ara_parser/parser/internal/definition/
mod.rs

1use 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}