mago_ast/ast/function_like/
arrow_function.rs

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