Skip to main content

mago_syntax/ast/ast/function_like/
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::block::Block;
8use crate::ast::ast::function_like::parameter::FunctionLikeParameterList;
9use crate::ast::ast::function_like::r#return::FunctionLikeReturnTypeHint;
10use crate::ast::ast::identifier::LocalIdentifier;
11use crate::ast::ast::keyword::Keyword;
12use crate::ast::sequence::Sequence;
13
14/// Represents a `function` declaration in PHP.
15///
16/// Example:
17///
18/// ```php
19/// <?php
20///
21/// function foo(): string {
22///    return 'bar';
23/// }
24/// ```
25#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
26pub struct Function<'arena> {
27    pub attribute_lists: Sequence<'arena, AttributeList<'arena>>,
28    pub function: Keyword<'arena>,
29    pub ampersand: Option<Span>,
30    pub name: LocalIdentifier<'arena>,
31    pub parameter_list: FunctionLikeParameterList<'arena>,
32    pub return_type_hint: Option<FunctionLikeReturnTypeHint<'arena>>,
33    pub body: Block<'arena>,
34}
35
36impl HasSpan for Function<'_> {
37    fn span(&self) -> Span {
38        if let Some(attribute_list) = self.attribute_lists.first() {
39            return attribute_list.span().join(self.body.span());
40        }
41
42        self.function.span().join(self.body.span())
43    }
44}