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