diff --git a/clang-tools-extra/clangd/SemanticHighlighting.h b/clang-tools-extra/clangd/SemanticHighlighting.h --- a/clang-tools-extra/clangd/SemanticHighlighting.h +++ b/clang-tools-extra/clangd/SemanticHighlighting.h @@ -49,6 +49,7 @@ Concept, Primitive, Macro, + Modifier, // This one is different from the other kinds as it's a line style // rather than a token style. diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp b/clang-tools-extra/clangd/SemanticHighlighting.cpp --- a/clang-tools-extra/clangd/SemanticHighlighting.cpp +++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -809,6 +809,18 @@ return true; } + bool VisitAttr(Attr *A) { + switch (A->getKind()) { + case attr::Override: + case attr::Final: + H.addToken(A->getLocation(), HighlightingKind::Modifier); + break; + default: + break; + } + return true; + } + bool VisitDependentNameTypeLoc(DependentNameTypeLoc L) { H.addToken(L.getNameLoc(), HighlightingKind::Type) .addModifier(HighlightingModifier::DependentName) @@ -985,6 +997,8 @@ return OS << "Primitive"; case HighlightingKind::Macro: return OS << "Macro"; + case HighlightingKind::Modifier: + return OS << "Modifier"; case HighlightingKind::InactiveCode: return OS << "InactiveCode"; } @@ -1119,6 +1133,8 @@ return "type"; case HighlightingKind::Macro: return "macro"; + case HighlightingKind::Modifier: + return "modifier"; case HighlightingKind::InactiveCode: return "comment"; } diff --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp --- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp +++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp @@ -864,6 +864,12 @@ const char *$LocalVariable_def_readonly[[s]] = $LocalVariable_readonly_static[[__func__]]; } )cpp", + // override and final + R"cpp( + class $Class_def_abstract[[Base]] { virtual void $Method_decl_abstract_virtual[[m]]() = 0; }; + class $Class_def[[override]] : public $Class_abstract[[Base]] { void $Method_decl_virtual[[m]]() $Modifier[[override]]; }; + class $Class_def[[final]] : public $Class[[override]] { void $Method_decl_virtual[[m]]() $Modifier[[override]] $Modifier[[final]]; }; + )cpp", // Issue 1222: readonly modifier for generic parameter R"cpp( template