1: <?php declare(strict_types = 1);
2:
3: namespace PHPStan\Type;
4:
5: use PhpParser\Node\Identifier;
6: use PHPStan\Php\PhpVersion;
7: use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
8: use PHPStan\PhpDocParser\Ast\Type\TypeNode;
9: use PHPStan\TrinaryLogic;
10: use PHPStan\Turbo\ShadowedByTurboExtension;
11: use PHPStan\Type\Traits\FalseyBooleanTypeTrait;
12: use PHPStan\Type\Traits\NonArrayTypeTrait;
13: use PHPStan\Type\Traits\NonCallableTypeTrait;
14: use PHPStan\Type\Traits\NonGeneralizableTypeTrait;
15: use PHPStan\Type\Traits\NonGenericTypeTrait;
16: use PHPStan\Type\Traits\NonIterableTypeTrait;
17: use PHPStan\Type\Traits\NonObjectTypeTrait;
18: use PHPStan\Type\Traits\NonOffsetAccessibleTypeTrait;
19: use PHPStan\Type\Traits\NonRemoveableTypeTrait;
20: use PHPStan\Type\Traits\UndecidedComparisonTypeTrait;
21:
22: /** @api */
23: #[ShadowedByTurboExtension(implementation: __DIR__ . '/../../turbo-ext/src/VoidType.cpp')]
24: #[InstanceofDeprecated(insteadUse: 'Type::isVoid()')]
25: class VoidType implements Type
26: {
27:
28: use NonArrayTypeTrait;
29: use NonCallableTypeTrait;
30: use NonIterableTypeTrait;
31: use NonObjectTypeTrait;
32: use NonOffsetAccessibleTypeTrait;
33: use FalseyBooleanTypeTrait;
34: use NonGenericTypeTrait;
35: use UndecidedComparisonTypeTrait;
36: use NonRemoveableTypeTrait;
37: use NonGeneralizableTypeTrait;
38:
39: /** @api */
40: public function __construct()
41: {
42: }
43:
44: public function getReferencedClasses(): array
45: {
46: return [];
47: }
48:
49: public function getObjectClassNames(): array
50: {
51: return [];
52: }
53:
54: public function getObjectClassReflections(): array
55: {
56: return [];
57: }
58:
59: public function accepts(Type $type, bool $strictTypes): AcceptsResult
60: {
61: if ($type instanceof CompoundType) {
62: return $type->isAcceptedBy($this, $strictTypes);
63: }
64:
65: return new AcceptsResult($type->isVoid()->or($type->isNull()), []);
66: }
67:
68: public function isSuperTypeOf(Type $type): IsSuperTypeOfResult
69: {
70: if ($type instanceof self) {
71: return IsSuperTypeOfResult::createYes();
72: }
73:
74: if ($type instanceof CompoundType) {
75: return $type->isSubTypeOf($this);
76: }
77:
78: return IsSuperTypeOfResult::createNo();
79: }
80:
81: public function equals(Type $type): bool
82: {
83: return $type instanceof self;
84: }
85:
86: public function describe(VerbosityLevel $level): string
87: {
88: return 'void';
89: }
90:
91: public function toNumber(): Type
92: {
93: return new ErrorType();
94: }
95:
96: public function toBitwiseNotType(): Type
97: {
98: return new ErrorType();
99: }
100:
101: public function toAbsoluteNumber(): Type
102: {
103: return new ErrorType();
104: }
105:
106: public function toString(): Type
107: {
108: return new ErrorType();
109: }
110:
111: public function toInteger(): Type
112: {
113: return new ErrorType();
114: }
115:
116: public function toFloat(): Type
117: {
118: return new ErrorType();
119: }
120:
121: public function toArray(): Type
122: {
123: return new ErrorType();
124: }
125:
126: public function toArrayKey(): Type
127: {
128: return new ErrorType();
129: }
130:
131: public function toCoercedArgumentType(bool $strictTypes): Type
132: {
133: return new NullType();
134: }
135:
136: public function isOffsetAccessLegal(): TrinaryLogic
137: {
138: return TrinaryLogic::createYes();
139: }
140:
141: public function isNull(): TrinaryLogic
142: {
143: return TrinaryLogic::createNo();
144: }
145:
146: public function isConstantValue(): TrinaryLogic
147: {
148: return TrinaryLogic::createNo();
149: }
150:
151: public function isConstantScalarValue(): TrinaryLogic
152: {
153: return TrinaryLogic::createNo();
154: }
155:
156: public function getConstantScalarTypes(): array
157: {
158: return [];
159: }
160:
161: public function getConstantScalarValues(): array
162: {
163: return [];
164: }
165:
166: public function isTrue(): TrinaryLogic
167: {
168: return TrinaryLogic::createNo();
169: }
170:
171: public function isFalse(): TrinaryLogic
172: {
173: return TrinaryLogic::createNo();
174: }
175:
176: public function isBoolean(): TrinaryLogic
177: {
178: return TrinaryLogic::createNo();
179: }
180:
181: public function isFloat(): TrinaryLogic
182: {
183: return TrinaryLogic::createNo();
184: }
185:
186: public function isInteger(): TrinaryLogic
187: {
188: return TrinaryLogic::createNo();
189: }
190:
191: public function isString(): TrinaryLogic
192: {
193: return TrinaryLogic::createNo();
194: }
195:
196: public function isNumericString(): TrinaryLogic
197: {
198: return TrinaryLogic::createNo();
199: }
200:
201: public function isDecimalIntegerString(): TrinaryLogic
202: {
203: return TrinaryLogic::createNo();
204: }
205:
206: public function isNonEmptyString(): TrinaryLogic
207: {
208: return TrinaryLogic::createNo();
209: }
210:
211: public function isNonFalsyString(): TrinaryLogic
212: {
213: return TrinaryLogic::createNo();
214: }
215:
216: public function isLiteralString(): TrinaryLogic
217: {
218: return TrinaryLogic::createNo();
219: }
220:
221: public function isLowercaseString(): TrinaryLogic
222: {
223: return TrinaryLogic::createNo();
224: }
225:
226: public function isUppercaseString(): TrinaryLogic
227: {
228: return TrinaryLogic::createNo();
229: }
230:
231: public function isClassString(): TrinaryLogic
232: {
233: return TrinaryLogic::createNo();
234: }
235:
236: public function getClassStringObjectType(): Type
237: {
238: return new ErrorType();
239: }
240:
241: public function getObjectTypeOrClassStringObjectType(): Type
242: {
243: return new ErrorType();
244: }
245:
246: public function isVoid(): TrinaryLogic
247: {
248: return TrinaryLogic::createYes();
249: }
250:
251: public function isScalar(): TrinaryLogic
252: {
253: return TrinaryLogic::createNo();
254: }
255:
256: public function looseCompare(Type $type, PhpVersion $phpVersion): BooleanType
257: {
258: return new BooleanType();
259: }
260:
261: public function traverse(callable $cb): Type
262: {
263: return $this;
264: }
265:
266: public function traverseSimultaneously(Type $right, callable $cb): Type
267: {
268: return $this;
269: }
270:
271: public function exponentiate(Type $exponent): Type
272: {
273: return new ErrorType();
274: }
275:
276: public function getFiniteTypes(): array
277: {
278: return [];
279: }
280:
281: public function toPhpDocNode(): TypeNode
282: {
283: return new IdentifierTypeNode('void');
284: }
285:
286: public function toNativePhpTypeNode(NativeTypePosition $position)
287: {
288: return $position->isVoidAllowed() ? new Identifier('void') : null;
289: }
290:
291: public function hasTemplateOrLateResolvableType(): bool
292: {
293: return false;
294: }
295:
296: }
297: