parser: support nullsafe method calls

This commit is contained in:
Ryan Chandler 2022-09-16 10:03:04 +01:00
parent 9c6beffdb7
commit b4b4e8340e
No known key found for this signature in database
GPG Key ID: F113BCADDB3B0CCA
2 changed files with 55 additions and 4 deletions

View File

@ -487,6 +487,11 @@ pub enum Expression {
target: Box<Self>,
property: Box<Self>,
},
NullsafeMethodCall {
target: Box<Self>,
method: Box<Self>,
args: Vec<Arg>,
},
StaticPropertyFetch {
target: Box<Self>,
property: Box<Self>,

View File

@ -2223,10 +2223,14 @@ impl Parser {
self.rparen()?;
Expression::MethodCall {
target: Box::new(lhs),
method: Box::new(property),
args,
if op == &TokenKind::NullsafeArrow {
Expression::NullsafeMethodCall { target: Box::new(lhs), method: Box::new(property), args }
} else {
Expression::MethodCall {
target: Box::new(lhs),
method: Box::new(property),
args,
}
}
} else if op == &TokenKind::NullsafeArrow {
Expression::NullsafePropertyFetch {
@ -3493,6 +3497,48 @@ mod tests {
);
}
#[test]
fn nullsafe_method_calls() {
assert_ast("<?php $a?->b();", &[
expr!(Expression::NullsafeMethodCall {
target: Box::new(Expression::Variable { name: "a".into() }),
method: Box::new(Expression::Identifier { name: "b".into() }),
args: vec![],
})
]);
}
#[test]
fn nullsafe_method_calls_with_args() {
assert_ast("<?php $a?->b($c);", &[
expr!(Expression::NullsafeMethodCall {
target: Box::new(Expression::Variable { name: "a".into() }),
method: Box::new(Expression::Identifier { name: "b".into() }),
args: vec![
Arg {
name: None,
unpack: false,
value: Expression::Variable { name: "c".into() }
}
],
})
]);
}
#[test]
fn nullsafe_method_call_chain() {
assert_ast("<?php $a?->b?->c();", &[
expr!(Expression::NullsafeMethodCall {
target: Box::new(Expression::NullsafePropertyFetch {
target: Box::new(Expression::Variable { name: "a".into() }),
property: Box::new(Expression::Identifier { name: "b".into() }),
}),
method: Box::new(Expression::Identifier { name: "c".into() }),
args: vec![],
})
]);
}
#[test]
fn try_catch() {
assert_ast(