|  1:  | <?php declare(strict_types = 1); | 
|  2:  |  | 
|  3:  | namespace PHPStan\Type; | 
|  4:  |  | 
|  5:  | use PHPStan\Type\Constant\ConstantArrayTypeBuilder; | 
|  6:  | use PHPStan\Type\Constant\ConstantBooleanType; | 
|  7:  | use PHPStan\Type\Constant\ConstantFloatType; | 
|  8:  | use PHPStan\Type\Constant\ConstantIntegerType; | 
|  9:  | use PHPStan\Type\Constant\ConstantStringType; | 
| 10:  | use PHPStan\Type\Enum\EnumCaseObjectType; | 
| 11:  | use UnitEnum; | 
| 12:  | use function count; | 
| 13:  | use function function_exists; | 
| 14:  | use function get_class; | 
| 15:  | use function is_array; | 
| 16:  | use function is_bool; | 
| 17:  | use function is_float; | 
| 18:  | use function is_int; | 
| 19:  | use function is_nan; | 
| 20:  | use function is_object; | 
| 21:  | use function is_string; | 
| 22:  |  | 
| 23:  |  | 
| 24:  |  | 
| 25:  |  | 
| 26:  | final class ConstantTypeHelper | 
| 27:  | { | 
| 28:  |  | 
| 29:  | 	 | 
| 30:  |  | 
| 31:  |  | 
| 32:  | 	public static function getTypeFromValue($value): Type | 
| 33:  | 	{ | 
| 34:  | 		if (is_int($value)) { | 
| 35:  | 			return new ConstantIntegerType($value); | 
| 36:  | 		} elseif (is_float($value)) { | 
| 37:  | 			if (is_nan($value)) { | 
| 38:  | 				return new MixedType(); | 
| 39:  | 			} | 
| 40:  | 			return new ConstantFloatType($value); | 
| 41:  | 		} elseif (is_bool($value)) { | 
| 42:  | 			return new ConstantBooleanType($value); | 
| 43:  | 		} elseif ($value === null) { | 
| 44:  | 			return new NullType(); | 
| 45:  | 		} elseif (is_string($value)) { | 
| 46:  | 			return new ConstantStringType($value); | 
| 47:  | 		} elseif (is_array($value)) { | 
| 48:  | 			$arrayBuilder = ConstantArrayTypeBuilder::createEmpty(); | 
| 49:  | 			if (count($value) > ConstantArrayTypeBuilder::ARRAY_COUNT_LIMIT) { | 
| 50:  | 				$arrayBuilder->degradeToGeneralArray(true); | 
| 51:  | 			} | 
| 52:  | 			foreach ($value as $k => $v) { | 
| 53:  | 				$arrayBuilder->setOffsetValueType(self::getTypeFromValue($k), self::getTypeFromValue($v)); | 
| 54:  | 			} | 
| 55:  | 			return $arrayBuilder->getArray(); | 
| 56:  | 		} elseif (is_object($value)) { | 
| 57:  | 			$class = get_class($value); | 
| 58:  | 			 | 
| 59:  | 			if (function_exists('enum_exists') && \enum_exists($class)) { | 
| 60:  | 				 | 
| 61:  | 				return new EnumCaseObjectType($class, $value->name); | 
| 62:  | 			} | 
| 63:  | 			 | 
| 64:  |  | 
| 65:  | 			return new ObjectType(get_class($value)); | 
| 66:  | 		} | 
| 67:  |  | 
| 68:  | 		return new MixedType(); | 
| 69:  | 	} | 
| 70:  |  | 
| 71:  | } | 
| 72:  |  |