[clang-tools-extra] r363568 - [clangd] Perform merge for main file symbols.
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 17 07:49:18 PDT 2019
Author: hokein
Date: Mon Jun 17 07:49:18 2019
New Revision: 363568
URL: http://llvm.org/viewvc/llvm-project?rev=363568&view=rev
Log:
[clangd] Perform merge for main file symbols.
Summary:
Previously, we randomly pick one main file symbol in dynamic index, we
may loose the ideal symbol (with definition location) in the index.
It fixes the issue where sometimes we fail to go to the symbol definition, see:
1. call go-to-decl on Foo in Foo.cpp
2. jump to Foo.h, call go-to-def on Foo in Foo.h
we can't go back to Foo.cpp -- because we open Foo.cpp, Foo.h in clangd, both
files have Foo symbol (one with def&decl, one with decl only), we randomely
choose one.
Reviewers: kadircet
Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D63425
Modified:
clang-tools-extra/trunk/clangd/index/FileIndex.cpp
clang-tools-extra/trunk/clangd/unittests/FileIndexTests.cpp
Modified: clang-tools-extra/trunk/clangd/index/FileIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/FileIndex.cpp?rev=363568&r1=363567&r2=363568&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/index/FileIndex.cpp (original)
+++ clang-tools-extra/trunk/clangd/index/FileIndex.cpp Mon Jun 17 07:49:18 2019
@@ -260,7 +260,7 @@ void FileIndex::updateMain(PathRef Path,
llvm::make_unique<RelationSlab>(std::move(std::get<2>(Contents))),
/*CountReferences=*/true);
MainFileIndex.reset(
- MainFileSymbols.buildIndex(IndexType::Light, DuplicateHandling::PickOne));
+ MainFileSymbols.buildIndex(IndexType::Light, DuplicateHandling::Merge));
}
} // namespace clangd
Modified: clang-tools-extra/trunk/clangd/unittests/FileIndexTests.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/unittests/FileIndexTests.cpp?rev=363568&r1=363567&r2=363568&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/unittests/FileIndexTests.cpp (original)
+++ clang-tools-extra/trunk/clangd/unittests/FileIndexTests.cpp Mon Jun 17 07:49:18 2019
@@ -46,6 +46,7 @@ MATCHER_P(DefURI, U, "") {
}
MATCHER_P(QName, N, "") { return (arg.Scope + arg.Name).str() == N; }
MATCHER_P(NumReferences, N, "") { return arg.References == N; }
+MATCHER_P(hasOrign, O, "") { return bool(arg.Origin & O); }
namespace clang {
namespace clangd {
@@ -386,6 +387,27 @@ TEST(FileIndexTest, ReferencesInMainFile
RefsAre({RefRange(Main.range())}));
}
+TEST(FileIndexTest, MergeMainFileSymbols) {
+ const char* CommonHeader = "void foo();";
+ TestTU Header = TestTU::withCode(CommonHeader);
+ TestTU Cpp = TestTU::withCode("void foo() {}");
+ Cpp.Filename = "foo.cpp";
+ Cpp.HeaderFilename = "foo.h";
+ Cpp.HeaderCode = CommonHeader;
+
+ FileIndex Index;
+ auto HeaderAST = Header.build();
+ auto CppAST = Cpp.build();
+ Index.updateMain(testPath("foo.h"), HeaderAST);
+ Index.updateMain(testPath("foo.cpp"), CppAST);
+
+ auto Symbols = runFuzzyFind(Index, "");
+ // Check foo is merged, foo in Cpp wins (as we see the definition there).
+ EXPECT_THAT(Symbols, ElementsAre(AllOf(DeclURI("unittest:///foo.h"),
+ DefURI("unittest:///foo.cpp"),
+ hasOrign(SymbolOrigin::Merge))));
+}
+
TEST(FileSymbolsTest, CountReferencesNoRefSlabs) {
FileSymbols FS;
FS.update("f1", numSlab(1, 3), nullptr, nullptr, true);
More information about the cfe-commits
mailing list