Skip to content

Commit a609d14

Browse files
committed
Handle non-built-in attrs as attr-items
1 parent 1411c8b commit a609d14

File tree

4 files changed

+70894
-68272
lines changed

4 files changed

+70894
-68272
lines changed

grammar.js

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,54 @@ const numeric_types = [
3535

3636
const primitive_types = numeric_types.concat(['bool', 'str', 'char'])
3737

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+
3886
module.exports = grammar({
3987
name: 'rust',
4088

@@ -210,18 +258,43 @@ module.exports = grammar({
210258
attribute_item: $ => seq(
211259
'#',
212260
'[',
213-
$.meta_item,
261+
$._attr,
214262
']'
215263
),
216264

217265
inner_attribute_item: $ => seq(
218266
'#',
219267
'!',
220268
'[',
221-
$.meta_item,
269+
$._attr,
222270
']'
223271
),
224272

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+
225298
meta_item: $ => seq(
226299
$._path,
227300
optional(choice(

0 commit comments

Comments
 (0)