//===------------------ ProjectModules.h -------------------------*- 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 // //===----------------------------------------------------------------------===// #include "ProjectModules.h" #include "support/Logger.h" #include "clang/Tooling/DependencyScanning/DependencyScanningService.h" #include "clang/Tooling/DependencyScanning/DependencyScanningTool.h" namespace clang::clangd { namespace { /// A scanner to query the dependency information for C++20 Modules. /// /// The scanner can scan a single file with `scan(PathRef)` member function /// or scan the whole project with `globalScan(vector<PathRef>)` member /// function. See the comments of `globalScan` to see the details. /// /// The ModuleDependencyScanner can get the directly required module names for a /// specific source file. Also the ModuleDependencyScanner can get the source /// file declaring the primary module interface for a specific module name. /// /// IMPORTANT NOTE: we assume that every module unit is only declared once in a /// source file in the project. But the assumption is not strictly true even /// besides the invalid projects. The language specification requires that every /// module unit should be unique in a valid program. But a project can contain /// multiple programs. Then it is valid that we can have multiple source files /// declaring the same module in a project as long as these source files don't /// interfere with each other. class ModuleDependencyScanner { … }; std::optional<ModuleDependencyScanner::ModuleDependencyInfo> ModuleDependencyScanner::scan(PathRef FilePath) { … } void ModuleDependencyScanner::globalScan() { … } PathRef ModuleDependencyScanner::getSourceForModuleName( llvm::StringRef ModuleName) const { … } std::vector<std::string> ModuleDependencyScanner::getRequiredModules(PathRef File) { … } } // namespace /// TODO: The existing `ScanningAllProjectModules` is not efficient. See the /// comments in ModuleDependencyScanner for detail. /// /// In the future, we wish the build system can provide a well design /// compilation database for modules then we can query that new compilation /// database directly. Or we need to have a global long-live scanner to detect /// the state of each file. class ScanningAllProjectModules : public ProjectModules { … }; std::unique_ptr<ProjectModules> scanningProjectModules( std::shared_ptr<const clang::tooling::CompilationDatabase> CDB, const ThreadsafeFS &TFS) { … } } // namespace clang::clangd