//===--- FeatureModule.h - Plugging features into clangd ----------*-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 // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_FEATUREMODULE_H #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_FEATUREMODULE_H #include "support/Function.h" #include "support/Threading.h" #include "clang/Basic/Diagnostic.h" #include "llvm/ADT/FunctionExtras.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/JSON.h" #include <memory> #include <optional> #include <type_traits> #include <vector> namespace clang { class CompilerInstance; namespace clangd { struct Diag; class LSPBinder; class SymbolIndex; class ThreadsafeFS; class TUScheduler; class Tweak; /// A FeatureModule contributes a vertical feature to clangd. /// /// The lifetime of a module is roughly: /// - feature modules are created before the LSP server, in ClangdMain.cpp /// - these modules are then passed to ClangdLSPServer in a FeatureModuleSet /// - initializeLSP() is called when the editor calls initialize. // - initialize() is then called by ClangdServer as it is constructed. /// - module hooks can be called by the server at this point. /// Server facilities (scheduler etc) are available. /// - ClangdServer will not be destroyed until all the requests are done. /// FIXME: Block server shutdown until all the modules are idle. /// - When shutting down, ClangdServer will wait for all requests to /// finish, call stop(), and then blockUntilIdle(). /// - feature modules will be destroyed after ClangdLSPServer is destroyed. /// /// FeatureModules are not threadsafe in general. A module's entrypoints are: /// - method handlers registered in initializeLSP() /// - public methods called directly via ClangdServer.featureModule<T>()->... /// - specific overridable "hook" methods inherited from FeatureModule /// Unless otherwise specified, these are only called on the main thread. /// /// Conventionally, standard feature modules live in the `clangd` namespace, /// and other exposed details live in a sub-namespace. class FeatureModule { … }; /// A FeatureModuleSet is a collection of feature modules installed in clangd. /// /// Modules can be looked up by type, or used via the FeatureModule interface. /// This allows individual modules to expose a public API. /// For this reason, there can be only one feature module of each type. /// /// The set owns the modules. It is itself owned by main, not ClangdServer. class FeatureModuleSet { … }; template <typename Mod> int FeatureModuleSet::ID<Mod>::Key; } // namespace clangd } // namespace clang #endif