@@ -13,7 +13,7 @@ macro_rules! define_semantic_token_types {
13
13
$( $standard: ident) ,* $( , ) ?
14
14
}
15
15
custom {
16
- $( ( $custom: ident, $string: literal) ) ,* $( , ) ?
16
+ $( ( $custom: ident, $string: literal) $ ( => $fallback : ident ) ? ) ,* $( , ) ?
17
17
}
18
18
19
19
) => {
@@ -24,6 +24,15 @@ macro_rules! define_semantic_token_types {
24
24
$( SemanticTokenType :: $standard, ) *
25
25
$( $custom) ,*
26
26
] ;
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
+ }
27
36
} ;
28
37
}
29
38
@@ -51,42 +60,46 @@ define_semantic_token_types![
51
60
52
61
custom {
53
62
( 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 ,
58
67
( BOOLEAN , "boolean" ) ,
59
68
( BRACE , "brace" ) ,
60
69
( BRACKET , "bracket" ) ,
61
- ( BUILTIN_ATTRIBUTE , "builtinAttribute" ) ,
70
+ ( BUILTIN_ATTRIBUTE , "builtinAttribute" ) => DECORATOR ,
62
71
( BUILTIN_TYPE , "builtinType" ) ,
63
- ( CHAR , "character" ) ,
72
+ ( CHAR , "character" ) => STRING ,
64
73
( COLON , "colon" ) ,
65
74
( COMMA , "comma" ) ,
66
- ( COMPARISON , "comparison" ) ,
75
+ ( COMPARISON , "comparison" ) => OPERATOR ,
67
76
( CONST_PARAMETER , "constParameter" ) ,
68
- ( DERIVE , "derive" ) ,
69
- ( DERIVE_HELPER , "deriveHelper" ) ,
77
+ ( DERIVE , "derive" ) => DECORATOR ,
78
+ ( DERIVE_HELPER , "deriveHelper" ) => DECORATOR ,
70
79
( 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 ,
74
83
( LABEL , "label" ) ,
75
84
( LIFETIME , "lifetime" ) ,
76
- ( LOGICAL , "logical" ) ,
77
- ( MACRO_BANG , "macroBang" ) ,
85
+ ( LOGICAL , "logical" ) => OPERATOR ,
86
+ ( MACRO_BANG , "macroBang" ) => MACRO ,
78
87
( PARENTHESIS , "parenthesis" ) ,
79
88
( PUNCTUATION , "punctuation" ) ,
80
- ( SELF_KEYWORD , "selfKeyword" ) ,
81
- ( SELF_TYPE_KEYWORD , "selfTypeKeyword" ) ,
89
+ ( SELF_KEYWORD , "selfKeyword" ) => KEYWORD ,
90
+ ( SELF_TYPE_KEYWORD , "selfTypeKeyword" ) => KEYWORD ,
82
91
( SEMICOLON , "semicolon" ) ,
83
92
( TYPE_ALIAS , "typeAlias" ) ,
84
- ( TOOL_MODULE , "toolModule" ) ,
93
+ ( TOOL_MODULE , "toolModule" ) => DECORATOR ,
85
94
( UNION , "union" ) ,
86
95
( UNRESOLVED_REFERENCE , "unresolvedReference" ) ,
87
96
}
88
97
] ;
89
98
99
+ macro_rules! count_tts {
100
+ ( ) => { 0usize } ;
101
+ ( $_head: tt $( $tail: tt) * ) => { 1usize + count_tts!( $( $tail) * ) } ;
102
+ }
90
103
macro_rules! define_semantic_token_modifiers {
91
104
(
92
105
standard {
@@ -105,6 +118,8 @@ macro_rules! define_semantic_token_modifiers {
105
118
$( SemanticTokenModifier :: $standard, ) *
106
119
$( $custom) ,*
107
120
] ;
121
+
122
+ const LAST_STANDARD_MOD : usize = count_tts!( $( $standard) * ) ;
108
123
} ;
109
124
}
110
125
@@ -137,6 +152,13 @@ define_semantic_token_modifiers![
137
152
#[ derive( Default ) ]
138
153
pub ( crate ) struct ModifierSet ( pub ( crate ) u32 ) ;
139
154
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
+
140
162
impl ops:: BitOrAssign < SemanticTokenModifier > for ModifierSet {
141
163
fn bitor_assign ( & mut self , rhs : SemanticTokenModifier ) {
142
164
let idx = SUPPORTED_MODIFIERS . iter ( ) . position ( |it| it == & rhs) . unwrap ( ) ;
0 commit comments