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