summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang-tools-extra/clangd/Quality.cpp31
-rw-r--r--clang-tools-extra/clangd/Quality.h3
-rw-r--r--clang-tools-extra/unittests/clangd/QualityTests.cpp8
3 files changed, 36 insertions, 6 deletions
diff --git a/clang-tools-extra/clangd/Quality.cpp b/clang-tools-extra/clangd/Quality.cpp
index e42fca4e344..fb67c3a9643 100644
--- a/clang-tools-extra/clangd/Quality.cpp
+++ b/clang-tools-extra/clangd/Quality.cpp
@@ -59,6 +59,29 @@ static SymbolQualitySignals::SymbolCategory categorize(const NamedDecl &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
categorize(const index::SymbolInfo &D) {
switch (D.Kind) {
@@ -103,10 +126,7 @@ void SymbolQualitySignals::merge(const CodeCompletionResult &SemaCCResult) {
if (SemaCCResult.Availability == CXAvailability_Deprecated)
Deprecated = true;
- if (SemaCCResult.Declaration)
- Category = categorize(*SemaCCResult.Declaration);
- else if (SemaCCResult.Kind == CodeCompletionResult::RK_Macro)
- Category = Macro;
+ Category = categorize(SemaCCResult);
if (SemaCCResult.Declaration) {
if (auto *ID = SemaCCResult.Declaration->getIdentifier())
@@ -135,6 +155,9 @@ float SymbolQualitySignals::evaluate() const {
Score *= 0.1f;
switch (Category) {
+ case Keyword: // Usually relevant, but misses most signals.
+ Score *= 10;
+ break;
case Type:
case Function:
case Variable:
diff --git a/clang-tools-extra/clangd/Quality.h b/clang-tools-extra/clangd/Quality.h
index ca1f1bf9126..0e0b6df6ba8 100644
--- a/clang-tools-extra/clangd/Quality.h
+++ b/clang-tools-extra/clangd/Quality.h
@@ -50,12 +50,13 @@ struct SymbolQualitySignals {
unsigned References = 0;
enum SymbolCategory {
+ Unknown = 0,
Variable,
Macro,
Type,
Function,
Namespace,
- Unknown,
+ Keyword,
} Category = Unknown;
void merge(const CodeCompletionResult &SemaCCResult);
diff --git a/clang-tools-extra/unittests/clangd/QualityTests.cpp b/clang-tools-extra/unittests/clangd/QualityTests.cpp
index 097fd323155..7238bf68fa7 100644
--- a/clang-tools-extra/unittests/clangd/QualityTests.cpp
+++ b/clang-tools-extra/unittests/clangd/QualityTests.cpp
@@ -58,6 +58,10 @@ TEST(QualityTests, SymbolQualitySignalExtraction) {
EXPECT_FALSE(Quality.ReservedName);
EXPECT_EQ(Quality.References, SymbolQualitySignals().References);
EXPECT_EQ(Quality.Category, SymbolQualitySignals::Function);
+
+ Quality = {};
+ Quality.merge(CodeCompletionResult("if"));
+ EXPECT_EQ(Quality.Category, SymbolQualitySignals::Keyword);
}
TEST(QualityTests, SymbolRelevanceSignalExtraction) {
@@ -125,10 +129,12 @@ TEST(QualityTests, SymbolQualitySignalsSanity) {
EXPECT_GT(WithReferences.evaluate(), Default.evaluate());
EXPECT_GT(ManyReferences.evaluate(), WithReferences.evaluate());
- SymbolQualitySignals Variable, Macro;
+ SymbolQualitySignals Keyword, Variable, Macro;
+ Keyword.Category = SymbolQualitySignals::Keyword;
Variable.Category = SymbolQualitySignals::Variable;
Macro.Category = SymbolQualitySignals::Macro;
EXPECT_GT(Variable.evaluate(), Default.evaluate());
+ EXPECT_GT(Keyword.evaluate(), Variable.evaluate());
EXPECT_LT(Macro.evaluate(), Default.evaluate());
}
OpenPOWER on IntegriCloud