/**
* @return Parameter
* A parameter built from a node
*
* @see \Phan\Deprecated\Pass1::node_param
* Formerly `function node_param`
*/
public static function fromNode(Context $context, CodeBase $code_base, Node $node) : Parameter
{
assert($node instanceof Node, "node was not an \\ast\\Node");
// Get the type of the parameter
$union_type = UnionType::fromNode($context, $code_base, $node->children['type']);
// Create the skeleton parameter from what we know so far
$parameter = new Parameter($context, (string) $node->children['name'], $union_type, $node->flags ?? 0);
// If there is a default value, store it and its type
if (($default_node = $node->children['default']) !== null) {
// We can't figure out default values during the
// parsing phase, unfortunately
if (!$default_node instanceof Node || $default_node->kind == \ast\AST_CONST || $default_node->kind == \ast\AST_UNARY_OP || $default_node->kind == \ast\AST_ARRAY) {
// Get the type of the default
$union_type = UnionType::fromNode($context, $code_base, $default_node);
// Set the default value
$parameter->setDefaultValueType($union_type);
} else {
try {
// Get the type of the default
$union_type = UnionType::fromNode($context, $code_base, $default_node, false);
} catch (IssueException $exception) {
// If we're in the parsing phase and we
// depend on a constant that isn't yet
// defined, give up and set it to
// bool|float|int|string to avoid having
// to handle a future type.
$union_type = new UnionType([BoolType::instance(), FloatType::instance(), IntType::instance(), StringType::instance()]);
}
// Set the default value
$parameter->setDefaultValueType($union_type);
}
}
return $parameter;
}