58 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_PROJECTMODULES_H10#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_PROJECTMODULES_H11 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 19namespace clang {20namespace clangd {21 22/// An interface to query the modules information in the project.23/// Users should get instances of `ProjectModules` from24/// `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 is29/// the corresponding source file.30///31/// Note that there can be multiple source files declaring the same module32/// in a valid project. Although the language specification requires that33/// every module unit's name must be unique in valid program, there can be34/// multiple program in a project. And it is technically valid if these program35/// 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.39class ProjectModules {40public: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 std::string getModuleNameForSource(PathRef File) = 0;46 virtual std::string getSourceForModuleName(llvm::StringRef ModuleName,47 PathRef RequiredSrcFile) = 0;48 49 virtual void setCommandMangler(CommandMangler Mangler) {}50 51 virtual ~ProjectModules() = default;52};53 54} // namespace clangd55} // namespace clang56 57#endif58