[PATCH] D47787: [clangd] Adjust symbol score based on crude symbol type.

2018-06-06 Thread Sam McCall via Phabricator via cfe-commits
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.

2018-06-05 Thread Sam McCall via Phabricator via cfe-commits
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:
+