diff options
author | Sam McCall <sam.mccall@gmail.com> | 2019-02-01 13:07:37 +0000 |
---|---|---|
committer | Sam McCall <sam.mccall@gmail.com> | 2019-02-01 13:07:37 +0000 |
commit | 3a4dfd62c2def9861d4d0e277ce832dcb8e7ccb4 (patch) | |
tree | 2dc6fb5dcf1f353546bb8578facae7a5746aa4aa | |
parent | 820bac171c912a763b2df27786e8e6215c3e74e4 (diff) | |
download | clang-tools-extra-3a4dfd62c2def9861d4d0e277ce832dcb8e7ccb4.tar.gz |
[clangd] Penalize file-scope symbols in the ranking for non-completion queries
Patch by Nathan Ridge!
Differential Revision: https://reviews.llvm.org/D56653
git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@352868 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | clangd/Quality.cpp | 21 | ||||
-rw-r--r-- | unittests/clangd/QualityTests.cpp | 12 |
2 files changed, 28 insertions, 5 deletions
diff --git a/clangd/Quality.cpp b/clangd/Quality.cpp index e9e8ff0a..50e3f7ee 100644 --- a/clangd/Quality.cpp +++ b/clangd/Quality.cpp @@ -282,12 +282,12 @@ computeScope(const NamedDecl *D) { } void SymbolRelevanceSignals::merge(const Symbol &IndexResult) { - // FIXME: Index results always assumed to be at global scope. If Scope becomes - // relevant to non-completion requests, we should recognize class members etc. - SymbolURI = IndexResult.CanonicalDeclaration.FileURI; SymbolScope = IndexResult.Scope; IsInstanceMember |= isInstanceMember(IndexResult.SymInfo); + if (!(IndexResult.Flags & Symbol::VisibleOutsideFile)) { + Scope = AccessibleScope::FileScope; + } } void SymbolRelevanceSignals::merge(const CodeCompletionResult &SemaCCResult) { @@ -365,7 +365,7 @@ float SymbolRelevanceSignals::evaluate() const { case GlobalScope: break; case FileScope: - Score *= 1.5; + Score *= 1.5f; break; case ClassScope: Score *= 2; @@ -374,6 +374,19 @@ float SymbolRelevanceSignals::evaluate() const { Score *= 4; break; } + } else { + // For non-completion queries, the wider the scope where a symbol is + // visible, the more likely it is to be relevant. + switch (Scope) { + case GlobalScope: + break; + case FileScope: + Score *= 0.5f; + break; + default: + // TODO: Handle other scopes as we start to use them for index results. + break; + } } if (TypeMatchesPreferred) diff --git a/unittests/clangd/QualityTests.cpp b/unittests/clangd/QualityTests.cpp index 259d296d..5ae6dd57 100644 --- a/unittests/clangd/QualityTests.cpp +++ b/unittests/clangd/QualityTests.cpp @@ -178,6 +178,16 @@ TEST(QualityTests, SymbolRelevanceSignalExtraction) { BaseMember.InBaseClass = true; Relevance.merge(BaseMember); EXPECT_TRUE(Relevance.InBaseClass); + + auto Index = Test.index(); + Symbol X; + FuzzyFindRequest Req; + Req.Query = "X"; + Req.AnyScope = true; + Index->fuzzyFind(Req, [&X](const Symbol& S){ X = S; }); + Relevance = {}; + Relevance.merge(X); + EXPECT_EQ(Relevance.Scope, SymbolRelevanceSignals::FileScope); } // Do the signals move the scores in the direction we expect? @@ -264,7 +274,7 @@ TEST(QualityTests, SymbolRelevanceSignalsSanity) { SymbolRelevanceSignals Scoped; Scoped.Scope = SymbolRelevanceSignals::FileScope; - EXPECT_EQ(Scoped.evaluate(), Default.evaluate()); + EXPECT_LT(Scoped.evaluate(), Default.evaluate()); Scoped.Query = SymbolRelevanceSignals::CodeComplete; EXPECT_GT(Scoped.evaluate(), Default.evaluate()); |