@@ -13,7 +13,7 @@ macro_rules! define_semantic_token_types {
1313 $( $standard: ident) ,* $( , ) ?
1414 }
1515 custom {
16- $( ( $custom: ident, $string: literal) ) ,* $( , ) ?
16+ $( ( $custom: ident, $string: literal) $ ( => $fallback : ident ) ? ) ,* $( , ) ?
1717 }
1818
1919 ) => {
@@ -24,6 +24,15 @@ macro_rules! define_semantic_token_types {
2424 $( SemanticTokenType :: $standard, ) *
2525 $( $custom) ,*
2626 ] ;
27+
28+ pub ( crate ) fn standard_fallback_type( token: SemanticTokenType ) -> Option <SemanticTokenType > {
29+ $(
30+ if token == $custom {
31+ None $( . or( Some ( SemanticTokenType :: $fallback) ) ) ?
32+ } else
33+ ) *
34+ { Some ( token ) }
35+ }
2736 } ;
2837}
2938
@@ -51,42 +60,46 @@ define_semantic_token_types![
5160
5261 custom {
5362 ( ANGLE , "angle" ) ,
54- ( ARITHMETIC , "arithmetic" ) ,
55- ( ATTRIBUTE , "attribute" ) ,
56- ( ATTRIBUTE_BRACKET , "attributeBracket" ) ,
57- ( BITWISE , "bitwise" ) ,
63+ ( ARITHMETIC , "arithmetic" ) => OPERATOR ,
64+ ( ATTRIBUTE , "attribute" ) => DECORATOR ,
65+ ( ATTRIBUTE_BRACKET , "attributeBracket" ) => DECORATOR ,
66+ ( BITWISE , "bitwise" ) => OPERATOR ,
5867 ( BOOLEAN , "boolean" ) ,
5968 ( BRACE , "brace" ) ,
6069 ( BRACKET , "bracket" ) ,
61- ( BUILTIN_ATTRIBUTE , "builtinAttribute" ) ,
70+ ( BUILTIN_ATTRIBUTE , "builtinAttribute" ) => DECORATOR ,
6271 ( BUILTIN_TYPE , "builtinType" ) ,
63- ( CHAR , "character" ) ,
72+ ( CHAR , "character" ) => STRING ,
6473 ( COLON , "colon" ) ,
6574 ( COMMA , "comma" ) ,
66- ( COMPARISON , "comparison" ) ,
75+ ( COMPARISON , "comparison" ) => OPERATOR ,
6776 ( CONST_PARAMETER , "constParameter" ) ,
68- ( DERIVE , "derive" ) ,
69- ( DERIVE_HELPER , "deriveHelper" ) ,
77+ ( DERIVE , "derive" ) => DECORATOR ,
78+ ( DERIVE_HELPER , "deriveHelper" ) => DECORATOR ,
7079 ( DOT , "dot" ) ,
71- ( ESCAPE_SEQUENCE , "escapeSequence" ) ,
72- ( FORMAT_SPECIFIER , "formatSpecifier" ) ,
73- ( GENERIC , "generic" ) ,
80+ ( ESCAPE_SEQUENCE , "escapeSequence" ) => STRING ,
81+ ( FORMAT_SPECIFIER , "formatSpecifier" ) => STRING ,
82+ ( GENERIC , "generic" ) => TYPE_PARAMETER ,
7483 ( LABEL , "label" ) ,
7584 ( LIFETIME , "lifetime" ) ,
76- ( LOGICAL , "logical" ) ,
77- ( MACRO_BANG , "macroBang" ) ,
85+ ( LOGICAL , "logical" ) => OPERATOR ,
86+ ( MACRO_BANG , "macroBang" ) => MACRO ,
7887 ( PARENTHESIS , "parenthesis" ) ,
7988 ( PUNCTUATION , "punctuation" ) ,
80- ( SELF_KEYWORD , "selfKeyword" ) ,
81- ( SELF_TYPE_KEYWORD , "selfTypeKeyword" ) ,
89+ ( SELF_KEYWORD , "selfKeyword" ) => KEYWORD ,
90+ ( SELF_TYPE_KEYWORD , "selfTypeKeyword" ) => KEYWORD ,
8291 ( SEMICOLON , "semicolon" ) ,
8392 ( TYPE_ALIAS , "typeAlias" ) ,
84- ( TOOL_MODULE , "toolModule" ) ,
93+ ( TOOL_MODULE , "toolModule" ) => DECORATOR ,
8594 ( UNION , "union" ) ,
8695 ( UNRESOLVED_REFERENCE , "unresolvedReference" ) ,
8796 }
8897] ;
8998
99+ macro_rules! count_tts {
100+ ( ) => { 0usize } ;
101+ ( $_head: tt $( $tail: tt) * ) => { 1usize + count_tts!( $( $tail) * ) } ;
102+ }
90103macro_rules! define_semantic_token_modifiers {
91104 (
92105 standard {
@@ -105,6 +118,8 @@ macro_rules! define_semantic_token_modifiers {
105118 $( SemanticTokenModifier :: $standard, ) *
106119 $( $custom) ,*
107120 ] ;
121+
122+ const LAST_STANDARD_MOD : usize = count_tts!( $( $standard) * ) ;
108123 } ;
109124}
110125
@@ -137,6 +152,13 @@ define_semantic_token_modifiers![
137152#[ derive( Default ) ]
138153pub ( crate ) struct ModifierSet ( pub ( crate ) u32 ) ;
139154
155+ impl ModifierSet {
156+ pub ( crate ) fn standard_fallback ( & mut self ) {
157+ // Remove all non standard modifiers
158+ self . 0 = self . 0 & !( !0u32 << LAST_STANDARD_MOD )
159+ }
160+ }
161+
140162impl ops:: BitOrAssign < SemanticTokenModifier > for ModifierSet {
141163 fn bitor_assign ( & mut self , rhs : SemanticTokenModifier ) {
142164 let idx = SUPPORTED_MODIFIERS . iter ( ) . position ( |it| it == & rhs) . unwrap ( ) ;
0 commit comments