diff options
author | Eric Liu <ioeric@google.com> | 2018-10-17 11:19:02 +0000 |
---|---|---|
committer | Eric Liu <ioeric@google.com> | 2018-10-17 11:19:02 +0000 |
commit | 3fac4ef1fdb4e6b2b4743f33498612c233da325d (patch) | |
tree | f3dbf1cda024228cff98f9e00d8dbd50188144e6 /clang-tools-extra/unittests/clangd | |
parent | e2566b5d877c415f128a9f3d75ef2173bf32c347 (diff) | |
download | bcm5719-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')
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)); |