Skip to main content

mago_syntax/ast/ast/function_like/
arrow_function.rs

1use serde::Serialize;
2
3use mago_span::HasSpan;
4use mago_span::Span;
5
6use crate::ast::ast::attribute::AttributeList;
7use crate::ast::ast::expression::Expression;
8use crate::ast::ast::function_like::parameter::FunctionLikeParameterList;
9use crate::ast::ast::function_like::r#return::FunctionLikeReturnTypeHint;
10use crate::ast::ast::keyword::Keyword;
11use crate::ast::sequence::Sequence;
12
13/// Represents an arrow function in PHP.
14///
15/// Example:
16///
17/// ```php
18/// <?php
19///
20/// $fn = fn($x) => $x * 2;
21/// ```
22#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
23pub struct ArrowFunction<'arena> {
24    pub attribute_lists: Sequence<'arena, AttributeList<'arena>>,
25    pub r#static: Option<Keyword<'arena>>,
26    pub r#fn: Keyword<'arena>,
27    pub ampersand: Option<Span>,
28    pub parameter_list: FunctionLikeParameterList<'arena>,
29    pub return_type_hint: Option<FunctionLikeReturnTypeHint<'arena>>,
30    pub arrow: Span,
31    pub expression: &'arena Expression<'arena>,
32}
33
34impl HasSpan for ArrowFunction<'_> {
35    fn span(&self) -> Span {
36        if let Some(attribute_list) = self.attribute_lists.first() {
37            return attribute_list.span().join(self.expression.span());
38        }
39
40        if let Some(r#static) = &self.r#static {
41            return r#static.span().join(self.expression.span());
42        }
43
44        self.r#fn.span().join(self.expression.span())
45    }
46}