, string[]> */ private const SCALAR_NAME_BY_TYPE = [StringType::class => ['string'], AccessoryNonEmptyStringType::class => ['non-empty-string'], ClassStringType::class => ['class-string'], FloatType::class => ['float', 'real', 'double'], IntegerType::class => ['int', 'integer'], BooleanType::class => ['bool', 'boolean'], NullType::class => ['null'], VoidType::class => ['void'], ResourceType::class => ['resource'], CallableType::class => ['callback', 'callable'], ObjectWithoutClassType::class => ['object'], NeverType::class => ['never', 'never-return', 'never-returns', 'no-return']]; public function mapScalarStringToType(string $scalarName) : Type { $loweredScalarName = Strings::lower($scalarName); if ($loweredScalarName === 'false') { return new ConstantBooleanType(\false); } if ($loweredScalarName === 'true') { return new ConstantBooleanType(\true); } if ($loweredScalarName === 'positive-int') { return IntegerRangeType::createAllGreaterThan(0); } if ($loweredScalarName === 'negative-int') { return IntegerRangeType::createAllSmallerThan(0); } foreach (self::SCALAR_NAME_BY_TYPE as $objectType => $scalarNames) { if (!\in_array($loweredScalarName, $scalarNames, \true)) { continue; } return new $objectType(); } if ($loweredScalarName === 'array') { return new ArrayType(new MixedType(), new MixedType()); } if ($loweredScalarName === 'iterable') { return new IterableType(new MixedType(), new MixedType()); } if ($loweredScalarName === 'mixed') { return new MixedType(\true); } return new MixedType(); } }