forked from OSchip/llvm-project
[clangd] Boost keyword completions.
Summary: These have few signals other than being keywords, so the boost is high. Reviewers: ilya-biryukov Subscribers: ioeric, MaskRay, jkorous, cfe-commits Differential Revision: https://reviews.llvm.org/D48083 llvm-svn: 334711
This commit is contained in:
parent
cc7344aae3
commit
c3b5bad723
|
@ -59,6 +59,29 @@ static SymbolQualitySignals::SymbolCategory categorize(const NamedDecl &ND) {
|
||||||
return Switch().Visit(&ND);
|
return Switch().Visit(&ND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SymbolQualitySignals::SymbolCategory categorize(const CodeCompletionResult &R) {
|
||||||
|
if (R.Declaration)
|
||||||
|
return categorize(*R.Declaration);
|
||||||
|
if (R.Kind == CodeCompletionResult::RK_Macro)
|
||||||
|
return SymbolQualitySignals::Macro;
|
||||||
|
// Everything else is a keyword or a pattern. Patterns are mostly keywords
|
||||||
|
// too, except a few which we recognize by cursor kind.
|
||||||
|
switch (R.CursorKind) {
|
||||||
|
case CXCursor_CXXMethod:
|
||||||
|
return SymbolQualitySignals::Function;
|
||||||
|
case CXCursor_ModuleImportDecl:
|
||||||
|
return SymbolQualitySignals::Namespace;
|
||||||
|
case CXCursor_MacroDefinition:
|
||||||
|
return SymbolQualitySignals::Macro;
|
||||||
|
case CXCursor_TypeRef:
|
||||||
|
return SymbolQualitySignals::Type;
|
||||||
|
case CXCursor_MemberRef:
|
||||||
|
return SymbolQualitySignals::Variable;
|
||||||
|
default:
|
||||||
|
return SymbolQualitySignals::Keyword;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static SymbolQualitySignals::SymbolCategory
|
static SymbolQualitySignals::SymbolCategory
|
||||||
categorize(const index::SymbolInfo &D) {
|
categorize(const index::SymbolInfo &D) {
|
||||||
switch (D.Kind) {
|
switch (D.Kind) {
|
||||||
|
@ -103,10 +126,7 @@ void SymbolQualitySignals::merge(const CodeCompletionResult &SemaCCResult) {
|
||||||
if (SemaCCResult.Availability == CXAvailability_Deprecated)
|
if (SemaCCResult.Availability == CXAvailability_Deprecated)
|
||||||
Deprecated = true;
|
Deprecated = true;
|
||||||
|
|
||||||
if (SemaCCResult.Declaration)
|
Category = categorize(SemaCCResult);
|
||||||
Category = categorize(*SemaCCResult.Declaration);
|
|
||||||
else if (SemaCCResult.Kind == CodeCompletionResult::RK_Macro)
|
|
||||||
Category = Macro;
|
|
||||||
|
|
||||||
if (SemaCCResult.Declaration) {
|
if (SemaCCResult.Declaration) {
|
||||||
if (auto *ID = SemaCCResult.Declaration->getIdentifier())
|
if (auto *ID = SemaCCResult.Declaration->getIdentifier())
|
||||||
|
@ -135,6 +155,9 @@ float SymbolQualitySignals::evaluate() const {
|
||||||
Score *= 0.1f;
|
Score *= 0.1f;
|
||||||
|
|
||||||
switch (Category) {
|
switch (Category) {
|
||||||
|
case Keyword: // Usually relevant, but misses most signals.
|
||||||
|
Score *= 10;
|
||||||
|
break;
|
||||||
case Type:
|
case Type:
|
||||||
case Function:
|
case Function:
|
||||||
case Variable:
|
case Variable:
|
||||||
|
|
|
@ -50,12 +50,13 @@ struct SymbolQualitySignals {
|
||||||
unsigned References = 0;
|
unsigned References = 0;
|
||||||
|
|
||||||
enum SymbolCategory {
|
enum SymbolCategory {
|
||||||
|
Unknown = 0,
|
||||||
Variable,
|
Variable,
|
||||||
Macro,
|
Macro,
|
||||||
Type,
|
Type,
|
||||||
Function,
|
Function,
|
||||||
Namespace,
|
Namespace,
|
||||||
Unknown,
|
Keyword,
|
||||||
} Category = Unknown;
|
} Category = Unknown;
|
||||||
|
|
||||||
void merge(const CodeCompletionResult &SemaCCResult);
|
void merge(const CodeCompletionResult &SemaCCResult);
|
||||||
|
|
|
@ -58,6 +58,10 @@ TEST(QualityTests, SymbolQualitySignalExtraction) {
|
||||||
EXPECT_FALSE(Quality.ReservedName);
|
EXPECT_FALSE(Quality.ReservedName);
|
||||||
EXPECT_EQ(Quality.References, SymbolQualitySignals().References);
|
EXPECT_EQ(Quality.References, SymbolQualitySignals().References);
|
||||||
EXPECT_EQ(Quality.Category, SymbolQualitySignals::Function);
|
EXPECT_EQ(Quality.Category, SymbolQualitySignals::Function);
|
||||||
|
|
||||||
|
Quality = {};
|
||||||
|
Quality.merge(CodeCompletionResult("if"));
|
||||||
|
EXPECT_EQ(Quality.Category, SymbolQualitySignals::Keyword);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(QualityTests, SymbolRelevanceSignalExtraction) {
|
TEST(QualityTests, SymbolRelevanceSignalExtraction) {
|
||||||
|
@ -125,10 +129,12 @@ TEST(QualityTests, SymbolQualitySignalsSanity) {
|
||||||
EXPECT_GT(WithReferences.evaluate(), Default.evaluate());
|
EXPECT_GT(WithReferences.evaluate(), Default.evaluate());
|
||||||
EXPECT_GT(ManyReferences.evaluate(), WithReferences.evaluate());
|
EXPECT_GT(ManyReferences.evaluate(), WithReferences.evaluate());
|
||||||
|
|
||||||
SymbolQualitySignals Variable, Macro;
|
SymbolQualitySignals Keyword, Variable, Macro;
|
||||||
|
Keyword.Category = SymbolQualitySignals::Keyword;
|
||||||
Variable.Category = SymbolQualitySignals::Variable;
|
Variable.Category = SymbolQualitySignals::Variable;
|
||||||
Macro.Category = SymbolQualitySignals::Macro;
|
Macro.Category = SymbolQualitySignals::Macro;
|
||||||
EXPECT_GT(Variable.evaluate(), Default.evaluate());
|
EXPECT_GT(Variable.evaluate(), Default.evaluate());
|
||||||
|
EXPECT_GT(Keyword.evaluate(), Variable.evaluate());
|
||||||
EXPECT_LT(Macro.evaluate(), Default.evaluate());
|
EXPECT_LT(Macro.evaluate(), Default.evaluate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue