1: <?php declare(strict_types = 1);
2:
3: namespace PHPStan\Type;
4:
5: use PHPStan\Type\Generic\TemplateTypeVariance;
6: use PHPStan\Type\Traits\LateResolvableTypeTrait;
7: use PHPStan\Type\Traits\NonGeneralizableTypeTrait;
8: use function sprintf;
9:
10: /** @api */
11: final class ValueOfType implements CompoundType, LateResolvableType
12: {
13:
14: use LateResolvableTypeTrait;
15: use NonGeneralizableTypeTrait;
16:
17: public function __construct(private Type $type)
18: {
19: }
20:
21: public function getReferencedClasses(): array
22: {
23: return $this->type->getReferencedClasses();
24: }
25:
26: public function getReferencedTemplateTypes(TemplateTypeVariance $positionVariance): array
27: {
28: return $this->type->getReferencedTemplateTypes($positionVariance);
29: }
30:
31: public function equals(Type $type): bool
32: {
33: return $type instanceof self
34: && $this->type->equals($type->type);
35: }
36:
37: public function describe(VerbosityLevel $level): string
38: {
39: return sprintf('value-of<%s>', $this->type->describe($level));
40: }
41:
42: public function isResolvable(): bool
43: {
44: return !TypeUtils::containsTemplateType($this->type);
45: }
46:
47: protected function getResult(): Type
48: {
49: return $this->type->getIterableValueType();
50: }
51:
52: /**
53: * @param callable(Type): Type $cb
54: */
55: public function traverse(callable $cb): Type
56: {
57: $type = $cb($this->type);
58:
59: if ($this->type === $type) {
60: return $this;
61: }
62:
63: return new ValueOfType($type);
64: }
65:
66: /**
67: * @param mixed[] $properties
68: */
69: public static function __set_state(array $properties): Type
70: {
71: return new self(
72: $properties['type'],
73: );
74: }
75:
76: }
77: