diff --git a/clang-tools-extra/clangd/ClangdServer.h b/clang-tools-extra/clangd/ClangdServer.h --- a/clang-tools-extra/clangd/ClangdServer.h +++ b/clang-tools-extra/clangd/ClangdServer.h @@ -137,8 +137,9 @@ /// Enable semantic highlighting features. bool SemanticHighlighting = false; - /// Returns true if the StringRef is a tweak that should be enabled - std::function TweakFilter = [](llvm::StringRef TweakToSearch) {return true;}; + /// Returns true if the StringRef is a tweak ID that should be enabled. + std::function TweakFilter = + [](llvm::StringRef TweakToSearch) { return true; }; }; // Sensible default options for use in tests. // Features like indexing must be enabled if desired. diff --git a/clang-tools-extra/clangd/ClangdServer.cpp b/clang-tools-extra/clangd/ClangdServer.cpp --- a/clang-tools-extra/clangd/ClangdServer.cpp +++ b/clang-tools-extra/clangd/ClangdServer.cpp @@ -334,11 +334,11 @@ if (!Selection) return CB(Selection.takeError()); std::vector Res; - for (auto &T : prepareTweaks(*Selection)) { - if (!TweakFilter(T->id()) || (T->hidden() && !EnableHiddenFeatures)) - continue; + for (auto &T : prepareTweaks(*Selection, [this](const Tweak &T) { + return TweakFilter(T.id()) && (!T.hidden() || EnableHiddenFeatures); + })) Res.push_back({T->id(), T->title(), T->intent()}); - } + CB(std::move(Res)); }; diff --git a/clang-tools-extra/clangd/refactor/Tweak.h b/clang-tools-extra/clangd/refactor/Tweak.h --- a/clang-tools-extra/clangd/refactor/Tweak.h +++ b/clang-tools-extra/clangd/refactor/Tweak.h @@ -110,9 +110,11 @@ TweakRegistrationFor##Subclass(#Subclass, /*Description=*/""); \ const char *Subclass::id() const { return #Subclass; } -/// Calls prepare() on all tweaks, returning those that can run on the -/// selection. -std::vector> prepareTweaks(const Tweak::Selection &S); +/// Calls prepare() on all tweaks that satisfy the filter, returning those that +/// can run on the selection. +std::vector> +prepareTweaks(const Tweak::Selection &S, + std::function Filter); // Calls prepare() on the tweak with a given ID. // If prepare() returns false, returns an error. diff --git a/clang-tools-extra/clangd/refactor/Tweak.cpp b/clang-tools-extra/clangd/refactor/Tweak.cpp --- a/clang-tools-extra/clangd/refactor/Tweak.cpp +++ b/clang-tools-extra/clangd/refactor/Tweak.cpp @@ -46,13 +46,15 @@ Cursor = SM.getComposedLoc(SM.getMainFileID(), RangeBegin); } -std::vector> prepareTweaks(const Tweak::Selection &S) { +std::vector> +prepareTweaks(const Tweak::Selection &S, + std::function Filter) { validateRegistry(); std::vector> Available; for (const auto &E : TweakRegistry::entries()) { std::unique_ptr T = E.instantiate(); - if (!T->prepare(S)) + if (!Filter(*T) || !T->prepare(S)) continue; Available.push_back(std::move(T)); }