Skip to main content

mago_syntax/ast/ast/
attribute.rs

1use serde::Serialize;
2
3use mago_span::HasSpan;
4use mago_span::Span;
5
6use crate::ast::ast::argument::ArgumentList;
7use crate::ast::ast::identifier::Identifier;
8use crate::ast::sequence::TokenSeparatedSequence;
9
10/// Represents a list of attributes.
11///
12/// Example: `#[Foo, Bar(1)]` in `#[Foo, Bar(1)] class Foo {}`
13#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
14pub struct AttributeList<'arena> {
15    pub hash_left_bracket: Span,
16    pub attributes: TokenSeparatedSequence<'arena, Attribute<'arena>>,
17    pub right_bracket: Span,
18}
19
20/// Represents a single attribute.
21///
22/// Example: `Foo` in `#[Foo]`, `Bar(1)` in `#[Bar(1)]`
23#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
24pub struct Attribute<'arena> {
25    pub name: Identifier<'arena>,
26    pub argument_list: Option<ArgumentList<'arena>>,
27}
28
29impl HasSpan for AttributeList<'_> {
30    fn span(&self) -> Span {
31        Span::between(self.hash_left_bracket, self.right_bracket)
32    }
33}
34
35impl HasSpan for Attribute<'_> {
36    fn span(&self) -> Span {
37        if let Some(arguments) = &self.argument_list {
38            Span::between(self.name.span(), arguments.span())
39        } else {
40            self.name.span()
41        }
42    }
43}