[PATCH] D50695: [clangd] Always use the latest preamble
Haojian Wu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 16 02:29:31 PDT 2018
hokein updated this revision to Diff 160983.
hokein marked 4 inline comments as done.
hokein added a comment.
Address review comments.
Repository:
rCTE Clang Tools Extra
https://reviews.llvm.org/D50695
Files:
clangd/TUScheduler.cpp
unittests/clangd/XRefsTests.cpp
Index: unittests/clangd/XRefsTests.cpp
===================================================================
--- unittests/clangd/XRefsTests.cpp
+++ unittests/clangd/XRefsTests.cpp
@@ -1021,6 +1021,51 @@
EXPECT_THAT(*Locations, IsEmpty());
}
+TEST(GoToDefinition, WithPreamble) {
+ // Test stragety: AST should always use the latest preamble instead of last
+ // good preamble.
+ MockFSProvider FS;
+ IgnoreDiagnostics DiagConsumer;
+ MockCompilationDatabase CDB;
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
+
+ auto FooCpp = testPath("foo.cpp");
+ auto FooCppUri = URIForFile{FooCpp};
+ // The trigger locations must be the same.
+ Annotations FooWithHeader(R"cpp(#include "fo^o.h")cpp");
+ Annotations FooWithoutHeader(R"cpp(double [[fo^o]]();)cpp");
+
+ FS.Files[FooCpp] = FooWithHeader.code();
+
+ auto FooH = testPath("foo.h");
+ auto FooHUri = URIForFile{FooH};
+ Annotations FooHeader(R"cpp([[]])cpp");
+ FS.Files[FooH] = FooHeader.code();
+
+ runAddDocument(Server, FooCpp, FooWithHeader.code());
+ // GoToDefinition goes to a #include file: the result comes from the preamble.
+ EXPECT_THAT(
+ cantFail(runFindDefinitions(Server, FooCpp, FooWithHeader.point())),
+ ElementsAre(Location{FooHUri, FooHeader.range()}));
+
+ // Only preamble is built, and no AST is built in this request.
+ Server.addDocument(FooCpp, FooWithoutHeader.code(), WantDiagnostics::No);
+ // We build AST here, and it should use the latest preamble rather than the
+ // stale one.
+ EXPECT_THAT(
+ cantFail(runFindDefinitions(Server, FooCpp, FooWithoutHeader.point())),
+ ElementsAre(Location{FooCppUri, FooWithoutHeader.range()}));
+
+ // Reset test environment.
+ runAddDocument(Server, FooCpp, FooWithHeader.code());
+ // Both preamble and AST are built in this request.
+ Server.addDocument(FooCpp, FooWithoutHeader.code(), WantDiagnostics::Yes);
+ // Use the AST being built in above request.
+ EXPECT_THAT(
+ cantFail(runFindDefinitions(Server, FooCpp, FooWithoutHeader.point())),
+ ElementsAre(Location{FooCppUri, FooWithoutHeader.range()}));
+}
+
} // namespace
} // namespace clangd
} // namespace clang
Index: clangd/TUScheduler.cpp
===================================================================
--- clangd/TUScheduler.cpp
+++ clangd/TUScheduler.cpp
@@ -370,8 +370,7 @@
bool CanReuseAST = InputsAreTheSame && (OldPreamble == NewPreamble);
{
std::lock_guard<std::mutex> Lock(Mutex);
- if (NewPreamble)
- LastBuiltPreamble = NewPreamble;
+ LastBuiltPreamble = NewPreamble;
}
// Before doing the expensive AST reparse, we want to release our reference
// to the old preamble, so it can be freed if there are no other references
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D50695.160983.patch
Type: text/x-patch
Size: 2773 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180816/47837b8b/attachment.bin>
More information about the cfe-commits
mailing list