ckandeler updated this revision to Diff 466731. ckandeler added a comment. Template parameters are definitions
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D127403/new/ https://reviews.llvm.org/D127403 Files: clang-tools-extra/clangd/SemanticHighlighting.cpp clang-tools-extra/clangd/SemanticHighlighting.h clang-tools-extra/clangd/test/initialize-params.test clang-tools-extra/clangd/test/semantic-tokens.test clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp clang-tools-extra/clangd/unittests/tweaks/AnnotateHighlightingsTests.cpp
Index: clang-tools-extra/clangd/unittests/tweaks/AnnotateHighlightingsTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/tweaks/AnnotateHighlightingsTests.cpp +++ clang-tools-extra/clangd/unittests/tweaks/AnnotateHighlightingsTests.cpp @@ -18,18 +18,18 @@ TEST_F(AnnotateHighlightingsTest, Test) { EXPECT_AVAILABLE("^vo^id^ ^f(^) {^}^"); // available everywhere. EXPECT_AVAILABLE("[[int a; int b;]]"); - EXPECT_EQ("void /* Function [decl] [globalScope] */f() {}", + EXPECT_EQ("void /* Function [decl] [def] [globalScope] */f() {}", apply("void ^f() {}")); EXPECT_EQ(apply("[[int f1(); const int x = f1();]]"), "int /* Function [decl] [globalScope] */f1(); " - "const int /* Variable [decl] [readonly] [fileScope] */x = " + "const int /* Variable [decl] [def] [readonly] [fileScope] */x = " "/* Function [globalScope] */f1();"); // Only the targeted range is annotated. EXPECT_EQ(apply("void f1(); void f2() {^}"), "void f1(); " - "void /* Function [decl] [globalScope] */f2() {}"); + "void /* Function [decl] [def] [globalScope] */f2() {}"); } } // namespace Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp +++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp @@ -48,12 +48,21 @@ assert(StartOffset <= EndOffset); assert(NextChar <= StartOffset); + bool hasDef = + T.Modifiers & (1 << uint32_t(HighlightingModifier::Definition)); + bool hasDecl = + T.Modifiers & (1 << uint32_t(HighlightingModifier::Declaration)); + EXPECT_TRUE(!hasDef || hasDecl); + OS << Input.substr(NextChar, StartOffset - NextChar); OS << '$' << T.Kind; for (unsigned I = 0; I <= static_cast<uint32_t>(HighlightingModifier::LastModifier); ++I) { - if (T.Modifiers & (1 << I)) - OS << '_' << static_cast<HighlightingModifier>(I); + if (T.Modifiers & (1 << I)) { + // _decl_def is common and redundant, just print _def instead. + if (I != uint32_t(HighlightingModifier::Declaration) || !hasDef) + OS << '_' << static_cast<HighlightingModifier>(I); + } } OS << "[[" << Input.substr(StartOffset, EndOffset - StartOffset) << "]]"; NextChar = EndOffset; @@ -96,52 +105,52 @@ TEST(SemanticHighlighting, GetsCorrectTokens) { const char *TestCases[] = { R"cpp( - struct $Class_decl[[AS]] { + struct $Class_def[[AS]] { double $Field_decl[[SomeMember]]; }; struct { - } $Variable_decl[[S]]; - void $Function_decl[[foo]](int $Parameter_decl[[A]], $Class[[AS]] $Parameter_decl[[As]]) { - $Primitive_deduced_defaultLibrary[[auto]] $LocalVariable_decl[[VeryLongVariableName]] = 12312; - $Class[[AS]] $LocalVariable_decl[[AA]]; - $Primitive_deduced_defaultLibrary[[auto]] $LocalVariable_decl[[L]] = $LocalVariable[[AA]].$Field[[SomeMember]] + $Parameter[[A]]; - auto $LocalVariable_decl[[FN]] = [ $LocalVariable[[AA]]](int $Parameter_decl[[A]]) -> void {}; + } $Variable_def[[S]]; + void $Function_def[[foo]](int $Parameter_def[[A]], $Class[[AS]] $Parameter_def[[As]]) { + $Primitive_deduced_defaultLibrary[[auto]] $LocalVariable_def[[VeryLongVariableName]] = 12312; + $Class[[AS]] $LocalVariable_def[[AA]]; + $Primitive_deduced_defaultLibrary[[auto]] $LocalVariable_def[[L]] = $LocalVariable[[AA]].$Field[[SomeMember]] + $Parameter[[A]]; + auto $LocalVariable_def[[FN]] = [ $LocalVariable[[AA]]](int $Parameter_def[[A]]) -> void {}; $LocalVariable[[FN]](12312); } )cpp", R"cpp( void $Function_decl[[foo]](int); void $Function_decl[[Gah]](); - void $Function_decl[[foo]]() { - auto $LocalVariable_decl[[Bou]] = $Function[[Gah]]; + void $Function_def[[foo]]() { + auto $LocalVariable_def[[Bou]] = $Function[[Gah]]; } - struct $Class_decl[[A]] { + struct $Class_def[[A]] { void $Method_decl[[abc]](); }; )cpp", R"cpp( namespace $Namespace_decl[[abc]] { - template<typename $TemplateParameter_decl[[T]]> - struct $Class_decl[[A]] { + template<typename $TemplateParameter_def[[T]]> + struct $Class_def[[A]] { $TemplateParameter[[T]] $Field_decl[[t]]; }; } - template<typename $TemplateParameter_decl[[T]]> - struct $Class_decl[[C]] : $Namespace[[abc]]::$Class[[A]]<$TemplateParameter[[T]]> { + template<typename $TemplateParameter_def[[T]]> + struct $Class_def[[C]] : $Namespace[[abc]]::$Class[[A]]<$TemplateParameter[[T]]> { typename $TemplateParameter[[T]]::$Type_dependentName[[A]]* $Field_decl[[D]]; }; - $Namespace[[abc]]::$Class[[A]]<int> $Variable_decl[[AA]]; + $Namespace[[abc]]::$Class[[A]]<int> $Variable_def[[AA]]; typedef $Namespace[[abc]]::$Class[[A]]<int> $Class_decl[[AAA]]; - struct $Class_decl[[B]] { + struct $Class_def[[B]] { $Class_decl[[B]](); ~$Class[[B]](); // FIXME: inconsistent with constructor void operator<<($Class[[B]]); $Class[[AAA]] $Field_decl[[AA]]; }; - $Class[[B]]::$Class_decl[[B]]() {} + $Class[[B]]::$Class_def[[B]]() {} $Class[[B]]::~$Class[[B]]() {} // FIXME: inconsistent with constructor - void $Function_decl[[f]] () { - $Class[[B]] $LocalVariable_decl[[BB]] = $Class[[B]](); + void $Function_def[[f]] () { + $Class[[B]] $LocalVariable_def[[BB]] = $Class[[B]](); $LocalVariable[[BB]].~$Class[[B]](); $Class[[B]](); } @@ -154,20 +163,20 @@ enum $Enum_decl[[EE]] { $EnumConstant_decl_readonly[[Hi]], }; - struct $Class_decl[[A]] { + struct $Class_def[[A]] { $Enum[[E]] $Field_decl[[EEE]]; $Enum[[EE]] $Field_decl[[EEEE]]; }; - int $Variable_decl[[I]] = $EnumConstant_readonly[[Hi]]; - $Enum[[E]] $Variable_decl[[L]] = $Enum[[E]]::$EnumConstant_readonly[[B]]; + int $Variable_def[[I]] = $EnumConstant_readonly[[Hi]]; + $Enum[[E]] $Variable_def[[L]] = $Enum[[E]]::$EnumConstant_readonly[[B]]; )cpp", R"cpp( namespace $Namespace_decl[[abc]] { namespace {} namespace $Namespace_decl[[bcd]] { - struct $Class_decl[[A]] {}; + struct $Class_def[[A]] {}; namespace $Namespace_decl[[cde]] { - struct $Class_decl[[A]] { + struct $Class_def[[A]] { enum class $Enum_decl[[B]] { $EnumConstant_decl_readonly[[Hi]], }; @@ -178,22 +187,22 @@ using namespace $Namespace[[abc]]::$Namespace[[bcd]]; namespace $Namespace_decl[[vwz]] = $Namespace[[abc]]::$Namespace[[bcd]]::$Namespace[[cde]]; - $Namespace[[abc]]::$Namespace[[bcd]]::$Class[[A]] $Variable_decl[[AA]]; - $Namespace[[vwz]]::$Class[[A]]::$Enum[[B]] $Variable_decl[[AAA]] = + $Namespace[[abc]]::$Namespace[[bcd]]::$Class[[A]] $Variable_def[[AA]]; + $Namespace[[vwz]]::$Class[[A]]::$Enum[[B]] $Variable_def[[AAA]] = $Namespace[[vwz]]::$Class[[A]]::$Enum[[B]]::$EnumConstant_readonly[[Hi]]; - ::$Namespace[[vwz]]::$Class[[A]] $Variable_decl[[B]]; - ::$Namespace[[abc]]::$Namespace[[bcd]]::$Class[[A]] $Variable_decl[[BB]]; + ::$Namespace[[vwz]]::$Class[[A]] $Variable_def[[B]]; + ::$Namespace[[abc]]::$Namespace[[bcd]]::$Class[[A]] $Variable_def[[BB]]; )cpp", R"cpp( - struct $Class_decl[[D]] { + struct $Class_def[[D]] { double $Field_decl[[C]]; }; - struct $Class_decl[[A]] { + struct $Class_def[[A]] { double $Field_decl[[B]]; $Class[[D]] $Field_decl[[E]]; static double $StaticField_decl_static[[S]]; - static void $StaticMethod_decl_static[[bar]]() {} - void $Method_decl[[foo]]() { + static void $StaticMethod_def_static[[bar]]() {} + void $Method_def[[foo]]() { $Field[[B]] = 123; this->$Field[[B]] = 156; this->$Method[[foo]](); @@ -202,8 +211,8 @@ $StaticField_static[[S]] = 90.1; } }; - void $Function_decl[[foo]]() { - $Class[[A]] $LocalVariable_decl[[AA]]; + void $Function_def[[foo]]() { + $Class[[A]] $LocalVariable_def[[AA]]; $LocalVariable[[AA]].$Field[[B]] += 2; $LocalVariable[[AA]].$Method[[foo]](); $LocalVariable[[AA]].$Field[[E]].$Field[[C]]; @@ -211,15 +220,15 @@ } )cpp", R"cpp( - struct $Class_decl[[AA]] { + struct $Class_def[[AA]] { int $Field_decl[[A]]; }; - int $Variable_decl[[B]]; - $Class[[AA]] $Variable_decl[[A]]{$Variable[[B]]}; + int $Variable_def[[B]]; + $Class[[AA]] $Variable_def[[A]]{$Variable[[B]]}; )cpp", R"cpp( namespace $Namespace_decl[[a]] { - struct $Class_decl[[A]] {}; + struct $Class_def[[A]] {}; typedef char $Primitive_decl[[C]]; } typedef $Namespace[[a]]::$Class[[A]] $Class_decl[[B]]; @@ -234,147 +243,147 @@ typedef float $Primitive_decl[[F]]; )cpp", R"cpp( - template<typename $TemplateParameter_decl[[T]], typename = void> - class $Class_decl[[A]] { + template<typename $TemplateParameter_def[[T]], typename = void> + class $Class_def[[A]] { $TemplateParameter[[T]] $Field_decl[[AA]]; $TemplateParameter[[T]] $Method_decl[[foo]](); }; - template<class $TemplateParameter_decl[[TT]]> - class $Class_decl[[B]] { + template<class $TemplateParameter_def[[TT]]> + class $Class_def[[B]] { $Class[[A]]<$TemplateParameter[[TT]]> $Field_decl[[AA]]; }; - template<class $TemplateParameter_decl[[TT]], class $TemplateParameter_decl[[GG]]> - class $Class_decl[[BB]] {}; - template<class $TemplateParameter_decl[[T]]> - class $Class_decl[[BB]]<$TemplateParameter[[T]], int> {}; - template<class $TemplateParameter_decl[[T]]> - class $Class_decl[[BB]]<$TemplateParameter[[T]], $TemplateParameter[[T]]*> {}; + template<class $TemplateParameter_def[[TT]], class $TemplateParameter_def[[GG]]> + class $Class_def[[BB]] {}; + template<class $TemplateParameter_def[[T]]> + class $Class_def[[BB]]<$TemplateParameter[[T]], int> {}; + template<class $TemplateParameter_def[[T]]> + class $Class_def[[BB]]<$TemplateParameter[[T]], $TemplateParameter[[T]]*> {}; - template<template<class> class $TemplateParameter_decl[[T]], class $TemplateParameter_decl[[C]]> + template<template<class> class $TemplateParameter_def[[T]], class $TemplateParameter_def[[C]]> $TemplateParameter[[T]]<$TemplateParameter[[C]]> $Function_decl[[f]](); template<typename> - class $Class_decl[[Foo]] {}; + class $Class_def[[Foo]] {}; - template<typename $TemplateParameter_decl[[T]]> + template<typename $TemplateParameter_def[[T]]> void $Function_decl[[foo]]($TemplateParameter[[T]] ...); )cpp", R"cpp( - template <class $TemplateParameter_decl[[T]]> - struct $Class_decl[[Tmpl]] {$TemplateParameter[[T]] $Field_decl[[x]] = 0;}; - extern template struct $Class_decl[[Tmpl]]<float>; - template struct $Class_decl[[Tmpl]]<double>; + template <class $TemplateParameter_def[[T]]> + struct $Class_def[[Tmpl]] {$TemplateParameter[[T]] $Field_decl[[x]] = 0;}; + extern template struct $Class_def[[Tmpl]]<float>; + template struct $Class_def[[Tmpl]]<double>; )cpp", // This test is to guard against highlightings disappearing when using // conversion operators as their behaviour in the clang AST differ from // other CXXMethodDecls. R"cpp( - class $Class_decl[[Foo]] {}; - struct $Class_decl[[Bar]] { + class $Class_def[[Foo]] {}; + struct $Class_def[[Bar]] { explicit operator $Class[[Foo]]*() const; explicit operator int() const; operator $Class[[Foo]](); }; - void $Function_decl[[f]]() { - $Class[[Bar]] $LocalVariable_decl[[B]]; - $Class[[Foo]] $LocalVariable_decl[[F]] = $LocalVariable[[B]]; - $Class[[Foo]] *$LocalVariable_decl[[FP]] = ($Class[[Foo]]*)$LocalVariable[[B]]; - int $LocalVariable_decl[[I]] = (int)$LocalVariable[[B]]; + void $Function_def[[f]]() { + $Class[[Bar]] $LocalVariable_def[[B]]; + $Class[[Foo]] $LocalVariable_def[[F]] = $LocalVariable[[B]]; + $Class[[Foo]] *$LocalVariable_def[[FP]] = ($Class[[Foo]]*)$LocalVariable[[B]]; + int $LocalVariable_def[[I]] = (int)$LocalVariable[[B]]; } )cpp", R"cpp( - struct $Class_decl[[B]] {}; - struct $Class_decl[[A]] { + struct $Class_def[[B]] {}; + struct $Class_def[[A]] { $Class[[B]] $Field_decl[[BB]]; - $Class[[A]] &operator=($Class[[A]] &&$Parameter_decl[[O]]); + $Class[[A]] &operator=($Class[[A]] &&$Parameter_def[[O]]); }; - $Class[[A]] &$Class[[A]]::operator=($Class[[A]] &&$Parameter_decl[[O]]) = default; + $Class[[A]] &$Class[[A]]::operator=($Class[[A]] &&$Parameter_def[[O]]) = default; )cpp", R"cpp( enum $Enum_decl[[En]] { $EnumConstant_decl_readonly[[EC]], }; - class $Class_decl[[Foo]] {}; - class $Class_decl[[Bar]] { + class $Class_def[[Foo]] {}; + class $Class_def[[Bar]] { public: $Class[[Foo]] $Field_decl[[Fo]]; $Enum[[En]] $Field_decl[[E]]; int $Field_decl[[I]]; - $Class_decl[[Bar]] ($Class[[Foo]] $Parameter_decl[[F]], - $Enum[[En]] $Parameter_decl[[E]]) + $Class_def[[Bar]] ($Class[[Foo]] $Parameter_def[[F]], + $Enum[[En]] $Parameter_def[[E]]) : $Field[[Fo]] ($Parameter[[F]]), $Field[[E]] ($Parameter[[E]]), $Field[[I]] (123) {} }; - class $Class_decl[[Bar2]] : public $Class[[Bar]] { - $Class_decl[[Bar2]]() : $Class[[Bar]]($Class[[Foo]](), $EnumConstant_readonly[[EC]]) {} + class $Class_def[[Bar2]] : public $Class[[Bar]] { + $Class_def[[Bar2]]() : $Class[[Bar]]($Class[[Foo]](), $EnumConstant_readonly[[EC]]) {} }; )cpp", R"cpp( enum $Enum_decl[[E]] { $EnumConstant_decl_readonly[[E]], }; - class $Class_decl[[Foo]] {}; - $Enum_deduced[[auto]] $Variable_decl[[AE]] = $Enum[[E]]::$EnumConstant_readonly[[E]]; - $Class_deduced[[auto]] $Variable_decl[[AF]] = $Class[[Foo]](); - $Class_deduced[[decltype]](auto) $Variable_decl[[AF2]] = $Class[[Foo]](); - $Class_deduced[[auto]] *$Variable_decl[[AFP]] = &$Variable[[AF]]; - $Enum_deduced[[auto]] &$Variable_decl[[AER]] = $Variable[[AE]]; - $Primitive_deduced_defaultLibrary[[auto]] $Variable_decl[[Form]] = 10.2 + 2 * 4; - $Primitive_deduced_defaultLibrary[[decltype]]($Variable[[Form]]) $Variable_decl[[F]] = 10; - auto $Variable_decl[[Fun]] = []()->void{}; + class $Class_def[[Foo]] {}; + $Enum_deduced[[auto]] $Variable_def[[AE]] = $Enum[[E]]::$EnumConstant_readonly[[E]]; + $Class_deduced[[auto]] $Variable_def[[AF]] = $Class[[Foo]](); + $Class_deduced[[decltype]](auto) $Variable_def[[AF2]] = $Class[[Foo]](); + $Class_deduced[[auto]] *$Variable_def[[AFP]] = &$Variable[[AF]]; + $Enum_deduced[[auto]] &$Variable_def[[AER]] = $Variable[[AE]]; + $Primitive_deduced_defaultLibrary[[auto]] $Variable_def[[Form]] = 10.2 + 2 * 4; + $Primitive_deduced_defaultLibrary[[decltype]]($Variable[[Form]]) $Variable_def[[F]] = 10; + auto $Variable_def[[Fun]] = []()->void{}; )cpp", R"cpp( - class $Class_decl[[G]] {}; - template<$Class[[G]] *$TemplateParameter_decl_readonly[[U]]> - class $Class_decl[[GP]] {}; - template<$Class[[G]] &$TemplateParameter_decl_readonly[[U]]> - class $Class_decl[[GR]] {}; - template<int *$TemplateParameter_decl_readonly[[U]]> - class $Class_decl[[IP]] { - void $Method_decl[[f]]() { + class $Class_def[[G]] {}; + template<$Class[[G]] *$TemplateParameter_def_readonly[[U]]> + class $Class_def[[GP]] {}; + template<$Class[[G]] &$TemplateParameter_def_readonly[[U]]> + class $Class_def[[GR]] {}; + template<int *$TemplateParameter_def_readonly[[U]]> + class $Class_def[[IP]] { + void $Method_def[[f]]() { *$TemplateParameter_readonly[[U]] += 5; } }; - template<unsigned $TemplateParameter_decl_readonly[[U]] = 2> - class $Class_decl[[Foo]] { - void $Method_decl[[f]]() { - for(int $LocalVariable_decl[[I]] = 0; + template<unsigned $TemplateParameter_def_readonly[[U]] = 2> + class $Class_def[[Foo]] { + void $Method_def[[f]]() { + for(int $LocalVariable_def[[I]] = 0; $LocalVariable[[I]] < $TemplateParameter_readonly[[U]];) {} } }; - $Class[[G]] $Variable_decl[[L]]; - void $Function_decl[[f]]() { - $Class[[Foo]]<123> $LocalVariable_decl[[F]]; - $Class[[GP]]<&$Variable[[L]]> $LocalVariable_decl[[LL]]; - $Class[[GR]]<$Variable[[L]]> $LocalVariable_decl[[LLL]]; + $Class[[G]] $Variable_def[[L]]; + void $Function_def[[f]]() { + $Class[[Foo]]<123> $LocalVariable_def[[F]]; + $Class[[GP]]<&$Variable[[L]]> $LocalVariable_def[[LL]]; + $Class[[GR]]<$Variable[[L]]> $LocalVariable_def[[LLL]]; } )cpp", R"cpp( - template<typename $TemplateParameter_decl[[T]], - void ($TemplateParameter[[T]]::*$TemplateParameter_decl_readonly[[method]])(int)> - struct $Class_decl[[G]] { - void $Method_decl[[foo]]( - $TemplateParameter[[T]] *$Parameter_decl[[O]]) { + template<typename $TemplateParameter_def[[T]], + void ($TemplateParameter[[T]]::*$TemplateParameter_def_readonly[[method]])(int)> + struct $Class_def[[G]] { + void $Method_def[[foo]]( + $TemplateParameter[[T]] *$Parameter_def[[O]]) { ($Parameter[[O]]->*$TemplateParameter_readonly[[method]])(10); } }; - struct $Class_decl[[F]] { + struct $Class_def[[F]] { void $Method_decl[[f]](int); }; - template<void (*$TemplateParameter_decl_readonly[[Func]])()> - struct $Class_decl[[A]] { - void $Method_decl[[f]]() { + template<void (*$TemplateParameter_def_readonly[[Func]])()> + struct $Class_def[[A]] { + void $Method_def[[f]]() { (*$TemplateParameter_readonly[[Func]])(); } }; - void $Function_decl[[foo]]() { - $Class[[F]] $LocalVariable_decl[[FF]]; - $Class[[G]]<$Class[[F]], &$Class[[F]]::$Method[[f]]> $LocalVariable_decl[[GG]]; + void $Function_def[[foo]]() { + $Class[[F]] $LocalVariable_def[[FF]]; + $Class[[G]]<$Class[[F]], &$Class[[F]]::$Method[[f]]> $LocalVariable_def[[GG]]; $LocalVariable[[GG]].$Method[[foo]](&$LocalVariable[[FF]]); - $Class[[A]]<$Function[[foo]]> $LocalVariable_decl[[AA]]; + $Class[[A]]<$Function[[foo]]> $LocalVariable_def[[AA]]; } )cpp", // Tokens that share a source range but have conflicting Kinds are not @@ -385,7 +394,7 @@ // Preamble ends. $Macro[[DEF_MULTIPLE]](XYZ); $Macro[[DEF_MULTIPLE]](XYZW); - $Macro[[DEF_CLASS]]($Class_decl[[A]]) + $Macro[[DEF_CLASS]]($Class_def[[A]]) #define $Macro_decl[[MACRO_CONCAT]](X, V, T) T foo##X = V #define $Macro_decl[[DEF_VAR]](X, V) int X = V #define $Macro_decl[[DEF_VAR_T]](T, X, V) T X = V @@ -395,27 +404,27 @@ #define $Macro_decl[[SOME_NAME]] variable #define $Macro_decl[[SOME_NAME_SET]] variable2 = 123 #define $Macro_decl[[INC_VAR]](X) X += 2 - void $Function_decl[[foo]]() { - $Macro[[DEF_VAR]]($LocalVariable_decl[[X]], 123); - $Macro[[DEF_VAR_REV]](908, $LocalVariable_decl[[XY]]); - int $Macro[[CPY]]( $LocalVariable_decl[[XX]] ); - $Macro[[DEF_VAR_TYPE]]($Class[[A]], $LocalVariable_decl[[AA]]); + void $Function_def[[foo]]() { + $Macro[[DEF_VAR]]($LocalVariable_def[[X]], 123); + $Macro[[DEF_VAR_REV]](908, $LocalVariable_def[[XY]]); + int $Macro[[CPY]]( $LocalVariable_def[[XX]] ); + $Macro[[DEF_VAR_TYPE]]($Class[[A]], $LocalVariable_def[[AA]]); double $Macro[[SOME_NAME]]; int $Macro[[SOME_NAME_SET]]; $LocalVariable[[variable]] = 20.1; $Macro[[MACRO_CONCAT]](var, 2, float); $Macro[[DEF_VAR_T]]($Class[[A]], $Macro[[CPY]]( - $Macro[[CPY]]($LocalVariable_decl[[Nested]])), + $Macro[[CPY]]($LocalVariable_def[[Nested]])), $Macro[[CPY]]($Class[[A]]())); $Macro[[INC_VAR]]($LocalVariable[[variable]]); } void $Macro[[SOME_NAME]](); - $Macro[[DEF_VAR]]($Variable_decl[[MMMMM]], 567); - $Macro[[DEF_VAR_REV]](756, $Variable_decl[[AB]]); + $Macro[[DEF_VAR]]($Variable_def[[MMMMM]], 567); + $Macro[[DEF_VAR_REV]](756, $Variable_def[[AB]]); #define $Macro_decl[[CALL_FN]](F) F(); #define $Macro_decl[[DEF_FN]](F) void F () - $Macro[[DEF_FN]]($Function_decl[[g]]) { + $Macro[[DEF_FN]]($Function_def[[g]]) { $Macro[[CALL_FN]]($Function[[foo]]); } )cpp", @@ -423,10 +432,10 @@ #define $Macro_decl[[fail]](expr) expr #define $Macro_decl[[assert]](COND) if (!(COND)) { fail("assertion failed" #COND); } // Preamble ends. - int $Variable_decl[[x]]; - int $Variable_decl[[y]]; + int $Variable_def[[x]]; + int $Variable_def[[y]]; int $Function_decl[[f]](); - void $Function_decl[[foo]]() { + void $Function_def[[foo]]() { $Macro[[assert]]($Variable[[x]] != $Variable[[y]]); $Macro[[assert]]($Variable[[x]] != $Function[[f]]()); } @@ -446,14 +455,14 @@ $InactiveCode[[#endif]] )cpp", R"cpp( - struct $Class_decl[[S]] { + struct $Class_def[[S]] { float $Field_decl[[Value]]; $Class[[S]] *$Field_decl[[Next]]; }; - $Class[[S]] $Variable_decl[[Global]][2] = {$Class[[S]](), $Class[[S]]()}; + $Class[[S]] $Variable_def[[Global]][2] = {$Class[[S]](), $Class[[S]]()}; auto [$Variable_decl[[G1]], $Variable_decl[[G2]]] = $Variable[[Global]]; - void $Function_decl[[f]]($Class[[S]] $Parameter_decl[[P]]) { - int $LocalVariable_decl[[A]][2] = {1,2}; + void $Function_def[[f]]($Class[[S]] $Parameter_def[[P]]) { + int $LocalVariable_def[[A]][2] = {1,2}; auto [$LocalVariable_decl[[B1]], $LocalVariable_decl[[B2]]] = $LocalVariable[[A]]; auto [$LocalVariable_decl[[G1]], $LocalVariable_decl[[G2]]] = $Variable[[Global]]; $Class_deduced[[auto]] [$LocalVariable_decl[[P1]], $LocalVariable_decl[[P2]]] = $Parameter[[P]]; @@ -462,8 +471,8 @@ } )cpp", R"cpp( - template<class $TemplateParameter_decl[[T]]> - class $Class_decl[[A]] { + template<class $TemplateParameter_def[[T]]> + class $Class_def[[A]] { using $TemplateParameter_decl[[TemplateParam1]] = $TemplateParameter[[T]]; typedef $TemplateParameter[[T]] $TemplateParameter_decl[[TemplateParam2]]; using $Primitive_decl[[IntType]] = int; @@ -481,53 +490,53 @@ }; )cpp", R"cpp( - template <class $TemplateParameter_decl[[T]]> + template <class $TemplateParameter_def[[T]]> void $Function_decl[[phase1]]($TemplateParameter[[T]]); - template <class $TemplateParameter_decl[[T]]> - void $Function_decl[[foo]]($TemplateParameter[[T]] $Parameter_decl[[P]]) { + template <class $TemplateParameter_def[[T]]> + void $Function_def[[foo]]($TemplateParameter[[T]] $Parameter_def[[P]]) { $Function[[phase1]]($Parameter[[P]]); $Unknown_dependentName[[phase2]]($Parameter[[P]]); } )cpp", R"cpp( - class $Class_decl[[A]] { - template <class $TemplateParameter_decl[[T]]> + class $Class_def[[A]] { + template <class $TemplateParameter_def[[T]]> void $Method_decl[[bar]]($TemplateParameter[[T]]); }; - template <class $TemplateParameter_decl[[U]]> - void $Function_decl[[foo]]($TemplateParameter[[U]] $Parameter_decl[[P]]) { + template <class $TemplateParameter_def[[U]]> + void $Function_def[[foo]]($TemplateParameter[[U]] $Parameter_def[[P]]) { $Class[[A]]().$Method[[bar]]($Parameter[[P]]); } )cpp", R"cpp( - struct $Class_decl[[A]] { - template <class $TemplateParameter_decl[[T]]> + struct $Class_def[[A]] { + template <class $TemplateParameter_def[[T]]> static void $StaticMethod_decl_static[[foo]]($TemplateParameter[[T]]); }; - template <class $TemplateParameter_decl[[T]]> - struct $Class_decl[[B]] { - void $Method_decl[[bar]]() { + template <class $TemplateParameter_def[[T]]> + struct $Class_def[[B]] { + void $Method_def[[bar]]() { $Class[[A]]::$StaticMethod_static[[foo]]($TemplateParameter[[T]]()); } }; )cpp", R"cpp( - template <class $TemplateParameter_decl[[T]]> + template <class $TemplateParameter_def[[T]]> void $Function_decl[[foo]](typename $TemplateParameter[[T]]::$Type_dependentName[[Type]] = $TemplateParameter[[T]]::$Unknown_dependentName[[val]]); )cpp", R"cpp( - template <class $TemplateParameter_decl[[T]]> - void $Function_decl[[foo]]($TemplateParameter[[T]] $Parameter_decl[[P]]) { + template <class $TemplateParameter_def[[T]]> + void $Function_def[[foo]]($TemplateParameter[[T]] $Parameter_def[[P]]) { $Parameter[[P]].$Unknown_dependentName[[Field]]; } )cpp", R"cpp( - template <class $TemplateParameter_decl[[T]]> - class $Class_decl[[A]] { - int $Method_decl[[foo]]() { + template <class $TemplateParameter_def[[T]]> + class $Class_def[[A]] { + int $Method_def[[foo]]() { return $TemplateParameter[[T]]::$Unknown_dependentName[[Field]]; } }; @@ -539,9 +548,9 @@ )cpp", // Highlighting of template template arguments. R"cpp( - template <template <class> class $TemplateParameter_decl[[TT]], - template <class> class ...$TemplateParameter_decl[[TTs]]> - struct $Class_decl[[Foo]] { + template <template <class> class $TemplateParameter_def[[TT]], + template <class> class ...$TemplateParameter_def[[TTs]]> + struct $Class_def[[Foo]] { $Class[[Foo]]<$TemplateParameter[[TT]], $TemplateParameter[[TTs]]...> *$Field_decl[[t]]; }; @@ -554,7 +563,7 @@ $InactiveCode[[#endif]] // A declaration to cause the preamble to end. - int $Variable_decl[[EndPreamble]]; + int $Variable_def[[EndPreamble]]; // Code after the preamble. // Code inside inactive blocks does not get regular highlightings @@ -563,33 +572,33 @@ $InactiveCode[[#if defined(test)]] $InactiveCode[[int Inactive2;]] $InactiveCode[[#elif defined(test2)]] - int $Variable_decl[[Active1]]; + int $Variable_def[[Active1]]; $InactiveCode[[#else]] $InactiveCode[[int Inactive3;]] $InactiveCode[[#endif]] #ifndef $Macro[[test]] - int $Variable_decl[[Active2]]; + int $Variable_def[[Active2]]; #endif $InactiveCode[[#ifdef test]] $InactiveCode[[int Inactive4;]] $InactiveCode[[#else]] - int $Variable_decl[[Active3]]; + int $Variable_def[[Active3]]; #endif )cpp", // Argument to 'sizeof...' R"cpp( - template <typename... $TemplateParameter_decl[[Elements]]> - struct $Class_decl[[TupleSize]] { + template <typename... $TemplateParameter_def[[Elements]]> + struct $Class_def[[TupleSize]] { static const int $StaticField_decl_readonly_static[[size]] = sizeof...($TemplateParameter[[Elements]]); }; )cpp", // More dependent types R"cpp( - template <typename $TemplateParameter_decl[[T]]> - struct $Class_decl[[Waldo]] { + template <typename $TemplateParameter_def[[T]]> + struct $Class_def[[Waldo]] { using $Typedef_decl[[Location1]] = typename $TemplateParameter[[T]] ::$Type_dependentName[[Resolver]]::$Type_dependentName[[Location]]; using $Typedef_decl[[Location2]] = typename $TemplateParameter[[T]] @@ -605,116 +614,116 @@ // Dependent name with heuristic target R"cpp( template <typename> - struct $Class_decl[[Foo]] { + struct $Class_def[[Foo]] { int $Field_decl[[Waldo]]; - void $Method_decl[[bar]]() { + void $Method_def[[bar]]() { $Class[[Foo]]().$Field_dependentName[[Waldo]]; } - template <typename $TemplateParameter_decl[[U]]> - void $Method_decl[[bar1]]() { + template <typename $TemplateParameter_def[[U]]> + void $Method_def[[bar1]]() { $Class[[Foo]]<$TemplateParameter[[U]]>().$Field_dependentName[[Waldo]]; } void $Method_decl[[Overload]](); void $Method_decl_readonly[[Overload]]() const; }; - template <typename $TemplateParameter_decl[[T]]> - void $Function_decl[[baz]]($Class[[Foo]]<$TemplateParameter[[T]]> $Parameter_decl[[o]]) { + template <typename $TemplateParameter_def[[T]]> + void $Function_def[[baz]]($Class[[Foo]]<$TemplateParameter[[T]]> $Parameter_def[[o]]) { $Parameter[[o]].$Method_readonly_dependentName[[Overload]](); } )cpp", // Concepts R"cpp( - template <typename $TemplateParameter_decl[[T]]> - concept $Concept_decl[[Fooable]] = - requires($TemplateParameter[[T]] $Parameter_decl[[F]]) { + template <typename $TemplateParameter_def[[T]]> + concept $Concept_decl[[Fooable]] = + requires($TemplateParameter[[T]] $Parameter_def[[F]]) { $Parameter[[F]].$Unknown_dependentName[[foo]](); }; - template <typename $TemplateParameter_decl[[T]]> + template <typename $TemplateParameter_def[[T]]> requires $Concept[[Fooable]]<$TemplateParameter[[T]]> - void $Function_decl[[bar]]($TemplateParameter[[T]] $Parameter_decl[[F]]) { + void $Function_def[[bar]]($TemplateParameter[[T]] $Parameter_def[[F]]) { $Parameter[[F]].$Unknown_dependentName[[foo]](); } )cpp", // Dependent template name R"cpp( - template <template <typename> class> struct $Class_decl[[A]] {}; - template <typename $TemplateParameter_decl[[T]]> + template <template <typename> class> struct $Class_def[[A]] {}; + template <typename $TemplateParameter_def[[T]]> using $Typedef_decl[[W]] = $Class[[A]]< $TemplateParameter[[T]]::template $Class_dependentName[[Waldo]] >; )cpp", R"cpp( - class $Class_decl_abstract[[Abstract]] { + class $Class_def_abstract[[Abstract]] { public: virtual void $Method_decl_abstract_virtual[[pure]]() = 0; virtual void $Method_decl_virtual[[impl]](); }; - void $Function_decl[[foo]]($Class_abstract[[Abstract]]* $Parameter_decl[[A]]) { + void $Function_def[[foo]]($Class_abstract[[Abstract]]* $Parameter_def[[A]]) { $Parameter[[A]]->$Method_abstract_virtual[[pure]](); $Parameter[[A]]->$Method_virtual[[impl]](); } )cpp", R"cpp( - <:[deprecated]:> int $Variable_decl_deprecated[[x]]; + <:[deprecated]:> int $Variable_def_deprecated[[x]]; )cpp", R"cpp( // ObjC: Classes and methods @class $Class_decl[[Forward]]; - @interface $Class_decl[[Foo]] + @interface $Class_def[[Foo]] @end - @interface $Class_decl[[Bar]] : $Class[[Foo]] - -(id) $Method_decl[[x]]:(int)$Parameter_decl[[a]] $Method_decl[[y]]:(int)$Parameter_decl[[b]]; + @interface $Class_def[[Bar]] : $Class[[Foo]] + -(id) $Method_decl[[x]]:(int)$Parameter_def[[a]] $Method_decl[[y]]:(int)$Parameter_def[[b]]; +(instancetype)$StaticMethod_decl_static[[sharedInstance]]; +(void) $StaticMethod_decl_static[[explode]]; @end - @implementation $Class_decl[[Bar]] - -(id) $Method_decl[[x]]:(int)$Parameter_decl[[a]] $Method_decl[[y]]:(int)$Parameter_decl[[b]] { + @implementation $Class_def[[Bar]] + -(id) $Method_def[[x]]:(int)$Parameter_def[[a]] $Method_def[[y]]:(int)$Parameter_def[[b]] { return self; } - +(instancetype)$StaticMethod_decl_static[[sharedInstance]] { return 0; } - +(void) $StaticMethod_decl_static[[explode]] {} + +(instancetype)$StaticMethod_def_static[[sharedInstance]] { return 0; } + +(void) $StaticMethod_def_static[[explode]] {} @end - void $Function_decl[[m]]($Class[[Bar]] *$Parameter_decl[[b]]) { + void $Function_def[[m]]($Class[[Bar]] *$Parameter_def[[b]]) { [$Parameter[[b]] $Method[[x]]:1 $Method[[y]]:2]; [$Class[[Bar]] $StaticMethod_static[[explode]]]; } )cpp", R"cpp( // ObjC: Protocols - @protocol $Interface_decl[[Protocol]] + @protocol $Interface_def[[Protocol]] @end - @protocol $Interface_decl[[Protocol2]] <$Interface[[Protocol]]> + @protocol $Interface_def[[Protocol2]] <$Interface[[Protocol]]> @end - @interface $Class_decl[[Klass]] <$Interface[[Protocol]]> + @interface $Class_def[[Klass]] <$Interface[[Protocol]]> @end - id<$Interface[[Protocol]]> $Variable_decl[[x]]; + id<$Interface[[Protocol]]> $Variable_def[[x]]; )cpp", R"cpp( // ObjC: Categories - @interface $Class_decl[[Foo]] + @interface $Class_def[[Foo]] @end - @interface $Class[[Foo]]($Namespace_decl[[Bar]]) + @interface $Class[[Foo]]($Namespace_def[[Bar]]) @end - @implementation $Class[[Foo]]($Namespace_decl[[Bar]]) + @implementation $Class[[Foo]]($Namespace_def[[Bar]]) @end )cpp", R"cpp( // ObjC: Properties and Ivars. - @interface $Class_decl[[Foo]] { + @interface $Class_def[[Foo]] { int $Field_decl[[_someProperty]]; } @property(nonatomic, assign) int $Field_decl[[someProperty]]; @property(readonly, class) $Class[[Foo]] *$Field_decl_readonly_static[[sharedInstance]]; @end - @implementation $Class_decl[[Foo]] + @implementation $Class_def[[Foo]] @synthesize someProperty = _someProperty; - - (int)$Method_decl[[otherMethod]] { + - (int)$Method_def[[otherMethod]] { return 0; } - - (int)$Method_decl[[doSomething]] { + - (int)$Method_def[[doSomething]] { $Class[[Foo]].$Field_static[[sharedInstance]].$Field[[someProperty]] = 1; self.$Field[[someProperty]] = self.$Field[[someProperty]] + self.$Field[[otherMethod]] + 1; self->$Field[[_someProperty]] = $Field[[_someProperty]] + 1; @@ -723,32 +732,32 @@ )cpp", // Member imported from dependent base R"cpp( - template <typename> struct $Class_decl[[Base]] { + template <typename> struct $Class_def[[Base]] { int $Field_decl[[member]]; }; - template <typename $TemplateParameter_decl[[T]]> - struct $Class_decl[[Derived]] : $Class[[Base]]<$TemplateParameter[[T]]> { + template <typename $TemplateParameter_def[[T]]> + struct $Class_def[[Derived]] : $Class[[Base]]<$TemplateParameter[[T]]> { using $Class[[Base]]<$TemplateParameter[[T]]>::$Field_dependentName[[member]]; - void $Method_decl[[method]]() { + void $Method_def[[method]]() { (void)$Field_dependentName[[member]]; } }; )cpp", // Modifier for variables passed as non-const references R"cpp( - struct $Class_decl[[ClassWithOp]] { + struct $Class_def[[ClassWithOp]] { void operator()(int); void operator()(int, int &); void operator()(int, int, const int &); int &operator[](int &); int operator[](int) const; }; - struct $Class_decl[[ClassWithStaticMember]] { - static inline int $StaticField_decl_static[[j]] = 0; + struct $Class_def[[ClassWithStaticMember]] { + static inline int $StaticField_def_static[[j]] = 0; }; - struct $Class_decl[[ClassWithRefMembers]] { - $Class_decl[[ClassWithRefMembers]](int $Parameter_decl[[i]]) + struct $Class_def[[ClassWithRefMembers]] { + $Class_def[[ClassWithRefMembers]](int $Parameter_def[[i]]) : $Field[[i1]]($Parameter[[i]]), $Field_readonly[[i2]]($Parameter[[i]]), $Field[[i3]]($Parameter_usedAsMutableReference[[i]]), @@ -761,61 +770,61 @@ const int &$Field_decl_readonly[[i4]]; int &$Field_decl[[i5]]; }; - void $Function_decl[[fun]](int, const int, + void $Function_def[[fun]](int, const int, int*, const int*, int&, const int&, int*&, const int*&, const int* const &, int**, int**&, int** const &, int = 123) { - int $LocalVariable_decl[[val]]; - int* $LocalVariable_decl[[ptr]]; - const int* $LocalVariable_decl_readonly[[constPtr]]; - int** $LocalVariable_decl[[array]]; - $Function[[fun]]($LocalVariable[[val]], $LocalVariable[[val]], - $LocalVariable[[ptr]], $LocalVariable_readonly[[constPtr]], - $LocalVariable_usedAsMutableReference[[val]], $LocalVariable[[val]], + int $LocalVariable_def[[val]]; + int* $LocalVariable_def[[ptr]]; + const int* $LocalVariable_def_readonly[[constPtr]]; + int** $LocalVariable_def[[array]]; + $Function[[fun]]($LocalVariable[[val]], $LocalVariable[[val]], + $LocalVariable[[ptr]], $LocalVariable_readonly[[constPtr]], + $LocalVariable_usedAsMutableReference[[val]], $LocalVariable[[val]], $LocalVariable_usedAsMutableReference[[ptr]], $LocalVariable_readonly_usedAsMutableReference[[constPtr]], $LocalVariable_readonly[[constPtr]], - $LocalVariable[[array]], $LocalVariable_usedAsMutableReference[[array]], + $LocalVariable[[array]], $LocalVariable_usedAsMutableReference[[array]], $LocalVariable[[array]] ); [](int){}($LocalVariable[[val]]); [](int&){}($LocalVariable_usedAsMutableReference[[val]]); [](const int&){}($LocalVariable[[val]]); - $Class[[ClassWithOp]] $LocalVariable_decl[[c]]; - const $Class[[ClassWithOp]] $LocalVariable_decl_readonly[[c2]]; + $Class[[ClassWithOp]] $LocalVariable_def[[c]]; + const $Class[[ClassWithOp]] $LocalVariable_def_readonly[[c2]]; $LocalVariable[[c]]($LocalVariable[[val]]); $LocalVariable[[c]](0, $LocalVariable_usedAsMutableReference[[val]]); $LocalVariable[[c]](0, 0, $LocalVariable[[val]]); $LocalVariable[[c]][$LocalVariable_usedAsMutableReference[[val]]]; $LocalVariable_readonly[[c2]][$LocalVariable[[val]]]; } - struct $Class_decl[[S]] { - $Class_decl[[S]](int&) { - $Class[[S]] $LocalVariable_decl[[s1]]($Field_usedAsMutableReference[[field]]); - $Class[[S]] $LocalVariable_decl[[s2]]($LocalVariable[[s1]].$Field_usedAsMutableReference[[field]]); + struct $Class_def[[S]] { + $Class_def[[S]](int&) { + $Class[[S]] $LocalVariable_def[[s1]]($Field_usedAsMutableReference[[field]]); + $Class[[S]] $LocalVariable_def[[s2]]($LocalVariable[[s1]].$Field_usedAsMutableReference[[field]]); - $Class[[S]] $LocalVariable_decl[[s3]]($StaticField_static_usedAsMutableReference[[staticField]]); - $Class[[S]] $LocalVariable_decl[[s4]]($Class[[S]]::$StaticField_static_usedAsMutableReference[[staticField]]); + $Class[[S]] $LocalVariable_def[[s3]]($StaticField_static_usedAsMutableReference[[staticField]]); + $Class[[S]] $LocalVariable_def[[s4]]($Class[[S]]::$StaticField_static_usedAsMutableReference[[staticField]]); } int $Field_decl[[field]]; static int $StaticField_decl_static[[staticField]]; }; - template <typename $TemplateParameter_decl[[X]]> - void $Function_decl[[foo]]($TemplateParameter[[X]]& $Parameter_decl[[x]]) { + template <typename $TemplateParameter_def[[X]]> + void $Function_def[[foo]]($TemplateParameter[[X]]& $Parameter_def[[x]]) { // We do not support dependent types, so this one should *not* get the modifier. - $Function[[foo]]($Parameter[[x]]); + $Function[[foo]]($Parameter[[x]]); } )cpp", // init-captures R"cpp( - void $Function_decl[[foo]]() { - int $LocalVariable_decl[[a]], $LocalVariable_decl[[b]]; - [ $LocalVariable_decl[[c]] = $LocalVariable[[a]], - $LocalVariable_decl[[d]]($LocalVariable[[b]]) ]() {}(); + void $Function_def[[foo]]() { + int $LocalVariable_def[[a]], $LocalVariable_def[[b]]; + [ $LocalVariable_def[[c]] = $LocalVariable[[a]], + $LocalVariable_def[[d]]($LocalVariable[[b]]) ]() {}(); } )cpp", // Enum base specifier @@ -832,33 +841,33 @@ R"cpp( void $Function_decl[[Foo]](); // Use <: :> digraphs for deprecated attribute to avoid conflict with annotation syntax - <:<:deprecated:>:> void $Function_decl_deprecated[[Foo]](int* $Parameter_decl[[x]]); - void $Function_decl[[Foo]](int $Parameter_decl[[x]]); - template <typename $TemplateParameter_decl[[T]]> - void $Function_decl[[Bar]]($TemplateParameter[[T]] $Parameter_decl[[x]]) { - $Function_deprecated[[Foo]]($Parameter[[x]]); - $Function_deprecated[[Foo]]($Parameter[[x]]); - $Function_deprecated[[Foo]]($Parameter[[x]]); + <:<:deprecated:>:> void $Function_decl_deprecated[[Foo]](int* $Parameter_def[[x]]); + void $Function_decl[[Foo]](int $Parameter_def[[x]]); + template <typename $TemplateParameter_def[[T]]> + void $Function_def[[Bar]]($TemplateParameter[[T]] $Parameter_def[[x]]) { + $Function_deprecated[[Foo]]($Parameter[[x]]); + $Function_deprecated[[Foo]]($Parameter[[x]]); + $Function_deprecated[[Foo]]($Parameter[[x]]); } )cpp", // Predefined identifiers R"cpp( - void $Function_decl[[Foo]]() { - const char *$LocalVariable_decl_readonly[[s]] = $LocalVariable_readonly_static[[__func__]]; + void $Function_def[[Foo]]() { + const char *$LocalVariable_def_readonly[[s]] = $LocalVariable_readonly_static[[__func__]]; } )cpp", // Explicit template specialization R"cpp( - struct $Class_decl[[Base]]{}; - template <typename $TemplateParameter_decl[[T]]> - struct $Class_decl[[S]] : public $Class[[Base]] {}; - template <> - struct $Class_decl[[S]]<void> : public $Class[[Base]] {}; + struct $Class_def[[Base]]{}; + template <typename $TemplateParameter_def[[T]]> + struct $Class_def[[S]] : public $Class[[Base]] {}; + template <> + struct $Class_def[[S]]<void> : public $Class[[Base]] {}; - template <typename $TemplateParameter_decl[[T]]> - $TemplateParameter[[T]] $Variable_decl[[x]] = {}; + template <typename $TemplateParameter_def[[T]]> + $TemplateParameter[[T]] $Variable_def[[x]] = {}; template <> - int $Variable_decl[[x]]<int> = (int)sizeof($Class[[Base]]); + int $Variable_def[[x]]<int> = (int)sizeof($Class[[Base]]); )cpp"}; for (const auto &TestCase : TestCases) // Mask off scope modifiers to keep the tests manageable. @@ -866,7 +875,7 @@ checkHighlightings(TestCase, {}, ~ScopeModifierMask); checkHighlightings(R"cpp( - class $Class_decl[[A]] { + class $Class_def[[A]] { #include "imp.h" }; )cpp", @@ -892,11 +901,11 @@ checkHighlightings(R"cpp( #include "SYSObject.h" - @interface $Class_defaultLibrary[[SYSObject]] ($Namespace_decl[[UserCategory]]) + @interface $Class_defaultLibrary[[SYSObject]] ($Namespace_def[[UserCategory]]) @property(nonatomic, readonly) int $Field_decl_readonly[[user_property]]; @end - int $Function_decl[[somethingUsingSystemSymbols]]() { - $Class_defaultLibrary[[SYSObject]] *$LocalVariable_decl[[obj]] = [$Class_defaultLibrary[[SYSObject]] $StaticMethod_static_defaultLibrary[[new]]]; + int $Function_def[[somethingUsingSystemSymbols]]() { + $Class_defaultLibrary[[SYSObject]] *$LocalVariable_def[[obj]] = [$Class_defaultLibrary[[SYSObject]] $StaticMethod_static_defaultLibrary[[new]]]; return $LocalVariable[[obj]].$Field_defaultLibrary[[value]] + $LocalVariable[[obj]].$Field_readonly[[user_property]]; } )cpp", Index: clang-tools-extra/clangd/test/semantic-tokens.test =================================================================== --- clang-tools-extra/clangd/test/semantic-tokens.test +++ clang-tools-extra/clangd/test/semantic-tokens.test @@ -23,7 +23,7 @@ # CHECK-NEXT: 4, # CHECK-NEXT: 1, # CHECK-NEXT: 0, -# CHECK-NEXT: 8193 +# CHECK-NEXT: 16387 # CHECK-NEXT: ], # CHECK-NEXT: "resultId": "1" # CHECK-NEXT: } @@ -49,7 +49,7 @@ # CHECK-NEXT: 4, # CHECK-NEXT: 1, # CHECK-NEXT: 0, -# CHECK-NEXT: 8193 +# CHECK-NEXT: 16387 # CHECK-NEXT: ], # Inserted at position 1 # CHECK-NEXT: "deleteCount": 0, @@ -72,12 +72,12 @@ # CHECK-NEXT: 4, # CHECK-NEXT: 1, # CHECK-NEXT: 0, -# CHECK-NEXT: 8193, +# CHECK-NEXT: 16387, # CHECK-NEXT: 1, # CHECK-NEXT: 4, # CHECK-NEXT: 1, # CHECK-NEXT: 0, -# CHECK-NEXT: 8193 +# CHECK-NEXT: 16387 # CHECK-NEXT: ], # CHECK-NEXT: "resultId": "3" # CHECK-NEXT: } Index: clang-tools-extra/clangd/test/initialize-params.test =================================================================== --- clang-tools-extra/clangd/test/initialize-params.test +++ clang-tools-extra/clangd/test/initialize-params.test @@ -58,6 +58,7 @@ # CHECK-NEXT: "legend": { # CHECK-NEXT: "tokenModifiers": [ # CHECK-NEXT: "declaration", +# CHECK-NEXT: "definition", # CHECK-NEXT: "deprecated", # CHECK-NEXT: "deduced", # CHECK-NEXT: "readonly", Index: clang-tools-extra/clangd/SemanticHighlighting.h =================================================================== --- clang-tools-extra/clangd/SemanticHighlighting.h +++ clang-tools-extra/clangd/SemanticHighlighting.h @@ -61,7 +61,7 @@ enum class HighlightingModifier { Declaration, - // FIXME: Definition (needs findExplicitReferences support) + Definition, Deprecated, Deduced, Readonly, Index: clang-tools-extra/clangd/SemanticHighlighting.cpp =================================================================== --- clang-tools-extra/clangd/SemanticHighlighting.cpp +++ clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -66,6 +66,23 @@ llvm_unreachable("invalid name kind"); } +bool isUniqueDefinition(const NamedDecl *Decl) { + if (auto *Func = dyn_cast<FunctionDecl>(Decl)) + return Func->isThisDeclarationADefinition(); + if (auto *Klass = dyn_cast<CXXRecordDecl>(Decl)) + return Klass->isThisDeclarationADefinition(); + if (auto *Iface = dyn_cast<ObjCInterfaceDecl>(Decl)) + return Iface->isThisDeclarationADefinition(); + if (auto *Proto = dyn_cast<ObjCProtocolDecl>(Decl)) + return Proto->isThisDeclarationADefinition(); + if (auto *Var = dyn_cast<VarDecl>(Decl)) + return Var->isThisDeclarationADefinition(); + return isa<TemplateTypeParmDecl>(Decl) || + isa<NonTypeTemplateParmDecl>(Decl) || + isa<TemplateTemplateParmDecl>(Decl) || isa<ObjCCategoryDecl>(Decl) || + isa<ObjCImplDecl>(Decl); +} + llvm::Optional<HighlightingKind> kindForType(const Type *TP, const HeuristicResolver *Resolver); llvm::Optional<HighlightingKind> @@ -660,7 +677,7 @@ // We handle objective-C selectors specially, because one reference can // cover several non-contiguous tokens. void highlightObjCSelector(const ArrayRef<SourceLocation> &Locs, bool Decl, - bool Class, bool DefaultLibrary) { + bool Def, bool Class, bool DefaultLibrary) { HighlightingKind Kind = Class ? HighlightingKind::StaticMethod : HighlightingKind::Method; for (SourceLocation Part : Locs) { @@ -668,6 +685,8 @@ H.addToken(Part, Kind).addModifier(HighlightingModifier::ClassScope); if (Decl) Tok.addModifier(HighlightingModifier::Declaration); + if (Def) + Tok.addModifier(HighlightingModifier::Definition); if (Class) Tok.addModifier(HighlightingModifier::Static); if (DefaultLibrary) @@ -678,8 +697,9 @@ bool VisitObjCMethodDecl(ObjCMethodDecl *OMD) { llvm::SmallVector<SourceLocation> Locs; OMD->getSelectorLocs(Locs); - highlightObjCSelector(Locs, /*Decl=*/true, OMD->isClassMethod(), - isDefaultLibrary(OMD)); + highlightObjCSelector(Locs, /*Decl=*/true, + OMD->isThisDeclarationADefinition(), + OMD->isClassMethod(), isDefaultLibrary(OMD)); return true; } @@ -689,8 +709,8 @@ bool DefaultLibrary = false; if (ObjCMethodDecl *OMD = OME->getMethodDecl()) DefaultLibrary = isDefaultLibrary(OMD); - highlightObjCSelector(Locs, /*Decl=*/false, OME->isClassMessage(), - DefaultLibrary); + highlightObjCSelector(Locs, /*Decl=*/false, /*Def=*/false, + OME->isClassMessage(), DefaultLibrary); return true; } @@ -859,11 +879,15 @@ Tok.addModifier(HighlightingModifier::DefaultLibrary); if (Decl->isDeprecated()) Tok.addModifier(HighlightingModifier::Deprecated); - // Do not treat an UnresolvedUsingValueDecl as a declaration. - // It's more common to think of it as a reference to the - // underlying declaration. - if (R.IsDecl && !isa<UnresolvedUsingValueDecl>(Decl)) - Tok.addModifier(HighlightingModifier::Declaration); + if (R.IsDecl) { + // Do not treat an UnresolvedUsingValueDecl as a declaration. + // It's more common to think of it as a reference to the + // underlying declaration. + if (!isa<UnresolvedUsingValueDecl>(Decl)) + Tok.addModifier(HighlightingModifier::Declaration); + if (isUniqueDefinition(Decl)) + Tok.addModifier(HighlightingModifier::Definition); + } } }, AST.getHeuristicResolver()); @@ -934,6 +958,8 @@ switch (K) { case HighlightingModifier::Declaration: return OS << "decl"; // abbreviation for common case + case HighlightingModifier::Definition: + return OS << "def"; // abbrevation for common case default: return OS << toSemanticTokenModifier(K); } @@ -1065,6 +1091,8 @@ switch (Modifier) { case HighlightingModifier::Declaration: return "declaration"; + case HighlightingModifier::Definition: + return "definition"; case HighlightingModifier::Deprecated: return "deprecated"; case HighlightingModifier::Readonly:
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits