mago_syntax/ast/ast/function_like/
function.rs1use 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#[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}