[PATCH] D47787: [clangd] Adjust symbol score based on crude symbol type.
This revision was automatically updated to reflect the committed changes. sammccall marked an inline comment as done. Closed by commit rL334074: Adjust symbol score based on crude symbol type. (authored by sammccall, committed by ). Herald added a subscriber: llvm-commits. Changed prior to commit: https://reviews.llvm.org/D47787?vs=15=150090#toc Repository: rL LLVM https://reviews.llvm.org/D47787 Files: clang-tools-extra/trunk/clangd/Quality.cpp clang-tools-extra/trunk/clangd/Quality.h clang-tools-extra/trunk/unittests/clangd/QualityTests.cpp Index: clang-tools-extra/trunk/unittests/clangd/QualityTests.cpp === --- clang-tools-extra/trunk/unittests/clangd/QualityTests.cpp +++ clang-tools-extra/trunk/unittests/clangd/QualityTests.cpp @@ -41,20 +41,23 @@ EXPECT_FALSE(Quality.Deprecated); EXPECT_EQ(Quality.SemaCCPriority, SymbolQualitySignals().SemaCCPriority); EXPECT_EQ(Quality.References, SymbolQualitySignals().References); + EXPECT_EQ(Quality.Category, SymbolQualitySignals::Variable); Symbol F = findSymbol(Symbols, "f"); F.References = 24; // TestTU doesn't count references, so fake it. Quality = {}; Quality.merge(F); EXPECT_FALSE(Quality.Deprecated); // FIXME: Include deprecated bit in index. EXPECT_EQ(Quality.SemaCCPriority, SymbolQualitySignals().SemaCCPriority); EXPECT_EQ(Quality.References, 24u); + EXPECT_EQ(Quality.Category, SymbolQualitySignals::Function); Quality = {}; Quality.merge(CodeCompletionResult((AST, "f"), /*Priority=*/42)); EXPECT_TRUE(Quality.Deprecated); EXPECT_EQ(Quality.SemaCCPriority, 42u); EXPECT_EQ(Quality.References, SymbolQualitySignals().References); + EXPECT_EQ(Quality.Category, SymbolQualitySignals::Function); } TEST(QualityTests, SymbolRelevanceSignalExtraction) { @@ -123,6 +126,12 @@ HighPriority.SemaCCPriority = 20; EXPECT_GT(HighPriority.evaluate(), Default.evaluate()); EXPECT_LT(LowPriority.evaluate(), Default.evaluate()); + + SymbolQualitySignals Variable, Macro; + Variable.Category = SymbolQualitySignals::Variable; + Macro.Category = SymbolQualitySignals::Macro; + EXPECT_GT(Variable.evaluate(), Default.evaluate()); + EXPECT_LT(Macro.evaluate(), Default.evaluate()); } TEST(QualityTests, SymbolRelevanceSignalsSanity) { Index: clang-tools-extra/trunk/clangd/Quality.h === --- clang-tools-extra/trunk/clangd/Quality.h +++ clang-tools-extra/trunk/clangd/Quality.h @@ -50,6 +50,15 @@ bool Deprecated = false; unsigned References = 0; + enum SymbolCategory { +Variable, +Macro, +Type, +Function, +Namespace, +Unknown, + } Category = Unknown; + void merge(const CodeCompletionResult ); void merge(const Symbol ); Index: clang-tools-extra/trunk/clangd/Quality.cpp === --- clang-tools-extra/trunk/clangd/Quality.cpp +++ clang-tools-extra/trunk/clangd/Quality.cpp @@ -9,6 +9,7 @@ #include "Quality.h" #include "index/Index.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/DeclVisitor.h" #include "clang/Basic/SourceManager.h" #include "clang/Sema/CodeCompleteConsumer.h" #include "llvm/Support/FormatVariadic.h" @@ -29,14 +30,82 @@ return false; } +static SymbolQualitySignals::SymbolCategory categorize(const NamedDecl ) { + class Switch + : public ConstDeclVisitor { + public: +#define MAP(DeclType, Category)\ + SymbolQualitySignals::SymbolCategory Visit##DeclType(const DeclType *) { \ +return SymbolQualitySignals::Category; \ + } +MAP(NamespaceDecl, Namespace); +MAP(NamespaceAliasDecl, Namespace); +MAP(TypeDecl, Type); +MAP(TypeAliasTemplateDecl, Type); +MAP(ClassTemplateDecl, Type); +MAP(ValueDecl, Variable); +MAP(VarTemplateDecl, Variable); +MAP(FunctionDecl, Function); +MAP(FunctionTemplateDecl, Function); +MAP(Decl, Unknown); +#undef MAP + }; + return Switch().Visit(); +} + +static SymbolQualitySignals::SymbolCategory +categorize(const index::SymbolInfo ) { + switch (D.Kind) { +case index::SymbolKind::Namespace: +case index::SymbolKind::NamespaceAlias: + return SymbolQualitySignals::Namespace; +case index::SymbolKind::Macro: + return SymbolQualitySignals::Macro; +case index::SymbolKind::Enum: +case index::SymbolKind::Struct: +case index::SymbolKind::Class: +case index::SymbolKind::Protocol: +case index::SymbolKind::Extension: +case index::SymbolKind::Union: +case index::SymbolKind::TypeAlias: + return SymbolQualitySignals::Type; +case index::SymbolKind::Function: +case index::SymbolKind::ClassMethod: +case index::SymbolKind::InstanceMethod: +case index::SymbolKind::StaticMethod: +case index::SymbolKind::InstanceProperty: +case
[PATCH] D47787: [clangd] Adjust symbol score based on crude symbol type.
sammccall created this revision. sammccall added a reviewer: ioeric. Herald added subscribers: cfe-commits, jkorous, MaskRay, ilya-biryukov. Numbers are guesses to be adjusted later. Repository: rCTE Clang Tools Extra https://reviews.llvm.org/D47787 Files: clangd/Quality.cpp clangd/Quality.h unittests/clangd/QualityTests.cpp Index: unittests/clangd/QualityTests.cpp === --- unittests/clangd/QualityTests.cpp +++ unittests/clangd/QualityTests.cpp @@ -41,20 +41,23 @@ EXPECT_FALSE(Quality.Deprecated); EXPECT_EQ(Quality.SemaCCPriority, SymbolQualitySignals().SemaCCPriority); EXPECT_EQ(Quality.References, SymbolQualitySignals().References); + EXPECT_EQ(Quality.Category, SymbolQualitySignals::Variable); Symbol F = findSymbol(Symbols, "f"); F.References = 24; // TestTU doesn't count references, so fake it. Quality = {}; Quality.merge(F); EXPECT_FALSE(Quality.Deprecated); // FIXME: Include deprecated bit in index. EXPECT_EQ(Quality.SemaCCPriority, SymbolQualitySignals().SemaCCPriority); EXPECT_EQ(Quality.References, 24u); + EXPECT_EQ(Quality.Category, SymbolQualitySignals::Function); Quality = {}; Quality.merge(CodeCompletionResult((AST, "f"), /*Priority=*/42)); EXPECT_TRUE(Quality.Deprecated); EXPECT_EQ(Quality.SemaCCPriority, 42u); EXPECT_EQ(Quality.References, SymbolQualitySignals().References); + EXPECT_EQ(Quality.Category, SymbolQualitySignals::Function); } TEST(QualityTests, SymbolRelevanceSignalExtraction) { @@ -123,6 +126,12 @@ HighPriority.SemaCCPriority = 20; EXPECT_GT(HighPriority.evaluate(), Default.evaluate()); EXPECT_LT(LowPriority.evaluate(), Default.evaluate()); + + SymbolQualitySignals Variable, Macro; + Variable.Category = SymbolQualitySignals::Variable; + Macro.Category = SymbolQualitySignals::Macro; + EXPECT_GT(Variable.evaluate(), Default.evaluate()); + EXPECT_LT(Macro.evaluate(), Default.evaluate()); } TEST(QualityTests, SymbolRelevanceSignalsSanity) { Index: clangd/Quality.h === --- clangd/Quality.h +++ clangd/Quality.h @@ -50,6 +50,15 @@ bool Deprecated = false; unsigned References = 0; + enum SymbolCategory { +Variable, +Macro, +Type, +Function, +Namespace, +Unknown, + } Category = Unknown; + void merge(const CodeCompletionResult ); void merge(const Symbol ); Index: clangd/Quality.cpp === --- clangd/Quality.cpp +++ clangd/Quality.cpp @@ -9,6 +9,7 @@ #include "Quality.h" #include "index/Index.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/DeclVisitor.h" #include "clang/Basic/SourceManager.h" #include "clang/Sema/CodeCompleteConsumer.h" #include "llvm/Support/FormatVariadic.h" @@ -29,14 +30,82 @@ return false; } +static SymbolQualitySignals::SymbolCategory categorize(const NamedDecl ) { + class Switch + : public ConstDeclVisitor { + public: +#define MAP(DeclType, Category)\ + SymbolQualitySignals::SymbolCategory Visit##DeclType(const DeclType *) { \ +return SymbolQualitySignals::Category;\ + } + +MAP(NamespaceDecl, Namespace); +MAP(NamespaceAliasDecl, Namespace); +MAP(TypeDecl, Type); +MAP(TypeAliasTemplateDecl, Type); +MAP(ClassTemplateDecl, Type); +MAP(ValueDecl, Variable); +MAP(VarTemplateDecl, Variable); +MAP(FunctionDecl, Function); +MAP(FunctionTemplateDecl, Function); +MAP(Decl, Unknown); + }; + return Switch().Visit(); +} + +static SymbolQualitySignals::SymbolCategory +categorize(const index::SymbolInfo ) { + switch (D.Kind) { +case index::SymbolKind::Namespace: +case index::SymbolKind::NamespaceAlias: + return SymbolQualitySignals::Namespace; +case index::SymbolKind::Macro: + return SymbolQualitySignals::Macro; +case index::SymbolKind::Enum: +case index::SymbolKind::Struct: +case index::SymbolKind::Class: +case index::SymbolKind::Protocol: +case index::SymbolKind::Extension: +case index::SymbolKind::Union: +case index::SymbolKind::TypeAlias: + return SymbolQualitySignals::Type; +case index::SymbolKind::Function: +case index::SymbolKind::ClassMethod: +case index::SymbolKind::InstanceMethod: +case index::SymbolKind::StaticMethod: +case index::SymbolKind::InstanceProperty: +case index::SymbolKind::ClassProperty: +case index::SymbolKind::StaticProperty: +case index::SymbolKind::Constructor: +case index::SymbolKind::Destructor: +case index::SymbolKind::ConversionFunction: + return SymbolQualitySignals::Function; +case index::SymbolKind::Variable: +case index::SymbolKind::Field: +case index::SymbolKind::EnumConstant: +case index::SymbolKind::Parameter: +