summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/unittests/clangd
diff options
context:
space:
mode:
authorEric Liu <ioeric@google.com>2018-10-17 11:19:02 +0000
committerEric Liu <ioeric@google.com>2018-10-17 11:19:02 +0000
commit3fac4ef1fdb4e6b2b4743f33498612c233da325d (patch)
treef3dbf1cda024228cff98f9e00d8dbd50188144e6 /clang-tools-extra/unittests/clangd
parente2566b5d877c415f128a9f3d75ef2173bf32c347 (diff)
downloadbcm5719-llvm-3fac4ef1fdb4e6b2b4743f33498612c233da325d.tar.gz
bcm5719-llvm-3fac4ef1fdb4e6b2b4743f33498612c233da325d.zip
[clangd] Support scope proximity in code completion.
Summary: This should make all-scope completion more usable. Scope proximity for indexes will be added in followup patch. Reviewers: sammccall Reviewed By: sammccall Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, cfe-commits Differential Revision: https://reviews.llvm.org/D53131 llvm-svn: 344688
Diffstat (limited to 'clang-tools-extra/unittests/clangd')
-rw-r--r--clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp22
-rw-r--r--clang-tools-extra/unittests/clangd/FileDistanceTests.cpp10
-rw-r--r--clang-tools-extra/unittests/clangd/QualityTests.cpp59
3 files changed, 83 insertions, 8 deletions
diff --git a/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp b/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp
index e056699ab55..c0e59e800db 100644
--- a/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp
+++ b/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp
@@ -1040,6 +1040,28 @@ TEST(CompletionTest, UnqualifiedIdQuery) {
UnorderedElementsAre("", "ns::", "std::"))));
}
+TEST(CompletionTest, EnclosingScopeComesFirst) {
+ auto Requests = captureIndexRequests(R"cpp(
+ namespace std {}
+ using namespace std;
+ namespace nx {
+ namespace ns {
+ namespace {
+ void f() {
+ vec^
+ }
+ }
+ }
+ }
+ )cpp");
+
+ EXPECT_THAT(Requests,
+ ElementsAre(Field(
+ &FuzzyFindRequest::Scopes,
+ UnorderedElementsAre("", "std::", "nx::ns::", "nx::"))));
+ EXPECT_EQ(Requests[0].Scopes[0], "nx::ns::");
+}
+
TEST(CompletionTest, ResolvedQualifiedIdQuery) {
auto Requests = captureIndexRequests(R"cpp(
namespace ns1 {}
diff --git a/clang-tools-extra/unittests/clangd/FileDistanceTests.cpp b/clang-tools-extra/unittests/clangd/FileDistanceTests.cpp
index bb5d3d2f00b..6d7d4777930 100644
--- a/clang-tools-extra/unittests/clangd/FileDistanceTests.cpp
+++ b/clang-tools-extra/unittests/clangd/FileDistanceTests.cpp
@@ -109,6 +109,16 @@ TEST(FileDistance, DisallowDownTraversalsFromRoot) {
EXPECT_EQ(D.distance("/x"), FileDistance::Unreachable);
}
+TEST(ScopeDistance, Smoke) {
+ ScopeDistance D({"x::y::z", "x::", "", "a::"});
+ EXPECT_EQ(D.distance("x::y::z::"), 0u);
+ EXPECT_GT(D.distance("x::y::"), D.distance("x::y::z::"));
+ EXPECT_GT(D.distance("x::"), D.distance("x::y::"));
+ EXPECT_GT(D.distance("x::y::z::down::"), D.distance("x::y::"));
+ EXPECT_GT(D.distance(""), D.distance("a::"));
+ EXPECT_GT(D.distance("x::"), D.distance("a::"));
+}
+
} // namespace
} // namespace clangd
} // namespace clang
diff --git a/clang-tools-extra/unittests/clangd/QualityTests.cpp b/clang-tools-extra/unittests/clangd/QualityTests.cpp
index ca13d4b793c..9dd992c2c10 100644
--- a/clang-tools-extra/unittests/clangd/QualityTests.cpp
+++ b/clang-tools-extra/unittests/clangd/QualityTests.cpp
@@ -28,6 +28,7 @@
#include "llvm/Support/Casting.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
+#include <vector>
namespace clang {
namespace clangd {
@@ -117,13 +118,14 @@ TEST(QualityTests, SymbolRelevanceSignalExtraction) {
Relevance = {};
Relevance.merge(CodeCompletionResult(&findDecl(AST, "main"), 42));
- EXPECT_FLOAT_EQ(Relevance.SemaProximityScore, 1.0f) << "Decl in current file";
+ EXPECT_FLOAT_EQ(Relevance.SemaFileProximityScore, 1.0f)
+ << "Decl in current file";
Relevance = {};
Relevance.merge(CodeCompletionResult(&findDecl(AST, "header"), 42));
- EXPECT_FLOAT_EQ(Relevance.SemaProximityScore, 0.6f) << "Decl from header";
+ EXPECT_FLOAT_EQ(Relevance.SemaFileProximityScore, 0.6f) << "Decl from header";
Relevance = {};
Relevance.merge(CodeCompletionResult(&findDecl(AST, "header_main"), 42));
- EXPECT_FLOAT_EQ(Relevance.SemaProximityScore, 1.0f)
+ EXPECT_FLOAT_EQ(Relevance.SemaFileProximityScore, 1.0f)
<< "Current file and header";
auto constructShadowDeclCompletionResult = [&](const std::string DeclName) {
@@ -146,10 +148,10 @@ TEST(QualityTests, SymbolRelevanceSignalExtraction) {
Relevance = {};
Relevance.merge(constructShadowDeclCompletionResult("Bar"));
- EXPECT_FLOAT_EQ(Relevance.SemaProximityScore, 1.0f)
+ EXPECT_FLOAT_EQ(Relevance.SemaFileProximityScore, 1.0f)
<< "Using declaration in main file";
Relevance.merge(constructShadowDeclCompletionResult("FLAGS_FOO"));
- EXPECT_FLOAT_EQ(Relevance.SemaProximityScore, 1.0f)
+ EXPECT_FLOAT_EQ(Relevance.SemaFileProximityScore, 1.0f)
<< "Using declaration in main file";
Relevance = {};
@@ -210,9 +212,21 @@ TEST(QualityTests, SymbolRelevanceSignalsSanity) {
PoorNameMatch.NameMatch = 0.2f;
EXPECT_LT(PoorNameMatch.evaluate(), Default.evaluate());
- SymbolRelevanceSignals WithSemaProximity;
- WithSemaProximity.SemaProximityScore = 0.2f;
- EXPECT_GT(WithSemaProximity.evaluate(), Default.evaluate());
+ SymbolRelevanceSignals WithSemaFileProximity;
+ WithSemaFileProximity.SemaFileProximityScore = 0.2f;
+ EXPECT_GT(WithSemaFileProximity.evaluate(), Default.evaluate());
+
+ ScopeDistance ScopeProximity({"x::y::"});
+
+ SymbolRelevanceSignals WithSemaScopeProximity;
+ WithSemaScopeProximity.ScopeProximityMatch = &ScopeProximity;
+ WithSemaScopeProximity.SemaSaysInScope = true;
+ EXPECT_GT(WithSemaScopeProximity.evaluate(), Default.evaluate());
+
+ SymbolRelevanceSignals WithIndexScopeProximity;
+ WithIndexScopeProximity.ScopeProximityMatch = &ScopeProximity;
+ WithIndexScopeProximity.SymbolScope = "x::";
+ EXPECT_GT(WithSemaScopeProximity.evaluate(), Default.evaluate());
SymbolRelevanceSignals IndexProximate;
IndexProximate.SymbolURI = "unittest:/foo/bar.h";
@@ -242,6 +256,35 @@ TEST(QualityTests, SymbolRelevanceSignalsSanity) {
EXPECT_EQ(Instance.evaluate(), Default.evaluate());
}
+TEST(QualityTests, ScopeProximity) {
+ SymbolRelevanceSignals Relevance;
+ ScopeDistance ScopeProximity({"x::y::z::", "x::", "llvm::", ""});
+ Relevance.ScopeProximityMatch = &ScopeProximity;
+
+ Relevance.SymbolScope = "other::";
+ float NotMatched = Relevance.evaluate();
+
+ Relevance.SymbolScope = "";
+ float Global = Relevance.evaluate();
+ EXPECT_GT(Global, NotMatched);
+
+ Relevance.SymbolScope = "llvm::";
+ float NonParent = Relevance.evaluate();
+ EXPECT_GT(NonParent, Global);
+
+ Relevance.SymbolScope = "x::";
+ float GrandParent = Relevance.evaluate();
+ EXPECT_GT(GrandParent, Global);
+
+ Relevance.SymbolScope = "x::y::";
+ float Parent = Relevance.evaluate();
+ EXPECT_GT(Parent, GrandParent);
+
+ Relevance.SymbolScope = "x::y::z::";
+ float Enclosing = Relevance.evaluate();
+ EXPECT_GT(Enclosing, Parent);
+}
+
TEST(QualityTests, SortText) {
EXPECT_LT(sortText(std::numeric_limits<float>::infinity()),
sortText(1000.2f));
OpenPOWER on IntegriCloud