TEST(MergeIndexTest, Refs) { FileIndex Dyn({"unittest"}); FileIndex StaticIndex({"unittest"}); auto MergedIndex = mergeIndex(&Dyn, &StaticIndex); const char *HeaderCode = "class Foo;"; auto HeaderSymbols = TestTU::withHeaderCode("class Foo;").headerSymbols(); auto Foo = findSymbol(HeaderSymbols, "Foo"); // Build dynamic index for test.cc. Annotations Test1Code(R"(class $Foo[[Foo]];)"); TestTU Test; Test.HeaderCode = HeaderCode; Test.Code = Test1Code.code(); Test.Filename = "test.cc"; auto AST = Test.build(); Dyn.update(Test.Filename, &AST.getASTContext(), AST.getPreprocessorPtr(), AST.getLocalTopLevelDecls()); // Build static index for test.cc. Test.HeaderCode = HeaderCode; Test.Code = "// static\nclass Foo {};"; Test.Filename = "test.cc"; auto StaticAST = Test.build(); // Add stale refs for test.cc. StaticIndex.update(Test.Filename, &StaticAST.getASTContext(), StaticAST.getPreprocessorPtr(), StaticAST.getLocalTopLevelDecls()); // Add refs for test2.cc Annotations Test2Code(R"(class $Foo[[Foo]] {};)"); TestTU Test2; Test2.HeaderCode = HeaderCode; Test2.Code = Test2Code.code(); Test2.Filename = "test2.cc"; StaticAST = Test2.build(); StaticIndex.update(Test2.Filename, &StaticAST.getASTContext(), StaticAST.getPreprocessorPtr(), StaticAST.getLocalTopLevelDecls()); RefsRequest Request; Request.IDs = {Foo.ID}; RefSlab::Builder Results; MergedIndex->refs(Request, [&](const Ref &O) { Results.insert(Foo.ID, O); }); EXPECT_THAT( std::move(Results).build(), ElementsAre(Pair( _, UnorderedElementsAre(AllOf(RefRange(Test1Code.range("Foo")), FileURI("unittest:///test.cc")), AllOf(RefRange(Test2Code.range("Foo")), FileURI("unittest:///test2.cc")))))); }