//===--- ModuleAssistant.cpp - Module map generation manager --*- C++ -*---===// // // 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 defines the module generation entry point function, // createModuleMap, a Module class for representing a module, // and various implementation functions for doing the underlying // work, described below. // // The "Module" class represents a module, with members for storing the module // name, associated header file names, and sub-modules, and an "output" // function that recursively writes the module definitions. // // The "createModuleMap" function implements the top-level logic of the // assistant mode. It calls a loadModuleDescriptions function to walk // the header list passed to it and creates a tree of Module objects // representing the module hierarchy, represented by a "Module" object, // the "RootModule". This root module may or may not represent an actual // module in the module map, depending on the "--root-module" option passed // to modularize. It then calls a writeModuleMap function to set up the // module map file output and walk the module tree, outputting the module // map file using a stream obtained and managed by an // llvm::ToolOutputFile object. // //===----------------------------------------------------------------------===// #include "Modularize.h" #include "llvm/ADT/SmallString.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" #include "llvm/Support/ToolOutputFile.h" #include <vector> // Local definitions: namespace { // Internal class definitions: // Represents a module. class Module { … }; } // end anonymous namespace. // Module functions: // Constructors. Module::Module(llvm::StringRef Name, bool Problem) : … { … } // Destructor. Module::~Module() { … } // Write a module hierarchy to the given output stream. bool Module::output(llvm::raw_fd_ostream &OS, int Indent) { … } // Lookup a sub-module. Module *Module::findSubModule(llvm::StringRef SubName) { … } // Implementation functions: // Reserved keywords in module.modulemap syntax. // Keep in sync with keywords in module map parser in Lex/ModuleMap.cpp, // such as in ModuleMapParser::consumeToken(). static const char *const ReservedNames[] = …; // Convert module name to a non-keyword. // Prepends a '_' to the name if and only if the name is a keyword. static std::string ensureNoCollisionWithReservedName(llvm::StringRef MightBeReservedName) { … } // Convert module name to a non-keyword. // Prepends a '_' to the name if and only if the name is a keyword. static std::string ensureVaidModuleName(llvm::StringRef MightBeInvalidName) { … } // Add one module, given a header file path. static bool addModuleDescription(Module *RootModule, llvm::StringRef HeaderFilePath, llvm::StringRef HeaderPrefix, DependencyMap &Dependencies, bool IsProblemFile) { … } // Create the internal module tree representation. static Module *loadModuleDescriptions( llvm::StringRef RootModuleName, llvm::ArrayRef<std::string> HeaderFileNames, llvm::ArrayRef<std::string> ProblemFileNames, DependencyMap &Dependencies, llvm::StringRef HeaderPrefix) { … } // Kick off the writing of the module map. static bool writeModuleMap(llvm::StringRef ModuleMapPath, llvm::StringRef HeaderPrefix, Module *RootModule) { … } // Global functions: // Module map generation entry point. bool createModuleMap(llvm::StringRef ModuleMapPath, llvm::ArrayRef<std::string> HeaderFileNames, llvm::ArrayRef<std::string> ProblemFileNames, DependencyMap &Dependencies, llvm::StringRef HeaderPrefix, llvm::StringRef RootModuleName) { … }