You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.0 KiB
105 lines
2.0 KiB
<?php declare(strict_types=1);
|
|
/*
|
|
* This file is part of sebastian/type.
|
|
*
|
|
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
namespace SebastianBergmann\Type;
|
|
|
|
use function strtolower;
|
|
|
|
final class SimpleType extends Type
|
|
{
|
|
/**
|
|
* @var string
|
|
*/
|
|
private $name;
|
|
|
|
/**
|
|
* @var bool
|
|
*/
|
|
private $allowsNull;
|
|
|
|
/**
|
|
* @var mixed
|
|
*/
|
|
private $value;
|
|
|
|
public function __construct(string $name, bool $nullable, $value = null)
|
|
{
|
|
$this->name = $this->normalize($name);
|
|
$this->allowsNull = $nullable;
|
|
$this->value = $value;
|
|
}
|
|
|
|
public function isAssignable(Type $other): bool
|
|
{
|
|
if ($this->allowsNull && $other instanceof NullType) {
|
|
return true;
|
|
}
|
|
|
|
if ($this->name === 'bool' && $other->name() === 'true') {
|
|
return true;
|
|
}
|
|
|
|
if ($this->name === 'bool' && $other->name() === 'false') {
|
|
return true;
|
|
}
|
|
|
|
if ($other instanceof self) {
|
|
return $this->name === $other->name;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public function name(): string
|
|
{
|
|
return $this->name;
|
|
}
|
|
|
|
public function allowsNull(): bool
|
|
{
|
|
return $this->allowsNull;
|
|
}
|
|
|
|
public function value()
|
|
{
|
|
return $this->value;
|
|
}
|
|
|
|
/**
|
|
* @psalm-assert-if-true SimpleType $this
|
|
*/
|
|
public function isSimple(): bool
|
|
{
|
|
return true;
|
|
}
|
|
|
|
private function normalize(string $name): string
|
|
{
|
|
$name = strtolower($name);
|
|
|
|
switch ($name) {
|
|
case 'boolean':
|
|
return 'bool';
|
|
|
|
case 'real':
|
|
case 'double':
|
|
return 'float';
|
|
|
|
case 'integer':
|
|
return 'int';
|
|
|
|
case '[]':
|
|
return 'array';
|
|
|
|
default:
|
|
return $name;
|
|
}
|
|
}
|
|
}
|