[PATCH] D44567: [clangd] Handle multiple callbacks from Sema's completion
Phabricator via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 16 08:26:22 PDT 2018
This revision was automatically updated to reflect the committed changes.
Closed by commit rCTE327717: [clangd] Handle multiple callbacks from Sema's completion (authored by ibiryukov, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D44567?vs=138706&id=138713#toc
Repository:
rL LLVM
https://reviews.llvm.org/D44567
Files:
clangd/CodeComplete.cpp
unittests/clangd/CodeCompleteTests.cpp
Index: clangd/CodeComplete.cpp
===================================================================
--- clangd/CodeComplete.cpp
+++ clangd/CodeComplete.cpp
@@ -450,8 +450,15 @@
void ProcessCodeCompleteResults(class Sema &S, CodeCompletionContext Context,
CodeCompletionResult *InResults,
unsigned NumResults) override final {
+ if (CCSema) {
+ log(llvm::formatv(
+ "Multiple code complete callbacks (parser backtracked?). "
+ "Dropping results from context {0}, keeping results from {1}.",
+ getCompletionKindString(this->CCContext.getKind()),
+ getCompletionKindString(Context.getKind())));
+ return;
+ }
// Record the completion context.
- assert(!CCSema && "ProcessCodeCompleteResults called multiple times!");
CCSema = &S;
CCContext = Context;
Index: unittests/clangd/CodeCompleteTests.cpp
===================================================================
--- unittests/clangd/CodeCompleteTests.cpp
+++ unittests/clangd/CodeCompleteTests.cpp
@@ -608,6 +608,43 @@
EXPECT_THAT(Results.items, Not(Contains(Labeled("clang::"))));
}
+TEST(CompletionTest, BacktrackCrashes) {
+ // Sema calls code completion callbacks twice in these cases.
+ auto Results = completions(R"cpp(
+ namespace ns {
+ struct FooBarBaz {};
+ } // namespace ns
+
+ int foo(ns::FooBar^
+ )cpp");
+
+ EXPECT_THAT(Results.items, ElementsAre(Labeled("FooBarBaz")));
+
+ // Check we don't crash in that case too.
+ completions(R"cpp(
+ struct FooBarBaz {};
+ void test() {
+ if (FooBarBaz * x^) {}
+ }
+)cpp");
+}
+
+TEST(CompletionTest, CompleteInExcludedPPBranch) {
+ auto Results = completions(R"cpp(
+ int bar(int param_in_bar) {
+ }
+
+ int foo(int param_in_foo) {
+#if 0
+ par^
+#endif
+ }
+)cpp");
+
+ EXPECT_THAT(Results.items, Contains(Labeled("param_in_foo")));
+ EXPECT_THAT(Results.items, Not(Contains(Labeled("param_in_bar"))));
+}
+
SignatureHelp signatures(StringRef Text) {
MockFSProvider FS;
MockCompilationDatabase CDB;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D44567.138713.patch
Type: text/x-patch
Size: 2120 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180316/05798f59/attachment.bin>
More information about the cfe-commits
mailing list