Index: clang-tools-extra/trunk/clangd/SemanticHighlighting.h =================================================================== --- clang-tools-extra/trunk/clangd/SemanticHighlighting.h +++ clang-tools-extra/trunk/clangd/SemanticHighlighting.h @@ -25,6 +25,7 @@ enum class HighlightingKind { Variable = 0, + Parameter, Function, Method, Field, Index: clang-tools-extra/trunk/clangd/SemanticHighlighting.cpp =================================================================== --- clang-tools-extra/trunk/clangd/SemanticHighlighting.cpp +++ clang-tools-extra/trunk/clangd/SemanticHighlighting.cpp @@ -11,6 +11,7 @@ #include "Protocol.h" #include "SourceCode.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/RecursiveASTVisitor.h" #include @@ -200,6 +201,10 @@ addToken(Loc, HighlightingKind::EnumConstant); return; } + if (isa(D)) { + addToken(Loc, HighlightingKind::Parameter); + return; + } if (isa(D)) { addToken(Loc, HighlightingKind::Variable); return; @@ -406,6 +411,8 @@ return "entity.name.function.method.cpp"; case HighlightingKind::Variable: return "variable.other.cpp"; + case HighlightingKind::Parameter: + return "variable.parameter.cpp"; case HighlightingKind::Field: return "variable.other.field.cpp"; case HighlightingKind::Class: Index: clang-tools-extra/trunk/clangd/test/semantic-highlighting.test =================================================================== --- clang-tools-extra/trunk/clangd/test/semantic-highlighting.test +++ clang-tools-extra/trunk/clangd/test/semantic-highlighting.test @@ -8,6 +8,9 @@ # CHECK-NEXT: "variable.other.cpp" # CHECK-NEXT: ], # CHECK-NEXT: [ +# CHECK-NEXT: "variable.parameter.cpp" +# CHECK-NEXT: ], +# CHECK-NEXT: [ # CHECK-NEXT: "entity.name.function.cpp" # CHECK-NEXT: ], # CHECK-NEXT: [ @@ -43,7 +46,7 @@ # CHECK-NEXT: "lines": [ # CHECK-NEXT: { # CHECK-NEXT: "line": 0, -# CHECK-NEXT: "tokens": "AAAAAAADAAkAAAAEAAEAAA==" +# CHECK-NEXT: "tokens": "AAAAAAADAAoAAAAEAAEAAA==" # CHECK-NEXT: } # CHECK-NEXT: ], # CHECK-NEXT: "textDocument": { @@ -58,11 +61,11 @@ # CHECK-NEXT: "lines": [ # CHECK-NEXT: { # CHECK-NEXT: "line": 0, -# CHECK-NEXT: "tokens": "AAAAAAADAAkAAAAEAAEAAA==" +# CHECK-NEXT: "tokens": "AAAAAAADAAoAAAAEAAEAAA==" # CHECK-NEXT: } # CHECK-NEXT: { # CHECK-NEXT: "line": 1, -# CHECK-NEXT: "tokens": "AAAAAAADAAkAAAAEAAEAAA==" +# CHECK-NEXT: "tokens": "AAAAAAADAAoAAAAEAAEAAA==" # CHECK-NEXT: } # CHECK-NEXT: ], # CHECK-NEXT: "textDocument": { @@ -77,7 +80,7 @@ # CHECK-NEXT: "lines": [ # CHECK-NEXT: { # CHECK-NEXT: "line": 1, -# CHECK-NEXT: "tokens": "AAAAAAADAAkAAAAEAAEAAA==" +# CHECK-NEXT: "tokens": "AAAAAAADAAoAAAAEAAEAAA==" # CHECK-NEXT: } # CHECK-NEXT: ], # CHECK-NEXT: "textDocument": { Index: clang-tools-extra/trunk/clangd/unittests/SemanticHighlightingTests.cpp =================================================================== --- clang-tools-extra/trunk/clangd/unittests/SemanticHighlightingTests.cpp +++ clang-tools-extra/trunk/clangd/unittests/SemanticHighlightingTests.cpp @@ -16,6 +16,10 @@ namespace clang { namespace clangd { + void PrintTo(const HighlightingToken &T, ::std::ostream *OS) { + *OS << "(" << T.R.start.line << ", " << T.R.start.character << ") -> (" << T.R.end.line << ", " << T.R.end.character << "): " << (int)T.Kind; +} + namespace { std::vector @@ -32,6 +36,7 @@ std::vector getExpectedTokens(Annotations &Test) { static const std::map KindToString{ {HighlightingKind::Variable, "Variable"}, + {HighlightingKind::Parameter, "Parameter"}, {HighlightingKind::Function, "Function"}, {HighlightingKind::Class, "Class"}, {HighlightingKind::Enum, "Enum"}, @@ -104,11 +109,11 @@ }; struct { } $Variable[[S]]; - $Primitive[[void]] $Function[[foo]]($Primitive[[int]] $Variable[[A]], $Class[[AS]] $Variable[[As]]) { + $Primitive[[void]] $Function[[foo]]($Primitive[[int]] $Parameter[[A]], $Class[[AS]] $Parameter[[As]]) { $Primitive[[auto]] $Variable[[VeryLongVariableName]] = 12312; $Class[[AS]] $Variable[[AA]]; - $Primitive[[auto]] $Variable[[L]] = $Variable[[AA]].$Field[[SomeMember]] + $Variable[[A]]; - auto $Variable[[FN]] = [ $Variable[[AA]]]($Primitive[[int]] $Variable[[A]]) -> $Primitive[[void]] {}; + $Primitive[[auto]] $Variable[[L]] = $Variable[[AA]].$Field[[SomeMember]] + $Parameter[[A]]; + auto $Variable[[FN]] = [ $Variable[[AA]]]($Primitive[[int]] $Parameter[[A]]) -> $Primitive[[void]] {}; $Variable[[FN]](12312); } )cpp", @@ -287,10 +292,10 @@ struct $Class[[B]] {}; struct $Class[[A]] { $Class[[B]] $Field[[BB]]; - $Class[[A]] &operator=($Class[[A]] &&$Variable[[O]]); + $Class[[A]] &operator=($Class[[A]] &&$Parameter[[O]]); }; - $Class[[A]] &$Class[[A]]::operator=($Class[[A]] &&$Variable[[O]]) = default; + $Class[[A]] &$Class[[A]]::operator=($Class[[A]] &&$Parameter[[O]]) = default; )cpp", R"cpp( enum $Enum[[En]] { @@ -301,9 +306,9 @@ $Class[[Foo]] $Field[[Fo]]; $Enum[[En]] $Field[[E]]; $Primitive[[int]] $Field[[I]]; - $Class[[Bar]] ($Class[[Foo]] $Variable[[F]], - $Enum[[En]] $Variable[[E]]) - : $Field[[Fo]] ($Variable[[F]]), $Field[[E]] ($Variable[[E]]), + $Class[[Bar]] ($Class[[Foo]] $Parameter[[F]], + $Enum[[En]] $Parameter[[E]]) + : $Field[[Fo]] ($Parameter[[F]]), $Field[[E]] ($Parameter[[E]]), $Field[[I]] (123) {} }; class $Class[[Bar2]] : public $Class[[Bar]] { @@ -356,8 +361,8 @@ $Primitive[[void]] (T::*$TemplateParameter[[method]])($Primitive[[int]])> struct $Class[[G]] { $Primitive[[void]] $Method[[foo]]( - $TemplateParameter[[T]] *$Variable[[O]]) { - ($Variable[[O]]->*$TemplateParameter[[method]])(10); + $TemplateParameter[[T]] *$Parameter[[O]]) { + ($Parameter[[O]]->*$TemplateParameter[[method]])(10); } }; struct $Class[[F]] { @@ -438,7 +443,7 @@ std::vector ActualResults = toSemanticHighlightingInformation(Tokens); std::vector ExpectedResults = { - {3, "AAAACAAEAAAAAAAEAAMAAQ=="}, {1, "AAAAAQAEAAA="}}; + {3, "AAAACAAEAAAAAAAEAAMAAg=="}, {1, "AAAAAQAEAAA="}}; EXPECT_EQ(ActualResults, ExpectedResults); }