Skip to content

Commit d7de811

Browse files
author
Eric Liu
committedJul 24, 2018
[clangd] Tune down quality score for class constructors so that it's ranked after class types.
Summary: Currently, class constructors have the same score as the class types, and they are often ranked before class types. This is often not desireable and can be annoying when snippet is enabled and constructor signatures are added. Metrics: ``` ================================================================================================== OVERALL ================================================================================================== Total measurements: 111117 (+0) All measurements: MRR: 64.06 (+0.20) Top-5: 75.73% (+0.14%) Top-100: 93.71% (+0.01%) Full identifiers: MRR: 98.25 (+0.55) Top-5: 99.04% (+0.03%) Top-100: 99.16% (+0.00%) Filter length 0-5: MRR: 15.23 (+0.02) 50.50 (-0.02) 65.04 (+0.11) 70.75 (+0.19) 74.37 (+0.25) 79.43 (+0.32) Top-5: 40.90% (+0.03%) 74.52% (+0.03%) 87.23% (+0.15%) 91.68% (+0.08%) 93.68% (+0.14%) 95.87% (+0.12%) Top-100: 68.21% (+0.02%) 96.28% (+0.07%) 98.43% (+0.00%) 98.72% (+0.00%) 98.74% (+0.01%) 98.81% (+0.00%) ================================================================================================== DEFAULT ================================================================================================== Total measurements: 57535 (+0) All measurements: MRR: 58.07 (+0.37) Top-5: 69.94% (+0.26%) Top-100: 90.14% (+0.03%) Full identifiers: MRR: 97.13 (+1.05) Top-5: 98.14% (+0.06%) Top-100: 98.34% (+0.00%) Filter length 0-5: MRR: 13.91 (+0.00) 38.53 (+0.01) 55.58 (+0.21) 63.63 (+0.30) 69.23 (+0.47) 72.87 (+0.60) Top-5: 24.99% (+0.00%) 62.70% (+0.06%) 82.80% (+0.30%) 88.66% (+0.16%) 92.02% (+0.27%) 93.53% (+0.21%) Top-100: 51.56% (+0.05%) 93.19% (+0.13%) 97.30% (+0.00%) 97.81% (+0.00%) 97.85% (+0.01%) 97.79% (+0.00%) ``` Remark: - The full-id completions have +1.05 MRR improvement. - There is no noticeable impact on EXPLICIT_MEMBER_ACCESS and WANT_LOCAL. Reviewers: sammccall Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, cfe-commits Differential Revision: https://reviews.llvm.org/D49667 llvm-svn: 337816
1 parent d55661d commit d7de811

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed
 

Diff for: ‎clang-tools-extra/clangd/Quality.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ static SymbolQualitySignals::SymbolCategory categorize(const NamedDecl &ND) {
6767
MAP(TypeDecl, Type);
6868
MAP(TypeAliasTemplateDecl, Type);
6969
MAP(ClassTemplateDecl, Type);
70+
MAP(CXXConstructorDecl, Constructor);
7071
MAP(ValueDecl, Variable);
7172
MAP(VarTemplateDecl, Variable);
7273
MAP(FunctionDecl, Function);
@@ -96,6 +97,8 @@ categorize(const CodeCompletionResult &R) {
9697
return SymbolQualitySignals::Type;
9798
case CXCursor_MemberRef:
9899
return SymbolQualitySignals::Variable;
100+
case CXCursor_Constructor:
101+
return SymbolQualitySignals::Constructor;
99102
default:
100103
return SymbolQualitySignals::Keyword;
101104
}
@@ -124,10 +127,11 @@ categorize(const index::SymbolInfo &D) {
124127
case index::SymbolKind::InstanceProperty:
125128
case index::SymbolKind::ClassProperty:
126129
case index::SymbolKind::StaticProperty:
127-
case index::SymbolKind::Constructor:
128130
case index::SymbolKind::Destructor:
129131
case index::SymbolKind::ConversionFunction:
130132
return SymbolQualitySignals::Function;
133+
case index::SymbolKind::Constructor:
134+
return SymbolQualitySignals::Constructor;
131135
case index::SymbolKind::Variable:
132136
case index::SymbolKind::Field:
133137
case index::SymbolKind::EnumConstant:
@@ -210,6 +214,7 @@ float SymbolQualitySignals::evaluate() const {
210214
Score *= 0.2f;
211215
break;
212216
case Unknown:
217+
case Constructor: // No boost constructors so they are after class types.
213218
break;
214219
}
215220

Diff for: ‎clang-tools-extra/clangd/Quality.h

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ struct SymbolQualitySignals {
5858
Macro,
5959
Type,
6060
Function,
61+
Constructor,
6162
Namespace,
6263
Keyword,
6364
} Category = Unknown;

Diff for: ‎clang-tools-extra/unittests/clangd/QualityTests.cpp

+30-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "TestTU.h"
2424
#include "clang/AST/Decl.h"
2525
#include "clang/AST/DeclCXX.h"
26+
#include "clang/AST/Type.h"
2627
#include "clang/Sema/CodeCompleteConsumer.h"
2728
#include "llvm/Support/Casting.h"
2829
#include "gmock/gmock.h"
@@ -185,13 +186,16 @@ TEST(QualityTests, SymbolQualitySignalsSanity) {
185186
EXPECT_GT(WithReferences.evaluate(), Default.evaluate());
186187
EXPECT_GT(ManyReferences.evaluate(), WithReferences.evaluate());
187188

188-
SymbolQualitySignals Keyword, Variable, Macro;
189+
SymbolQualitySignals Keyword, Variable, Macro, Constructor, Function;
189190
Keyword.Category = SymbolQualitySignals::Keyword;
190191
Variable.Category = SymbolQualitySignals::Variable;
191192
Macro.Category = SymbolQualitySignals::Macro;
193+
Constructor.Category = SymbolQualitySignals::Constructor;
194+
Function.Category = SymbolQualitySignals::Function;
192195
EXPECT_GT(Variable.evaluate(), Default.evaluate());
193196
EXPECT_GT(Keyword.evaluate(), Variable.evaluate());
194197
EXPECT_LT(Macro.evaluate(), Default.evaluate());
198+
EXPECT_LT(Constructor.evaluate(), Function.evaluate());
195199
}
196200

197201
TEST(QualityTests, SymbolRelevanceSignalsSanity) {
@@ -317,6 +321,31 @@ TEST(QualityTests, IsInstanceMember) {
317321
EXPECT_TRUE(Rel.IsInstanceMember);
318322
}
319323

324+
TEST(QualityTests, ConstructorQuality) {
325+
auto Header = TestTU::withHeaderCode(R"cpp(
326+
class Foo {
327+
public:
328+
Foo(int);
329+
};
330+
)cpp");
331+
auto Symbols = Header.headerSymbols();
332+
auto AST = Header.build();
333+
334+
const NamedDecl *CtorDecl = &findAnyDecl(AST, [](const NamedDecl &ND) {
335+
return (ND.getQualifiedNameAsString() == "Foo::Foo") &&
336+
llvm::isa<CXXConstructorDecl>(&ND);
337+
});
338+
339+
SymbolQualitySignals Q;
340+
Q.merge(CodeCompletionResult(CtorDecl, /*Priority=*/0));
341+
EXPECT_EQ(Q.Category, SymbolQualitySignals::Constructor);
342+
343+
Q.Category = SymbolQualitySignals::Unknown;
344+
const Symbol &CtorSym = findSymbol(Symbols, "Foo::Foo");
345+
Q.merge(CtorSym);
346+
EXPECT_EQ(Q.Category, SymbolQualitySignals::Constructor);
347+
}
348+
320349
} // namespace
321350
} // namespace clangd
322351
} // namespace clang

0 commit comments

Comments
 (0)
Please sign in to comment.