-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
attribute.rs
61 lines (55 loc) 路 2.49 KB
/
attribute.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use crate::lexer::token::TokenKind;
use crate::parser::internal::expression::argument;
use crate::parser::internal::identifier;
use crate::parser::internal::utils;
use crate::parser::result::ParseResult;
use crate::parser::state::State;
use crate::tree::definition::attribute::AttributeDefinition;
use crate::tree::definition::attribute::AttributeGroupDefinition;
use crate::tree::expression::argument::ArgumentExpression;
pub fn gather(state: &mut State) -> ParseResult<bool> {
if state.iterator.current().kind != TokenKind::Attribute {
return Ok(false);
}
let attributes = AttributeGroupDefinition {
hash_left_bracket: utils::skip(state, TokenKind::Attribute)?,
members: utils::comma_separated(
state,
&|state| {
Ok(AttributeDefinition {
name: identifier::fully_qualified_type_identifier_including_self(state)?,
arguments: if state.iterator.current().kind == TokenKind::LeftParen {
let arguments = argument::argument_list_expression(state)?;
for argument in &arguments.arguments.inner {
match argument {
ArgumentExpression::Value { value, .. }
| ArgumentExpression::Named { value, .. } => {
if !value.is_constant(true) {
crate::parser_report!(
state,
invalid_constant_initialization_expression(value)
);
}
}
expression => {
crate::parser_report!(
state,
invalid_constant_initialization_expression(expression)
);
}
}
}
Some(arguments)
} else {
None
},
})
},
TokenKind::RightBracket,
)?,
right_bracket: utils::skip(state, TokenKind::RightBracket)?,
};
state.attribute(attributes);
// recursive, looking for multiple attribute brackets after each other.
gather(state).map(|_| true)
}