/** * @param Node $node * A node to parse * * @return Context * A new or an unchanged context resulting from * parsing the node */ public function visitList(Node $node) : Context { // Figure out the type of elements in the list $element_type = $this->right_type->asNonGenericTypes(); foreach ($node->children ?? [] as $child_node) { // Some times folks like to pass a null to // a list to throw the element away. I'm not // here to judge. if (!$child_node instanceof Node) { continue; } $variable = Variable::fromNodeInContext($child_node, $this->context, $this->code_base, false); // Set the element type on each element of // the list $variable->setUnionType($element_type); // Note that we're not creating a new scope, just // adding variables to the existing scope $this->context->addScopeVariable($variable); } return $this->context; }