parser: allow reserved idents in static method calls

This commit is contained in:
Ryan Chandler 2022-11-30 00:48:34 +00:00
parent a069fa2a8a
commit 4178947be8
No known key found for this signature in database
GPG Key ID: F113BCADDB3B0CCA
2 changed files with 86 additions and 77 deletions

View File

@ -58,83 +58,7 @@ impl Parser {
pub(crate) fn ident_maybe_reserved(&mut self) -> ParseResult<ByteString> {
match self.current.kind {
TokenKind::Static
| TokenKind::Abstract
| TokenKind::Final
| TokenKind::For
| TokenKind::Private
| TokenKind::Protected
| TokenKind::Public
| TokenKind::Include
| TokenKind::IncludeOnce
| TokenKind::Eval
| TokenKind::Require
| TokenKind::RequireOnce
| TokenKind::LogicalOr
| TokenKind::LogicalXor
| TokenKind::LogicalAnd
| TokenKind::Instanceof
| TokenKind::New
| TokenKind::Clone
| TokenKind::Exit
| TokenKind::If
| TokenKind::ElseIf
| TokenKind::Else
| TokenKind::EndIf
| TokenKind::Echo
| TokenKind::Do
| TokenKind::While
| TokenKind::EndWhile
| TokenKind::EndFor
| TokenKind::Foreach
| TokenKind::EndForeach
| TokenKind::Declare
| TokenKind::EndDeclare
| TokenKind::As
| TokenKind::Try
| TokenKind::Catch
| TokenKind::Finally
| TokenKind::Throw
| TokenKind::Use
| TokenKind::Insteadof
| TokenKind::Global
| TokenKind::Var
| TokenKind::Unset
| TokenKind::Isset
| TokenKind::Empty
| TokenKind::Continue
| TokenKind::Goto
| TokenKind::Function
| TokenKind::Const
| TokenKind::Return
| TokenKind::Print
| TokenKind::Yield
| TokenKind::List
| TokenKind::Switch
| TokenKind::EndSwitch
| TokenKind::Case
| TokenKind::Default
| TokenKind::Break
| TokenKind::Array
| TokenKind::Callable
| TokenKind::Extends
| TokenKind::Implements
| TokenKind::Namespace
| TokenKind::Trait
| TokenKind::Interface
| TokenKind::Class
| TokenKind::ClassConstant
| TokenKind::TraitConstant
| TokenKind::FunctionConstant
| TokenKind::MethodConstant
| TokenKind::LineConstant
| TokenKind::FileConstant
| TokenKind::DirConstant
| TokenKind::NamespaceConstant
| TokenKind::HaltCompiler
| TokenKind::Fn
| TokenKind::Match
| TokenKind::Enum => {
_ if is_reserved_ident(&self.current.kind) => {
let string = self.current.kind.to_string().into();
self.next();
Ok(string)
@ -143,3 +67,83 @@ impl Parser {
}
}
}
pub(crate) fn is_reserved_ident(kind: &TokenKind) -> bool {
matches!(kind, TokenKind::Static
| TokenKind::Abstract
| TokenKind::Final
| TokenKind::For
| TokenKind::Private
| TokenKind::Protected
| TokenKind::Public
| TokenKind::Include
| TokenKind::IncludeOnce
| TokenKind::Eval
| TokenKind::Require
| TokenKind::RequireOnce
| TokenKind::LogicalOr
| TokenKind::LogicalXor
| TokenKind::LogicalAnd
| TokenKind::Instanceof
| TokenKind::New
| TokenKind::Clone
| TokenKind::Exit
| TokenKind::If
| TokenKind::ElseIf
| TokenKind::Else
| TokenKind::EndIf
| TokenKind::Echo
| TokenKind::Do
| TokenKind::While
| TokenKind::EndWhile
| TokenKind::EndFor
| TokenKind::Foreach
| TokenKind::EndForeach
| TokenKind::Declare
| TokenKind::EndDeclare
| TokenKind::As
| TokenKind::Try
| TokenKind::Catch
| TokenKind::Finally
| TokenKind::Throw
| TokenKind::Use
| TokenKind::Insteadof
| TokenKind::Global
| TokenKind::Var
| TokenKind::Unset
| TokenKind::Isset
| TokenKind::Empty
| TokenKind::Continue
| TokenKind::Goto
| TokenKind::Function
| TokenKind::Const
| TokenKind::Return
| TokenKind::Print
| TokenKind::Yield
| TokenKind::List
| TokenKind::Switch
| TokenKind::EndSwitch
| TokenKind::Case
| TokenKind::Default
| TokenKind::Break
| TokenKind::Array
| TokenKind::Callable
| TokenKind::Extends
| TokenKind::Implements
| TokenKind::Namespace
| TokenKind::Trait
| TokenKind::Interface
| TokenKind::Class
| TokenKind::ClassConstant
| TokenKind::TraitConstant
| TokenKind::FunctionConstant
| TokenKind::MethodConstant
| TokenKind::LineConstant
| TokenKind::FileConstant
| TokenKind::DirConstant
| TokenKind::NamespaceConstant
| TokenKind::HaltCompiler
| TokenKind::Fn
| TokenKind::Match
| TokenKind::Enum)
}

View File

@ -16,6 +16,8 @@ use crate::{
};
use crate::{ByteString, TraitAdaptation, TryBlockCaughtType};
use self::ident::is_reserved_ident;
pub mod error;
mod block;
@ -2361,6 +2363,9 @@ impl Parser {
// FIXME: Can this be represented in a nicer way? Kind of hacky.
Expression::Identifier { name: "class".into() }
},
_ if is_reserved_ident(&self.current.kind) => {
Expression::Identifier { name: self.ident_maybe_reserved()?.into() }
},
_ => {
return expected_token_err!(["`{`", "`$`", "an identifier"], self);
}