diff --git a/src/Php/Parser/AssignOpTrait.php b/src/Php/Parser/AssignOpTrait.php index a6de8cb4..b3aae194 100644 --- a/src/Php/Parser/AssignOpTrait.php +++ b/src/Php/Parser/AssignOpTrait.php @@ -109,14 +109,21 @@ trait AssignOpTrait continue; } if ($item instanceof ArrayItem) { - $oriInAssignExpr = $this->context->inAssignExpr; - $this->context->inAssignExpr = true; - $var = $this->parseIdentifier($item->value); - $this->context->inAssignExpr = $oriInAssignExpr; - if ($this->isVarExpr($item->value) and !$this->hasVar($var)) { - $this->addLocalVar($var, self::TYPE_VAR); + if ($item->value instanceof Expr\List_) { + $nestedTmp = $this->genTmpVarName(); + $this->addLocalVar($nestedTmp, self::TYPE_ARRAY); + $code .= "{$nestedTmp} = {$tmpVar}.item({$k}); "; + $code .= $this->parseAssignToList($item->value, new Variable($nestedTmp)); + } else { + $oriInAssignExpr = $this->context->inAssignExpr; + $this->context->inAssignExpr = true; + $var = $this->parseIdentifier($item->value); + $this->context->inAssignExpr = $oriInAssignExpr; + if ($this->isVarExpr($item->value) and !$this->hasVar($var)) { + $this->addLocalVar($var, self::TYPE_VAR); + } + $code .= "{$var} = {$tmpVar}.item({$k}); "; } - $code .= "{$var} = {$tmpVar}.item({$k}); "; } else { abort($item); } diff --git a/tests/aot/arrays/list-nested.phpt b/tests/aot/arrays/list-nested.phpt new file mode 100644 index 00000000..1b1fefe6 --- /dev/null +++ b/tests/aot/arrays/list-nested.phpt @@ -0,0 +1,32 @@ +--TEST-- +nested list() destructuring +--FILE-- + +--EXPECT-- +1 +2 +3 +4 +10 +20 +30 +40 +50