mirror of
https://github.com/nikic/PHP-Parser.git
synced 2025-07-18 12:51:39 +02:00
Compare commits
3 Commits
v3.0.0alph
...
2.x
Author | SHA1 | Date | |
---|---|---|---|
|
4dd659edad | ||
|
83f34e7fa4 | ||
|
13f7321def |
15
CHANGELOG.md
15
CHANGELOG.md
@@ -1,8 +1,21 @@
|
|||||||
Version 2.1.1-dev
|
Version 2.1.2-dev
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
Nothing yet.
|
Nothing yet.
|
||||||
|
|
||||||
|
Version 2.1.1 (2016-09-16)
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
* The pretty printer will now escape all control characters in the range `\x00-\x1F` inside double
|
||||||
|
quoted strings. If no special escape sequence is available, an octal escape will be used.
|
||||||
|
* The quality of the error recovery has been improved. In particular unterminated expressions should
|
||||||
|
be handled more gracefully.
|
||||||
|
* The PHP 7 parser will now generate a parse error for `$var =& new Obj` assignments.
|
||||||
|
* Comments on free-standing code blocks will no be retained as comments on the first statement in
|
||||||
|
the code block.
|
||||||
|
|
||||||
Version 2.1.0 (2016-04-19)
|
Version 2.1.0 (2016-04-19)
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
|
@@ -150,7 +150,7 @@ inner_statement:
|
|||||||
;
|
;
|
||||||
|
|
||||||
non_empty_statement:
|
non_empty_statement:
|
||||||
'{' inner_statement_list '}' { $$ = $2; }
|
'{' inner_statement_list '}' { $$ = $2; prependLeadingComments($$); }
|
||||||
| T_IF parentheses_expr statement elseif_list else_single
|
| T_IF parentheses_expr statement elseif_list else_single
|
||||||
{ $$ = Stmt\If_[$2, ['stmts' => toArray($3), 'elseifs' => $4, 'else' => $5]]; }
|
{ $$ = Stmt\If_[$2, ['stmts' => toArray($3), 'elseifs' => $4, 'else' => $5]]; }
|
||||||
| T_IF parentheses_expr ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';'
|
| T_IF parentheses_expr ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';'
|
||||||
|
@@ -150,7 +150,7 @@ inner_statement:
|
|||||||
;
|
;
|
||||||
|
|
||||||
non_empty_statement:
|
non_empty_statement:
|
||||||
'{' inner_statement_list '}' { $$ = $2; }
|
'{' inner_statement_list '}' { $$ = $2; prependLeadingComments($$); }
|
||||||
| T_IF '(' expr ')' statement elseif_list else_single
|
| T_IF '(' expr ')' statement elseif_list else_single
|
||||||
{ $$ = Stmt\If_[$3, ['stmts' => toArray($5), 'elseifs' => $6, 'else' => $7]]; }
|
{ $$ = Stmt\If_[$3, ['stmts' => toArray($5), 'elseifs' => $6, 'else' => $7]]; }
|
||||||
| T_IF '(' expr ')' ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';'
|
| T_IF '(' expr ')' ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';'
|
||||||
@@ -512,7 +512,6 @@ expr:
|
|||||||
| list_expr '=' expr { $$ = Expr\Assign[$1, $3]; }
|
| list_expr '=' expr { $$ = Expr\Assign[$1, $3]; }
|
||||||
| variable '=' expr { $$ = Expr\Assign[$1, $3]; }
|
| variable '=' expr { $$ = Expr\Assign[$1, $3]; }
|
||||||
| variable '=' '&' variable { $$ = Expr\AssignRef[$1, $4]; }
|
| variable '=' '&' variable { $$ = Expr\AssignRef[$1, $4]; }
|
||||||
| variable '=' '&' new_expr { $$ = Expr\AssignRef[$1, $4]; }
|
|
||||||
| new_expr { $$ = $1; }
|
| new_expr { $$ = $1; }
|
||||||
| T_CLONE expr { $$ = Expr\Clone_[$2]; }
|
| T_CLONE expr { $$ = Expr\Clone_[$2]; }
|
||||||
| variable T_PLUS_EQUAL expr { $$ = Expr\AssignOp\Plus [$1, $3]; }
|
| variable T_PLUS_EQUAL expr { $$ = Expr\AssignOp\Plus [$1, $3]; }
|
||||||
|
@@ -195,6 +195,15 @@ function resolveMacros($code) {
|
|||||||
. $args[0] . '[\'docLabel\'] = $matches[1];';
|
. $args[0] . '[\'docLabel\'] = $matches[1];';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ('prependLeadingComments' == $name) {
|
||||||
|
assertArgs(1, $args, $name);
|
||||||
|
|
||||||
|
return '$attrs = $this->startAttributeStack[#1]; $stmts = ' . $args[0] . '; '
|
||||||
|
. 'if (!empty($attrs[\'comments\']) && isset($stmts[0])) {'
|
||||||
|
. '$stmts[0]->setAttribute(\'comments\', '
|
||||||
|
. 'array_merge($attrs[\'comments\'], $stmts[0]->getAttribute(\'comments\', []))); }';
|
||||||
|
}
|
||||||
|
|
||||||
return $matches[0];
|
return $matches[0];
|
||||||
},
|
},
|
||||||
$code
|
$code
|
||||||
|
@@ -1420,7 +1420,7 @@ class Php5 extends \PhpParser\ParserAbstract
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected function reduceRule127() {
|
protected function reduceRule127() {
|
||||||
$this->semValue = $this->semStack[$this->stackPos-(3-2)];
|
$this->semValue = $this->semStack[$this->stackPos-(3-2)]; $attrs = $this->startAttributeStack[$this->stackPos-(3-1)]; $stmts = $this->semValue; if (!empty($attrs['comments']) && isset($stmts[0])) {$stmts[0]->setAttribute('comments', array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); };
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function reduceRule128() {
|
protected function reduceRule128() {
|
||||||
|
File diff suppressed because it is too large
Load Diff
23
test/code/parser/blockComments.test
Normal file
23
test/code/parser/blockComments.test
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
Comments on blocks
|
||||||
|
-----
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// foo
|
||||||
|
{
|
||||||
|
// bar
|
||||||
|
{
|
||||||
|
// baz
|
||||||
|
$a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
-----
|
||||||
|
array(
|
||||||
|
0: Expr_Variable(
|
||||||
|
name: a
|
||||||
|
comments: array(
|
||||||
|
0: // foo
|
||||||
|
1: // bar
|
||||||
|
2: // baz
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
@@ -23,7 +23,6 @@ $a = $b *= $c **= $d;
|
|||||||
|
|
||||||
// by ref assign
|
// by ref assign
|
||||||
$a =& $b;
|
$a =& $b;
|
||||||
$a =& new B;
|
|
||||||
|
|
||||||
// list() assign
|
// list() assign
|
||||||
list($a) = $b;
|
list($a) = $b;
|
||||||
@@ -191,21 +190,7 @@ array(
|
|||||||
0: // by ref assign
|
0: // by ref assign
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
15: Expr_AssignRef(
|
15: Expr_Assign(
|
||||||
var: Expr_Variable(
|
|
||||||
name: a
|
|
||||||
)
|
|
||||||
expr: Expr_New(
|
|
||||||
class: Name(
|
|
||||||
parts: array(
|
|
||||||
0: B
|
|
||||||
)
|
|
||||||
)
|
|
||||||
args: array(
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
16: Expr_Assign(
|
|
||||||
var: Expr_List(
|
var: Expr_List(
|
||||||
vars: array(
|
vars: array(
|
||||||
0: Expr_Variable(
|
0: Expr_Variable(
|
||||||
@@ -223,7 +208,7 @@ array(
|
|||||||
0: // list() assign
|
0: // list() assign
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
17: Expr_Assign(
|
16: Expr_Assign(
|
||||||
var: Expr_List(
|
var: Expr_List(
|
||||||
vars: array(
|
vars: array(
|
||||||
0: Expr_Variable(
|
0: Expr_Variable(
|
||||||
@@ -239,7 +224,7 @@ array(
|
|||||||
name: c
|
name: c
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
18: Expr_Assign(
|
17: Expr_Assign(
|
||||||
var: Expr_List(
|
var: Expr_List(
|
||||||
vars: array(
|
vars: array(
|
||||||
0: Expr_Variable(
|
0: Expr_Variable(
|
||||||
@@ -262,7 +247,7 @@ array(
|
|||||||
name: e
|
name: e
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
19: Expr_PreInc(
|
18: Expr_PreInc(
|
||||||
var: Expr_Variable(
|
var: Expr_Variable(
|
||||||
name: a
|
name: a
|
||||||
)
|
)
|
||||||
@@ -270,17 +255,17 @@ array(
|
|||||||
0: // inc/dec
|
0: // inc/dec
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
20: Expr_PostInc(
|
19: Expr_PostInc(
|
||||||
var: Expr_Variable(
|
var: Expr_Variable(
|
||||||
name: a
|
name: a
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
21: Expr_PreDec(
|
20: Expr_PreDec(
|
||||||
var: Expr_Variable(
|
var: Expr_Variable(
|
||||||
name: a
|
name: a
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
22: Expr_PostDec(
|
21: Expr_PostDec(
|
||||||
var: Expr_Variable(
|
var: Expr_Variable(
|
||||||
name: a
|
name: a
|
||||||
)
|
)
|
||||||
|
39
test/code/parser/expr/assignNewByRef.test
Normal file
39
test/code/parser/expr/assignNewByRef.test
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
Assigning new by reference (PHP 5 only)
|
||||||
|
-----
|
||||||
|
<?php
|
||||||
|
$a =& new B;
|
||||||
|
-----
|
||||||
|
!!php5
|
||||||
|
array(
|
||||||
|
0: Expr_AssignRef(
|
||||||
|
var: Expr_Variable(
|
||||||
|
name: a
|
||||||
|
)
|
||||||
|
expr: Expr_New(
|
||||||
|
class: Name(
|
||||||
|
parts: array(
|
||||||
|
0: B
|
||||||
|
)
|
||||||
|
)
|
||||||
|
args: array(
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
-----
|
||||||
|
<?php
|
||||||
|
$a =& new B;
|
||||||
|
-----
|
||||||
|
!!php7
|
||||||
|
Syntax error, unexpected T_NEW from 2:7 to 2:9
|
||||||
|
array(
|
||||||
|
0: Expr_New(
|
||||||
|
class: Name(
|
||||||
|
parts: array(
|
||||||
|
0: B
|
||||||
|
)
|
||||||
|
)
|
||||||
|
args: array(
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
Reference in New Issue
Block a user