Index: clang-tools-extra/trunk/clangd/CodeComplete.cpp =================================================================== --- clang-tools-extra/trunk/clangd/CodeComplete.cpp +++ clang-tools-extra/trunk/clangd/CodeComplete.cpp @@ -1015,6 +1015,15 @@ return std::move(Top).items(); } + Optional fuzzyScore(const CompletionCandidate &C) { + // Macros can be very spammy, so we only support prefix completion. + // We won't end up with underfull index results, as macros are sema-only. + if (C.SemaResult && C.SemaResult->Kind == CodeCompletionResult::RK_Macro && + !C.Name.startswith_lower(Filter->pattern())) + return None; + return Filter->match(C.Name); + } + // Scores a candidate and adds it to the TopN structure. void addCandidate(TopN &Candidates, const CodeCompletionResult *SemaResult, @@ -1027,7 +1036,7 @@ SymbolQualitySignals Quality; SymbolRelevanceSignals Relevance; Relevance.Query = SymbolRelevanceSignals::CodeComplete; - if (auto FuzzyScore = Filter->match(C.Name)) + if (auto FuzzyScore = fuzzyScore(C)) Relevance.NameMatch = *FuzzyScore; else return; Index: clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp =================================================================== --- clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp +++ clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp @@ -193,6 +193,7 @@ TEST(CompletionTest, Filter) { std::string Body = R"cpp( + #define FooBarMacro int Abracadabra; int Alakazam; struct S { @@ -202,7 +203,8 @@ }; )cpp"; EXPECT_THAT(completions(Body + "int main() { S().Foba^ }").items, - AllOf(Has("FooBar"), Has("FooBaz"), Not(Has("Qux")))); + AllOf(Has("FooBar"), Has("FooBaz"), Not(Has("FooBarMacro")), + Not(Has("Qux")))); EXPECT_THAT(completions(Body + "int main() { S().FR^ }").items, AllOf(Has("FooBar"), Not(Has("FooBaz")), Not(Has("Qux"))));