diff --git a/clang-tools-extra/clangd/CodeComplete.cpp b/clang-tools-extra/clangd/CodeComplete.cpp --- a/clang-tools-extra/clangd/CodeComplete.cpp +++ b/clang-tools-extra/clangd/CodeComplete.cpp @@ -1617,8 +1617,10 @@ 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 --- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -194,9 +194,14 @@ 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) {