//===--- extra/modularize/ModularizeUtilities.cpp -------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file implements a class for loading and validating a module map or // header list by checking that all headers in the corresponding directories // are accounted for. // //===----------------------------------------------------------------------===// #include "clang/Basic/SourceManager.h" #include "clang/Driver/Options.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendActions.h" #include "CoverageChecker.h" #include "llvm/ADT/SmallString.h" #include "llvm/Support/FileUtilities.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Path.h" #include "llvm/Support/raw_ostream.h" #include "ModularizeUtilities.h" usingnamespaceclang; usingnamespacellvm; usingnamespaceModularize; namespace { // Subclass TargetOptions so we can construct it inline with // the minimal option, the triple. class ModuleMapTargetOptions : public clang::TargetOptions { … }; } // namespace // ModularizeUtilities class implementation. // Constructor. ModularizeUtilities::ModularizeUtilities(std::vector<std::string> &InputPaths, llvm::StringRef Prefix, llvm::StringRef ProblemFilesListPath) : … { … } // Create instance of ModularizeUtilities, to simplify setting up // subordinate objects. ModularizeUtilities *ModularizeUtilities::createModularizeUtilities( std::vector<std::string> &InputPaths, llvm::StringRef Prefix, llvm::StringRef ProblemFilesListPath) { … } // Load all header lists and dependencies. std::error_code ModularizeUtilities::loadAllHeaderListsAndDependencies() { … } // Do coverage checks. // For each loaded module map, do header coverage check. // Starting from the directory of the module.modulemap file, // Find all header files, optionally looking only at files // covered by the include path options, and compare against // the headers referenced by the module.modulemap file. // Display warnings for unaccounted-for header files. // Returns 0 if there were no errors or warnings, 1 if there // were warnings, 2 if any other problem, such as a bad // module map path argument was specified. std::error_code ModularizeUtilities::doCoverageCheck( std::vector<std::string> &IncludePaths, llvm::ArrayRef<std::string> CommandLine) { … } // Load single header list and dependencies. std::error_code ModularizeUtilities::loadSingleHeaderListsAndDependencies( llvm::StringRef InputPath) { … } // Load problem header list. std::error_code ModularizeUtilities::loadProblemHeaderList( llvm::StringRef InputPath) { … } // Load single module map and extract header file list. std::error_code ModularizeUtilities::loadModuleMap( llvm::StringRef InputPath) { … } // Collect module map headers. // Walks the modules and collects referenced headers into // HeaderFileNames. bool ModularizeUtilities::collectModuleMapHeaders(clang::ModuleMap *ModMap) { … } // Collect referenced headers from one module. // Collects the headers referenced in the given module into // HeaderFileNames. bool ModularizeUtilities::collectModuleHeaders(const clang::Module &Mod) { … } // Collect headers from an umbrella directory. bool ModularizeUtilities::collectUmbrellaHeaders(StringRef UmbrellaDirName, DependentsVector &Dependents) { … } // Replace .. embedded in path for purposes of having // a canonical path. static std::string replaceDotDot(StringRef Path) { … } // Convert header path to canonical form. // The canonical form is basically just use forward slashes, and remove "./". // \param FilePath The file path, relative to the module map directory. // \returns The file path in canonical form. std::string ModularizeUtilities::getCanonicalPath(StringRef FilePath) { … } // Check for header file extension. // If the file extension is .h, .inc, or missing, it's // assumed to be a header. // \param FileName The file name. Must not be a directory. // \returns true if it has a header extension or no extension. bool ModularizeUtilities::isHeader(StringRef FileName) { … } // Get directory path component from file path. // \returns the component of the given path, which will be // relative if the given path is relative, absolute if the // given path is absolute, or "." if the path has no leading // path component. std::string ModularizeUtilities::getDirectoryFromPath(StringRef Path) { … } // Add unique problem file. // Also standardizes the path. void ModularizeUtilities::addUniqueProblemFile(std::string FilePath) { … } // Add file with no compile errors. // Also standardizes the path. void ModularizeUtilities::addNoCompileErrorsFile(std::string FilePath) { … } // List problem files. void ModularizeUtilities::displayProblemFiles() { … } // List files with no problems. void ModularizeUtilities::displayGoodFiles() { … } // List files with problem files commented out. void ModularizeUtilities::displayCombinedFiles() { … }