@@ -4692,6 +4692,64 @@ TEST(CompletionTest, ListExplicitObjectOverloads) {
46924692 }
46934693}
46944694
4695+ TEST (CompletionTest, FuzzyMatchMacro) {
4696+ Annotations Code (R"cpp(
4697+ #define gl_foo() 42
4698+ #define _gl_foo() 42
4699+ #define glfbar() 42
4700+
4701+ int gl_frob();
4702+ int _gl_frob();
4703+
4704+ int main() {
4705+ int y = glf$c1^;
4706+ int y = _gl$c2^;
4707+ }
4708+ )cpp" );
4709+
4710+ auto TU = TestTU::withCode (Code.code ());
4711+
4712+ // Exact prefix should match macro or symbol
4713+ {
4714+ CodeCompleteOptions Opts{};
4715+ EXPECT_EQ (Opts.MacroFilter , Config::MacroFilterPolicy::ExactPrefix);
4716+
4717+ {
4718+ auto Results = completions (TU, Code.point (" c1" ), {}, Opts);
4719+ EXPECT_THAT (
4720+ Results.Completions ,
4721+ ElementsAre (named (" gl_frob" ), named (" _gl_frob" ), named (" glfbar" )));
4722+ }
4723+
4724+ {
4725+ auto Results = completions (TU, Code.point (" c2" ), {}, Opts);
4726+ EXPECT_THAT (Results.Completions ,
4727+ ElementsAre (named (" _gl_frob" ), named (" _gl_foo" )));
4728+ }
4729+ }
4730+
4731+ // but with fuzzy match
4732+ {
4733+ CodeCompleteOptions Opts{};
4734+ Opts.MacroFilter = Config::MacroFilterPolicy::FuzzyMatch;
4735+
4736+ // don't suggest underscore macros in general,
4737+ {
4738+ auto Results = completions (TU, Code.point (" c1" ), {}, Opts);
4739+ EXPECT_THAT (Results.Completions ,
4740+ ElementsAre (named (" gl_frob" ), named (" _gl_frob" ),
4741+ named (" glfbar" ), named (" gl_foo" )));
4742+ }
4743+
4744+ // but do suggest when macro contains exact prefix
4745+ {
4746+ auto Results = completions (TU, Code.point (" c2" ), {}, Opts);
4747+ EXPECT_THAT (Results.Completions ,
4748+ ElementsAre (named (" _gl_frob" ), named (" _gl_foo" )));
4749+ }
4750+ }
4751+ }
4752+
46954753} // namespace
46964754} // namespace clangd
46974755} // namespace clang
0 commit comments