[PATCH] D73696: [clang][Index] Introduce a TemplateParm SymbolKind

2020-02-14 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet marked 3 inline comments as done.
kadircet added inline comments.



Comment at: clang-tools-extra/clangd/CodeComplete.cpp:98
+  case SK::TemplateTypeParm:
+  case SK::TemplateTemplateParm:
 return CompletionItemKind::Class;

hokein wrote:
> I think these two should belong to `CompletionItemKind::TypeParameter`?
right, moved the ones below but forgot to move these :D thanks!



Comment at: clang/lib/Index/IndexSymbol.cpp:360
   break;
+case Decl::TemplateTypeParm:
+  Info.Kind = SymbolKind::TemplateTypeParm;

hokein wrote:
> nit: could we move these newly-added lines above the `case 
> Decl::ClassTemplatePartialSpecialization:`. I think we usually put the 
> `llvm_unreachable` cases at the end of switch statement..
yes but this one is specially, there's also a default label below.

Also the unreachable ones are for making sure certain `valid` types don't 
arrive in here rather than checking for `invalid` types are passed.
We usually put the unreachable to the end if it is protecting against invalid 
usages, I believe.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D73696/new/

https://reviews.llvm.org/D73696



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D73696: [clang][Index] Introduce a TemplateParm SymbolKind

2020-02-14 Thread Kadir Cetinkaya via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG84240e0db8ab: [clang][Index] Introduce a TemplateParm 
SymbolKind (authored by kadircet).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D73696/new/

https://reviews.llvm.org/D73696

Files:
  clang-tools-extra/clangd/CodeComplete.cpp
  clang-tools-extra/clangd/Hover.cpp
  clang-tools-extra/clangd/Protocol.cpp
  clang-tools-extra/clangd/Quality.cpp
  clang-tools-extra/clangd/unittests/HoverTests.cpp
  clang/include/clang/Index/IndexSymbol.h
  clang/lib/Index/IndexSymbol.cpp
  clang/tools/libclang/CXIndexDataConsumer.cpp
  clang/unittests/Index/IndexTests.cpp

Index: clang/unittests/Index/IndexTests.cpp
===
--- clang/unittests/Index/IndexTests.cpp
+++ clang/unittests/Index/IndexTests.cpp
@@ -249,8 +249,13 @@
   Index->Symbols.clear();
   tooling::runToolOnCode(std::make_unique(Index, Opts), Code);
   EXPECT_THAT(Index->Symbols,
-  AllOf(Contains(QName("Foo::T")), Contains(QName("Foo::I")),
-Contains(QName("Foo::C")), Contains(QName("Foo::NoRef";
+  AllOf(Contains(AllOf(QName("Foo::T"),
+   Kind(SymbolKind::TemplateTypeParm))),
+Contains(AllOf(QName("Foo::I"),
+   Kind(SymbolKind::NonTypeTemplateParm))),
+Contains(AllOf(QName("Foo::C"),
+   Kind(SymbolKind::TemplateTemplateParm))),
+Contains(QName("Foo::NoRef";
 }
 
 TEST(IndexTest, UsingDecls) {
Index: clang/tools/libclang/CXIndexDataConsumer.cpp
===
--- clang/tools/libclang/CXIndexDataConsumer.cpp
+++ clang/tools/libclang/CXIndexDataConsumer.cpp
@@ -1245,6 +1245,9 @@
   case SymbolKind::Macro:
   case SymbolKind::ClassProperty:
   case SymbolKind::Using:
+  case SymbolKind::TemplateTypeParm:
+  case SymbolKind::TemplateTemplateParm:
+  case SymbolKind::NonTypeTemplateParm:
 return CXIdxEntity_Unexposed;
 
   case SymbolKind::Enum: return CXIdxEntity_Enum;
Index: clang/lib/Index/IndexSymbol.cpp
===
--- clang/lib/Index/IndexSymbol.cpp
+++ clang/lib/Index/IndexSymbol.cpp
@@ -357,6 +357,15 @@
 case Decl::VarTemplate:
   llvm_unreachable("variables handled before");
   break;
+case Decl::TemplateTypeParm:
+  Info.Kind = SymbolKind::TemplateTypeParm;
+  break;
+case Decl::TemplateTemplateParm:
+  Info.Kind = SymbolKind::TemplateTemplateParm;
+  break;
+case Decl::NonTypeTemplateParm:
+  Info.Kind = SymbolKind::NonTypeTemplateParm;
+  break;
 // Other decls get the 'unknown' kind.
 default:
   break;
@@ -517,6 +526,9 @@
   case SymbolKind::ConversionFunction: return "conversion-func";
   case SymbolKind::Parameter: return "param";
   case SymbolKind::Using: return "using";
+  case SymbolKind::TemplateTypeParm: return "template-type-param";
+  case SymbolKind::TemplateTemplateParm: return "template-template-param";
+  case SymbolKind::NonTypeTemplateParm: return "non-type-template-param";
   }
   llvm_unreachable("invalid symbol kind");
 }
Index: clang/include/clang/Index/IndexSymbol.h
===
--- clang/include/clang/Index/IndexSymbol.h
+++ clang/include/clang/Index/IndexSymbol.h
@@ -54,6 +54,9 @@
 
   Parameter,
   Using,
+  TemplateTypeParm,
+  TemplateTemplateParm,
+  NonTypeTemplateParm,
 };
 
 enum class SymbolLanguage : uint8_t {
Index: clang-tools-extra/clangd/unittests/HoverTests.cpp
===
--- clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -573,6 +573,42 @@
  // pattern.
  HI.Documentation = "comment from primary";
}},
+  {// Template Type Parameter
+   R"cpp(
+  template  void foo();
+  )cpp",
+   [](HoverInfo ) {
+ HI.Name = "T";
+ HI.Kind = index::SymbolKind::TemplateTypeParm;
+ HI.NamespaceScope = "";
+ HI.Definition = "typename T = int";
+ HI.LocalScope = "foo::";
+ HI.Type = "typename";
+   }},
+  {// TemplateTemplate Type Parameter
+   R"cpp(
+  template  class [[^T]]> void foo();
+  )cpp",
+   [](HoverInfo ) {
+ HI.Name = "T";
+ HI.Kind = index::SymbolKind::TemplateTemplateParm;
+ HI.NamespaceScope = "";
+ HI.Definition = "template  class T";
+ HI.LocalScope = "foo::";
+ HI.Type = "template  class";
+   }},
+  {// NonType Template Parameter
+   R"cpp(
+  template  void foo();
+  )cpp",
+   [](HoverInfo ) {
+ HI.Name = "T";
+ HI.Kind = 

[PATCH] D73696: [clang][Index] Introduce a TemplateParm SymbolKind

2020-02-14 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet updated this revision to Diff 244619.
kadircet marked an inline comment as done.
kadircet added a comment.

- Address comments


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D73696/new/

https://reviews.llvm.org/D73696

Files:
  clang-tools-extra/clangd/CodeComplete.cpp
  clang-tools-extra/clangd/Hover.cpp
  clang-tools-extra/clangd/Protocol.cpp
  clang-tools-extra/clangd/Quality.cpp
  clang-tools-extra/clangd/unittests/HoverTests.cpp
  clang/include/clang/Index/IndexSymbol.h
  clang/lib/Index/IndexSymbol.cpp
  clang/tools/libclang/CXIndexDataConsumer.cpp
  clang/unittests/Index/IndexTests.cpp

Index: clang/unittests/Index/IndexTests.cpp
===
--- clang/unittests/Index/IndexTests.cpp
+++ clang/unittests/Index/IndexTests.cpp
@@ -249,8 +249,13 @@
   Index->Symbols.clear();
   tooling::runToolOnCode(std::make_unique(Index, Opts), Code);
   EXPECT_THAT(Index->Symbols,
-  AllOf(Contains(QName("Foo::T")), Contains(QName("Foo::I")),
-Contains(QName("Foo::C")), Contains(QName("Foo::NoRef";
+  AllOf(Contains(AllOf(QName("Foo::T"),
+   Kind(SymbolKind::TemplateTypeParm))),
+Contains(AllOf(QName("Foo::I"),
+   Kind(SymbolKind::NonTypeTemplateParm))),
+Contains(AllOf(QName("Foo::C"),
+   Kind(SymbolKind::TemplateTemplateParm))),
+Contains(QName("Foo::NoRef";
 }
 
 TEST(IndexTest, UsingDecls) {
Index: clang/tools/libclang/CXIndexDataConsumer.cpp
===
--- clang/tools/libclang/CXIndexDataConsumer.cpp
+++ clang/tools/libclang/CXIndexDataConsumer.cpp
@@ -1245,6 +1245,9 @@
   case SymbolKind::Macro:
   case SymbolKind::ClassProperty:
   case SymbolKind::Using:
+  case SymbolKind::TemplateTypeParm:
+  case SymbolKind::TemplateTemplateParm:
+  case SymbolKind::NonTypeTemplateParm:
 return CXIdxEntity_Unexposed;
 
   case SymbolKind::Enum: return CXIdxEntity_Enum;
Index: clang/lib/Index/IndexSymbol.cpp
===
--- clang/lib/Index/IndexSymbol.cpp
+++ clang/lib/Index/IndexSymbol.cpp
@@ -357,6 +357,15 @@
 case Decl::VarTemplate:
   llvm_unreachable("variables handled before");
   break;
+case Decl::TemplateTypeParm:
+  Info.Kind = SymbolKind::TemplateTypeParm;
+  break;
+case Decl::TemplateTemplateParm:
+  Info.Kind = SymbolKind::TemplateTemplateParm;
+  break;
+case Decl::NonTypeTemplateParm:
+  Info.Kind = SymbolKind::NonTypeTemplateParm;
+  break;
 // Other decls get the 'unknown' kind.
 default:
   break;
@@ -517,6 +526,9 @@
   case SymbolKind::ConversionFunction: return "conversion-func";
   case SymbolKind::Parameter: return "param";
   case SymbolKind::Using: return "using";
+  case SymbolKind::TemplateTypeParm: return "template-type-param";
+  case SymbolKind::TemplateTemplateParm: return "template-template-param";
+  case SymbolKind::NonTypeTemplateParm: return "non-type-template-param";
   }
   llvm_unreachable("invalid symbol kind");
 }
Index: clang/include/clang/Index/IndexSymbol.h
===
--- clang/include/clang/Index/IndexSymbol.h
+++ clang/include/clang/Index/IndexSymbol.h
@@ -54,6 +54,9 @@
 
   Parameter,
   Using,
+  TemplateTypeParm,
+  TemplateTemplateParm,
+  NonTypeTemplateParm,
 };
 
 enum class SymbolLanguage : uint8_t {
Index: clang-tools-extra/clangd/unittests/HoverTests.cpp
===
--- clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -573,6 +573,42 @@
  // pattern.
  HI.Documentation = "comment from primary";
}},
+  {// Template Type Parameter
+   R"cpp(
+  template  void foo();
+  )cpp",
+   [](HoverInfo ) {
+ HI.Name = "T";
+ HI.Kind = index::SymbolKind::TemplateTypeParm;
+ HI.NamespaceScope = "";
+ HI.Definition = "typename T = int";
+ HI.LocalScope = "foo::";
+ HI.Type = "typename";
+   }},
+  {// TemplateTemplate Type Parameter
+   R"cpp(
+  template  class [[^T]]> void foo();
+  )cpp",
+   [](HoverInfo ) {
+ HI.Name = "T";
+ HI.Kind = index::SymbolKind::TemplateTemplateParm;
+ HI.NamespaceScope = "";
+ HI.Definition = "template  class T";
+ HI.LocalScope = "foo::";
+ HI.Type = "template  class";
+   }},
+  {// NonType Template Parameter
+   R"cpp(
+  template  void foo();
+  )cpp",
+   [](HoverInfo ) {
+ HI.Name = "T";
+ HI.Kind = index::SymbolKind::NonTypeTemplateParm;
+ 

[PATCH] D73696: [clang][Index] Introduce a TemplateParm SymbolKind

2020-02-14 Thread Haojian Wu via Phabricator via cfe-commits
hokein accepted this revision.
hokein added inline comments.
This revision is now accepted and ready to land.



Comment at: clang-tools-extra/clangd/CodeComplete.cpp:98
+  case SK::TemplateTypeParm:
+  case SK::TemplateTemplateParm:
 return CompletionItemKind::Class;

I think these two should belong to `CompletionItemKind::TypeParameter`?



Comment at: clang/lib/Index/IndexSymbol.cpp:360
   break;
+case Decl::TemplateTypeParm:
+  Info.Kind = SymbolKind::TemplateTypeParm;

nit: could we move these newly-added lines above the `case 
Decl::ClassTemplatePartialSpecialization:`. I think we usually put the 
`llvm_unreachable` cases at the end of switch statement..


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D73696/new/

https://reviews.llvm.org/D73696



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D73696: [clang][Index] Introduce a TemplateParm SymbolKind

2020-02-13 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet added a comment.

ping :)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D73696/new/

https://reviews.llvm.org/D73696



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D73696: [clang][Index] Introduce a TemplateParm SymbolKind

2020-02-07 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet marked an inline comment as done.
kadircet added inline comments.



Comment at: clang-tools-extra/clangd/Protocol.cpp:265
   case index::SymbolKind::Parameter:
+  case index::SymbolKind::TemplateParm:
 return SymbolKind::Variable;

sammccall wrote:
> this seems kind of dubious, maybe worth a comment?
> (If we had the decl here we'd distinguish between type and non-type, right?)
we have all 3 of them now


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D73696/new/

https://reviews.llvm.org/D73696



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D73696: [clang][Index] Introduce a TemplateParm SymbolKind

2020-02-07 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet updated this revision to Diff 243091.
kadircet marked 2 inline comments as done.
kadircet added a comment.

- As discussed offline, do not expose new symbol kinds to libclang
- Set types for templateparms in HoverInfo.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D73696/new/

https://reviews.llvm.org/D73696

Files:
  clang-tools-extra/clangd/CodeComplete.cpp
  clang-tools-extra/clangd/Hover.cpp
  clang-tools-extra/clangd/Protocol.cpp
  clang-tools-extra/clangd/Quality.cpp
  clang-tools-extra/clangd/unittests/HoverTests.cpp
  clang/include/clang/Index/IndexSymbol.h
  clang/lib/Index/IndexSymbol.cpp
  clang/tools/libclang/CXIndexDataConsumer.cpp
  clang/unittests/Index/IndexTests.cpp

Index: clang/unittests/Index/IndexTests.cpp
===
--- clang/unittests/Index/IndexTests.cpp
+++ clang/unittests/Index/IndexTests.cpp
@@ -249,8 +249,13 @@
   Index->Symbols.clear();
   tooling::runToolOnCode(std::make_unique(Index, Opts), Code);
   EXPECT_THAT(Index->Symbols,
-  AllOf(Contains(QName("Foo::T")), Contains(QName("Foo::I")),
-Contains(QName("Foo::C")), Contains(QName("Foo::NoRef";
+  AllOf(Contains(AllOf(QName("Foo::T"),
+   Kind(SymbolKind::TemplateTypeParm))),
+Contains(AllOf(QName("Foo::I"),
+   Kind(SymbolKind::NonTypeTemplateParm))),
+Contains(AllOf(QName("Foo::C"),
+   Kind(SymbolKind::TemplateTemplateParm))),
+Contains(QName("Foo::NoRef";
 }
 
 TEST(IndexTest, UsingDecls) {
Index: clang/tools/libclang/CXIndexDataConsumer.cpp
===
--- clang/tools/libclang/CXIndexDataConsumer.cpp
+++ clang/tools/libclang/CXIndexDataConsumer.cpp
@@ -1245,6 +1245,9 @@
   case SymbolKind::Macro:
   case SymbolKind::ClassProperty:
   case SymbolKind::Using:
+  case SymbolKind::TemplateTypeParm:
+  case SymbolKind::TemplateTemplateParm:
+  case SymbolKind::NonTypeTemplateParm:
 return CXIdxEntity_Unexposed;
 
   case SymbolKind::Enum: return CXIdxEntity_Enum;
Index: clang/lib/Index/IndexSymbol.cpp
===
--- clang/lib/Index/IndexSymbol.cpp
+++ clang/lib/Index/IndexSymbol.cpp
@@ -357,6 +357,15 @@
 case Decl::VarTemplate:
   llvm_unreachable("variables handled before");
   break;
+case Decl::TemplateTypeParm:
+  Info.Kind = SymbolKind::TemplateTypeParm;
+  break;
+case Decl::TemplateTemplateParm:
+  Info.Kind = SymbolKind::TemplateTemplateParm;
+  break;
+case Decl::NonTypeTemplateParm:
+  Info.Kind = SymbolKind::NonTypeTemplateParm;
+  break;
 // Other decls get the 'unknown' kind.
 default:
   break;
@@ -517,6 +526,9 @@
   case SymbolKind::ConversionFunction: return "conversion-func";
   case SymbolKind::Parameter: return "param";
   case SymbolKind::Using: return "using";
+  case SymbolKind::TemplateTypeParm: return "template-type-param";
+  case SymbolKind::TemplateTemplateParm: return "template-template-param";
+  case SymbolKind::NonTypeTemplateParm: return "non-type-template-param";
   }
   llvm_unreachable("invalid symbol kind");
 }
Index: clang/include/clang/Index/IndexSymbol.h
===
--- clang/include/clang/Index/IndexSymbol.h
+++ clang/include/clang/Index/IndexSymbol.h
@@ -54,6 +54,9 @@
 
   Parameter,
   Using,
+  TemplateTypeParm,
+  TemplateTemplateParm,
+  NonTypeTemplateParm,
 };
 
 enum class SymbolLanguage : uint8_t {
Index: clang-tools-extra/clangd/unittests/HoverTests.cpp
===
--- clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -573,6 +573,42 @@
  // pattern.
  HI.Documentation = "comment from primary";
}},
+  {// Template Type Parameter
+   R"cpp(
+  template  void foo();
+  )cpp",
+   [](HoverInfo ) {
+ HI.Name = "T";
+ HI.Kind = index::SymbolKind::TemplateTypeParm;
+ HI.NamespaceScope = "";
+ HI.Definition = "typename T = int";
+ HI.LocalScope = "foo::";
+ HI.Type = "typename";
+   }},
+  {// TemplateTemplate Type Parameter
+   R"cpp(
+  template  class [[^T]]> void foo();
+  )cpp",
+   [](HoverInfo ) {
+ HI.Name = "T";
+ HI.Kind = index::SymbolKind::TemplateTemplateParm;
+ HI.NamespaceScope = "";
+ HI.Definition = "template  class T";
+ HI.LocalScope = "foo::";
+ HI.Type = "template  class";
+   }},
+  {// NonType Template Parameter
+   R"cpp(
+  template  void foo();
+  )cpp",
+   [](HoverInfo ) {
+ HI.Name = 

[PATCH] D73696: [clang][Index] Introduce a TemplateParm SymbolKind

2020-02-05 Thread Sam McCall via Phabricator via cfe-commits
sammccall added a comment.

Libclang changes need tests I think.




Comment at: clang-tools-extra/clangd/Protocol.cpp:265
   case index::SymbolKind::Parameter:
+  case index::SymbolKind::TemplateParm:
 return SymbolKind::Variable;

this seems kind of dubious, maybe worth a comment?
(If we had the decl here we'd distinguish between type and non-type, right?)



Comment at: clang-tools-extra/clangd/unittests/HoverTests.cpp:586
+ HI.LocalScope = "foo::";
+   }},
+  {// TemplateTemplate Type Parameter

I do think we're going to want to have `HI.Type = "typename"` here, maybe with 
some special-case in the rendering.

(Especially with concepts where the TTP can be constrained as Integral or 
something)

Fine to leave for now but FIXME somewhere?



Comment at: clang/include/clang-c/Index.h:6257
+  CXIdxEntity_CXXInterface  = 26,
+  CXIdxEntity_CXXTemplateParm   = 27
 

As far as hover goes, calling this "template parameter" and making int/class 
the "type" is cute and fits well.

But I worry we're not exposing enough info here and at the libclang level (and 
I guess Index) we should be distinguishing the 3 cases. WDYT?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D73696/new/

https://reviews.llvm.org/D73696



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D73696: [clang][Index] Introduce a TemplateParm SymbolKind

2020-01-30 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

{icon times-circle color=red} Unit tests: fail. 62337 tests passed, 1 failed 
and 838 were skipped.

  failed: libc++.std/containers/sequences/array/array_creation/to_array.fail.cpp

{icon check-circle color=green} clang-tidy: pass.

{icon times-circle color=red} clang-format: fail. Please format your changes 
with clang-format by running `git-clang-format HEAD^` or applying this patch 
.

Build artifacts 
: 
diff.json 
,
 clang-tidy.txt 
,
 clang-format.patch 
,
 CMakeCache.txt 
,
 console-log.txt 
,
 test-results.xml 


//Pre-merge checks is in beta. Report issue 
.
 Please join beta  or enable 
it for your project 
.//


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D73696/new/

https://reviews.llvm.org/D73696



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D73696: [clang][Index] Introduce a TemplateParm SymbolKind

2020-01-30 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet created this revision.
kadircet added a reviewer: sammccall.
Herald added subscribers: cfe-commits, usaxena95, arphaman, jkorous, 
ilya-biryukov, kristof.beyls.
Herald added a project: clang.

Currently template parameters has symbolkind `Unknown`. This patch
introduces a new kind `TemplateParm` for templatetemplate, templatetype and
nontypetemplate parameters.

Also adds tests in clangd hover feature.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D73696

Files:
  clang-tools-extra/clangd/CodeComplete.cpp
  clang-tools-extra/clangd/Protocol.cpp
  clang-tools-extra/clangd/Quality.cpp
  clang-tools-extra/clangd/unittests/HoverTests.cpp
  clang/include/clang-c/Index.h
  clang/include/clang/Index/IndexSymbol.h
  clang/lib/Index/IndexSymbol.cpp
  clang/tools/c-index-test/c-index-test.c
  clang/tools/libclang/CXIndexDataConsumer.cpp
  clang/unittests/Index/IndexTests.cpp

Index: clang/unittests/Index/IndexTests.cpp
===
--- clang/unittests/Index/IndexTests.cpp
+++ clang/unittests/Index/IndexTests.cpp
@@ -248,9 +248,12 @@
   Opts.IndexTemplateParameters = true;
   Index->Symbols.clear();
   tooling::runToolOnCode(std::make_unique(Index, Opts), Code);
-  EXPECT_THAT(Index->Symbols,
-  AllOf(Contains(QName("Foo::T")), Contains(QName("Foo::I")),
-Contains(QName("Foo::C")), Contains(QName("Foo::NoRef";
+  EXPECT_THAT(
+  Index->Symbols,
+  AllOf(Contains(AllOf(QName("Foo::T"), Kind(SymbolKind::TemplateParm))),
+Contains(AllOf(QName("Foo::I"), Kind(SymbolKind::TemplateParm))),
+Contains(AllOf(QName("Foo::C"), Kind(SymbolKind::TemplateParm))),
+Contains(QName("Foo::NoRef";
 }
 
 TEST(IndexTest, UsingDecls) {
Index: clang/tools/libclang/CXIndexDataConsumer.cpp
===
--- clang/tools/libclang/CXIndexDataConsumer.cpp
+++ clang/tools/libclang/CXIndexDataConsumer.cpp
@@ -1284,6 +1284,7 @@
   case SymbolKind::Destructor: return CXIdxEntity_CXXDestructor;
   case SymbolKind::ConversionFunction: return CXIdxEntity_CXXConversionFunction;
   case SymbolKind::Parameter: return CXIdxEntity_Variable;
+  case SymbolKind::TemplateParm: return CXIdxEntity_CXXTemplateParm;
   }
   llvm_unreachable("invalid symbol kind");
 }
Index: clang/tools/c-index-test/c-index-test.c
===
--- clang/tools/c-index-test/c-index-test.c
+++ clang/tools/c-index-test/c-index-test.c
@@ -3471,6 +3471,7 @@
   case CXIdxEntity_CXXConversionFunction: return "conversion-func";
   case CXIdxEntity_CXXTypeAlias: return "type-alias";
   case CXIdxEntity_CXXInterface: return "c++-__interface";
+  case CXIdxEntity_CXXTemplateParm: return "c++-template-parm";
   }
   assert(0 && "Garbage entity kind");
   return 0;
Index: clang/lib/Index/IndexSymbol.cpp
===
--- clang/lib/Index/IndexSymbol.cpp
+++ clang/lib/Index/IndexSymbol.cpp
@@ -357,6 +357,11 @@
 case Decl::VarTemplate:
   llvm_unreachable("variables handled before");
   break;
+case Decl::TemplateTypeParm:
+case Decl::TemplateTemplateParm:
+case Decl::NonTypeTemplateParm:
+  Info.Kind = SymbolKind::TemplateParm;
+  break;
 // Other decls get the 'unknown' kind.
 default:
   break;
@@ -517,6 +522,7 @@
   case SymbolKind::ConversionFunction: return "conversion-func";
   case SymbolKind::Parameter: return "param";
   case SymbolKind::Using: return "using";
+  case SymbolKind::TemplateParm: return "template-param";
   }
   llvm_unreachable("invalid symbol kind");
 }
Index: clang/include/clang/Index/IndexSymbol.h
===
--- clang/include/clang/Index/IndexSymbol.h
+++ clang/include/clang/Index/IndexSymbol.h
@@ -54,6 +54,7 @@
 
   Parameter,
   Using,
+  TemplateParm,
 };
 
 enum class SymbolLanguage : uint8_t {
Index: clang/include/clang-c/Index.h
===
--- clang/include/clang-c/Index.h
+++ clang/include/clang-c/Index.h
@@ -6253,7 +6253,8 @@
   CXIdxEntity_CXXDestructor = 23,
   CXIdxEntity_CXXConversionFunction = 24,
   CXIdxEntity_CXXTypeAlias  = 25,
-  CXIdxEntity_CXXInterface  = 26
+  CXIdxEntity_CXXInterface  = 26,
+  CXIdxEntity_CXXTemplateParm   = 27
 
 } CXIdxEntityKind;
 
Index: clang-tools-extra/clangd/unittests/HoverTests.cpp
===
--- clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -573,6 +573,40 @@
  // pattern.
  HI.Documentation = "comment from primary";
}},
+  {// Template Type Parameter
+   R"cpp(
+  template  void foo();
+  )cpp",
+   [](HoverInfo ) {
+ HI.Name = "T";