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, + Keyword, // 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::Keyword); + 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::Keyword: + return OS << "Keyword"; case HighlightingKind::InactiveCode: return OS << "InactiveCode"; } @@ -1119,6 +1133,8 @@ return "type"; case HighlightingKind::Macro: return "macro"; + case HighlightingKind::Keyword: + return "keyword"; 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,7 +864,13 @@ 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[[Derived]] : public $Class_abstract[[Base]] { void $Method_decl_virtual[[m]]() $Keyword[[override]]; }; + class $Class_def[[MoreDerived]] : public $Class[[Derived]] { void $Method_decl_virtual[[m]]() $Keyword[[final]]; }; // Issue 1222: readonly modifier for generic parameter + )cpp", R"cpp( template auto $Function_def[[foo]](const $TemplateParameter[[T]] $Parameter_def_readonly[[template_type]],