private function assignVariable(Scope $scope, Node $var, Type $subNodeType = null) : Scope
{
if ($var instanceof Variable && is_string($var->name)) {
$scope = $scope->assignVariable($var->name, $subNodeType);
} elseif ($var instanceof ArrayDimFetch) {
$depth = 0;
while ($var instanceof ArrayDimFetch) {
$var = $var->var;
$depth++;
}
if ($var instanceof Variable && is_string($var->name)) {
$arrayType = ArrayType::createDeepArrayType(new NestedArrayItemType($subNodeType !== null ? $subNodeType : new MixedType(true), $depth), false);
if ($scope->hasVariableType($var->name)) {
$arrayType = $scope->getVariableType($var->name)->combineWith($arrayType);
}
$scope = $scope->assignVariable($var->name, $arrayType);
}
if (isset($var->dim)) {
$scope = $this->lookForAssigns($scope, $var->dim);
}
} else {
$scope = $this->lookForAssigns($scope, $var);
}
return $scope;
}