@@ -35,6 +35,54 @@ const numeric_types = [
35
35
36
36
const primitive_types = numeric_types . concat ( [ 'bool' , 'str' , 'char' ] )
37
37
38
+ const built_in_attributes = [
39
+ 'cfg' ,
40
+ 'cfg_attr' ,
41
+ 'test' ,
42
+ 'ignore' ,
43
+ 'should_panic' ,
44
+ 'derive' ,
45
+ 'automatically_derived' ,
46
+ 'macro_export' ,
47
+ 'macro_use' ,
48
+ 'proc_macro' ,
49
+ 'proc_macro_derive' ,
50
+ 'proc_macro_attribute' ,
51
+ 'allow' ,
52
+ 'warn' ,
53
+ 'deny' ,
54
+ 'forbid' ,
55
+ 'deprecated' ,
56
+ 'must_use' ,
57
+ 'link' ,
58
+ 'link_name' ,
59
+ 'no_link' ,
60
+ 'repr' ,
61
+ 'crate_type' ,
62
+ 'no_main' ,
63
+ 'export_name' ,
64
+ 'link_section' ,
65
+ 'no_mangle' ,
66
+ 'used' ,
67
+ 'crate_name' ,
68
+ 'inline' ,
69
+ 'cold' ,
70
+ 'no_builtins' ,
71
+ 'target_feature' ,
72
+ 'track_caller' ,
73
+ 'doc' ,
74
+ 'no_std' ,
75
+ 'no_implicit_prelude' ,
76
+ 'path' ,
77
+ 'recursion_limit' ,
78
+ 'type_length_limit' ,
79
+ 'panic_handler' ,
80
+ 'global_allocator' ,
81
+ 'windows_subsystem' ,
82
+ 'feature' ,
83
+ 'non_exhaustive'
84
+ ]
85
+
38
86
module . exports = grammar ( {
39
87
name : 'rust' ,
40
88
@@ -210,18 +258,43 @@ module.exports = grammar({
210
258
attribute_item : $ => seq (
211
259
'#' ,
212
260
'[' ,
213
- $ . meta_item ,
261
+ $ . _attr ,
214
262
']'
215
263
) ,
216
264
217
265
inner_attribute_item : $ => seq (
218
266
'#' ,
219
267
'!' ,
220
268
'[' ,
221
- $ . meta_item ,
269
+ $ . _attr ,
222
270
']'
223
271
) ,
224
272
273
+ _attr : $ => choice (
274
+ alias ( $ . built_in_attr , $ . meta_item ) ,
275
+ alias ( $ . custom_attr , $ . attr_item ) ,
276
+ ) ,
277
+
278
+ custom_attr : $ => seq (
279
+ $ . _path ,
280
+ optional ( choice (
281
+ seq ( '=' , field ( 'value' , $ . _literal ) ) ,
282
+ field ( 'arguments' , $ . delim_token_tree )
283
+ ) )
284
+ ) ,
285
+
286
+ built_in_attr : $ => seq (
287
+ $ . _built_in_attr_path ,
288
+ optional ( choice (
289
+ seq ( '=' , field ( 'value' , $ . _literal ) ) ,
290
+ field ( 'arguments' , $ . meta_arguments )
291
+ ) )
292
+ ) ,
293
+
294
+ _built_in_attr_path : $ => choice (
295
+ ...built_in_attributes . map ( name => alias ( name , $ . identifier ) )
296
+ ) ,
297
+
225
298
meta_item : $ => seq (
226
299
$ . _path ,
227
300
optional ( choice (
0 commit comments