-
Notifications
You must be signed in to change notification settings - Fork 428
/
ParserNodeTypeToPHPStanType.php
81 lines (71 loc) · 2.39 KB
/
ParserNodeTypeToPHPStanType.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?php declare(strict_types = 1);
namespace PHPStan\Type;
use PhpParser\Node\Name;
use PhpParser\Node\NullableType;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Type\Constant\ConstantBooleanType;
class ParserNodeTypeToPHPStanType
{
/**
* @param \PhpParser\Node\Name|\PhpParser\Node\Identifier|\PhpParser\Node\NullableType|\PhpParser\Node\UnionType|null $type
* @param ClassReflection|null $classReflection
* @return Type
*/
public static function resolve($type, ?ClassReflection $classReflection): Type
{
if ($type === null) {
return new MixedType();
} elseif ($type instanceof Name) {
$typeClassName = (string) $type;
$lowercasedClassName = strtolower($typeClassName);
if ($classReflection !== null && in_array($lowercasedClassName, ['self', 'static'], true)) {
$typeClassName = $classReflection->getName();
} elseif (
$lowercasedClassName === 'parent'
&& $classReflection !== null
&& $classReflection->getParentClass() !== false
) {
$typeClassName = $classReflection->getParentClass()->getName();
}
if ($lowercasedClassName === 'static') {
return new StaticType($typeClassName);
}
return new ObjectType($typeClassName);
} elseif ($type instanceof NullableType) {
return TypeCombinator::addNull(self::resolve($type->type, $classReflection));
} elseif ($type instanceof \PhpParser\Node\UnionType) {
$types = [];
foreach ($type->types as $unionTypeType) {
$types[] = self::resolve($unionTypeType, $classReflection);
}
return TypeCombinator::union(...$types);
}
$type = $type->name;
if ($type === 'string') {
return new StringType();
} elseif ($type === 'int') {
return new IntegerType();
} elseif ($type === 'bool') {
return new BooleanType();
} elseif ($type === 'float') {
return new FloatType();
} elseif ($type === 'callable') {
return new CallableType();
} elseif ($type === 'array') {
return new ArrayType(new MixedType(), new MixedType());
} elseif ($type === 'iterable') {
return new IterableType(new MixedType(), new MixedType());
} elseif ($type === 'void') {
return new VoidType();
} elseif ($type === 'object') {
return new ObjectWithoutClassType();
} elseif ($type === 'false') {
return new ConstantBooleanType(false);
} elseif ($type === 'null') {
return new NullType();
} elseif ($type === 'mixed') {
return new MixedType(true);
}
return new MixedType();
}
}