Add a variable to this context's scope. Note that
this does not create a new context. You're actually
injecting the variable into the context. Use with
caution.
public addScopeVariable ( |
||
$variable | A variable to inject into this context | |
return | null |
/** * @param Node $node * A node to parse * * @return Context * A new or an unchanged context resulting from * parsing the node */ public function visitVar(Node $node) : Context { $variable_name = AST::variableName($node); // Check to see if the variable already exists if ($this->context->getScope()->hasVariableWithName($variable_name)) { $variable = $this->context->getScope()->getVariableWithName($variable_name); // If we're assigning to an array element then we don't // know what the constitutation of the parameter is // outside of the scope of this assignment, so we add to // its union type rather than replace it. if ($this->is_dim_assignment) { $variable->getUnionType()->addUnionType($this->right_type); } else { // If the variable isn't a pass-by-reference paramter // we clone it so as to not disturb its previous types // as we replace it. if (!($variable instanceof Parameter && $variable->isPassByReference())) { $variable = clone $variable; } $variable->setUnionType($this->right_type); } $this->context->addScopeVariable($variable); return $this->context; } $variable = Variable::fromNodeInContext($this->assignment_node, $this->context, $this->code_base); // Set that type on the variable $variable->getUnionType()->addUnionType($this->right_type); // Note that we're not creating a new scope, just // adding variables to the existing scope $this->context->addScopeVariable($variable); return $this->context; }
/** * @return Variable * A variable in scope or a new variable * * @throws NodeException * An exception is thrown if we can't understand the node */ public function getOrCreateVariable() : Variable { try { return $this->getVariable(); } catch (IssueException $exception) { // Swallow it } // Create a new variable $variable = Variable::fromNodeInContext($this->node, $this->context, $this->code_base, false); $this->context->addScopeVariable($variable); return $variable; }
/** * @param Node $node * A node to parse * * @return Context * A new or an unchanged context resulting from * parsing the node */ public function visitStatic(Node $node) : Context { $variable = Variable::fromNodeInContext($node->children['var'], $this->context, $this->code_base, false); // If the element has a default, set its type // on the variable if (isset($node->children['default'])) { $default_type = UnionType::fromNode($this->context, $this->code_base, $node->children['default']); $variable->setUnionType($default_type); } // Note that we're not creating a new scope, just // adding variables to the existing scope $this->context->addScopeVariable($variable); return $this->context; }
/** * @param Node $node * A node to parse * * @return Context * A new or an unchanged context resulting from * parsing the node */ public function visitVar(Node $node) : Context { $variable_name = AST::variableName($node); // Check to see if the variable already exists if ($this->context->getScope()->hasVariableWithName($variable_name)) { $variable = $this->context->getScope()->getVariableWithName($variable_name); $variable->setUnionType($this->right_type); $this->context->addScopeVariable($variable); return $this->context; } $variable = Variable::fromNodeInContext($this->assignment_node, $this->context, $this->code_base); // Set that type on the variable $variable->getUnionType()->addUnionType($this->right_type); // Note that we're not creating a new scope, just // adding variables to the existing scope $this->context->addScopeVariable($variable); return $this->context; }
/** * @param Node $node * A node to parse * * @return Context * A new or an unchanged context resulting from * parsing the node */ public function visitInstanceof(Node $node) : Context { // Only look at things of the form // `$variable instanceof ClassName` if ($node->children['expr']->kind !== \ast\AST_VAR) { return $this->context; } try { // Get the variable we're operating on $variable = (new ContextNode($this->code_base, $this->context, $node->children['expr']))->getVariable(); // Get the type that we're checking it against $type = UnionType::fromNode($this->context, $this->code_base, $node->children['class']); // Make a copy of the variable $variable = clone $variable; // Add the type to the variable $variable->getUnionType()->addUnionType($type); // Overwrite the variable with its new type $this->context->addScopeVariable($variable); } catch (\Exception $exception) { // Swallow it } return $this->context; }