*/
final class CastTypeResolver implements NodeTypeResolverInterface
{
/**
* @var array, class-string>
*/
private const CAST_CLASS_TO_TYPE_MAP = [Bool_::class => BooleanType::class, String_::class => StringType::class, Int_::class => IntegerType::class, Double::class => FloatType::class];
/**
* @return array>
*/
public function getNodeClasses() : array
{
return [Cast::class];
}
/**
* @param Cast $node
*/
public function resolve(Node $node) : Type
{
foreach (self::CAST_CLASS_TO_TYPE_MAP as $castClass => $typeClass) {
if ($node instanceof $castClass) {
return new $typeClass();
}
}
if ($node instanceof Array_) {
return new ArrayType(new MixedType(), new MixedType());
}
if ($node instanceof Object_) {
return new ObjectType('stdClass');
}
throw new NotImplementedYetException(\get_class($node));
}
}