ilya-biryukov created this revision. ilya-biryukov added a reviewer: hokein. Herald added subscribers: kadircet, arphaman, jkorous, MaskRay. Herald added a project: clang. ilya-biryukov added a parent revision: D66516: [clangd] Highlight typedefs to template parameters as template parameters. ilya-biryukov marked an inline comment as done. ilya-biryukov added inline comments.
================ Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:530 + case HighlightingKind::Typedef: + return "entity.name.type.typedef.cpp"; case HighlightingKind::Namespace: ---------------- Not sure what the rules for the scope names are, happy to change if I'm doing it wrong We still attempt to highlight them as underlying types, but fallback to the generic 'typedef' highlighting kind if the underlying type is too complicated. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D67290 Files: clang-tools-extra/clangd/SemanticHighlighting.cpp clang-tools-extra/clangd/SemanticHighlighting.h clang-tools-extra/clangd/test/semantic-highlighting.test clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp +++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp @@ -499,11 +499,16 @@ 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]]); + using $Typedef[[Pointer]] = $TemplateParameter[[T]] *; + using $Typedef[[LVReference]] = $TemplateParameter[[T]] &; + using $Typedef[[RVReference]] = $TemplateParameter[[T]]&&; + using $Typedef[[Array]] = $TemplateParameter[[T]]*[3]; + using $Typedef[[MemberPointer]] = $Primitive[[int]] (A::*)($Primitive[[int]]); + + // Use various defined typedef in a function type. + $Primitive[[void]] $Method[[func]]( + $Typedef[[Pointer]], $Typedef[[LVReference]], $Typedef[[RVReference]], + $Typedef[[Array]], $Typedef[[MemberPointer]]); }; )cpp"}; for (const auto &TestCase : TestCases) { Index: clang-tools-extra/clangd/test/semantic-highlighting.test =================================================================== --- clang-tools-extra/clangd/test/semantic-highlighting.test +++ clang-tools-extra/clangd/test/semantic-highlighting.test @@ -38,6 +38,9 @@ # CHECK-NEXT: "variable.other.enummember.cpp" # CHECK-NEXT: ], # CHECK-NEXT: [ +# CHECK-NEXT: "entity.name.type.typedef.cpp" +# CHECK-NEXT: ], +# CHECK-NEXT: [ # CHECK-NEXT: "entity.name.namespace.cpp" # CHECK-NEXT: ], # CHECK-NEXT: [ @@ -58,7 +61,7 @@ # CHECK-NEXT: "lines": [ # CHECK-NEXT: { # CHECK-NEXT: "line": 0, -# CHECK-NEXT: "tokens": "AAAAAAADAA0AAAAEAAEAAA==" +# CHECK-NEXT: "tokens": "AAAAAAADAA4AAAAEAAEAAA==" # CHECK-NEXT: } # CHECK-NEXT: ], # CHECK-NEXT: "textDocument": { @@ -73,11 +76,11 @@ # CHECK-NEXT: "lines": [ # CHECK-NEXT: { # CHECK-NEXT: "line": 0, -# CHECK-NEXT: "tokens": "AAAAAAADAA0AAAAEAAEAAA==" +# CHECK-NEXT: "tokens": "AAAAAAADAA4AAAAEAAEAAA==" # CHECK-NEXT: } # CHECK-NEXT: { # CHECK-NEXT: "line": 1, -# CHECK-NEXT: "tokens": "AAAAAAADAA0AAAAEAAEAAA==" +# CHECK-NEXT: "tokens": "AAAAAAADAA4AAAAEAAEAAA==" # CHECK-NEXT: } # CHECK-NEXT: ], # CHECK-NEXT: "textDocument": { @@ -92,7 +95,7 @@ # CHECK-NEXT: "lines": [ # CHECK-NEXT: { # CHECK-NEXT: "line": 1, -# CHECK-NEXT: "tokens": "AAAAAAADAA0AAAAEAAEAAA==" +# CHECK-NEXT: "tokens": "AAAAAAADAA4AAAAEAAEAAA==" # CHECK-NEXT: } # CHECK-NEXT: ], # CHECK-NEXT: "textDocument": { Index: clang-tools-extra/clangd/SemanticHighlighting.h =================================================================== --- clang-tools-extra/clangd/SemanticHighlighting.h +++ clang-tools-extra/clangd/SemanticHighlighting.h @@ -36,6 +36,7 @@ Class, Enum, EnumConstant, + Typedef, Namespace, TemplateParameter, Primitive, Index: clang-tools-extra/clangd/SemanticHighlighting.cpp =================================================================== --- clang-tools-extra/clangd/SemanticHighlighting.cpp +++ clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -17,6 +17,7 @@ #include "clang/AST/RecursiveASTVisitor.h" #include "clang/AST/Type.h" #include "clang/AST/TypeLoc.h" +#include "clang/Basic/SourceLocation.h" #include <algorithm> namespace clang { @@ -125,13 +126,12 @@ } bool VisitTypedefNameDecl(TypedefNameDecl *TD) { - if (const auto *TSI = TD->getTypeSourceInfo()) - addType(TD->getLocation(), TSI->getTypeLoc().getType().getTypePtr()); + addTokenForTypedef(TD->getLocation(), TD); return true; } bool VisitTypedefTypeLoc(TypedefTypeLoc TL) { - addType(TL.getBeginLoc(), TL.getTypePtr()); + addTokenForTypedef(TL.getBeginLoc(), TL.getTypedefNameDecl()); return true; } @@ -182,17 +182,35 @@ } private: - void addType(SourceLocation Loc, const Type *TP) { - if (!TP) + void addTokenForTypedef(SourceLocation Loc, const TypedefNameDecl *TD) { + auto *TSI = TD->getTypeSourceInfo(); + if (!TSI) + return; + // Try to highlight as underlying type. + if (addType(Loc, TSI->getType().getTypePtrOrNull())) return; - if (TP->isBuiltinType()) + // Fallback to the typedef highlighting kind. + addToken(Loc, HighlightingKind::Typedef); + } + + bool addType(SourceLocation Loc, const Type *TP) { + if (!TP) + return false; + if (TP->isBuiltinType()) { // Builtins must be special cased as they do not have a TagDecl. addToken(Loc, HighlightingKind::Primitive); - if (const TemplateTypeParmType *TD = dyn_cast<TemplateTypeParmType>(TP)) + return true; + } + if (const TemplateTypeParmType *TD = dyn_cast<TemplateTypeParmType>(TP)) { // TemplateTypeParmType also do not have a TagDecl. addToken(Loc, TD->getDecl()); - if (const TagDecl *TD = TP->getAsTagDecl()) + return true; + } + if (const TagDecl *TD = TP->getAsTagDecl()) { addToken(Loc, TD); + return true; + } + return false; } void addToken(SourceLocation Loc, const NamedDecl *D) { @@ -379,6 +397,8 @@ return OS << "Enum"; case HighlightingKind::EnumConstant: return OS << "EnumConstant"; + case HighlightingKind::Typedef: + return OS << "Typedef"; case HighlightingKind::Namespace: return OS << "Namespace"; case HighlightingKind::TemplateParameter: @@ -506,6 +526,8 @@ return "entity.name.type.enum.cpp"; case HighlightingKind::EnumConstant: return "variable.other.enummember.cpp"; + case HighlightingKind::Typedef: + return "entity.name.type.typedef.cpp"; case HighlightingKind::Namespace: return "entity.name.namespace.cpp"; case HighlightingKind::TemplateParameter:
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits