in src/Parser.php [1076:1177]
private function isExpressionStartFn() {
return function ($token) {
switch ($token->kind) {
// Script Inclusion Expression
case TokenKind::RequireKeyword:
case TokenKind::RequireOnceKeyword:
case TokenKind::IncludeKeyword:
case TokenKind::IncludeOnceKeyword:
// yield-expression
case TokenKind::YieldKeyword:
case TokenKind::YieldFromKeyword:
// object-creation-expression
case TokenKind::NewKeyword:
case TokenKind::CloneKeyword:
return true;
// unary-op-expression
case TokenKind::PlusToken:
case TokenKind::MinusToken:
case TokenKind::ExclamationToken:
case TokenKind::TildeToken:
// error-control-expression
case TokenKind::AtSymbolToken:
// prefix-increment-expression
case TokenKind::PlusPlusToken:
// prefix-decrement-expression
case TokenKind::MinusMinusToken:
return true;
// variable-name
case TokenKind::VariableName:
case TokenKind::DollarToken:
return true;
// qualified-name
case TokenKind::Name:
case TokenKind::BackslashToken:
return true;
case TokenKind::NamespaceKeyword:
// TODO currently only supports qualified-names, but eventually parse namespace declarations
return $this->isNamespaceKeywordStartOfExpression($token);
// literal
case TokenKind::DecimalLiteralToken: // TODO merge dec, oct, hex, bin, float -> NumericLiteral
case TokenKind::OctalLiteralToken:
case TokenKind::HexadecimalLiteralToken:
case TokenKind::BinaryLiteralToken:
case TokenKind::FloatingLiteralToken:
case TokenKind::InvalidOctalLiteralToken:
case TokenKind::InvalidHexadecimalLiteral:
case TokenKind::InvalidBinaryLiteral:
case TokenKind::IntegerLiteralToken:
case TokenKind::StringLiteralToken:
case TokenKind::SingleQuoteToken:
case TokenKind::DoubleQuoteToken:
case TokenKind::HeredocStart:
case TokenKind::BacktickToken:
// array-creation-expression
case TokenKind::ArrayKeyword:
case TokenKind::OpenBracketToken:
// intrinsic-construct
case TokenKind::EchoKeyword:
case TokenKind::ListKeyword:
case TokenKind::UnsetKeyword:
// intrinsic-operator
case TokenKind::EmptyKeyword:
case TokenKind::EvalKeyword:
case TokenKind::ExitKeyword:
case TokenKind::DieKeyword:
case TokenKind::IsSetKeyword:
case TokenKind::PrintKeyword:
// ( expression )
case TokenKind::OpenParenToken:
case TokenKind::ArrayCastToken:
case TokenKind::BoolCastToken:
case TokenKind::DoubleCastToken:
case TokenKind::IntCastToken:
case TokenKind::ObjectCastToken:
case TokenKind::StringCastToken:
case TokenKind::UnsetCastToken:
case TokenKind::MatchKeyword:
// anonymous-function-creation-expression
case TokenKind::StaticKeyword:
case TokenKind::FunctionKeyword:
case TokenKind::FnKeyword:
case TokenKind::AttributeToken:
return true;
}
return \in_array($token->kind, $this->reservedWordTokens, true);
};
}