From 04d6c492049c37cbd61c415abdcc53abbdeb6e50 Mon Sep 17 00:00:00 2001 From: azjezz Date: Tue, 17 Jan 2023 21:54:34 +0100 Subject: [PATCH] chore(parser): remove modifier issues --- src/parser/internal/definition/class.rs | 22 +- src/parser/internal/definition/constant.rs | 4 +- src/parser/internal/definition/enum.rs | 16 +- src/parser/internal/definition/function.rs | 16 +- src/parser/internal/definition/interface.rs | 18 +- src/parser/internal/definition/modifier.rs | 366 ++------------- src/parser/internal/definition/parameter.rs | 13 - src/parser/internal/definition/property.rs | 4 +- src/parser/internal/expression/class.rs | 8 +- src/parser/internal/statement/try.rs | 10 +- src/parser/issue.rs | 482 +------------------- src/tree/definition/class.rs | 16 +- src/tree/definition/constant.rs | 18 +- src/tree/definition/function.rs | 67 +-- src/tree/definition/modifier.rs | 456 +++--------------- src/tree/definition/property.rs | 10 +- tests/samples/0003/error.txt | 2 +- tests/samples/0018/tree.txt | 3 +- tests/samples/0019/tree.txt | 3 +- tests/samples/0020/tree.txt | 3 +- tests/samples/0023/error.txt | 2 +- tests/samples/0025/tree.txt | 11 +- tests/samples/0030/tree.txt | 8 +- tests/samples/0036/tree.txt | 24 +- tests/samples/0040/tree.txt | 29 +- tests/samples/0041/tree.txt | 21 +- tests/samples/0044/tree.txt | 3 +- tests/samples/0046/tree.txt | 8 +- tests/samples/0047/tree.txt | 8 +- tests/samples/0048/tree.txt | 11 +- tests/samples/0049/tree.txt | 14 +- tests/samples/0050/tree.txt | 8 +- tests/samples/0055/tree.txt | 19 +- tests/samples/0057/tree.txt | 53 ++- tests/samples/0058/tree.txt | 3 +- tests/samples/0060/tree.txt | 21 +- tests/samples/0062/tree.txt | 6 +- tests/samples/0064/tree.txt | 3 +- tests/samples/0065/error.txt | 2 +- tests/samples/0067/error.txt | 2 +- tests/samples/0068/error.txt | 2 +- tests/samples/0071/tree.txt | 24 +- tests/samples/0075/tree.txt | 53 ++- tests/samples/0076/tree.txt | 38 +- tests/samples/0082/tree.txt | 53 ++- tests/samples/0083/error.txt | 2 +- tests/samples/0084/tree.txt | 9 +- tests/samples/0085/tree.txt | 41 +- tests/samples/0086/error.txt | 14 +- tests/samples/0087/tree.txt | 43 +- tests/samples/0089/tree.txt | 19 +- tests/samples/0093/tree.txt | 19 +- tests/samples/0104/error.txt | 8 +- tests/samples/0107/code.ara | 2 +- tests/samples/0107/tree.txt | 127 ++++-- 55 files changed, 677 insertions(+), 1570 deletions(-) diff --git a/src/parser/internal/definition/class.rs b/src/parser/internal/definition/class.rs index 9f30cf7..40e45cd 100644 --- a/src/parser/internal/definition/class.rs +++ b/src/parser/internal/definition/class.rs @@ -16,13 +16,11 @@ use crate::tree::definition::class::ClassDefinitionBody; use crate::tree::definition::class::ClassDefinitionExtends; use crate::tree::definition::class::ClassDefinitionImplements; use crate::tree::definition::class::ClassDefinitionMember; -use crate::tree::identifier::Identifier; pub fn class_definition(state: &mut State) -> ParseResult { let attributes = state.get_attributes(); let modifiers = modifier::collect(state)?; - let modifiers = modifier::class_modifier_definition_group(state, modifiers)?; let comments = state.iterator.comments(); let class = utils::skip_keyword(state, TokenKind::Class)?; let name = identifier::classname_identifier(state)?; @@ -64,7 +62,7 @@ pub fn class_definition(state: &mut State) -> ParseResult { members: { let mut members = Vec::new(); while state.iterator.current().kind != TokenKind::RightBrace { - members.push(class_definition_member(state, &name)?); + members.push(class_definition_member(state)?); } members @@ -85,28 +83,17 @@ pub fn class_definition(state: &mut State) -> ParseResult { }) } -fn class_definition_member( - state: &mut State, - name: &Identifier, -) -> ParseResult { +fn class_definition_member(state: &mut State) -> ParseResult { attribute::gather(state)?; let modifiers = modifier::collect(state)?; if state.iterator.current().kind == TokenKind::Const { - let modifiers = modifier::constant_modifier_definition_group(state, modifiers)?; return classish_constant_definition(state, modifiers).map(ClassDefinitionMember::Constant); } if state.iterator.current().kind == TokenKind::Function { - let modifiers = modifier::method_modifier_definition_group(state, modifiers)?; - - let method = method_definition( - state, - MethodDefinitionType::DependingOnModifiers, - modifiers, - Some(name), - )?; + let method = method_definition(state, MethodDefinitionType::Either, modifiers)?; return match method { MethodDefinitionReference::Abstract(method) => { @@ -124,8 +111,5 @@ fn class_definition_member( }; } - // e.g: public static - let modifiers = modifier::property_modifier_definition_group(state, modifiers)?; - property::property_definition(state, modifiers).map(ClassDefinitionMember::Property) } diff --git a/src/parser/internal/definition/constant.rs b/src/parser/internal/definition/constant.rs index 88ea044..819e5d0 100644 --- a/src/parser/internal/definition/constant.rs +++ b/src/parser/internal/definition/constant.rs @@ -7,7 +7,7 @@ use crate::parser::state::State; use crate::tree::definition::constant::ClassishConstantDefinition; use crate::tree::definition::constant::ConstantDefinition; use crate::tree::definition::constant::ConstantDefinitionEntry; -use crate::tree::definition::modifier::ConstantModifierDefinitionGroup; +use crate::tree::definition::modifier::ModifierGroupDefinition; pub fn constant_definition(state: &mut State) -> ParseResult { Ok(ConstantDefinition { @@ -30,7 +30,7 @@ pub fn constant_definition(state: &mut State) -> ParseResult pub fn classish_constant_definition( state: &mut State, - modifiers: ConstantModifierDefinitionGroup, + modifiers: ModifierGroupDefinition, ) -> ParseResult { Ok(ClassishConstantDefinition { comments: state.iterator.comments(), diff --git a/src/parser/internal/definition/enum.rs b/src/parser/internal/definition/enum.rs index 984be05..22679f3 100644 --- a/src/parser/internal/definition/enum.rs +++ b/src/parser/internal/definition/enum.rs @@ -10,6 +10,7 @@ use crate::parser::internal::utils; use crate::parser::result::ParseResult; use crate::parser::state::State; use crate::tree::definition::function::ConcreteMethodDefinition; +use crate::tree::definition::modifier::ModifierGroupDefinition; use crate::tree::definition::r#enum::BackedEnumBodyDefinition; use crate::tree::definition::r#enum::BackedEnumCaseDefinition; use crate::tree::definition::r#enum::BackedEnumDefinition; @@ -158,8 +159,6 @@ fn unit_enum_definition_member( let modifiers = modifier::collect(state)?; if state.iterator.current().kind == TokenKind::Const { - let modifiers = modifier::constant_modifier_definition_group(state, modifiers)?; - return constant::classish_constant_definition(state, modifiers) .map(UnitEnumMemberDefinition::Constant) .map(Some); @@ -210,8 +209,6 @@ fn backed_enum_definition_member( let modifiers = modifier::collect(state)?; if state.iterator.current().kind == TokenKind::Const { - let modifiers = modifier::constant_modifier_definition_group(state, modifiers)?; - return constant::classish_constant_definition(state, modifiers) .map(BackedEnumMemberDefinition::Constant) .map(Some); @@ -223,16 +220,11 @@ fn backed_enum_definition_member( fn concrete_method_definition( state: &mut State, - modifiers: Vec<(usize, TokenKind)>, + modifiers: ModifierGroupDefinition, enum_name: &Identifier, ) -> ParseResult> { - let modifiers = modifier::enum_method_modifier_definition_group(state, modifiers)?; - let method = function::method_definition( - state, - function::MethodDefinitionType::Concrete, - modifiers, - Some(enum_name), - )?; + let method = + function::method_definition(state, function::MethodDefinitionType::Concrete, modifiers)?; match method { MethodDefinitionReference::ConcreteConstructor(constructor) => { diff --git a/src/parser/internal/definition/function.rs b/src/parser/internal/definition/function.rs index 49ace02..2a2a024 100644 --- a/src/parser/internal/definition/function.rs +++ b/src/parser/internal/definition/function.rs @@ -15,13 +15,13 @@ use crate::tree::definition::function::FunctionDefinition; use crate::tree::definition::function::FunctionLikeReturnTypeDefinition; use crate::tree::definition::function::MethodTypeConstraintDefinition; use crate::tree::definition::function::MethodTypeConstraintGroupDefinition; -use crate::tree::definition::modifier::MethodModifierDefinitionGroup; -use crate::tree::identifier::Identifier; +use crate::tree::definition::modifier::ModifierDefinition; +use crate::tree::definition::modifier::ModifierGroupDefinition; pub enum MethodDefinitionType { Abstract, Concrete, - DependingOnModifiers, + Either, } pub enum MethodDefinitionReference { @@ -57,8 +57,7 @@ pub fn function_definition(state: &mut State) -> ParseResult pub fn method_definition( state: &mut State, r#type: MethodDefinitionType, - modifiers: MethodModifierDefinitionGroup, - class: Option<&Identifier>, + modifiers: ModifierGroupDefinition, ) -> ParseResult { let comments = state.iterator.comments(); let attributes = state.get_attributes(); @@ -68,12 +67,15 @@ pub fn method_definition( let has_body = match r#type { MethodDefinitionType::Abstract => false, MethodDefinitionType::Concrete => true, - MethodDefinitionType::DependingOnModifiers => !modifiers.has_abstract(), + MethodDefinitionType::Either => !modifiers + .modifiers + .iter() + .any(|modifier| matches!(modifier, ModifierDefinition::Abstract(_))), }; if name.to_string().to_lowercase() == "__construct" { return if has_body { - let parameters = parameter::constructor_parameter_list_definition(state, class)?; + let parameters = parameter::constructor_parameter_list_definition(state)?; Ok(MethodDefinitionReference::ConcreteConstructor( ConcreteConstructorDefinition { diff --git a/src/parser/internal/definition/interface.rs b/src/parser/internal/definition/interface.rs index 5847974..a105dd2 100644 --- a/src/parser/internal/definition/interface.rs +++ b/src/parser/internal/definition/interface.rs @@ -14,7 +14,6 @@ use crate::tree::definition::interface::InterfaceDefinition; use crate::tree::definition::interface::InterfaceDefinitionBody; use crate::tree::definition::interface::InterfaceDefinitionExtends; use crate::tree::definition::interface::InterfaceDefinitionMember; -use crate::tree::identifier::Identifier; pub fn interface_definition(state: &mut State) -> ParseResult { let comments = state.iterator.comments(); @@ -47,7 +46,7 @@ pub fn interface_definition(state: &mut State) -> ParseResult ParseResult ParseResult { +fn interface_definition_member(state: &mut State) -> ParseResult { attribute::gather(state)?; let modifiers = modifier::collect(state)?; if state.iterator.current().kind == TokenKind::Const { - let modifiers = modifier::interface_constant_modifier_definition_group(state, modifiers)?; constant::classish_constant_definition(state, modifiers) .map(InterfaceDefinitionMember::Constant) } else { - let modifiers = modifier::interface_method_modifier_definition_group(state, modifiers)?; - - let method = method_definition( - state, - MethodDefinitionType::Abstract, - modifiers, - Some(interface_name), - )?; + let method = method_definition(state, MethodDefinitionType::Abstract, modifiers)?; match method { MethodDefinitionReference::Abstract(method) => { diff --git a/src/parser/internal/definition/modifier.rs b/src/parser/internal/definition/modifier.rs index bc89cf5..e44c9a4 100644 --- a/src/parser/internal/definition/modifier.rs +++ b/src/parser/internal/definition/modifier.rs @@ -1,311 +1,11 @@ use crate::lexer::token::TokenKind; +use crate::parser::internal::utils; use crate::parser::result::ParseResult; use crate::parser::state::State; -use crate::tree::definition::modifier::ClassModifierDefinition; -use crate::tree::definition::modifier::ClassModifierDefinitionGroup; -use crate::tree::definition::modifier::ConstantModifierDefinition; -use crate::tree::definition::modifier::ConstantModifierDefinitionGroup; -use crate::tree::definition::modifier::MethodModifierDefinition; -use crate::tree::definition::modifier::MethodModifierDefinitionGroup; -use crate::tree::definition::modifier::PromotedPropertyModifierDefinition; -use crate::tree::definition::modifier::PromotedPropertyModifierDefinitionGroup; -use crate::tree::definition::modifier::PropertyModifierDefinition; -use crate::tree::definition::modifier::PropertyModifierDefinitionGroup; +use crate::tree::definition::modifier::{ModifierDefinition, ModifierGroupDefinition}; -#[inline(always)] -pub fn class_modifier_definition_group( - state: &mut State, - input: Vec<(usize, TokenKind)>, -) -> ParseResult { - let mut final_modifier: Option = None; - let mut abstract_modifier: Option = None; - - let mut modifiers = vec![]; - for (position, token) in input { - match token { - TokenKind::Readonly => { - modifiers.push(ClassModifierDefinition::Readonly(position)); - } - TokenKind::Final => { - let modifier = ClassModifierDefinition::Final(position); - modifiers.push(modifier.clone()); - - if final_modifier.is_none() { - final_modifier = Some(modifier); - } - } - TokenKind::Abstract => { - let modifier = ClassModifierDefinition::Abstract(position); - modifiers.push(modifier.clone()); - - if abstract_modifier.is_none() { - abstract_modifier = Some(modifier); - } - } - _ => { - crate::parser_report!( - state, - modifier_cannot_be_used_on_class(token.to_string(), position) - ); - } - } - } - - Ok(ClassModifierDefinitionGroup { modifiers }) -} - -#[inline(always)] -pub fn method_modifier_definition_group( - state: &mut State, - input: Vec<(usize, TokenKind)>, -) -> ParseResult { - let mut final_modifier: Option = None; - let mut abstract_modifier: Option = None; - - let mut modifiers = vec![]; - for (position, token) in input { - match token { - TokenKind::Private => { - modifiers.push(MethodModifierDefinition::Private(position)); - } - TokenKind::Protected => { - modifiers.push(MethodModifierDefinition::Protected(position)); - } - TokenKind::Public => { - modifiers.push(MethodModifierDefinition::Public(position)); - } - TokenKind::Static => { - modifiers.push(MethodModifierDefinition::Static(position)); - } - TokenKind::Final => { - let modifier = MethodModifierDefinition::Final(position); - modifiers.push(modifier.clone()); - - if final_modifier.is_none() { - final_modifier = Some(modifier); - } - } - TokenKind::Abstract => { - let modifier = MethodModifierDefinition::Abstract(position); - modifiers.push(modifier.clone()); - - if abstract_modifier.is_none() { - abstract_modifier = Some(modifier); - } - } - _ => { - crate::parser_report!( - state, - modifier_cannot_be_used_on_class_method(token.to_string(), position) - ); - } - } - } - - Ok(MethodModifierDefinitionGroup { modifiers }) -} - -#[inline(always)] -pub fn interface_method_modifier_definition_group( - state: &mut State, - input: Vec<(usize, TokenKind)>, -) -> ParseResult { - let mut modifiers = vec![]; - for (position, token) in input { - match token { - TokenKind::Public => { - modifiers.push(MethodModifierDefinition::Public(position)); - } - TokenKind::Static => { - modifiers.push(MethodModifierDefinition::Static(position)); - } - _ => { - crate::parser_report!( - state, - modifier_cannot_be_used_on_interface_method(token.to_string(), position) - ); - } - } - } - - Ok(MethodModifierDefinitionGroup { modifiers }) -} - -#[inline(always)] -pub fn enum_method_modifier_definition_group( - state: &mut State, - input: Vec<(usize, TokenKind)>, -) -> ParseResult { - let mut modifiers = vec![]; - for (position, token) in input { - match token { - TokenKind::Private => { - modifiers.push(MethodModifierDefinition::Private(position)); - } - TokenKind::Protected => { - modifiers.push(MethodModifierDefinition::Protected(position)); - } - TokenKind::Public => { - modifiers.push(MethodModifierDefinition::Public(position)); - } - TokenKind::Static => { - modifiers.push(MethodModifierDefinition::Static(position)); - } - TokenKind::Final => { - modifiers.push(MethodModifierDefinition::Final(position)); - } - _ => { - crate::parser_report!( - state, - modifier_cannot_be_used_on_enum_method(token.to_string(), position) - ); - } - } - } - - Ok(MethodModifierDefinitionGroup { modifiers }) -} - -#[inline(always)] -pub fn property_modifier_definition_group( - state: &mut State, - input: Vec<(usize, TokenKind)>, -) -> ParseResult { - let mut modifiers = vec![]; - for (position, token) in input { - match token { - TokenKind::Private => { - modifiers.push(PropertyModifierDefinition::Private(position)); - } - TokenKind::Protected => { - modifiers.push(PropertyModifierDefinition::Protected(position)); - } - TokenKind::Public => { - modifiers.push(PropertyModifierDefinition::Public(position)); - } - TokenKind::Static => { - modifiers.push(PropertyModifierDefinition::Static(position)); - } - TokenKind::Readonly => { - modifiers.push(PropertyModifierDefinition::Readonly(position)); - } - _ => { - crate::parser_report!( - state, - modifier_cannot_be_used_on_property(token.to_string(), position) - ); - } - } - } - - Ok(PropertyModifierDefinitionGroup { modifiers }) -} - -#[inline(always)] -pub fn promoted_property_modifier_definition_group( - state: &mut State, - input: Vec<(usize, TokenKind)>, -) -> ParseResult { - let mut modifiers = vec![]; - for (position, token) in input { - match token { - TokenKind::Private => { - modifiers.push(PromotedPropertyModifierDefinition::Private(position)); - } - TokenKind::Protected => { - modifiers.push(PromotedPropertyModifierDefinition::Protected(position)); - } - TokenKind::Public => { - modifiers.push(PromotedPropertyModifierDefinition::Public(position)); - } - TokenKind::Readonly => { - modifiers.push(PromotedPropertyModifierDefinition::Readonly(position)); - } - _ => { - crate::parser_report!( - state, - modifier_cannot_be_used_on_promoted_property(token.to_string(), position) - ); - } - } - } - - Ok(PromotedPropertyModifierDefinitionGroup { modifiers }) -} - -pub fn constant_modifier_definition_group( - state: &mut State, - input: Vec<(usize, TokenKind)>, -) -> ParseResult { - let mut final_modifier = None; - let mut private_modifier = None; - - let mut modifiers = vec![]; - for (position, token) in input { - match token { - TokenKind::Private => { - let modifier = ConstantModifierDefinition::Private(position); - modifiers.push(modifier.clone()); - private_modifier = Some(modifier); - } - TokenKind::Protected => { - modifiers.push(ConstantModifierDefinition::Protected(position)); - } - TokenKind::Public => { - modifiers.push(ConstantModifierDefinition::Public(position)); - } - TokenKind::Final => { - let modifier = ConstantModifierDefinition::Final(position); - modifiers.push(modifier.clone()); - final_modifier = Some(modifier); - } - _ => { - crate::parser_report!( - state, - modifier_cannot_be_used_on_constant(token.to_string(), position) - ); - } - } - } - - if let (Some(private_modifier), Some(final_modifier)) = (&private_modifier, &final_modifier) { - crate::parser_report!( - state, - private_constant_cannot_be_final(final_modifier, private_modifier) - ); - } - - Ok(ConstantModifierDefinitionGroup { modifiers }) -} - -#[inline(always)] -pub fn interface_constant_modifier_definition_group( - state: &mut State, - input: Vec<(usize, TokenKind)>, -) -> ParseResult { - let mut modifiers = vec![]; - for (position, token) in input { - match token { - TokenKind::Public => { - modifiers.push(ConstantModifierDefinition::Public(position)); - } - TokenKind::Final => { - modifiers.push(ConstantModifierDefinition::Final(position)); - } - _ => { - crate::parser_report!( - state, - modifier_cannot_be_used_on_interface_constant(token.to_string(), position) - ); - } - } - } - - Ok(ConstantModifierDefinitionGroup { modifiers }) -} - -pub fn collect(state: &mut State) -> ParseResult> { - let mut collected: Vec<(usize, TokenKind)> = vec![]; +pub fn collect(state: &mut State) -> ParseResult { + let mut modifiers: Vec = vec![]; let collectable_tokens = vec![ TokenKind::Private, @@ -322,42 +22,38 @@ pub fn collect(state: &mut State) -> ParseResult> { let mut current_position = current.position; while collectable_tokens.contains(¤t_kind) { - if let Some((position, _)) = collected.iter().find(|(_, kind)| kind == ¤t_kind) { - crate::parser_report!( - state, - duplicate_modifier(current_kind.to_string(), *position, current_position) - ); - } - - // guard against multiple visibility modifiers, we don't care where these modifiers are used. - if matches!( - current_kind, - TokenKind::Public | TokenKind::Protected | TokenKind::Private - ) { - if let Some((position, visibility)) = collected.iter().find(|(_, kind)| { - matches!( - kind, - TokenKind::Public | TokenKind::Protected | TokenKind::Private - ) - }) { - crate::parser_report!( - state, - multiple_visibility_modifiers( - (*position, visibility.to_string()), - (current_position, current_kind.to_string()), - ) - ); + modifiers.push(match current_kind { + TokenKind::Private => { + ModifierDefinition::Private(utils::skip_keyword(state, TokenKind::Private)?) } - } - - collected.push((current_position, current_kind)); - - state.iterator.next(); + TokenKind::Protected => { + ModifierDefinition::Protected(utils::skip_keyword(state, TokenKind::Protected)?) + } + TokenKind::Public => { + ModifierDefinition::Public(utils::skip_keyword(state, TokenKind::Public)?) + } + TokenKind::Final => { + ModifierDefinition::Final(utils::skip_keyword(state, TokenKind::Final)?) + } + TokenKind::Abstract => { + ModifierDefinition::Abstract(utils::skip_keyword(state, TokenKind::Abstract)?) + } + TokenKind::Static => { + ModifierDefinition::Static(utils::skip_keyword(state, TokenKind::Static)?) + } + TokenKind::Readonly => { + ModifierDefinition::Readonly(utils::skip_keyword(state, TokenKind::Readonly)?) + } + _ => unreachable!(), + }); current = state.iterator.current().clone(); current_kind = current.kind; current_position = current.position; } - Ok(collected) + Ok(ModifierGroupDefinition { + position: current_position, + modifiers, + }) } diff --git a/src/parser/internal/definition/parameter.rs b/src/parser/internal/definition/parameter.rs index a6b665c..a37ac03 100644 --- a/src/parser/internal/definition/parameter.rs +++ b/src/parser/internal/definition/parameter.rs @@ -12,7 +12,6 @@ use crate::tree::definition::function::ConstructorParameterListDefinition; use crate::tree::definition::function::FunctionLikeParameterDefaultValueDefinition; use crate::tree::definition::function::FunctionLikeParameterDefinition; use crate::tree::definition::function::FunctionLikeParameterListDefinition; -use crate::tree::identifier::Identifier; pub fn function_like_parameter_list_definition( state: &mut State, @@ -85,7 +84,6 @@ pub fn function_like_parameter_list_definition( pub fn constructor_parameter_list_definition( state: &mut State, - class: Option<&Identifier>, ) -> ParseResult { let comments = state.iterator.comments(); @@ -96,11 +94,7 @@ pub fn constructor_parameter_list_definition( attribute::gather(state)?; let modifiers = modifier::collect(state)?; - let modifiers = - modifier::promoted_property_modifier_definition_group(state, modifiers)?; - let type_definition = r#type::type_definition(state)?; - let current = state.iterator.current(); let (ellipsis, variable) = if matches!(current.kind, TokenKind::Ellipsis) { state.iterator.next(); @@ -144,13 +138,6 @@ pub fn constructor_parameter_list_definition( modifiers, }; - if !parameter.modifiers.is_empty() && parameter.ellipsis.is_some() { - crate::parser_report!( - state, - promoted_property_cannot_be_variadic(class, ¶meter) - ); - } - Ok(parameter) }, TokenKind::RightParen, diff --git a/src/parser/internal/definition/property.rs b/src/parser/internal/definition/property.rs index aeb10ad..eda0b96 100644 --- a/src/parser/internal/definition/property.rs +++ b/src/parser/internal/definition/property.rs @@ -5,13 +5,13 @@ use crate::parser::internal::utils; use crate::parser::internal::variable; use crate::parser::result::ParseResult; use crate::parser::state::State; -use crate::tree::definition::modifier::PropertyModifierDefinitionGroup; +use crate::tree::definition::modifier::ModifierGroupDefinition; use crate::tree::definition::property::PropertyDefinition; use crate::tree::definition::property::PropertyEntryDefinition; pub fn property_definition( state: &mut State, - modifiers: PropertyModifierDefinitionGroup, + modifiers: ModifierGroupDefinition, ) -> ParseResult { let type_definition = r#type::type_definition(state)?; let variable = variable::parse(state)?; diff --git a/src/parser/internal/expression/class.rs b/src/parser/internal/expression/class.rs index 8f371a5..1b67a1e 100644 --- a/src/parser/internal/expression/class.rs +++ b/src/parser/internal/expression/class.rs @@ -92,15 +92,12 @@ fn anonymous_class_expression_member( let modifiers = modifier::collect(state)?; if state.iterator.current().kind == TokenKind::Const { - let modifiers = modifier::constant_modifier_definition_group(state, modifiers)?; - return classish_constant_definition(state, modifiers) .map(AnonymousClassExpressionMember::Constant); } if state.iterator.current().kind == TokenKind::Function { - let modifiers = modifier::method_modifier_definition_group(state, modifiers)?; - let method = method_definition(state, MethodDefinitionType::Concrete, modifiers, None)?; + let method = method_definition(state, MethodDefinitionType::Concrete, modifiers)?; match method { MethodDefinitionReference::Concrete(method) => { @@ -117,8 +114,5 @@ fn anonymous_class_expression_member( } } - // e.g: public static - let modifiers = modifier::property_modifier_definition_group(state, modifiers)?; - property::property_definition(state, modifiers).map(AnonymousClassExpressionMember::Property) } diff --git a/src/parser/internal/statement/try.rs b/src/parser/internal/statement/try.rs index fff17f4..b4226af 100644 --- a/src/parser/internal/statement/try.rs +++ b/src/parser/internal/statement/try.rs @@ -11,7 +11,7 @@ use crate::tree::statement::r#try::TryFinallyBlockStatement; use crate::tree::statement::r#try::TryStatement; pub fn try_statement(state: &mut State) -> ParseResult { - let statement = TryStatement { + Ok(TryStatement { comments: state.iterator.comments(), r#try: utils::skip_keyword(state, TokenKind::Try)?, block: block::block_statement(state)?, @@ -49,13 +49,7 @@ pub fn try_statement(state: &mut State) -> ParseResult { } else { None }, - }; - - if statement.catches.is_empty() && statement.finally.is_none() { - crate::parser_report!(state, try_statement_must_have_catch_or_finally(&statement)) - } - - Ok(statement) + }) } #[inline(always)] diff --git a/src/parser/issue.rs b/src/parser/issue.rs index 4810ced..32a5460 100644 --- a/src/parser/issue.rs +++ b/src/parser/issue.rs @@ -8,9 +8,7 @@ use crate::lexer::token::TokenKind; use crate::parser::state::State as ParserState; use crate::tree::definition::function::ConcreteConstructorDefinition; use crate::tree::definition::function::ConcreteMethodDefinition; -use crate::tree::definition::function::ConstructorParameterDefinition; use crate::tree::identifier::Identifier; -use crate::tree::statement::r#try::TryStatement; use crate::tree::Node; #[derive(Debug, Copy, Clone)] @@ -126,35 +124,7 @@ pub enum ParserIssueCode { /// - Remove the attributes MissingItemDefinitionAfterAttributes = 7, - /// Multiple visibility modifiers ( code = 8 ) - /// - /// Example: - /// - /// ```ara - /// final class Foo { - /// public private function bar() {} - /// } - /// ``` - /// - /// Possible solution(s): - /// - /// - Remove one of the visibility modifiers - MultipleVisibilityModifiers = 8, - - /// Duplicate modifier ( code = 9 ) - /// - /// Example: - /// - /// ```ara - /// final final class Foo {} - /// ``` - /// - /// Possible solution(s): - /// - /// - Remove one of the modifiers - DuplicateModifier = 9, - - /// Reserved keyword cannot be used for type name ( code = 10 ) + /// Reserved keyword cannot be used for type name ( code = 8 ) /// /// Example: /// @@ -165,9 +135,9 @@ pub enum ParserIssueCode { /// Possible solution(s): /// /// - Use a different name - ReservedKeywordCannotBeUsedForTypeName = 10, + ReservedKeywordCannotBeUsedForTypeName = 8, - /// Reserved keyword cannot be used for constant name ( code = 11 ) + /// Reserved keyword cannot be used for constant name ( code = 9 ) /// /// Example: /// @@ -178,9 +148,9 @@ pub enum ParserIssueCode { /// Possible solution(s): /// /// - Use a different name - ReservedKeywordCannotBeUsedForConstantName = 11, + ReservedKeywordCannotBeUsedForConstantName = 9, - /// Type cannot be used in current context ( code = 12 ) + /// Type cannot be used in current context ( code = 10 ) /// /// Example: /// @@ -191,9 +161,9 @@ pub enum ParserIssueCode { /// Possible solution(s): /// /// - Use a different type - TypeCannotBeUsedInCurrentContext = 12, + TypeCannotBeUsedInCurrentContext = 10, - /// Missing item expression after attribute(s) ( code = 13 ) + /// Missing item expression after attribute(s) ( code = 11 ) /// /// Example: /// @@ -207,164 +177,9 @@ pub enum ParserIssueCode { /// /// - Add an item expression after the attribute(s) /// - Remove the attribute(s) - MissingItemExpressionAfterAttributes = 13, - - /// Private constant cannot be final ( code = 14 ) - /// - /// Example: - /// - /// ```ara - /// class Foo { - /// private final const BAR = 1; - /// } - /// ``` - /// - /// Possible solution(s): - /// - /// - Remove the `final` modifier - /// - Remove the `private` modifier - PrivateConstantCannotBeFinal = 14, - - /// Modifier cannot be used on classes ( code = 15 ) - /// - /// Example: - /// - /// ```ara - /// final class Foo {} - /// ``` - /// - /// Possible solution(s): - /// - /// - Remove the modifier - ModifierCannotBeUsedOnClass = 15, - - /// Modifier cannot be used on class methods ( code = 16 ) - /// - /// Example: - /// - /// ```ara - /// class Foo { - /// public readonly function bar(): void {} - /// } - /// ``` - /// - /// Possible solution(s): - /// - /// - Remove the modifier - ModifierCannotBeUsedOnClassMethod = 16, - - /// Modifier cannot be used on interface methods ( code = 17 ) - /// - /// Example: - /// - /// ```ara - /// interface Foo { - /// private function bar(): void; - /// } - /// ``` - /// - /// Possible solution(s): - /// - /// - Remove the modifier - ModifierCannotBeUsedOnInterfaceMethod = 17, - - /// Modifier cannot be used on enum methods ( code = 18 ) - /// - /// Example: - /// - /// ```ara - /// enum Foo { - /// public abstract function bar(): void {} - /// } - /// ``` - /// - /// Possible solution(s): - /// - /// - Remove the modifier - ModifierCannotBeUsedOnEnumMethod = 18, + MissingItemExpressionAfterAttributes = 11, - /// Modifier cannot be used on properties ( code = 19 ) - /// - /// Example: - /// - /// - /// ```ara - /// class Foo { - /// public abstract string $bar = ""; - /// } - /// ``` - /// - /// Possible solution(s): - /// - /// - Remove the modifier - ModifierCannotBeUsedOnProperty = 19, - - /// Modifier cannot be used on promoted properties ( code = 20 ) - /// - /// Example: - /// - /// ```ara - /// class Foo { - /// public function __construct( - /// private static string $bar = "", - /// ) {} - /// } - /// ``` - /// - /// Possible solution(s): - /// - /// - Remove the modifier - ModifierCannotBeUsedOnPromotedProperty = 20, - - /// Modifier cannot be used on constants ( code = 21 ) - /// - /// Example: - /// - /// ```ara - /// class Foo { - /// public abstract const BAR = 1; - /// } - /// ``` - /// - /// Possible solution(s): - /// - /// - Remove the modifier - ModifierCannotBeUsedOnConstant = 21, - - /// Modifier cannot be used on interface constants ( code = 22 ) - /// - /// Example: - /// - /// ```ara - /// interface Foo { - /// private const BAR = 1; - /// } - /// ``` - /// - /// Possible solution(s): - /// - /// - Remove the modifier - ModifierCannotBeUsedOnInterfaceConstant = 22, - - /// Promoted property cannot be variadic ( code = 24 ) - /// - /// Example: - /// - /// ```ara - /// class Foo { - /// public function __construct( - /// private string ...$bar, - /// ) {} - /// } - /// ``` - /// - /// Possible solution(s): - /// - /// - Remove the variadic declaration ( `...` ) - /// - Demote the property - PromotedPropertyCannotBeVariadic = 24, - - /// Enum backing type must be either `int` or `string` ( code = 25 ) + /// Enum backing type must be either `int` or `string` ( code = 12 ) /// /// Example: /// @@ -377,27 +192,9 @@ pub enum ParserIssueCode { /// Possible solution(s): /// /// - Change the backing type to `int` or `string` - InvalidEnumBackingType = 25, + InvalidEnumBackingType = 12, - /// Catch block must have a catch or finally block ( code = 26 ) - /// - /// Example: - /// - /// ```ara - /// function foo(): void { - /// try { - /// // ... - /// } - /// } - /// ``` - /// - /// Possible solution(s): - /// - /// - Add a catch or finally block - /// - Remove the try block - TryStatementMustHaveCatchOrFinally = 26, - - /// Unexpected token + /// Unexpected token ( code = 13 ) /// /// Example: /// @@ -405,9 +202,9 @@ pub enum ParserIssueCode { /// function foo() -> void { /// } /// ``` - UnexpectedToken = 28, + UnexpectedToken = 13, - /// Invalid constant initialization expression ( code = 30 ) + /// Invalid constant initialization expression ( code = 14 ) /// /// Example: /// @@ -422,9 +219,9 @@ pub enum ParserIssueCode { /// Possible solution(s): /// /// - Use a valid constant initialization expression - InvalidConstantInitializationExpression = 30, + InvalidConstantInitializationExpression = 14, - /// Invalid empty type template ( code = 32 ) + /// Invalid empty type template ( code = 15 ) /// /// Example: /// @@ -436,7 +233,7 @@ pub enum ParserIssueCode { /// /// - Remove the empty type template /// - Add a type template - ExpectedAtLeastOneTypeInTemplateGroup = 32, + ExpectedAtLeastOneTypeInTemplateGroup = 15, } pub(crate) fn unreachable_code>(state: &ParserState, message: M) -> Issue { @@ -597,41 +394,6 @@ pub(crate) fn missing_item_definition_after_attributes(state: &ParserState) -> I issue } -pub(crate) fn multiple_visibility_modifiers( - state: &ParserState, - first: (usize, String), - second: (usize, String), -) -> Issue { - let origin = state.source.name(); - - Issue::error( - ParserIssueCode::MultipleVisibilityModifiers, - "multiple visibility modifiers are not allowed", - ) - .with_source(origin, second.0, second.0 + second.1.len()) - .with_annotation(Annotation::primary( - origin, - first.0, - first.0 + first.1.len(), - )) -} - -pub(crate) fn duplicate_modifier( - state: &ParserState, - modifier: String, - first: usize, - second: usize, -) -> Issue { - let origin = state.source.name(); - - Issue::error( - ParserIssueCode::DuplicateModifier, - format!("multiple `{}` modifiers are not allowed", modifier), - ) - .with_source(origin, second, second + modifier.len()) - .with_annotation(Annotation::primary(origin, first, first + modifier.len())) -} - pub(crate) fn reserved_keyword_cannot_be_used_for_type_name( state: &ParserState, identifier: &Identifier, @@ -713,203 +475,6 @@ pub(crate) fn missing_item_expression_after_attributes(state: &ParserState) -> I issue } -pub(crate) fn private_constant_cannot_be_final( - state: &ParserState, - r#private: &dyn Node, - r#final: &dyn Node, -) -> Issue { - let origin = state.source.name(); - - Issue::error( - ParserIssueCode::PrivateConstantCannotBeFinal, - "private constant cannot be final", - ) - .with_source(origin, r#final.initial_position(), r#final.final_position()) - .with_annotation(Annotation::primary( - origin, - r#private.initial_position(), - r#private.final_position(), - )) - .with_note( - "a private constant cannot be final because it cannot be overridden by other classes.", - ) -} - -pub(crate) fn modifier_cannot_be_used_on_class( - state: &ParserState, - modifier: String, - position: usize, -) -> Issue { - Issue::error( - ParserIssueCode::ModifierCannotBeUsedOnClass, - format!("modifier `{}` cannot be used on a class", modifier), - ) - .with_source(state.source.name(), position, position + modifier.len()) - .with_note("only the `final`, `abstract`, and `readonly` modifiers can be used on a class.") -} - -pub(crate) fn modifier_cannot_be_used_on_class_method( - state: &ParserState, - modifier: String, - position: usize, -) -> Issue { - Issue::error( - ParserIssueCode::ModifierCannotBeUsedOnClassMethod, - format!("modifier `{}` cannot be used on a class method", modifier), - ) - .with_source( - state.source.name(), - position, - position + modifier.len(), - ) - .with_note( - "only the `final`, `abstract`, `static`, `private`, `protected`, and `public` modifiers can be used on a class method.", - ) -} - -pub(crate) fn modifier_cannot_be_used_on_interface_method( - state: &ParserState, - modifier: String, - position: usize, -) -> Issue { - Issue::error( - ParserIssueCode::ModifierCannotBeUsedOnInterfaceMethod, - format!( - "modifier `{}` cannot be used on an interface method", - modifier - ), - ) - .with_source(state.source.name(), position, position + modifier.len()) - .with_note("only the `static`, and `public` modifiers can be used on an interface method.") -} - -pub(crate) fn modifier_cannot_be_used_on_enum_method( - state: &ParserState, - modifier: String, - position: usize, -) -> Issue { - Issue::error( - ParserIssueCode::ModifierCannotBeUsedOnEnumMethod, - format!("modifier `{}` cannot be used on an enum method", modifier), - ) - .with_source( - state.source.name(), - position, - position + modifier.len(), - ) - .with_note("only the `final`, `static`, and `public`, `protected`, `private` modifiers can be used on an enum method.") -} - -pub(crate) fn modifier_cannot_be_used_on_property( - state: &ParserState, - modifier: String, - position: usize, -) -> Issue { - Issue::error( - ParserIssueCode::ModifierCannotBeUsedOnProperty, - format!("modifier `{}` cannot be used on a property", modifier) - ) - .with_source( - state.source.name(), - position, - position + modifier.len(), - ) - .with_note( - "only the `static`, `readonly`, `private`, `protected`, and `public` modifiers can be used on a property.", - ) -} - -pub(crate) fn modifier_cannot_be_used_on_promoted_property( - state: &ParserState, - modifier: String, - position: usize, -) -> Issue { - Issue::error( - ParserIssueCode::ModifierCannotBeUsedOnPromotedProperty, - format!("modifier `{}` cannot be used on a promoted property", modifier) - ) - .with_source( - state.source.name(), - position, - position + modifier.len(), - ) - .with_note( - "only the `readonly`, `private`, `protected`, and `public` modifiers can be used on a promoted property.", - ) -} - -pub(crate) fn modifier_cannot_be_used_on_constant( - state: &ParserState, - modifier: String, - position: usize, -) -> Issue { - Issue::error( - ParserIssueCode::ModifierCannotBeUsedOnConstant, - format!("modifier `{}` cannot be used on a constant", modifier) - ) - .with_source( - state.source.name(), - position, - position + modifier.len(), - ) - .with_note( - "only the `final`, `private`, `protected`, and `public` modifiers can be used on a constant.", - ) -} - -pub(crate) fn modifier_cannot_be_used_on_interface_constant( - state: &ParserState, - modifier: String, - position: usize, -) -> Issue { - Issue::error( - ParserIssueCode::ModifierCannotBeUsedOnInterfaceConstant, - format!( - "modifier `{}` cannot be used on an interface constant", - modifier - ), - ) - .with_source(state.source.name(), position, position + modifier.len()) - .with_note("only the `final`, and `public` modifiers can be used on an interface constant.") -} - -pub(crate) fn promoted_property_cannot_be_variadic( - state: &ParserState, - class_name: Option<&Identifier>, - promoted_property: &ConstructorParameterDefinition, -) -> Issue { - let origin = state.source.name(); - - let position = promoted_property.ellipsis.unwrap(); - - let mut issue = Issue::error( - ParserIssueCode::PromotedPropertyCannotBeVariadic, - format!( - "promoted property `{}::{}` cannot be declared variadic", - class_name - .map(|c| state.named(c)) - .unwrap_or_else(|| "anonymous@class".to_string()), - promoted_property.variable, - ), - ) - .with_source(origin, position, position + 3) - .with_annotation(Annotation::secondary( - origin, - promoted_property.initial_position(), - promoted_property.final_position(), - )); - - if let Some(class_name) = class_name { - issue = issue.with_annotation(Annotation::secondary( - origin, - class_name.initial_position(), - class_name.final_position(), - )); - } - - issue -} - pub(crate) fn invalid_enum_backing_type( state: &ParserState, backing_identifier: &Identifier, @@ -926,21 +491,6 @@ pub(crate) fn invalid_enum_backing_type( .with_note("the only valid enum backing types are `int`, and `string`.") } -pub(crate) fn try_statement_must_have_catch_or_finally( - state: &ParserState, - try_statement: &TryStatement, -) -> Issue { - Issue::error( - ParserIssueCode::TryStatementMustHaveCatchOrFinally, - "try statement must have a catch or finally block", - ) - .with_source( - state.source.name(), - try_statement.initial_position(), - try_statement.final_position(), - ) -} - pub(crate) fn unexpected_token( state: &ParserState, expected: Vec, diff --git a/src/tree/definition/class.rs b/src/tree/definition/class.rs index 1114f7f..6065989 100644 --- a/src/tree/definition/class.rs +++ b/src/tree/definition/class.rs @@ -9,7 +9,7 @@ use crate::tree::definition::function::AbstractConstructorDefinition; use crate::tree::definition::function::AbstractMethodDefinition; use crate::tree::definition::function::ConcreteConstructorDefinition; use crate::tree::definition::function::ConcreteMethodDefinition; -use crate::tree::definition::modifier::ClassModifierDefinitionGroup; +use crate::tree::definition::modifier::ModifierGroupDefinition; use crate::tree::definition::property::PropertyDefinition; use crate::tree::definition::template::TemplateGroupDefinition; use crate::tree::identifier::Identifier; @@ -23,8 +23,7 @@ use crate::tree::Node; pub struct ClassDefinition { pub comments: CommentGroup, pub attributes: Vec, - #[serde(flatten)] - pub modifiers: ClassModifierDefinitionGroup, + pub modifiers: ModifierGroupDefinition, pub class: Keyword, pub name: Identifier, pub templates: Option, @@ -76,11 +75,7 @@ impl Node for ClassDefinition { return attributes.initial_position(); } - if let Some(modifier) = self.modifiers.modifiers.first() { - return modifier.initial_position(); - } - - self.class.initial_position() + self.modifiers.initial_position() } fn final_position(&self) -> usize { @@ -94,10 +89,7 @@ impl Node for ClassDefinition { children.push(attribute); } - for modifier in &self.modifiers.modifiers { - children.push(modifier); - } - + children.push(&self.modifiers); children.push(&self.name); if let Some(templates) = &self.templates { diff --git a/src/tree/definition/constant.rs b/src/tree/definition/constant.rs index 7a0f92f..de88994 100644 --- a/src/tree/definition/constant.rs +++ b/src/tree/definition/constant.rs @@ -4,7 +4,7 @@ use serde::Serialize; use crate::tree::comment::CommentGroup; use crate::tree::definition::attribute::AttributeGroupDefinition; -use crate::tree::definition::modifier::ConstantModifierDefinitionGroup; +use crate::tree::definition::modifier::ModifierGroupDefinition; use crate::tree::expression::Expression; use crate::tree::identifier::Identifier; use crate::tree::token::Keyword; @@ -33,8 +33,7 @@ pub struct ConstantDefinition { pub struct ClassishConstantDefinition { pub comments: CommentGroup, pub attributes: Vec, - #[serde(flatten)] - pub modifiers: ConstantModifierDefinitionGroup, + pub modifiers: ModifierGroupDefinition, pub r#const: Keyword, pub entries: CommaSeparated, pub semicolon: usize, @@ -93,12 +92,10 @@ impl Node for ClassishConstantDefinition { fn initial_position(&self) -> usize { if let Some(attribute) = self.attributes.first() { - attribute.initial_position() - } else if let Some(modifier) = self.modifiers.modifiers.first() { - modifier.initial_position() - } else { - self.r#const.initial_position() + return attribute.initial_position(); } + + self.modifiers.initial_position() } fn final_position(&self) -> usize { @@ -111,10 +108,7 @@ impl Node for ClassishConstantDefinition { children.push(attribute); } - for modifier in &self.modifiers.modifiers { - children.push(modifier); - } - + children.push(&self.modifiers); children.push(&self.r#const); for entry in &self.entries.inner { diff --git a/src/tree/definition/function.rs b/src/tree/definition/function.rs index 5b7aaf2..4621835 100644 --- a/src/tree/definition/function.rs +++ b/src/tree/definition/function.rs @@ -4,8 +4,7 @@ use serde::Serialize; use crate::tree::comment::CommentGroup; use crate::tree::definition::attribute::AttributeGroupDefinition; -use crate::tree::definition::modifier::MethodModifierDefinitionGroup; -use crate::tree::definition::modifier::PromotedPropertyModifierDefinitionGroup; +use crate::tree::definition::modifier::ModifierGroupDefinition; use crate::tree::definition::r#type::TypeDefinition; use crate::tree::definition::template::TemplateGroupDefinition; use crate::tree::expression::Expression; @@ -68,8 +67,7 @@ pub struct FunctionDefinition { pub struct ConstructorParameterDefinition { pub attributes: Vec, pub comments: CommentGroup, - #[serde(flatten)] - pub modifiers: PromotedPropertyModifierDefinitionGroup, + pub modifiers: ModifierGroupDefinition, pub type_definition: TypeDefinition, pub ellipsis: Option, pub variable: Variable, @@ -90,8 +88,7 @@ pub struct ConstructorParameterListDefinition { pub struct AbstractConstructorDefinition { pub comments: CommentGroup, pub attributes: Vec, - #[serde(flatten)] - pub modifiers: MethodModifierDefinitionGroup, + pub modifiers: ModifierGroupDefinition, pub function: Keyword, pub name: Identifier, pub parameters: FunctionLikeParameterListDefinition, @@ -103,8 +100,7 @@ pub struct AbstractConstructorDefinition { pub struct ConcreteConstructorDefinition { pub comments: CommentGroup, pub attributes: Vec, - #[serde(flatten)] - pub modifiers: MethodModifierDefinitionGroup, + pub modifiers: ModifierGroupDefinition, pub function: Keyword, pub name: Identifier, pub parameters: ConstructorParameterListDefinition, @@ -133,8 +129,7 @@ pub struct MethodTypeConstraintGroupDefinition { pub struct AbstractMethodDefinition { pub comments: CommentGroup, pub attributes: Vec, - #[serde(flatten)] - pub modifiers: MethodModifierDefinitionGroup, + pub modifiers: ModifierGroupDefinition, pub function: Keyword, pub name: Identifier, pub templates: Option, @@ -149,8 +144,7 @@ pub struct AbstractMethodDefinition { pub struct ConcreteMethodDefinition { pub comments: CommentGroup, pub attributes: Vec, - #[serde(flatten)] - pub modifiers: MethodModifierDefinitionGroup, + pub modifiers: ModifierGroupDefinition, pub function: Keyword, pub name: Identifier, pub templates: Option, @@ -313,11 +307,7 @@ impl Node for ConstructorParameterDefinition { return attributes.initial_position(); } - if let Some(modifier) = self.modifiers.modifiers.first() { - return modifier.initial_position(); - } - - self.type_definition.initial_position() + self.modifiers.initial_position() } fn final_position(&self) -> usize { @@ -381,11 +371,7 @@ impl Node for AbstractConstructorDefinition { return attributes.initial_position(); } - if let Some(modifier) = self.modifiers.modifiers.first() { - return modifier.initial_position(); - } - - self.function.initial_position() + self.modifiers.initial_position() } fn final_position(&self) -> usize { @@ -399,9 +385,7 @@ impl Node for AbstractConstructorDefinition { children.push(attribute); } - for modifier in &self.modifiers.modifiers { - children.push(modifier); - } + children.push(&self.modifiers); children.push(&self.function); children.push(&self.name); @@ -425,11 +409,7 @@ impl Node for ConcreteConstructorDefinition { return attributes.initial_position(); } - if let Some(modifier) = self.modifiers.modifiers.first() { - return modifier.initial_position(); - } - - self.function.initial_position() + self.modifiers.initial_position() } fn final_position(&self) -> usize { @@ -443,10 +423,7 @@ impl Node for ConcreteConstructorDefinition { children.push(attribute); } - for modifier in &self.modifiers.modifiers { - children.push(modifier); - } - + children.push(&self.modifiers); children.push(&self.function); children.push(&self.name); children.push(&self.parameters); @@ -470,11 +447,7 @@ impl Node for AbstractMethodDefinition { return attributes.initial_position(); } - if let Some(modifier) = self.modifiers.modifiers.first() { - return modifier.initial_position(); - } - - self.function.initial_position() + self.modifiers.initial_position() } fn final_position(&self) -> usize { @@ -488,10 +461,7 @@ impl Node for AbstractMethodDefinition { children.push(attribute); } - for modifier in &self.modifiers.modifiers { - children.push(modifier); - } - + children.push(&self.modifiers); children.push(&self.function); children.push(&self.name); @@ -582,11 +552,7 @@ impl Node for ConcreteMethodDefinition { return attributes.initial_position(); } - if let Some(modifier) = self.modifiers.modifiers.first() { - return modifier.initial_position(); - } - - self.function.initial_position() + self.modifiers.initial_position() } fn final_position(&self) -> usize { @@ -600,10 +566,7 @@ impl Node for ConcreteMethodDefinition { children.push(attribute); } - for modifier in &self.modifiers.modifiers { - children.push(modifier); - } - + children.push(&self.modifiers); children.push(&self.function); children.push(&self.name); diff --git a/src/tree/definition/modifier.rs b/src/tree/definition/modifier.rs index 3651438..e205f7e 100644 --- a/src/tree/definition/modifier.rs +++ b/src/tree/definition/modifier.rs @@ -2,451 +2,107 @@ use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; +use crate::tree::token::Keyword; use crate::tree::Node; -#[derive(Debug, Clone, Hash, Eq, PartialEq, Deserialize, Serialize, JsonSchema)] -#[serde(rename_all = "snake_case", tag = "type")] -pub enum Visibility { - Public, - Protected, - Private, -} - #[derive(Debug, PartialEq, Eq, Clone, Hash, Deserialize, Serialize, JsonSchema)] #[serde(rename_all = "snake_case", tag = "type", content = "value")] -pub enum VisibilityModifierDefinition { - Public(usize), - Protected(usize), - Private(usize), -} - -#[derive(Debug, Clone, Hash, Eq, PartialEq, Deserialize, Serialize, JsonSchema)] -#[serde(rename_all = "snake_case", tag = "type", content = "value")] -pub enum PromotedPropertyModifierDefinition { - Public(usize), - Protected(usize), - Private(usize), - Readonly(usize), +pub enum ModifierDefinition { + Public(Keyword), + Protected(Keyword), + Private(Keyword), + Static(Keyword), + Readonly(Keyword), + Final(Keyword), + Abstract(Keyword), } #[derive(Debug, Clone, Hash, Eq, PartialEq, Deserialize, Serialize, JsonSchema)] #[serde(rename_all = "snake_case")] -#[repr(transparent)] -pub struct PromotedPropertyModifierDefinitionGroup { - pub modifiers: Vec, +pub struct ModifierGroupDefinition { + pub position: usize, + pub modifiers: Vec, } -#[derive(Debug, Clone, Hash, Eq, PartialEq, Deserialize, Serialize, JsonSchema)] -#[serde(rename_all = "snake_case", tag = "type", content = "value")] -pub enum PropertyModifierDefinition { - Public(usize), - Protected(usize), - Private(usize), - Static(usize), - Readonly(usize), -} - -#[derive(Debug, Clone, Hash, Eq, PartialEq, Deserialize, Serialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -#[repr(transparent)] -pub struct PropertyModifierDefinitionGroup { - pub modifiers: Vec, -} - -#[derive(Debug, Clone, Hash, Eq, PartialEq, Deserialize, Serialize, JsonSchema)] -#[serde(rename_all = "snake_case", tag = "type", content = "value")] -pub enum MethodModifierDefinition { - Final(usize), - Static(usize), - Abstract(usize), - Public(usize), - Protected(usize), - Private(usize), -} - -#[derive(Debug, Clone, Hash, Eq, PartialEq, Deserialize, Serialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -#[repr(transparent)] -pub struct MethodModifierDefinitionGroup { - pub modifiers: Vec, -} - -#[derive(Debug, Clone, Hash, Eq, PartialEq, Deserialize, Serialize, JsonSchema)] -#[serde(rename_all = "snake_case", tag = "type", content = "value")] -pub enum ClassModifierDefinition { - Final(usize), - Abstract(usize), - Readonly(usize), -} - -#[derive(Debug, Clone, Hash, Eq, PartialEq, Deserialize, Serialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -#[repr(transparent)] -pub struct ClassModifierDefinitionGroup { - pub modifiers: Vec, -} - -#[derive(Debug, Clone, Hash, Eq, PartialEq, Deserialize, Serialize, JsonSchema)] -#[serde(rename_all = "snake_case", tag = "type", content = "value")] -pub enum ConstantModifierDefinition { - Final(usize), - Public(usize), - Protected(usize), - Private(usize), -} - -#[derive(Debug, Clone, Hash, Eq, PartialEq, Deserialize, Serialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -#[repr(transparent)] -pub struct ConstantModifierDefinitionGroup { - pub modifiers: Vec, -} - -impl PromotedPropertyModifierDefinitionGroup { - pub fn is_empty(&self) -> bool { - self.modifiers.is_empty() - } - - pub fn get_readonly(&self) -> Option<&PromotedPropertyModifierDefinition> { - self.modifiers.iter().find(|modifier| { - matches!( - modifier, - PromotedPropertyModifierDefinition::Readonly { .. } - ) - }) - } - - pub fn has_readonly(&self) -> bool { - self.modifiers.iter().any(|modifier| { - matches!( - modifier, - PromotedPropertyModifierDefinition::Readonly { .. } - ) - }) - } - - pub fn visibility(&self) -> Visibility { - self.modifiers - .iter() - .find_map(|modifier| match modifier { - PromotedPropertyModifierDefinition::Protected { .. } => Some(Visibility::Protected), - PromotedPropertyModifierDefinition::Private { .. } => Some(Visibility::Private), - PromotedPropertyModifierDefinition::Public { .. } => Some(Visibility::Public), - _ => None, - }) - .unwrap_or(Visibility::Public) - } -} - -impl PropertyModifierDefinitionGroup { - pub fn is_empty(&self) -> bool { - self.modifiers.is_empty() - } - - pub fn get_readonly(&self) -> Option<&PropertyModifierDefinition> { - self.modifiers - .iter() - .find(|modifier| matches!(modifier, PropertyModifierDefinition::Readonly { .. })) - } - - pub fn get_static(&self) -> Option<&PropertyModifierDefinition> { - self.modifiers - .iter() - .find(|modifier| matches!(modifier, PropertyModifierDefinition::Static { .. })) - } - - pub fn has_readonly(&self) -> bool { - self.modifiers - .iter() - .any(|modifier| matches!(modifier, PropertyModifierDefinition::Readonly { .. })) - } - - pub fn has_static(&self) -> bool { - self.modifiers - .iter() - .any(|modifier| matches!(modifier, PropertyModifierDefinition::Static { .. })) - } - - pub fn visibility(&self) -> Visibility { - self.modifiers - .iter() - .find_map(|modifier| match modifier { - PropertyModifierDefinition::Protected { .. } => Some(Visibility::Protected), - PropertyModifierDefinition::Private { .. } => Some(Visibility::Private), - PropertyModifierDefinition::Public { .. } => Some(Visibility::Public), - _ => None, - }) - .unwrap_or(Visibility::Public) - } -} - -impl MethodModifierDefinitionGroup { - pub fn is_empty(&self) -> bool { - self.modifiers.is_empty() - } - - pub fn has_final(&self) -> bool { - self.modifiers - .iter() - .any(|modifier| matches!(modifier, MethodModifierDefinition::Final { .. })) - } - - pub fn has_static(&self) -> bool { - self.modifiers - .iter() - .any(|modifier| matches!(modifier, MethodModifierDefinition::Static { .. })) - } - - pub fn has_abstract(&self) -> bool { - self.modifiers - .iter() - .any(|modifier| matches!(modifier, MethodModifierDefinition::Abstract { .. })) - } - - pub fn get_abstract(&self) -> Option<&MethodModifierDefinition> { - self.modifiers - .iter() - .find(|modifier| matches!(modifier, MethodModifierDefinition::Abstract { .. })) - } - - pub fn visibility(&self) -> Visibility { - self.modifiers - .iter() - .find_map(|modifier| match modifier { - MethodModifierDefinition::Protected { .. } => Some(Visibility::Protected), - MethodModifierDefinition::Private { .. } => Some(Visibility::Private), - MethodModifierDefinition::Public { .. } => Some(Visibility::Public), - _ => None, - }) - .unwrap_or(Visibility::Public) - } -} - -impl ClassModifierDefinitionGroup { - pub fn is_empty(&self) -> bool { - self.modifiers.is_empty() - } - - pub fn has_final(&self) -> bool { - self.modifiers - .iter() - .any(|modifier| matches!(modifier, ClassModifierDefinition::Final { .. })) - } - - pub fn has_readonly(&self) -> bool { - self.modifiers - .iter() - .any(|modifier| matches!(modifier, ClassModifierDefinition::Readonly { .. })) - } - - pub fn has_abstract(&self) -> bool { +impl Node for ModifierGroupDefinition { + fn initial_position(&self) -> usize { self.modifiers - .iter() - .any(|modifier| matches!(modifier, ClassModifierDefinition::Abstract { .. })) + .first() + .map(|modifier| modifier.initial_position()) + .unwrap_or(self.position) } -} -impl ConstantModifierDefinitionGroup { - pub fn is_empty(&self) -> bool { - self.modifiers.is_empty() - } - - pub fn has_final(&self) -> bool { + fn final_position(&self) -> usize { self.modifiers - .iter() - .any(|modifier| matches!(modifier, ConstantModifierDefinition::Final { .. })) + .last() + .map(|modifier| modifier.final_position()) + .unwrap_or(self.position) } - pub fn visibility(&self) -> Visibility { + fn children(&self) -> Vec<&dyn Node> { self.modifiers .iter() - .find_map(|modifier| match modifier { - ConstantModifierDefinition::Protected { .. } => Some(Visibility::Protected), - ConstantModifierDefinition::Private { .. } => Some(Visibility::Private), - ConstantModifierDefinition::Public { .. } => Some(Visibility::Public), - _ => None, - }) - .unwrap_or(Visibility::Public) - } -} - -impl Node for VisibilityModifierDefinition { - fn initial_position(&self) -> usize { - match self { - VisibilityModifierDefinition::Public(position) => *position, - VisibilityModifierDefinition::Protected(position) => *position, - VisibilityModifierDefinition::Private(position) => *position, - } - } - - fn final_position(&self) -> usize { - match self { - VisibilityModifierDefinition::Public(position) => position + 6, - VisibilityModifierDefinition::Protected(position) => position + 9, - VisibilityModifierDefinition::Private(position) => position + 7, - } - } - - fn children(&self) -> Vec<&dyn Node> { - vec![] + .map(|modifier| modifier as &dyn Node) + .collect() } fn get_description(&self) -> String { - "visibility modifier definition".to_string() + "modifier group definition".to_string() } } -impl Node for PromotedPropertyModifierDefinition { +impl Node for ModifierDefinition { fn initial_position(&self) -> usize { match self { - PromotedPropertyModifierDefinition::Public(position) => *position, - PromotedPropertyModifierDefinition::Protected(position) => *position, - PromotedPropertyModifierDefinition::Private(position) => *position, - PromotedPropertyModifierDefinition::Readonly(position) => *position, + ModifierDefinition::Public(keyword) + | ModifierDefinition::Protected(keyword) + | ModifierDefinition::Private(keyword) + | ModifierDefinition::Readonly(keyword) + | ModifierDefinition::Static(keyword) + | ModifierDefinition::Abstract(keyword) + | ModifierDefinition::Final(keyword) => keyword.initial_position(), } } fn final_position(&self) -> usize { match self { - PromotedPropertyModifierDefinition::Public(position) => position + 6, - PromotedPropertyModifierDefinition::Protected(position) => position + 9, - PromotedPropertyModifierDefinition::Private(position) => position + 7, - PromotedPropertyModifierDefinition::Readonly(position) => position + 8, + ModifierDefinition::Public(keyword) + | ModifierDefinition::Protected(keyword) + | ModifierDefinition::Private(keyword) + | ModifierDefinition::Readonly(keyword) + | ModifierDefinition::Static(keyword) + | ModifierDefinition::Abstract(keyword) + | ModifierDefinition::Final(keyword) => keyword.final_position(), } } fn children(&self) -> Vec<&dyn Node> { - vec![] - } - - fn get_description(&self) -> String { - "promoted property modifier definition".to_string() - } -} - -impl Node for PropertyModifierDefinition { - fn initial_position(&self) -> usize { - match self { - PropertyModifierDefinition::Static(position) => *position, - PropertyModifierDefinition::Public(position) => *position, - PropertyModifierDefinition::Protected(position) => *position, - PropertyModifierDefinition::Private(position) => *position, - PropertyModifierDefinition::Readonly(position) => *position, - } - } - - fn final_position(&self) -> usize { match self { - PropertyModifierDefinition::Static(position) => position + 6, - PropertyModifierDefinition::Public(position) => position + 6, - PropertyModifierDefinition::Protected(position) => position + 9, - PropertyModifierDefinition::Private(position) => position + 7, - PropertyModifierDefinition::Readonly(position) => position + 8, + ModifierDefinition::Public(keyword) + | ModifierDefinition::Protected(keyword) + | ModifierDefinition::Private(keyword) + | ModifierDefinition::Readonly(keyword) + | ModifierDefinition::Static(keyword) + | ModifierDefinition::Abstract(keyword) + | ModifierDefinition::Final(keyword) => vec![keyword as &dyn Node], } } - fn children(&self) -> Vec<&dyn Node> { - vec![] - } - - fn get_description(&self) -> String { - "property modifier definition".to_string() - } -} - -impl Node for MethodModifierDefinition { - fn initial_position(&self) -> usize { - match self { - MethodModifierDefinition::Static(position) => *position, - MethodModifierDefinition::Public(position) => *position, - MethodModifierDefinition::Protected(position) => *position, - MethodModifierDefinition::Private(position) => *position, - MethodModifierDefinition::Final(position) => *position, - MethodModifierDefinition::Abstract(position) => *position, - } - } - - fn final_position(&self) -> usize { - match self { - MethodModifierDefinition::Static(position) => position + 6, - MethodModifierDefinition::Public(position) => position + 6, - MethodModifierDefinition::Protected(position) => position + 9, - MethodModifierDefinition::Private(position) => position + 7, - MethodModifierDefinition::Final(position) => *position + 5, - MethodModifierDefinition::Abstract(position) => position + 8, - } - } - - fn children(&self) -> Vec<&dyn Node> { - vec![] - } - - fn get_description(&self) -> String { - "method modifier definition".to_string() - } -} - -impl Node for ClassModifierDefinition { - fn initial_position(&self) -> usize { - match self { - ClassModifierDefinition::Final(position) => *position, - ClassModifierDefinition::Abstract(position) => *position, - ClassModifierDefinition::Readonly(position) => *position, - } - } - - fn final_position(&self) -> usize { - match self { - ClassModifierDefinition::Final(position) => *position + 5, - ClassModifierDefinition::Abstract(position) => position + 8, - ClassModifierDefinition::Readonly(position) => position + 8, - } - } - - fn children(&self) -> Vec<&dyn Node> { - vec![] - } - - fn get_description(&self) -> String { - "class modifier definition".to_string() - } -} - -impl Node for ConstantModifierDefinition { - fn initial_position(&self) -> usize { - match self { - ConstantModifierDefinition::Final(position) => *position, - ConstantModifierDefinition::Public(position) => *position, - ConstantModifierDefinition::Protected(position) => *position, - ConstantModifierDefinition::Private(position) => *position, - } - } - - fn final_position(&self) -> usize { - match self { - ConstantModifierDefinition::Final(position) => position + 5, - ConstantModifierDefinition::Public(position) => position + 6, - ConstantModifierDefinition::Protected(position) => position + 9, - ConstantModifierDefinition::Private(position) => position + 7, - } - } - - fn children(&self) -> Vec<&dyn Node> { - vec![] - } - fn get_description(&self) -> String { - "constant modifier definition".to_string() + "modifier definition".to_string() } } -impl std::fmt::Display for PromotedPropertyModifierDefinition { +impl std::fmt::Display for ModifierDefinition { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - PromotedPropertyModifierDefinition::Public(_) => write!(f, "public"), - PromotedPropertyModifierDefinition::Protected(_) => write!(f, "protected"), - PromotedPropertyModifierDefinition::Private(_) => write!(f, "private"), - PromotedPropertyModifierDefinition::Readonly(_) => write!(f, "readonly"), + ModifierDefinition::Public(keyword) + | ModifierDefinition::Protected(keyword) + | ModifierDefinition::Private(keyword) + | ModifierDefinition::Readonly(keyword) + | ModifierDefinition::Static(keyword) + | ModifierDefinition::Abstract(keyword) + | ModifierDefinition::Final(keyword) => write!(f, "{}", keyword.value), } } } diff --git a/src/tree/definition/property.rs b/src/tree/definition/property.rs index 6a8e12a..685ab12 100644 --- a/src/tree/definition/property.rs +++ b/src/tree/definition/property.rs @@ -3,7 +3,7 @@ use serde::Deserialize; use serde::Serialize; use crate::tree::definition::attribute::AttributeGroupDefinition; -use crate::tree::definition::modifier::PropertyModifierDefinitionGroup; +use crate::tree::definition::modifier::ModifierGroupDefinition; use crate::tree::definition::r#type::TypeDefinition; use crate::tree::expression::Expression; use crate::tree::variable::Variable; @@ -13,8 +13,7 @@ use crate::tree::Node; #[serde(rename_all = "snake_case")] pub struct PropertyDefinition { pub attributes: Vec, - #[serde(flatten)] - pub modifiers: PropertyModifierDefinitionGroup, + pub modifiers: ModifierGroupDefinition, pub type_definition: TypeDefinition, pub entry: PropertyEntryDefinition, pub semicolon: usize, @@ -66,10 +65,7 @@ impl Node for PropertyDefinition { children.push(attribute); } - for modifier in &self.modifiers.modifiers { - children.push(modifier); - } - + children.push(&self.modifiers); children.push(&self.type_definition); children.push(&self.entry); diff --git a/tests/samples/0003/error.txt b/tests/samples/0003/error.txt index 25b4516..21e0994 100644 --- a/tests/samples/0003/error.txt +++ b/tests/samples/0003/error.txt @@ -1,4 +1,4 @@ -error[P0028]: unexpected token `[`, expected an expression +error[P0013]: unexpected token `[`, expected an expression --> 0003/code.ara:5:10 | 5 | $a = [ diff --git a/tests/samples/0018/tree.txt b/tests/samples/0018/tree.txt index 40c5ebb..ed87233 100644 --- a/tests/samples/0018/tree.txt +++ b/tests/samples/0018/tree.txt @@ -6,7 +6,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 0, modifiers: [], }, class: Keyword { diff --git a/tests/samples/0019/tree.txt b/tests/samples/0019/tree.txt index 63d1caf..c3d9f06 100644 --- a/tests/samples/0019/tree.txt +++ b/tests/samples/0019/tree.txt @@ -6,7 +6,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 0, modifiers: [], }, class: Keyword { diff --git a/tests/samples/0020/tree.txt b/tests/samples/0020/tree.txt index fca4afd..2cbb106 100644 --- a/tests/samples/0020/tree.txt +++ b/tests/samples/0020/tree.txt @@ -6,7 +6,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 0, modifiers: [], }, class: Keyword { diff --git a/tests/samples/0023/error.txt b/tests/samples/0023/error.txt index 7df70dd..4984be4 100644 --- a/tests/samples/0023/error.txt +++ b/tests/samples/0023/error.txt @@ -1,4 +1,4 @@ -error[P0028]: unexpected token `implements`, expected `(` +error[P0013]: unexpected token `implements`, expected `(` --> 0023/code.ara:3:22 | 3 | return new class implements Foo, Bar {}; diff --git a/tests/samples/0025/tree.txt b/tests/samples/0025/tree.txt index b761f79..2edd39f 100644 --- a/tests/samples/0025/tree.txt +++ b/tests/samples/0025/tree.txt @@ -6,7 +6,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 0, modifiers: [], }, class: Keyword { @@ -26,10 +27,14 @@ DefinitionTree { Property( PropertyDefinition { attributes: [], - modifiers: PropertyModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 30, modifiers: [ Protected( - 20, + Keyword { + value: "protected", + position: 20, + }, ), ], }, diff --git a/tests/samples/0030/tree.txt b/tests/samples/0030/tree.txt index fb7e2b8..65bb5a4 100644 --- a/tests/samples/0030/tree.txt +++ b/tests/samples/0030/tree.txt @@ -6,10 +6,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 9, modifiers: [ Readonly( - 0, + Keyword { + value: "readonly", + position: 0, + }, ), ], }, diff --git a/tests/samples/0036/tree.txt b/tests/samples/0036/tree.txt index 2e78c9a..dbfa97e 100644 --- a/tests/samples/0036/tree.txt +++ b/tests/samples/0036/tree.txt @@ -6,7 +6,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 0, modifiers: [], }, class: Keyword { @@ -29,10 +30,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 23, modifiers: [ Public( - 16, + Keyword { + value: "public", + position: 16, + }, ), ], }, @@ -56,13 +61,20 @@ DefinitionTree { comments: CommentGroup { comments: [], }, - modifiers: PromotedPropertyModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 69, modifiers: [ Readonly( - 53, + Keyword { + value: "readonly", + position: 53, + }, ), Public( - 62, + Keyword { + value: "public", + position: 62, + }, ), ], }, diff --git a/tests/samples/0040/tree.txt b/tests/samples/0040/tree.txt index d1e217b..ff85688 100644 --- a/tests/samples/0040/tree.txt +++ b/tests/samples/0040/tree.txt @@ -18,10 +18,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 26, modifiers: [ Final( - 20, + Keyword { + value: "final", + position: 20, + }, ), ], }, @@ -45,10 +49,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 50, modifiers: [ Public( - 43, + Keyword { + value: "public", + position: 43, + }, ), ], }, @@ -72,13 +80,20 @@ DefinitionTree { comments: CommentGroup { comments: [], }, - modifiers: PromotedPropertyModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 98, modifiers: [ Public( - 82, + Keyword { + value: "public", + position: 82, + }, ), Readonly( - 89, + Keyword { + value: "readonly", + position: 89, + }, ), ], }, diff --git a/tests/samples/0041/tree.txt b/tests/samples/0041/tree.txt index 6b9c62a..60dc82d 100644 --- a/tests/samples/0041/tree.txt +++ b/tests/samples/0041/tree.txt @@ -18,10 +18,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 26, modifiers: [ Final( - 20, + Keyword { + value: "final", + position: 20, + }, ), ], }, @@ -42,13 +46,20 @@ DefinitionTree { Property( PropertyDefinition { attributes: [], - modifiers: PropertyModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 59, modifiers: [ Public( - 43, + Keyword { + value: "public", + position: 43, + }, ), Readonly( - 50, + Keyword { + value: "readonly", + position: 50, + }, ), ], }, diff --git a/tests/samples/0044/tree.txt b/tests/samples/0044/tree.txt index 87e91a5..9e56cd9 100644 --- a/tests/samples/0044/tree.txt +++ b/tests/samples/0044/tree.txt @@ -6,7 +6,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 0, modifiers: [], }, class: Keyword { diff --git a/tests/samples/0046/tree.txt b/tests/samples/0046/tree.txt index a08527d..5cc14f5 100644 --- a/tests/samples/0046/tree.txt +++ b/tests/samples/0046/tree.txt @@ -25,10 +25,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 27, modifiers: [ Public( - 20, + Keyword { + value: "public", + position: 20, + }, ), ], }, diff --git a/tests/samples/0047/tree.txt b/tests/samples/0047/tree.txt index 1ae663a..571e9e7 100644 --- a/tests/samples/0047/tree.txt +++ b/tests/samples/0047/tree.txt @@ -67,10 +67,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 53, modifiers: [ Public( - 46, + Keyword { + value: "public", + position: 46, + }, ), ], }, diff --git a/tests/samples/0048/tree.txt b/tests/samples/0048/tree.txt index bbc1e24..b42aa75 100644 --- a/tests/samples/0048/tree.txt +++ b/tests/samples/0048/tree.txt @@ -6,7 +6,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 0, modifiers: [], }, class: Keyword { @@ -29,10 +30,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 23, modifiers: [ Public( - 16, + Keyword { + value: "public", + position: 16, + }, ), ], }, diff --git a/tests/samples/0049/tree.txt b/tests/samples/0049/tree.txt index 4cf8fc0..814b40d 100644 --- a/tests/samples/0049/tree.txt +++ b/tests/samples/0049/tree.txt @@ -6,7 +6,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 0, modifiers: [], }, class: Keyword { @@ -33,7 +34,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 12, modifiers: [], }, class: Keyword { @@ -70,10 +72,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 45, modifiers: [ Public( - 38, + Keyword { + value: "public", + position: 38, + }, ), ], }, diff --git a/tests/samples/0050/tree.txt b/tests/samples/0050/tree.txt index 27a7e1b..8006f19 100644 --- a/tests/samples/0050/tree.txt +++ b/tests/samples/0050/tree.txt @@ -25,10 +25,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 22, modifiers: [ Public( - 15, + Keyword { + value: "public", + position: 15, + }, ), ], }, diff --git a/tests/samples/0055/tree.txt b/tests/samples/0055/tree.txt index 6d4fafb..e3b319e 100644 --- a/tests/samples/0055/tree.txt +++ b/tests/samples/0055/tree.txt @@ -6,7 +6,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 0, modifiers: [], }, class: Keyword { @@ -29,7 +30,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 16, modifiers: [], }, const: Keyword { @@ -68,13 +70,20 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 50, modifiers: [ Public( - 36, + Keyword { + value: "public", + position: 36, + }, ), Static( - 43, + Keyword { + value: "static", + position: 43, + }, ), ], }, diff --git a/tests/samples/0057/tree.txt b/tests/samples/0057/tree.txt index ad7d67a..b78c016 100644 --- a/tests/samples/0057/tree.txt +++ b/tests/samples/0057/tree.txt @@ -121,7 +121,8 @@ DefinitionTree { right_bracket: 50, }, ], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 56, modifiers: [], }, const: Keyword { @@ -177,10 +178,14 @@ DefinitionTree { right_bracket: 79, }, ], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 92, modifiers: [ Public( - 85, + Keyword { + value: "public", + position: 85, + }, ), ], }, @@ -253,13 +258,20 @@ DefinitionTree { right_bracket: 124, }, ], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 143, modifiers: [ Final( - 130, + Keyword { + value: "final", + position: 130, + }, ), Public( - 136, + Keyword { + value: "public", + position: 136, + }, ), ], }, @@ -352,10 +364,14 @@ DefinitionTree { right_bracket: 184, }, ], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 196, modifiers: [ Final( - 190, + Keyword { + value: "final", + position: 190, + }, ), ], }, @@ -412,10 +428,14 @@ DefinitionTree { right_bracket: 218, }, ], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 231, modifiers: [ Public( - 224, + Keyword { + value: "public", + position: 224, + }, ), ], }, @@ -491,13 +511,20 @@ DefinitionTree { right_bracket: 270, }, ], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 290, modifiers: [ Public( - 276, + Keyword { + value: "public", + position: 276, + }, ), Static( - 283, + Keyword { + value: "static", + position: 283, + }, ), ], }, diff --git a/tests/samples/0058/tree.txt b/tests/samples/0058/tree.txt index fe9fd7b..cba9c66 100644 --- a/tests/samples/0058/tree.txt +++ b/tests/samples/0058/tree.txt @@ -186,7 +186,8 @@ DefinitionTree { right_bracket: 63, }, ], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 65, modifiers: [], }, class: Keyword { diff --git a/tests/samples/0060/tree.txt b/tests/samples/0060/tree.txt index 7109655..81e6878 100644 --- a/tests/samples/0060/tree.txt +++ b/tests/samples/0060/tree.txt @@ -194,7 +194,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 157, modifiers: [], }, class: Keyword { @@ -217,7 +218,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 171, modifiers: [], }, const: Keyword { @@ -256,7 +258,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 196, modifiers: [], }, const: Keyword { @@ -295,7 +298,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 219, modifiers: [], }, const: Keyword { @@ -334,7 +338,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 244, modifiers: [], }, const: Keyword { @@ -373,7 +378,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 269, modifiers: [], }, const: Keyword { @@ -412,7 +418,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 293, modifiers: [], }, const: Keyword { diff --git a/tests/samples/0062/tree.txt b/tests/samples/0062/tree.txt index c0ea239..8020ef7 100644 --- a/tests/samples/0062/tree.txt +++ b/tests/samples/0062/tree.txt @@ -57,7 +57,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 38, modifiers: [], }, class: Keyword { @@ -126,7 +127,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 87, modifiers: [], }, class: Keyword { diff --git a/tests/samples/0064/tree.txt b/tests/samples/0064/tree.txt index 6ab4f7e..31f2bb3 100644 --- a/tests/samples/0064/tree.txt +++ b/tests/samples/0064/tree.txt @@ -96,7 +96,8 @@ DefinitionTree { right_bracket: 35, }, ], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 37, modifiers: [], }, class: Keyword { diff --git a/tests/samples/0065/error.txt b/tests/samples/0065/error.txt index 73cbd92..c5ecfba 100644 --- a/tests/samples/0065/error.txt +++ b/tests/samples/0065/error.txt @@ -1,4 +1,4 @@ -error[P0028]: unexpected token `[`, expected an expression +error[P0013]: unexpected token `[`, expected an expression --> 0065/code.ara:2:10 | 2 | $a = [1, 2, 3]; diff --git a/tests/samples/0067/error.txt b/tests/samples/0067/error.txt index dbfb214..fc25534 100644 --- a/tests/samples/0067/error.txt +++ b/tests/samples/0067/error.txt @@ -1,4 +1,4 @@ -error[P0028]: unexpected token `[`, expected an expression +error[P0013]: unexpected token `[`, expected an expression --> 0067/code.ara:2:10 | 2 | $a = []; diff --git a/tests/samples/0068/error.txt b/tests/samples/0068/error.txt index 8ef877e..ab1f0c8 100644 --- a/tests/samples/0068/error.txt +++ b/tests/samples/0068/error.txt @@ -1,4 +1,4 @@ -error[P0028]: unexpected token `[`, expected an expression +error[P0013]: unexpected token `[`, expected an expression --> 0068/code.ara:2:10 | 2 | $a = []; diff --git a/tests/samples/0071/tree.txt b/tests/samples/0071/tree.txt index c9932ae..80e8b0f 100644 --- a/tests/samples/0071/tree.txt +++ b/tests/samples/0071/tree.txt @@ -756,10 +756,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 378, modifiers: [ Final( - 372, + Keyword { + value: "final", + position: 372, + }, ), ], }, @@ -804,10 +808,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 404, modifiers: [ Public( - 397, + Keyword { + value: "public", + position: 397, + }, ), ], }, @@ -831,10 +839,14 @@ DefinitionTree { comments: CommentGroup { comments: [], }, - modifiers: PromotedPropertyModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 432, modifiers: [ Public( - 425, + Keyword { + value: "public", + position: 425, + }, ), ], }, diff --git a/tests/samples/0075/tree.txt b/tests/samples/0075/tree.txt index 94d4665..daf7d41 100644 --- a/tests/samples/0075/tree.txt +++ b/tests/samples/0075/tree.txt @@ -39,13 +39,20 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 38, modifiers: [ Final( - 23, + Keyword { + value: "final", + position: 23, + }, ), Readonly( - 29, + Keyword { + value: "readonly", + position: 29, + }, ), ], }, @@ -90,10 +97,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 71, modifiers: [ Public( - 64, + Keyword { + value: "public", + position: 64, + }, ), ], }, @@ -117,10 +128,14 @@ DefinitionTree { comments: CommentGroup { comments: [], }, - modifiers: PromotedPropertyModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 109, modifiers: [ Private( - 101, + Keyword { + value: "private", + position: 101, + }, ), ], }, @@ -202,10 +217,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 153, modifiers: [ Public( - 146, + Keyword { + value: "public", + position: 146, + }, ), ], }, @@ -599,10 +618,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 430, modifiers: [ Public( - 423, + Keyword { + value: "public", + position: 423, + }, ), ], }, @@ -992,10 +1015,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 675, modifiers: [ Public( - 668, + Keyword { + value: "public", + position: 668, + }, ), ], }, diff --git a/tests/samples/0076/tree.txt b/tests/samples/0076/tree.txt index 9990cd6..fa4128d 100644 --- a/tests/samples/0076/tree.txt +++ b/tests/samples/0076/tree.txt @@ -76,7 +76,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 54, modifiers: [], }, class: Keyword { @@ -99,10 +100,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 79, modifiers: [ Public( - 72, + Keyword { + value: "public", + position: 72, + }, ), ], }, @@ -142,10 +147,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 108, modifiers: [ Public( - 101, + Keyword { + value: "public", + position: 101, + }, ), ], }, @@ -733,7 +742,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 468, modifiers: [], }, class: Keyword { @@ -756,10 +766,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 492, modifiers: [ Public( - 485, + Keyword { + value: "public", + position: 485, + }, ), ], }, @@ -799,10 +813,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 520, modifiers: [ Public( - 513, + Keyword { + value: "public", + position: 513, + }, ), ], }, diff --git a/tests/samples/0082/tree.txt b/tests/samples/0082/tree.txt index 794d31d..86e5e07 100644 --- a/tests/samples/0082/tree.txt +++ b/tests/samples/0082/tree.txt @@ -39,13 +39,20 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 38, modifiers: [ Final( - 23, + Keyword { + value: "final", + position: 23, + }, ), Readonly( - 29, + Keyword { + value: "readonly", + position: 29, + }, ), ], }, @@ -90,10 +97,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 71, modifiers: [ Public( - 64, + Keyword { + value: "public", + position: 64, + }, ), ], }, @@ -117,10 +128,14 @@ DefinitionTree { comments: CommentGroup { comments: [], }, - modifiers: PromotedPropertyModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 109, modifiers: [ Private( - 101, + Keyword { + value: "private", + position: 101, + }, ), ], }, @@ -202,10 +217,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 153, modifiers: [ Public( - 146, + Keyword { + value: "public", + position: 146, + }, ), ], }, @@ -599,10 +618,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 430, modifiers: [ Public( - 423, + Keyword { + value: "public", + position: 423, + }, ), ], }, @@ -992,10 +1015,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 675, modifiers: [ Public( - 668, + Keyword { + value: "public", + position: 668, + }, ), ], }, diff --git a/tests/samples/0083/error.txt b/tests/samples/0083/error.txt index b2be783..746c5da 100644 --- a/tests/samples/0083/error.txt +++ b/tests/samples/0083/error.txt @@ -40,7 +40,7 @@ error[P0006]: enum `Bar` cannot have magic method 14 | | } | \-----^ -error[P0028]: unexpected token `?>`, expected a definition +error[P0013]: unexpected token `?>`, expected a definition --> 0083/code.ara:17:1 | 17 | ?> diff --git a/tests/samples/0084/tree.txt b/tests/samples/0084/tree.txt index 27747b5..433627b 100644 --- a/tests/samples/0084/tree.txt +++ b/tests/samples/0084/tree.txt @@ -102,7 +102,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 109, modifiers: [], }, class: Keyword { @@ -129,7 +130,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 124, modifiers: [], }, class: Keyword { @@ -156,7 +158,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 139, modifiers: [], }, class: Keyword { diff --git a/tests/samples/0085/tree.txt b/tests/samples/0085/tree.txt index 56461be..5527244 100644 --- a/tests/samples/0085/tree.txt +++ b/tests/samples/0085/tree.txt @@ -3185,7 +3185,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 1509, modifiers: [], }, class: Keyword { @@ -3208,10 +3209,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 1533, modifiers: [ Private( - 1525, + Keyword { + value: "private", + position: 1525, + }, ), ], }, @@ -4299,10 +4304,14 @@ DefinitionTree { Property( PropertyDefinition { attributes: [], - modifiers: PropertyModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 2188, modifiers: [ Private( - 2180, + Keyword { + value: "private", + position: 2180, + }, ), ], }, @@ -5408,10 +5417,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 2844, modifiers: [ Public( - 2837, + Keyword { + value: "public", + position: 2837, + }, ), ], }, @@ -5435,7 +5448,8 @@ DefinitionTree { comments: CommentGroup { comments: [], }, - modifiers: PromotedPropertyModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 2874, modifiers: [], }, type_definition: Identifier( @@ -6474,7 +6488,8 @@ DefinitionTree { comments: CommentGroup { comments: [], }, - modifiers: PromotedPropertyModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 3574, modifiers: [], }, type_definition: Dict( @@ -6641,10 +6656,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 3703, modifiers: [ Public( - 3696, + Keyword { + value: "public", + position: 3696, + }, ), ], }, diff --git a/tests/samples/0086/error.txt b/tests/samples/0086/error.txt index 81b6bc2..d103f51 100644 --- a/tests/samples/0086/error.txt +++ b/tests/samples/0086/error.txt @@ -1,40 +1,40 @@ -error[P0030]: invalid constant initialization expression +error[P0014]: invalid constant initialization expression --> 0086/code.ara:9:7 | 9 | #[Foo(new Bar($bar), new Baz($baz), new Qux(function(): void {}))] | ^^^^^^^^^^^^^ -error[P0030]: invalid constant initialization expression +error[P0014]: invalid constant initialization expression --> 0086/code.ara:9:22 | 9 | #[Foo(new Bar($bar), new Baz($baz), new Qux(function(): void {}))] | ^^^^^^^^^^^^^ -error[P0030]: invalid constant initialization expression +error[P0014]: invalid constant initialization expression --> 0086/code.ara:9:37 | 9 | #[Foo(new Bar($bar), new Baz($baz), new Qux(function(): void {}))] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[P0030]: invalid constant initialization expression +error[P0014]: invalid constant initialization expression --> 0086/code.ara:11:14 | 11 | Bar $a = new Bar($bar), | ^^^^^^^^^^^^^ -error[P0030]: invalid constant initialization expression +error[P0014]: invalid constant initialization expression --> 0086/code.ara:12:14 | 12 | Baz $b = new Baz($baz), | ^^^^^^^^^^^^^ -error[P0030]: invalid constant initialization expression +error[P0014]: invalid constant initialization expression --> 0086/code.ara:13:14 | 13 | Qux $c = new Qux(function(): void {}) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[P0028]: unexpected identifier, expected `;` +error[P0013]: unexpected identifier, expected `;` --> 0086/code.ara:25:22 | 25 | private mixed $a FOO = new Foo(); diff --git a/tests/samples/0087/tree.txt b/tests/samples/0087/tree.txt index 43639e7..76564c9 100644 --- a/tests/samples/0087/tree.txt +++ b/tests/samples/0087/tree.txt @@ -25,10 +25,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 28, modifiers: [ Public( - 21, + Keyword { + value: "public", + position: 21, + }, ), ], }, @@ -79,10 +83,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 75, modifiers: [ Public( - 68, + Keyword { + value: "public", + position: 68, + }, ), ], }, @@ -130,10 +138,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 114, modifiers: [ Final( - 108, + Keyword { + value: "final", + position: 108, + }, ), ], }, @@ -176,10 +188,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 157, modifiers: [ Public( - 150, + Keyword { + value: "public", + position: 150, + }, ), ], }, @@ -203,7 +219,8 @@ DefinitionTree { comments: CommentGroup { comments: [], }, - modifiers: PromotedPropertyModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 178, modifiers: [], }, type_definition: String( @@ -246,10 +263,14 @@ DefinitionTree { ], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 226, modifiers: [ Public( - 219, + Keyword { + value: "public", + position: 219, + }, ), ], }, diff --git a/tests/samples/0089/tree.txt b/tests/samples/0089/tree.txt index ed65628..e336c11 100644 --- a/tests/samples/0089/tree.txt +++ b/tests/samples/0089/tree.txt @@ -76,7 +76,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 45, modifiers: [], }, class: Keyword { @@ -99,10 +100,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 67, modifiers: [ Public( - 60, + Keyword { + value: "public", + position: 60, + }, ), ], }, @@ -142,10 +147,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 93, modifiers: [ Public( - 86, + Keyword { + value: "public", + position: 86, + }, ), ], }, diff --git a/tests/samples/0093/tree.txt b/tests/samples/0093/tree.txt index 6de7e23..4f3835a 100644 --- a/tests/samples/0093/tree.txt +++ b/tests/samples/0093/tree.txt @@ -76,7 +76,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 54, modifiers: [], }, class: Keyword { @@ -99,10 +100,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 79, modifiers: [ Public( - 72, + Keyword { + value: "public", + position: 72, + }, ), ], }, @@ -142,10 +147,14 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: MethodModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 108, modifiers: [ Public( - 101, + Keyword { + value: "public", + position: 101, + }, ), ], }, diff --git a/tests/samples/0104/error.txt b/tests/samples/0104/error.txt index 712fdfa..43aaff6 100644 --- a/tests/samples/0104/error.txt +++ b/tests/samples/0104/error.txt @@ -1,22 +1,22 @@ -error[P0030]: invalid constant initialization expression +error[P0014]: invalid constant initialization expression --> 0104/code.ara:2:7 | 2 | #[Baz(...BAZ)] | ^^^^^^ -error[P0030]: invalid constant initialization expression +error[P0014]: invalid constant initialization expression --> 0104/code.ara:4:16 | 4 | Bar $bar = new Bar(...BAZ), | ^^^^^^^^^^^^^^^ -error[P0030]: invalid constant initialization expression +error[P0014]: invalid constant initialization expression --> 0104/code.ara:7:7 | 7 | #[Bar(...BAZ)] | ^^^^^^ -error[P0030]: invalid constant initialization expression +error[P0014]: invalid constant initialization expression --> 0104/code.ara:9:16 | 9 | Bar $bar = new Bar(BAZ...), diff --git a/tests/samples/0107/code.ara b/tests/samples/0107/code.ara index 16f8068..db57669 100644 --- a/tests/samples/0107/code.ara +++ b/tests/samples/0107/code.ara @@ -3,7 +3,7 @@ const ONE = new Foo(); class Foo { CONST FOO = fn(): int => 1; - public readonly string $baz = 'baz'; + public static abstract Abstract readonly private static protected string $baz = 'baz'; public int $bar = fn(): Foo => new Foo(); diff --git a/tests/samples/0107/tree.txt b/tests/samples/0107/tree.txt index 41e994b..38f9a8e 100644 --- a/tests/samples/0107/tree.txt +++ b/tests/samples/0107/tree.txt @@ -59,7 +59,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ClassModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 24, modifiers: [], }, class: Keyword { @@ -82,7 +83,8 @@ DefinitionTree { comments: [], }, attributes: [], - modifiers: ConstantModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 40, modifiers: [], }, const: Keyword { @@ -152,28 +154,71 @@ DefinitionTree { Property( PropertyDefinition { attributes: [], - modifiers: PropertyModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 139, modifiers: [ Public( - 73, + Keyword { + value: "public", + position: 73, + }, + ), + Static( + Keyword { + value: "static", + position: 80, + }, + ), + Abstract( + Keyword { + value: "abstract", + position: 87, + }, + ), + Abstract( + Keyword { + value: "Abstract", + position: 96, + }, ), Readonly( - 80, + Keyword { + value: "readonly", + position: 105, + }, + ), + Private( + Keyword { + value: "private", + position: 114, + }, + ), + Static( + Keyword { + value: "static", + position: 122, + }, + ), + Protected( + Keyword { + value: "protected", + position: 129, + }, ), ], }, type_definition: String( Keyword { value: "string", - position: 89, + position: 139, }, ), entry: Initialized { variable: Variable { - position: 96, + position: 146, name: "$baz", }, - equals: 101, + equals: 151, value: Literal( String( LiteralString { @@ -181,36 +226,40 @@ DefinitionTree { comments: [], }, value: "'baz'", - position: 103, + position: 153, }, ), ), }, - semicolon: 108, + semicolon: 158, }, ), Property( PropertyDefinition { attributes: [], - modifiers: PropertyModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 172, modifiers: [ Public( - 115, + Keyword { + value: "public", + position: 165, + }, ), ], }, type_definition: Integer( Keyword { value: "int", - position: 122, + position: 172, }, ), entry: Initialized { variable: Variable { - position: 126, + position: 176, name: "$bar", }, - equals: 131, + equals: 181, value: ArrowFunction( ArrowFunctionExpression { comments: CommentGroup { @@ -220,32 +269,32 @@ DefinitionTree { static: None, fn: Keyword { value: "fn", - position: 133, + position: 183, }, parameters: FunctionLikeParameterListDefinition { comments: CommentGroup { comments: [], }, - left_parenthesis: 135, + left_parenthesis: 185, parameters: CommaSeparated { inner: [], commas: [], }, - right_parenthesis: 136, + right_parenthesis: 186, }, return_type: FunctionLikeReturnTypeDefinition { - colon: 137, + colon: 187, type_definition: Identifier( TemplatedIdentifier { name: Identifier { - position: 139, + position: 189, value: "Foo", }, templates: None, }, ), }, - double_arrow: 143, + double_arrow: 193, body: ClassOperation( Initialization { comments: CommentGroup { @@ -253,11 +302,11 @@ DefinitionTree { }, new: Keyword { value: "new", - position: 146, + position: 196, }, class: Identifier( Identifier { - position: 150, + position: 200, value: "Foo", }, ), @@ -266,43 +315,47 @@ DefinitionTree { comments: CommentGroup { comments: [], }, - left_parenthesis: 153, + left_parenthesis: 203, arguments: CommaSeparated { inner: [], commas: [], }, - right_parenthesis: 154, + right_parenthesis: 204, }, }, ), }, ), }, - semicolon: 155, + semicolon: 205, }, ), Property( PropertyDefinition { attributes: [], - modifiers: PropertyModifierDefinitionGroup { + modifiers: ModifierGroupDefinition { + position: 219, modifiers: [ Public( - 162, + Keyword { + value: "public", + position: 212, + }, ), ], }, type_definition: Integer( Keyword { value: "int", - position: 169, + position: 219, }, ), entry: Initialized { variable: Variable { - position: 173, + position: 223, name: "$foo", }, - equals: 178, + equals: 228, value: ObjectOperation( PropertyFetch { comments: CommentGroup { @@ -310,26 +363,26 @@ DefinitionTree { }, object: Variable( Variable { - position: 180, + position: 230, name: "$this", }, ), - arrow: 185, + arrow: 235, property: Identifier { - position: 187, + position: 237, value: "bar", }, }, ), }, - semicolon: 190, + semicolon: 240, }, ), ], - right_brace: 192, + right_brace: 242, }, }, ), ], - eof: 194, + eof: 244, } \ No newline at end of file