diff --git a/clang-tools-extra/clangd/CodeComplete.cpp b/clang-tools-extra/clangd/CodeComplete.cpp index f79033ac95142..92ebc4c39f64c 100644 --- a/clang-tools-extra/clangd/CodeComplete.cpp +++ b/clang-tools-extra/clangd/CodeComplete.cpp @@ -1617,8 +1617,10 @@ class CodeCompleteFlow { llvm::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 && + if (((C.SemaResult && + C.SemaResult->Kind == CodeCompletionResult::RK_Macro) || + (C.IndexResult && + C.IndexResult->SymInfo.Kind == index::SymbolKind::Macro)) && !C.Name.startswith_lower(Filter->pattern())) return None; return Filter->match(C.Name); diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp index 31a1c2d46c09b..fd144d9391d38 100644 --- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -194,9 +194,14 @@ TEST(CompletionTest, Filter) { EXPECT_THAT(completions(Body + "int main() { S().Foba^ }").Completions, AllOf(Has("FooBar"), Has("FooBaz"), Not(Has("Qux")))); - // Macros require prefix match. - EXPECT_THAT(completions(Body + "int main() { C^ }").Completions, - AllOf(Has("Car"), Not(Has("MotorCar")))); + // Macros require prefix match, either from index or AST. + Symbol Sym = var("MotorCarIndex"); + Sym.SymInfo.Kind = index::SymbolKind::Macro; + EXPECT_THAT( + completions(Body + "int main() { C^ }", {Sym}).Completions, + AllOf(Has("Car"), Not(Has("MotorCar")), Not(Has("MotorCarIndex")))); + EXPECT_THAT(completions(Body + "int main() { M^ }", {Sym}).Completions, + AllOf(Has("MotorCar"), Has("MotorCarIndex"))); } void testAfterDotCompletion(clangd::CodeCompleteOptions Opts) {