*/ 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)); } }