diff options
Diffstat (limited to 'clang-tools-extra/clangd/unittests/XRefsTests.cpp')
-rw-r--r-- | clang-tools-extra/clangd/unittests/XRefsTests.cpp | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp index 6d16fa51373..79d7090a28e 100644 --- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp +++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp @@ -937,6 +937,13 @@ TEST(FindReferences, WithinAST) { [[CAT]](Fo, o) foo4; } )cpp", + + R"cpp(// Macros + #define [[MA^CRO]](X) (X+1) + void test() { + int x = [[MACRO]]([[MACRO]](1)); + } + )cpp", }; for (const char *Test : Tests) { Annotations T(Test); @@ -1011,7 +1018,7 @@ TEST(FindReferences, ExplicitSymbols) { } } -TEST(FindReferences, NeedsIndex) { +TEST(FindReferences, NeedsIndexForSymbols) { const char *Header = "int foo();"; Annotations Main("int main() { [[f^oo]](); }"); TestTU TU; @@ -1040,13 +1047,49 @@ TEST(FindReferences, NeedsIndex) { EXPECT_EQ(1u, LimitRefs.References.size()); EXPECT_TRUE(LimitRefs.HasMore); - // If the main file is in the index, we don't return duplicates. - // (even if the references are in a different location) + // Avoid indexed results for the main file. Use AST for the mainfile. TU.Code = ("\n\n" + Main.code()).str(); EXPECT_THAT(findReferences(AST, Main.point(), 0, TU.index().get()).References, ElementsAre(RangeIs(Main.range()))); } +TEST(FindReferences, NeedsIndexForMacro) { + const char *Header = "#define MACRO(X) (X+1)"; + Annotations Main(R"cpp( + int main() { + int a = [[MA^CRO]](1); + } + )cpp"); + TestTU TU; + TU.Code = Main.code(); + TU.HeaderCode = Header; + auto AST = TU.build(); + + // References in main file are returned without index. + EXPECT_THAT( + findReferences(AST, Main.point(), 0, /*Index=*/nullptr).References, + ElementsAre(RangeIs(Main.range()))); + + Annotations IndexedMain(R"cpp( + int indexed_main() { + int a = [[MACRO]](1); + } + )cpp"); + + // References from indexed files are included. + TestTU IndexedTU; + IndexedTU.Code = IndexedMain.code(); + IndexedTU.Filename = "Indexed.cpp"; + IndexedTU.HeaderCode = Header; + EXPECT_THAT( + findReferences(AST, Main.point(), 0, IndexedTU.index().get()).References, + ElementsAre(RangeIs(Main.range()), RangeIs(IndexedMain.range()))); + auto LimitRefs = + findReferences(AST, Main.point(), /*Limit*/ 1, IndexedTU.index().get()); + EXPECT_EQ(1u, LimitRefs.References.size()); + EXPECT_TRUE(LimitRefs.HasMore); +} + TEST(FindReferences, NoQueryForLocalSymbols) { struct RecordingIndex : public MemIndex { mutable Optional<llvm::DenseSet<SymbolID>> RefIDs; |