[clang-tools-extra] [clangd] Add feature modules registry (PR #153756)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 14 23:56:37 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clangd
Author: Aleksandr Platonov (ArcsinX)
<details>
<summary>Changes</summary>
This patch adds feature modules registry, as discussed with @<!-- -->kadircet in [discourse](https://discourse.llvm.org/t/rfc-registry-for-feature-modules/87733).
Feature modules. which added into the feature module set from registry entries, can't expose public API, but still can be used via `FeatureModule` interface.
---
Full diff: https://github.com/llvm/llvm-project/pull/153756.diff
3 Files Affected:
- (modified) clang-tools-extra/clangd/FeatureModule.cpp (+2)
- (modified) clang-tools-extra/clangd/FeatureModule.h (+14-3)
- (modified) clang-tools-extra/clangd/tool/ClangdMain.cpp (+7)
``````````diff
diff --git a/clang-tools-extra/clangd/FeatureModule.cpp b/clang-tools-extra/clangd/FeatureModule.cpp
index 872cea1443789..47aff0b513f0d 100644
--- a/clang-tools-extra/clangd/FeatureModule.cpp
+++ b/clang-tools-extra/clangd/FeatureModule.cpp
@@ -9,6 +9,8 @@
#include "FeatureModule.h"
#include "support/Logger.h"
+LLVM_INSTANTIATE_REGISTRY(clang::clangd::FeatureModuleRegistry)
+
namespace clang {
namespace clangd {
diff --git a/clang-tools-extra/clangd/FeatureModule.h b/clang-tools-extra/clangd/FeatureModule.h
index 7b6883507be3f..3697a68ed4454 100644
--- a/clang-tools-extra/clangd/FeatureModule.h
+++ b/clang-tools-extra/clangd/FeatureModule.h
@@ -15,6 +15,7 @@
#include "llvm/ADT/FunctionExtras.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/JSON.h"
+#include "llvm/Support/Registry.h"
#include <memory>
#include <optional>
#include <type_traits>
@@ -143,9 +144,14 @@ 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.
+/// Modules added with explicit type specification 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.
+///
+/// Modules added using a base class pointer can be used only via the
+/// FeatureModule interface and can't be looked up by type, thus custom public
+/// API (if provided by the module) can't be used.
///
/// The set owns the modules. It is itself owned by main, not ClangdServer.
class FeatureModuleSet {
@@ -172,6 +178,9 @@ class FeatureModuleSet {
const_iterator begin() const { return const_iterator(Modules.begin()); }
const_iterator end() const { return const_iterator(Modules.end()); }
+ void add(std::unique_ptr<FeatureModule> M) {
+ Modules.push_back(std::move(M));
+ }
template <typename Mod> bool add(std::unique_ptr<Mod> M) {
return addImpl(&ID<Mod>::Key, std::move(M), LLVM_PRETTY_FUNCTION);
}
@@ -185,6 +194,8 @@ class FeatureModuleSet {
template <typename Mod> int FeatureModuleSet::ID<Mod>::Key;
+typedef llvm::Registry<FeatureModule> FeatureModuleRegistry;
+
} // namespace clangd
} // namespace clang
#endif
diff --git a/clang-tools-extra/clangd/tool/ClangdMain.cpp b/clang-tools-extra/clangd/tool/ClangdMain.cpp
index f287439f10cab..87c9f701d95ea 100644
--- a/clang-tools-extra/clangd/tool/ClangdMain.cpp
+++ b/clang-tools-extra/clangd/tool/ClangdMain.cpp
@@ -1017,6 +1017,13 @@ clangd accepts flags on the commandline, and in the CLANGD_FLAGS environment var
: static_cast<int>(ErrorResultCode::CheckFailed);
}
+ FeatureModuleSet ModuleSet;
+ for (FeatureModuleRegistry::entry E : FeatureModuleRegistry::entries()) {
+ vlog("Adding feature module '{0}' ({1})", E.getName(), E.getDesc());
+ ModuleSet.add(E.instantiate());
+ }
+ Opts.FeatureModules = &ModuleSet;
+
// Initialize and run ClangdLSPServer.
// Change stdin to binary to not lose \r\n on windows.
llvm::sys::ChangeStdinToBinary();
``````````
</details>
https://github.com/llvm/llvm-project/pull/153756
More information about the cfe-commits
mailing list