@@ -121,18 +121,7 @@ module.exports = {
121
121
const node = this . node ( "parenthesis" ) ;
122
122
expr = this . next ( ) . read_expr ( ) ;
123
123
this . expect ( ")" ) && this . next ( ) ;
124
- expr = node ( expr ) ;
125
- // handle dereferencable
126
- if ( this . token === this . tok . T_OBJECT_OPERATOR ) {
127
- return this . recursive_variable_chain_scan ( expr , false ) ;
128
- } else if ( this . token === this . tok . T_CURLY_OPEN || this . token === "[" ) {
129
- return this . read_dereferencable ( expr ) ;
130
- } else if ( this . token === "(" ) {
131
- // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1118
132
- return this . node ( "call" ) ( expr , this . read_function_argument_list ( ) ) ;
133
- } else {
134
- return expr ;
135
- }
124
+ return this . handleDereferencable ( node ( expr ) ) ;
136
125
}
137
126
138
127
if ( this . token === "`" ) {
@@ -185,6 +174,15 @@ module.exports = {
185
174
}
186
175
}
187
176
177
+ if ( this . token === "[" ) {
178
+ expr = this . read_array ( ) ;
179
+ if ( this . token === "=" ) {
180
+ return this . node ( "assign" ) ( expr , this . next ( ) . read_expr ( ) , "=" ) ;
181
+ } else {
182
+ return this . handleDereferencable ( expr ) ;
183
+ }
184
+ }
185
+
188
186
if ( this . token === this . tok . T_CLONE )
189
187
return this . node ( "clone" ) ( this . next ( ) . read_expr ( ) ) ;
190
188
@@ -417,19 +415,7 @@ module.exports = {
417
415
}
418
416
} else if ( this . is ( "SCALAR" ) ) {
419
417
expr = this . read_scalar ( ) ;
420
- // handle dereferencable
421
- while ( this . token !== this . EOF ) {
422
- if ( this . token === this . tok . T_OBJECT_OPERATOR ) {
423
- expr = this . recursive_variable_chain_scan ( expr , false ) ;
424
- } else if ( this . token === this . tok . T_CURLY_OPEN || this . token === "[" ) {
425
- expr = this . read_dereferencable ( expr ) ;
426
- } else if ( this . token === "(" ) {
427
- // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1118
428
- expr = this . node ( "call" ) ( expr , this . read_function_argument_list ( ) ) ;
429
- } else {
430
- return expr ;
431
- }
432
- }
418
+ return this . handleDereferencable ( expr ) ;
433
419
} else {
434
420
this . error ( "EXPR" ) ;
435
421
this . next ( ) ;
@@ -521,5 +507,21 @@ module.exports = {
521
507
result = [ "key" , result , this . next ( ) . read_expr_item ( ) ] ;
522
508
}
523
509
return result ;
510
+ } ,
511
+
512
+ handleDereferencable : function ( expr ) {
513
+ while ( this . token !== this . EOF ) {
514
+ if ( this . token === this . tok . T_OBJECT_OPERATOR ) {
515
+ expr = this . recursive_variable_chain_scan ( expr , false ) ;
516
+ } else if ( this . token === this . tok . T_CURLY_OPEN || this . token === "[" ) {
517
+ expr = this . read_dereferencable ( expr ) ;
518
+ } else if ( this . token === "(" ) {
519
+ // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1118
520
+ expr = this . node ( "call" ) ( expr , this . read_function_argument_list ( ) ) ;
521
+ } else {
522
+ return expr ;
523
+ }
524
+ }
525
+ return expr ;
524
526
}
525
527
} ;
0 commit comments