-
Notifications
You must be signed in to change notification settings - Fork 428
/
HasPropertyType.php
112 lines (91 loc) · 2.6 KB
/
HasPropertyType.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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?php declare(strict_types = 1);
namespace PHPStan\Type\Accessory;
use PHPStan\Reflection\ClassMemberAccessAnswerer;
use PHPStan\Reflection\TrivialParametersAcceptor;
use PHPStan\TrinaryLogic;
use PHPStan\Type\CompoundType;
use PHPStan\Type\IntersectionType;
use PHPStan\Type\Traits\NonGeneralizableTypeTrait;
use PHPStan\Type\Traits\NonGenericTypeTrait;
use PHPStan\Type\Traits\NonRemoveableTypeTrait;
use PHPStan\Type\Traits\ObjectTypeTrait;
use PHPStan\Type\Traits\UndecidedComparisonCompoundTypeTrait;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
use PHPStan\Type\VerbosityLevel;
use function sprintf;
class HasPropertyType implements AccessoryType, CompoundType
{
use ObjectTypeTrait;
use NonGenericTypeTrait;
use UndecidedComparisonCompoundTypeTrait;
use NonRemoveableTypeTrait;
use NonGeneralizableTypeTrait;
/** @api */
public function __construct(private string $propertyName)
{
}
/**
* @return string[]
*/
public function getReferencedClasses(): array
{
return [];
}
public function getPropertyName(): string
{
return $this->propertyName;
}
public function accepts(Type $type, bool $strictTypes): TrinaryLogic
{
return TrinaryLogic::createFromBoolean($this->equals($type));
}
public function isSuperTypeOf(Type $type): TrinaryLogic
{
return $type->hasProperty($this->propertyName);
}
public function isSubTypeOf(Type $otherType): TrinaryLogic
{
if ($otherType instanceof UnionType || $otherType instanceof IntersectionType) {
return $otherType->isSuperTypeOf($this);
}
if ($otherType instanceof self) {
$limit = TrinaryLogic::createYes();
} else {
$limit = TrinaryLogic::createMaybe();
}
return $limit->and($otherType->hasProperty($this->propertyName));
}
public function isAcceptedBy(Type $acceptingType, bool $strictTypes): TrinaryLogic
{
return $this->isSubTypeOf($acceptingType);
}
public function equals(Type $type): bool
{
return $type instanceof self
&& $this->propertyName === $type->propertyName;
}
public function describe(VerbosityLevel $level): string
{
return sprintf('hasProperty(%s)', $this->propertyName);
}
public function hasProperty(string $propertyName): TrinaryLogic
{
if ($this->propertyName === $propertyName) {
return TrinaryLogic::createYes();
}
return TrinaryLogic::createMaybe();
}
public function getCallableParametersAcceptors(ClassMemberAccessAnswerer $scope): array
{
return [new TrivialParametersAcceptor()];
}
public function traverse(callable $cb): Type
{
return $this;
}
public static function __set_state(array $properties): Type
{
return new self($properties['propertyName']);
}
}