Skip to content

Commit 5a30ff0

Browse files
GrayJackmaxbrunsfeld
authored andcommitted
Allow attribut on function parameters (#60)
1 parent 7cd2dca commit 5a30ff0

File tree

5 files changed

+57177
-56202
lines changed

5 files changed

+57177
-56202
lines changed

corpus/declarations.txt

Lines changed: 94 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -66,32 +66,103 @@ fn foo() {
6666

6767
fn foo(x: impl FnOnce() -> result::Result<T, E>) {}
6868

69+
fn foo(#[attr] x: i32, #[attr] x: i64) {}
70+
6971
---
7072

7173
(source_file
72-
(function_item (identifier) (parameters) (block))
73-
(function_item (identifier)
74-
(parameters
75-
(parameter (identifier) (primitive_type))
76-
(parameter (identifier) (primitive_type)))
77-
(primitive_type)
78-
(block
79-
(return_expression (binary_expression (identifier) (identifier)))))
80-
(function_item (identifier)
81-
(parameters
82-
(parameter (identifier) (reference_type (primitive_type))))
83-
(block (macro_invocation (identifier) (token_tree (string_literal) (identifier)))))
84-
(function_item (identifier) (parameters) (array_type (primitive_type) (integer_literal))
85-
(block (return_expression (array_expression (integer_literal) (integer_literal)))))
86-
(function_item (identifier) (parameters) (tuple_type (primitive_type) (primitive_type))
87-
(block (return_expression (tuple_expression (integer_literal) (integer_literal)))))
88-
(function_item (identifier) (parameters)
89-
(block (return_expression)))
90-
(function_item (identifier)
91-
(parameters
92-
(parameter (identifier)
93-
(abstract_type (function_type (type_identifier) (parameters) (generic_type (scoped_type_identifier (identifier) (type_identifier)) (type_arguments (type_identifier) (type_identifier)))))))
94-
(block)))
74+
(function_item
75+
name: (identifier)
76+
parameters: (parameters)
77+
body: (block))
78+
(function_item
79+
name: (identifier)
80+
parameters: (parameters
81+
(parameter
82+
pattern: (identifier)
83+
type: (primitive_type))
84+
(parameter
85+
pattern: (identifier)
86+
type: (primitive_type)))
87+
return_type: (primitive_type)
88+
body: (block
89+
(return_expression
90+
(binary_expression
91+
left: (identifier)
92+
right: (identifier)))))
93+
(function_item
94+
name: (identifier)
95+
parameters: (parameters
96+
(parameter
97+
pattern: (identifier)
98+
type: (reference_type
99+
type: (primitive_type))))
100+
body: (block
101+
(macro_invocation
102+
macro: (identifier)
103+
(token_tree
104+
(string_literal)
105+
(identifier)))))
106+
(function_item
107+
name: (identifier)
108+
parameters: (parameters)
109+
return_type: (array_type
110+
element: (primitive_type)
111+
length: (integer_literal))
112+
body: (block
113+
(return_expression
114+
(array_expression
115+
(integer_literal)
116+
(integer_literal)))))
117+
(function_item
118+
name: (identifier)
119+
parameters: (parameters)
120+
return_type: (tuple_type
121+
(primitive_type)
122+
(primitive_type))
123+
body: (block
124+
(return_expression
125+
(tuple_expression
126+
(integer_literal)
127+
(integer_literal)))))
128+
(function_item
129+
name: (identifier)
130+
parameters: (parameters)
131+
body: (block
132+
(return_expression)))
133+
(function_item
134+
name: (identifier)
135+
parameters: (parameters
136+
(parameter
137+
pattern: (identifier)
138+
type: (abstract_type
139+
trait: (function_type
140+
trait: (type_identifier)
141+
parameters: (parameters)
142+
return_type: (generic_type
143+
type: (scoped_type_identifier
144+
path: (identifier)
145+
name: (type_identifier))
146+
type_arguments: (type_arguments
147+
(type_identifier)
148+
(type_identifier)))))))
149+
body: (block))
150+
(function_item
151+
name: (identifier)
152+
parameters: (parameters
153+
(attribute_item
154+
(meta_item
155+
(identifier)))
156+
(parameter
157+
pattern: (identifier)
158+
type: (primitive_type))
159+
(attribute_item
160+
(meta_item
161+
(identifier)))
162+
(parameter
163+
pattern: (identifier)
164+
type: (primitive_type)))
165+
body: (block)))
95166

96167
============================================
97168
Const function declarations

grammar.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -586,13 +586,15 @@ module.exports = grammar({
586586

587587
parameters: $ => seq(
588588
'(',
589-
sepBy(',', choice(
590-
$.parameter,
591-
$.self_parameter,
592-
$.variadic_parameter,
593-
'_',
594-
$._type
595-
)),
589+
sepBy(',', seq(
590+
optional($.attribute_item),
591+
choice(
592+
$.parameter,
593+
$.self_parameter,
594+
$.variadic_parameter,
595+
'_',
596+
$._type
597+
))),
596598
optional(','),
597599
')'
598600
),

src/grammar.json

Lines changed: 69 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -735,7 +735,7 @@
735735
},
736736
{
737737
"type": "PATTERN",
738-
"value": "[\\/_\\-=->,;:::!=?.@*=\\/='&=#%=^=+<>|~]+"
738+
"value": "[/_\\-=->,;:::!=?.@*=/='&=#%=^=+<>|~]+"
739739
},
740740
{
741741
"type": "STRING",
@@ -3281,27 +3281,44 @@
32813281
"type": "SEQ",
32823282
"members": [
32833283
{
3284-
"type": "CHOICE",
3284+
"type": "SEQ",
32853285
"members": [
32863286
{
3287-
"type": "SYMBOL",
3288-
"name": "parameter"
3289-
},
3290-
{
3291-
"type": "SYMBOL",
3292-
"name": "self_parameter"
3293-
},
3294-
{
3295-
"type": "SYMBOL",
3296-
"name": "variadic_parameter"
3297-
},
3298-
{
3299-
"type": "STRING",
3300-
"value": "_"
3287+
"type": "CHOICE",
3288+
"members": [
3289+
{
3290+
"type": "SYMBOL",
3291+
"name": "attribute_item"
3292+
},
3293+
{
3294+
"type": "BLANK"
3295+
}
3296+
]
33013297
},
33023298
{
3303-
"type": "SYMBOL",
3304-
"name": "_type"
3299+
"type": "CHOICE",
3300+
"members": [
3301+
{
3302+
"type": "SYMBOL",
3303+
"name": "parameter"
3304+
},
3305+
{
3306+
"type": "SYMBOL",
3307+
"name": "self_parameter"
3308+
},
3309+
{
3310+
"type": "SYMBOL",
3311+
"name": "variadic_parameter"
3312+
},
3313+
{
3314+
"type": "STRING",
3315+
"value": "_"
3316+
},
3317+
{
3318+
"type": "SYMBOL",
3319+
"name": "_type"
3320+
}
3321+
]
33053322
}
33063323
]
33073324
},
@@ -3315,27 +3332,44 @@
33153332
"value": ","
33163333
},
33173334
{
3318-
"type": "CHOICE",
3335+
"type": "SEQ",
33193336
"members": [
33203337
{
3321-
"type": "SYMBOL",
3322-
"name": "parameter"
3323-
},
3324-
{
3325-
"type": "SYMBOL",
3326-
"name": "self_parameter"
3327-
},
3328-
{
3329-
"type": "SYMBOL",
3330-
"name": "variadic_parameter"
3331-
},
3332-
{
3333-
"type": "STRING",
3334-
"value": "_"
3338+
"type": "CHOICE",
3339+
"members": [
3340+
{
3341+
"type": "SYMBOL",
3342+
"name": "attribute_item"
3343+
},
3344+
{
3345+
"type": "BLANK"
3346+
}
3347+
]
33353348
},
33363349
{
3337-
"type": "SYMBOL",
3338-
"name": "_type"
3350+
"type": "CHOICE",
3351+
"members": [
3352+
{
3353+
"type": "SYMBOL",
3354+
"name": "parameter"
3355+
},
3356+
{
3357+
"type": "SYMBOL",
3358+
"name": "self_parameter"
3359+
},
3360+
{
3361+
"type": "SYMBOL",
3362+
"name": "variadic_parameter"
3363+
},
3364+
{
3365+
"type": "STRING",
3366+
"value": "_"
3367+
},
3368+
{
3369+
"type": "SYMBOL",
3370+
"name": "_type"
3371+
}
3372+
]
33393373
}
33403374
]
33413375
}

0 commit comments

Comments
 (0)