1 //===------------------ ProjectModules.h -------------------------*- C++-*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_PROJECTMODULES_H 10 #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_PROJECTMODULES_H 11 12 #include "support/Function.h" 13 #include "support/Path.h" 14 #include "support/ThreadsafeFS.h" 15 #include "clang/Tooling/CompilationDatabase.h" 16 17 #include <memory> 18 19 namespace clang { 20 namespace clangd { 21 22 /// An interface to query the modules information in the project. 23 /// Users should get instances of `ProjectModules` from 24 /// `GlobalCompilationDatabase::getProjectModules(PathRef)`. 25 /// 26 /// Currently, the modules information includes: 27 /// - Given a source file, what are the required modules. 28 /// - Given a module name and a required source file, what is 29 /// the corresponding source file. 30 /// 31 /// Note that there can be multiple source files declaring the same module 32 /// in a valid project. Although the language specification requires that 33 /// every module unit's name must be unique in valid program, there can be 34 /// multiple program in a project. And it is technically valid if these program 35 /// doesn't interfere with each other. 36 /// 37 /// A module name should be in the format: 38 /// `<primary-module-name>[:partition-name]`. So module names covers partitions. 39 class ProjectModules { 40 public: 41 using CommandMangler = 42 llvm::unique_function<void(tooling::CompileCommand &, PathRef) const>; 43 44 virtual std::vector<std::string> getRequiredModules(PathRef File) = 0; 45 virtual PathRef 46 getSourceForModuleName(llvm::StringRef ModuleName, 47 PathRef RequiredSrcFile = PathRef()) = 0; 48 49 virtual void setCommandMangler(CommandMangler Mangler) {} 50 51 virtual ~ProjectModules() = default; 52 }; 53 54 } // namespace clangd 55 } // namespace clang 56 57 #endif 58