/** * @param Node $node * A node to parse * * @return Context * A new or an unchanged context resulting from * parsing the node */ public function visitDim(Node $node) : Context { // Make the right type a generic (i.e. int -> int[]) $right_type = $this->right_type->asGenericTypes(); if ($node->children['expr']->kind == \ast\AST_VAR) { $variable_name = AST::variableName($node); if ('GLOBALS' === $variable_name) { $dim = $node->children['dim']; if (is_string($dim)) { // You're not going to believe this, but I just // found a piece of code like $GLOBALS[mt_rand()]. // Super weird, right? assert(is_string($dim), "dim is not a string at {$this->context}"); $variable = new Variable($this->context, $dim, $this->right_type, $node->flags ?? 0); $this->context->getScope()->withGlobalVariable($variable); return $this->context; } } } // Recurse into whatever we're []'ing $context = (new Element($node->children['expr']))->acceptKindVisitor(new AssignmentVisitor($this->context, $this->code_base, $node, $right_type)); return $context; }