mirror of
https://github.com/danog/parser.git
synced 2024-11-30 04:29:13 +01:00
parser: allow reserved idents in static method calls
This commit is contained in:
parent
a069fa2a8a
commit
4178947be8
@ -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)
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user