ara_parser/parser/internal/definition/
mod.rs1use crate::lexer::token::TokenKind;
2use crate::parser::result::ParseResult;
3use crate::parser::state::State;
4use crate::tree::definition::Definition;
5use crate::tree::definition::DefinitionTree;
6
7pub mod attribute;
8pub mod class;
9pub mod constant;
10pub mod r#enum;
11pub mod function;
12pub mod interface;
13pub mod modifier;
14pub mod namespace;
15pub mod parameter;
16pub mod property;
17pub mod template;
18pub mod r#type;
19pub mod r#use;
20
21pub fn tree(state: &mut State) -> ParseResult<DefinitionTree> {
22 let mut definitions = Vec::new();
23
24 while !state.iterator.is_eof() {
25 definitions.push(definition(state)?);
26 }
27
28 Ok(DefinitionTree {
29 definitions,
30 eof: state.iterator.current().position,
31 })
32}
33
34pub fn definition(state: &mut State) -> ParseResult<Definition> {
35 let current = state.iterator.current();
36 if matches!(current.kind, TokenKind::OpenTag(_)) {
37 state.iterator.next();
38
39 crate::parser_report!(state, php_opening_tag_not_supported(current));
40
41 return definition(state);
42 }
43
44 if current.kind == TokenKind::Namespace {
45 return Ok(Definition::Namespace(Box::new(
46 namespace::namespace_definition(state)?,
47 )));
48 }
49
50 if current.kind == TokenKind::Use {
51 return Ok(Definition::Use(Box::new(r#use::use_definition(state)?)));
52 }
53
54 if current.kind == TokenKind::Const {
55 return Ok(Definition::Constant(Box::new(
56 constant::constant_definition(state)?,
57 )));
58 }
59
60 if current.kind == TokenKind::Type {
61 return Ok(Definition::TypeAlias(Box::new(
62 r#type::type_alias_definition(state)?,
63 )));
64 }
65
66 let has_attributes = attribute::gather(state)?;
67 let current = state.iterator.current();
68
69 if current.kind == TokenKind::Enum {
70 return Ok(Definition::Enum(Box::new(r#enum::enum_definition(state)?)));
71 }
72
73 if current.kind == TokenKind::Interface {
74 return Ok(Definition::Interface(Box::new(
75 interface::interface_definition(state)?,
76 )));
77 }
78
79 if current.kind == TokenKind::Function {
80 return Ok(Definition::Function(Box::new(
81 function::function_definition(state)?,
82 )));
83 }
84
85 if matches!(
86 current.kind,
87 TokenKind::Readonly | TokenKind::Final | TokenKind::Abstract | TokenKind::Class
88 ) {
89 return Ok(Definition::Class(Box::new(class::class_definition(state)?)));
90 }
91
92 if has_attributes {
93 crate::parser_report!(state, missing_item_definition_after_attributes);
94 }
95
96 crate::parser_bail!(state, unexpected_token(vec!["a definition"], current));
97}