public function visit(Node $node) : UnionType
{
$left = UnionType::fromNode($this->context, $this->code_base, $node->children['left']);
$right = UnionType::fromNode($this->context, $this->code_base, $node->children['right']);
if ($left->isType(ArrayType::instance()) || $right->isType(ArrayType::instance())) {
Issue::maybeEmit($this->code_base, $this->context, Issue::TypeArrayOperator, $node->lineno ?? 0, $left, $right);
return new UnionType();
} elseif ($left->hasType(IntType::instance()) && $right->hasType(IntType::instance())) {
return IntType::instance()->asUnionType();
} elseif ($left->hasType(FloatType::instance()) && $right->hasType(FloatType::instance())) {
return FloatType::instance()->asUnionType();
}
return new UnionType([IntType::instance(), FloatType::instance()]);
}