[PATCH] D58448: [clangd] Improve global code completion when scope specifier is unresolved.
Eric Liu via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 27 03:41:58 PST 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rL354963: [clangd] Improve global code completion when scope specifier is unresolved. (authored by ioeric, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D58448/new/
https://reviews.llvm.org/D58448
Files:
clang-tools-extra/trunk/clangd/CodeComplete.cpp
clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp
Index: clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp
===================================================================
--- clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp
+++ clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp
@@ -1095,8 +1095,10 @@
} // namespace ns
)cpp");
- EXPECT_THAT(Requests, ElementsAre(Field(&FuzzyFindRequest::Scopes,
- UnorderedElementsAre("bar::"))));
+ EXPECT_THAT(Requests,
+ ElementsAre(Field(
+ &FuzzyFindRequest::Scopes,
+ UnorderedElementsAre("a::bar::", "ns::bar::", "bar::"))));
}
TEST(CompletionTest, UnresolvedNestedQualifierIdQuery) {
@@ -2335,6 +2337,35 @@
Kind(CompletionItemKind::Reference))));
}
+TEST(CompletionTest, ScopeIsUnresolved) {
+ clangd::CodeCompleteOptions Opts = {};
+ Opts.AllScopes = true;
+
+ auto Results = completions(R"cpp(
+ namespace a {
+ void f() { b::X^ }
+ }
+ )cpp",
+ {cls("a::b::XYZ")}, Opts);
+ EXPECT_THAT(Results.Completions,
+ UnorderedElementsAre(AllOf(Qualifier(""), Named("XYZ"))));
+}
+
+TEST(CompletionTest, NestedScopeIsUnresolved) {
+ clangd::CodeCompleteOptions Opts = {};
+ Opts.AllScopes = true;
+
+ auto Results = completions(R"cpp(
+ namespace a {
+ namespace b {}
+ void f() { b::c::X^ }
+ }
+ )cpp",
+ {cls("a::b::c::XYZ")}, Opts);
+ EXPECT_THAT(Results.Completions,
+ UnorderedElementsAre(AllOf(Qualifier(""), Named("XYZ"))));
+}
+
} // namespace
} // namespace clangd
} // namespace clang
Index: clang-tools-extra/trunk/clangd/CodeComplete.cpp
===================================================================
--- clang-tools-extra/trunk/clangd/CodeComplete.cpp
+++ clang-tools-extra/trunk/clangd/CodeComplete.cpp
@@ -48,6 +48,7 @@
#include "llvm/ADT/None.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/FormatVariadic.h"
@@ -526,7 +527,7 @@
std::set<std::string> Results;
for (llvm::StringRef AS : AccessibleScopes)
Results.insert(
- ((UnresolvedQualifier ? *UnresolvedQualifier : "") + AS).str());
+ (AS + (UnresolvedQualifier ? *UnresolvedQualifier : "")).str());
return {Results.begin(), Results.end()};
}
};
@@ -570,16 +571,15 @@
}
// Unresolved qualifier.
- // FIXME: When Sema can resolve part of a scope chain (e.g.
- // "known::unknown::id"), we should expand the known part ("known::") rather
- // than treating the whole thing as unknown.
- SpecifiedScope Info;
- Info.AccessibleScopes.push_back(""); // global namespace
+ SpecifiedScope Info = GetAllAccessibleScopes(CCContext);
+ Info.AccessibleScopes.push_back(""); // Make sure global scope is included.
- Info.UnresolvedQualifier =
+ llvm::StringRef SpelledSpecifier =
Lexer::getSourceText(CharSourceRange::getCharRange((*SS)->getRange()),
- CCSema.SourceMgr, clang::LangOptions())
- .ltrim("::");
+ CCSema.SourceMgr, clang::LangOptions());
+ if (SpelledSpecifier.consume_front("::"))
+ Info.AccessibleScopes = {""};
+ Info.UnresolvedQualifier = SpelledSpecifier;
// Sema excludes the trailing "::".
if (!Info.UnresolvedQualifier->empty())
*Info.UnresolvedQualifier += "::";
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D58448.188514.patch
Type: text/x-patch
Size: 3532 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190227/4b43db08/attachment.bin>
More information about the llvm-commits
mailing list