diff options
| author | Nathan Ridge <zeratul976@hotmail.com> | 2019-12-05 14:28:56 -0500 |
|---|---|---|
| committer | Nathan Ridge <zeratul976@hotmail.com> | 2019-12-05 14:30:53 -0500 |
| commit | de3dbc4f41665e60f53eb3d41fcadb2b322cf6f0 (patch) | |
| tree | e06f2545a84a80e8bcad297e24c1f811e05d629e | |
| parent | 1a4ee4c88f21c0e6860983a80bfa51a25b4af700 (diff) | |
| download | bcm5719-llvm-de3dbc4f41665e60f53eb3d41fcadb2b322cf6f0.tar.gz bcm5719-llvm-de3dbc4f41665e60f53eb3d41fcadb2b322cf6f0.zip | |
[clangd] Highlighting dependent types in more contexts
Fixes https://github.com/clangd/clangd/issues/214.
Reviewers: ilya-biryukov
Reviewed By: ilya-biryukov
Subscribers: MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D70746
| -rw-r--r-- | clang-tools-extra/clangd/SemanticHighlighting.cpp | 19 | ||||
| -rw-r--r-- | clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp | 19 |
2 files changed, 37 insertions, 1 deletions
diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp b/clang-tools-extra/clangd/SemanticHighlighting.cpp index 049afb741b2..2b65625ae2d 100644 --- a/clang-tools-extra/clangd/SemanticHighlighting.cpp +++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -258,6 +258,25 @@ public: return true; } + bool VisitDependentTemplateSpecializationTypeLoc( + DependentTemplateSpecializationTypeLoc L) { + H.addToken(L.getTemplateNameLoc(), HighlightingKind::DependentType); + return true; + } + + // findExplicitReferences will walk nested-name-specifiers and + // find anything that can be resolved to a Decl. However, non-leaf + // components of nested-name-specifiers which are dependent names + // (kind "Identifier") cannot be resolved to a decl, so we visit + // them here. + bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc Q) { + if (NestedNameSpecifier *NNS = Q.getNestedNameSpecifier()) { + if (NNS->getKind() == NestedNameSpecifier::Identifier) + H.addToken(Q.getLocalBeginLoc(), HighlightingKind::DependentType); + } + return RecursiveASTVisitor::TraverseNestedNameSpecifierLoc(Q); + } + private: HighlightingsBuilder &H; }; diff --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp index 2df0f1c9a57..b353c0bdb4e 100644 --- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp +++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp @@ -630,7 +630,24 @@ $InactiveCode[[]] #else R"cpp( template <typename... $TemplateParameter[[Elements]]> struct $Class[[TupleSize]] { - static const int $StaticField[[size]] = sizeof...($TemplateParameter[[Elements]]); + static const int $StaticField[[size]] = +sizeof...($TemplateParameter[[Elements]]); + }; + )cpp", + // More dependent types + R"cpp( + template <typename $TemplateParameter[[T]]> + struct $Class[[Waldo]] { + using $Typedef[[Location1]] = typename $TemplateParameter[[T]] + ::$DependentType[[Resolver]]::$DependentType[[Location]]; + using $Typedef[[Location2]] = typename $TemplateParameter[[T]] + ::template $DependentType[[Resolver]]<$TemplateParameter[[T]]> + ::$DependentType[[Location]]; + using $Typedef[[Location3]] = typename $TemplateParameter[[T]] + ::$DependentType[[Resolver]] + ::template $DependentType[[Location]]<$TemplateParameter[[T]]>; + static const int $StaticField[[Value]] = $TemplateParameter[[T]] + ::$DependentType[[Resolver]]::$DependentName[[Value]]; }; )cpp"}; for (const auto &TestCase : TestCases) { |

