xref: /llvm-project/clang-tools-extra/clangd/ProjectModules.h (revision 2b0e2255d6067872e844ff07d67342a6c97d8049)
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