Author: ibiryukov Date: Mon Sep 9 02:37:17 2019 New Revision: 371379 URL: http://llvm.org/viewvc/llvm-project?rev=371379&view=rev Log: [clangd] Highlight typedefs to template parameters as template parameters
Summary: Template parameters were handled outside `addType`, this led to lack of highlightings for typedefs to template types. This was never desirable, we want to highlight our typedefs as their underlying type. Note that typedefs to more complicated types, like pointers and references are still not highlighted. Original patch by Johan Vikström. Reviewers: hokein, jvikstrom Reviewed By: hokein Subscribers: nridge, javed.absar, kristof.beyls, MaskRay, jkorous, arphaman, kadircet, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D66516 Modified: clang-tools-extra/trunk/clangd/SemanticHighlighting.cpp clang-tools-extra/trunk/clangd/unittests/SemanticHighlightingTests.cpp Modified: clang-tools-extra/trunk/clangd/SemanticHighlighting.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/SemanticHighlighting.cpp?rev=371379&r1=371378&r2=371379&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/SemanticHighlighting.cpp (original) +++ clang-tools-extra/trunk/clangd/SemanticHighlighting.cpp Mon Sep 9 02:37:17 2019 @@ -15,6 +15,8 @@ #include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/RecursiveASTVisitor.h" +#include "clang/AST/Type.h" +#include "clang/AST/TypeLoc.h" #include <algorithm> namespace clang { @@ -128,13 +130,12 @@ public: return true; } - bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc &TL) { - // TemplateTypeParmTypeLoc does not have a TagDecl in its type ptr. - addToken(TL.getBeginLoc(), TL.getDecl()); + bool VisitTypedefTypeLoc(TypedefTypeLoc TL) { + addType(TL.getBeginLoc(), TL.getTypePtr()); return true; } - bool VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc &TL) { + bool VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL) { if (const TemplateDecl *TD = TL.getTypePtr()->getTemplateName().getAsTemplateDecl()) addToken(TL.getBeginLoc(), TD); @@ -187,7 +188,10 @@ private: if (TP->isBuiltinType()) // Builtins must be special cased as they do not have a TagDecl. addToken(Loc, HighlightingKind::Primitive); - if (const TagDecl *TD = TP->getAsTagDecl()) + if (auto *TD = dyn_cast<TemplateTypeParmType>(TP)) + // TemplateTypeParmType also do not have a TagDecl. + addToken(Loc, TD->getDecl()); + if (auto *TD = TP->getAsTagDecl()) addToken(Loc, TD); } Modified: clang-tools-extra/trunk/clangd/unittests/SemanticHighlightingTests.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/unittests/SemanticHighlightingTests.cpp?rev=371379&r1=371378&r2=371379&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/unittests/SemanticHighlightingTests.cpp (original) +++ clang-tools-extra/trunk/clangd/unittests/SemanticHighlightingTests.cpp Mon Sep 9 02:37:17 2019 @@ -474,7 +474,7 @@ TEST(SemanticHighlighting, GetsCorrectTo $Macro[[assert]]($Variable[[x]] != $Function[[f]]()); } )cpp", - R"cpp( + R"cpp( struct $Class[[S]] { $Primitive[[float]] $Field[[Value]]; $Class[[S]] *$Field[[Next]]; @@ -488,6 +488,21 @@ TEST(SemanticHighlighting, GetsCorrectTo // Highlights references to BindingDecls. $Variable[[B1]]++; } + )cpp", + R"cpp( + template<class $TemplateParameter[[T]]> + class $Class[[A]] { + using $TemplateParameter[[TemplateParam1]] = $TemplateParameter[[T]]; + typedef $TemplateParameter[[T]] $TemplateParameter[[TemplateParam2]]; + using $Primitive[[IntType]] = $Primitive[[int]]; + + // These typedefs are not yet highlighted, their types are complicated. + using Pointer = $TemplateParameter[[T]] *; + using LVReference = $TemplateParameter[[T]] &; + using RVReference = $TemplateParameter[[T]]&&; + using Array = $TemplateParameter[[T]]*[3]; + using MemberPointer = $Primitive[[int]] (A::*)($Primitive[[int]]); + }; )cpp"}; for (const auto &TestCase : TestCases) { checkHighlightings(TestCase); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits