Permalink
Browse files

Allow trailing commas in function and method calls

  • Loading branch information...
SammyK authored and krakjoe committed Oct 7, 2017
1 parent 4da0bfc commit b591c329ee3129adbdc35141bb1542d119f7a2a1
@@ -0,0 +1,8 @@
--TEST--
Leading commas in function calls is not allowed
--FILE--
<?php
foo(,$foo);
?>
--EXPECTF--
Parse error: syntax error, unexpected ',' in %s on line %d
@@ -0,0 +1,8 @@
--TEST--
Multiple inner commas in function calls is not allowed
--FILE--
<?php
foo($foo,,$bar);
?>
--EXPECTF--
Parse error: syntax error, unexpected ',', expecting ')' in %s on line %d
@@ -0,0 +1,8 @@
--TEST--
Multiple trailing commas in function calls is not allowed
--FILE--
<?php
foo($foo,,);
?>
--EXPECTF--
Parse error: syntax error, unexpected ',', expecting ')' in %s on line %d
@@ -0,0 +1,8 @@
--TEST--
Single comma in function calls is not allowed
--FILE--
<?php
foo(,);
?>
--EXPECTF--
Parse error: syntax error, unexpected ',' in %s on line %d
@@ -0,0 +1,97 @@
--TEST--
Allow trailing commas in function and method calls
--FILE--
<?php
function foo(...$args) {
echo __FUNCTION__ . "\n";
var_dump($args);
}
foo(
'function',
'bar',
);
class Foo
{
public function __construct(...$args) {
echo __FUNCTION__ . "\n";
var_dump($args);
}
public function bar(...$args) {
echo __FUNCTION__ . "\n";
var_dump($args);
}
public function __invoke(...$args) {
echo __FUNCTION__ . "\n";
var_dump($args);
}
}
$foo = new Foo(
'constructor',
'bar',
);
$foo->bar(
'method',
'bar',
);
$foo(
'invoke',
'bar',
);
$bar = function(...$args) {
echo __FUNCTION__ . "\n";
var_dump($args);
};
$bar(
'closure',
'bar',
);
# Make sure to hit the "not really a function" language constructs
unset($foo, $bar,);
var_dump(isset($foo, $bar,));
?>
--EXPECT--
foo
array(2) {
[0]=>
string(8) "function"
[1]=>
string(3) "bar"
}
__construct
array(2) {
[0]=>
string(11) "constructor"
[1]=>
string(3) "bar"
}
bar
array(2) {
[0]=>
string(6) "method"
[1]=>
string(3) "bar"
}
__invoke
array(2) {
[0]=>
string(6) "invoke"
[1]=>
string(3) "bar"
}
{closure}
array(2) {
[0]=>
string(7) "closure"
[1]=>
string(3) "bar"
}
bool(false)
@@ -439,7 +439,7 @@ statement:
| T_ECHO echo_expr_list ';' { $$ = $2; }
| T_INLINE_HTML { $$ = zend_ast_create(ZEND_AST_ECHO, $1); }
| expr ';' { $$ = $1; }
| T_UNSET '(' unset_variables ')' ';' { $$ = $3; }
| T_UNSET '(' unset_variables possible_comma ')' ';' { $$ = $3; }
| T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement
{ $$ = zend_ast_create(ZEND_AST_FOREACH, $3, $5, NULL, $7); }
| T_FOREACH '(' expr T_AS foreach_variable T_DOUBLE_ARROW foreach_variable ')'
@@ -670,7 +670,7 @@ return_type:
argument_list:
'(' ')' { $$ = zend_ast_create_list(0, ZEND_AST_ARG_LIST); }
| '(' non_empty_argument_list ')' { $$ = $2; }
| '(' non_empty_argument_list possible_comma ')' { $$ = $2; }
;
non_empty_argument_list:
@@ -1260,7 +1260,7 @@ encaps_var_offset:
internal_functions_in_yacc:
T_ISSET '(' isset_variables ')' { $$ = $3; }
T_ISSET '(' isset_variables possible_comma ')' { $$ = $3; }
| T_EMPTY '(' expr ')' { $$ = zend_ast_create(ZEND_AST_EMPTY, $3); }
| T_INCLUDE expr
{ $$ = zend_ast_create_ex(ZEND_AST_INCLUDE_OR_EVAL, ZEND_INCLUDE, $2); }

2 comments on commit b591c32

@carusogabriel

This comment has been minimized.

Contributor

carusogabriel replied Aug 5, 2018

@cmb69 Should we mention this one in NEWS? Or syntax changes don't go there? :)

@cmb69

This comment has been minimized.

Contributor

cmb69 replied Aug 5, 2018

@carusogabriel Good catch, thanks! I've added an entry to UPGRADING which is important so this change will be noted in the migration guide. I'm not sure whether we need an additional entry in NEWS (in my opinion, we should document something either in NEWS or UPGRADING, not both).

Please sign in to comment.