1: <?php declare(strict_types = 1);
2:
3: namespace PHPStan\Node\Printer;
4:
5: use PhpParser\PrettyPrinter\Standard;
6: use PHPStan\DependencyInjection\AutowiredService;
7: use PHPStan\Node\BooleanAndNode;
8: use PHPStan\Node\BooleanOrNode;
9: use PHPStan\Node\Expr\AlwaysRememberedExpr;
10: use PHPStan\Node\Expr\CloneReinitializationExpr;
11: use PHPStan\Node\Expr\ExistingArrayDimFetch;
12: use PHPStan\Node\Expr\ForeachValueByRefExpr;
13: use PHPStan\Node\Expr\GetIterableKeyTypeExpr;
14: use PHPStan\Node\Expr\GetIterableValueTypeExpr;
15: use PHPStan\Node\Expr\GetOffsetValueTypeExpr;
16: use PHPStan\Node\Expr\IntertwinedVariableByReferenceWithExpr;
17: use PHPStan\Node\Expr\NativeTypeExpr;
18: use PHPStan\Node\Expr\OriginalForeachKeyExpr;
19: use PHPStan\Node\Expr\OriginalForeachValueExpr;
20: use PHPStan\Node\Expr\OriginalPropertyTypeExpr;
21: use PHPStan\Node\Expr\ParameterVariableOriginalValueExpr;
22: use PHPStan\Node\Expr\PossiblyImpureCallExpr;
23: use PHPStan\Node\Expr\PropertyInitializationExpr;
24: use PHPStan\Node\Expr\SetExistingOffsetValueTypeExpr;
25: use PHPStan\Node\Expr\SetOffsetValueTypeExpr;
26: use PHPStan\Node\Expr\TypeExpr;
27: use PHPStan\Node\Expr\UnsetOffsetExpr;
28: use PHPStan\Node\FunctionCallableNode;
29: use PHPStan\Node\InstantiationCallableNode;
30: use PHPStan\Node\IssetExpr;
31: use PHPStan\Node\MethodCallableNode;
32: use PHPStan\Node\StaticMethodCallableNode;
33: use PHPStan\Type\VerbosityLevel;
34: use function sprintf;
35:
36: /**
37: * @api
38: */
39: #[AutowiredService(as: Printer::class)]
40: final class Printer extends Standard
41: {
42:
43: protected function pPHPStan_Node_TypeExpr(TypeExpr $expr): string // phpcs:ignore
44: {
45: return sprintf('__phpstanType(%s)', $expr->getExprType()->describe(VerbosityLevel::precise()));
46: }
47:
48: protected function pPHPStan_Node_NativeTypeExpr(NativeTypeExpr $expr): string // phpcs:ignore
49: {
50: return sprintf('__phpstanNativeType(%s, %s)', $expr->getPhpDocType()->describe(VerbosityLevel::precise()), $expr->getNativeType()->describe(VerbosityLevel::precise()));
51: }
52:
53: protected function pPHPStan_Node_GetOffsetValueTypeExpr(GetOffsetValueTypeExpr $expr): string // phpcs:ignore
54: {
55: return sprintf('__phpstanGetOffsetValueType(%s, %s)', $this->p($expr->getVar()), $this->p($expr->getDim()));
56: }
57:
58: protected function pPHPStan_Node_UnsetOffsetExpr(UnsetOffsetExpr $expr): string // phpcs:ignore
59: {
60: return sprintf('__phpstanUnsetOffset(%s, %s)', $this->p($expr->getVar()), $this->p($expr->getDim()));
61: }
62:
63: protected function pPHPStan_Node_GetIterableValueTypeExpr(GetIterableValueTypeExpr $expr): string // phpcs:ignore
64: {
65: return sprintf('__phpstanGetIterableValueType(%s)', $this->p($expr->getExpr()));
66: }
67:
68: protected function pPHPStan_Node_GetIterableKeyTypeExpr(GetIterableKeyTypeExpr $expr): string // phpcs:ignore
69: {
70: return sprintf('__phpstanGetIterableKeyType(%s)', $this->p($expr->getExpr()));
71: }
72:
73: protected function pPHPStan_Node_ExistingArrayDimFetch(ExistingArrayDimFetch $expr): string // phpcs:ignore
74: {
75: return sprintf('__phpstanExistingArrayDimFetch(%s, %s)', $this->p($expr->getVar()), $this->p($expr->getDim()));
76: }
77:
78: protected function pPHPStan_Node_OriginalPropertyTypeExpr(OriginalPropertyTypeExpr $expr): string // phpcs:ignore
79: {
80: return sprintf('__phpstanOriginalPropertyType(%s)', $this->p($expr->getPropertyFetch()));
81: }
82:
83: protected function pPHPStan_Node_SetOffsetValueTypeExpr(SetOffsetValueTypeExpr $expr): string // phpcs:ignore
84: {
85: return sprintf('__phpstanSetOffsetValueType(%s, %s, %s)', $this->p($expr->getVar()), $expr->getDim() !== null ? $this->p($expr->getDim()) : 'null', $this->p($expr->getValue()));
86: }
87:
88: protected function pPHPStan_Node_SetExistingOffsetValueTypeExpr(SetExistingOffsetValueTypeExpr $expr): string // phpcs:ignore
89: {
90: return sprintf('__phpstanSetExistingOffsetValueType(%s, %s, %s)', $this->p($expr->getVar()), $this->p($expr->getDim()), $this->p($expr->getValue()));
91: }
92:
93: protected function pPHPStan_Node_AlwaysRememberedExpr(AlwaysRememberedExpr $expr): string // phpcs:ignore
94: {
95: return sprintf('__phpstanRemembered(%s)', $this->p($expr->getExpr()));
96: }
97:
98: protected function pPHPStan_Node_PossiblyImpureCallExpr(PossiblyImpureCallExpr $expr): string // phpcs:ignore
99: {
100: return sprintf('__phpstanPossiblyImpure(%s, %s)', $this->p($expr->callExpr), $this->p($expr->impactedExpr));
101: }
102:
103: protected function pPHPStan_Node_PropertyInitializationExpr(PropertyInitializationExpr $expr): string // phpcs:ignore
104: {
105: return sprintf('__phpstanPropertyInitialization(%s)', $expr->getPropertyName());
106: }
107:
108: protected function pPHPStan_Node_CloneReinitializationExpr(CloneReinitializationExpr $expr): string // phpcs:ignore
109: {
110: return sprintf('__phpstanCloneReinitialization(%s)', $expr->getPropertyName());
111: }
112:
113: protected function pPHPStan_Node_ForeachValueByRefExpr(ForeachValueByRefExpr $expr): string // phpcs:ignore
114: {
115: return sprintf('__phpstanForeachValueByRef(%s)', $this->p($expr->getExpr()));
116: }
117:
118: protected function pPHPStan_Node_ParameterVariableOriginalValueExpr(ParameterVariableOriginalValueExpr $expr): string // phpcs:ignore
119: {
120: return sprintf('__phpstanParameterVariableOriginalValue(%s)', $expr->getVariableName());
121: }
122:
123: protected function pPHPStan_Node_OriginalForeachKeyExpr(OriginalForeachKeyExpr $expr): string // phpcs:ignore
124: {
125: return sprintf('__phpstanOriginalForeachKey(%s)', $expr->getVariableName());
126: }
127:
128: protected function pPHPStan_Node_OriginalForeachValueExpr(OriginalForeachValueExpr $expr): string // phpcs:ignore
129: {
130: return sprintf('__phpstanOriginalForeachValue(%s)', $expr->getVariableName());
131: }
132:
133: protected function pPHPStan_Node_IntertwinedVariableByReferenceWithExpr(IntertwinedVariableByReferenceWithExpr $expr): string // phpcs:ignore
134: {
135: return sprintf('__phpstanIntertwinedVariableByReference(%s, %s, %s)', $expr->getVariableName(), $this->p($expr->getExpr()), $this->p($expr->getAssignedExpr()));
136: }
137:
138: protected function pPHPStan_Node_IssetExpr(IssetExpr $expr): string // phpcs:ignore
139: {
140: return sprintf('__phpstanIssetExpr(%s)', $this->p($expr->getExpr()));
141: }
142:
143: protected function pPHPStan_Node_BooleanOrNode(BooleanOrNode $expr): string // phpcs:ignore
144: {
145: return sprintf('__phpstanBooleanOr(%s, %s)', $this->p($expr->getOriginalNode()->left), $this->p($expr->getOriginalNode()->right));
146: }
147:
148: protected function pPHPStan_Node_BooleanAndNode(BooleanAndNode $expr): string // phpcs:ignore
149: {
150: return sprintf('__phpstanBooleanAnd(%s, %s)', $this->p($expr->getOriginalNode()->left), $this->p($expr->getOriginalNode()->right));
151: }
152:
153: protected function pPHPStan_Node_FunctionCallableNode(FunctionCallableNode $expr): string // phpcs:ignore
154: {
155: return sprintf('__phpstanFunctionCallable(%s)', $this->p($expr->getOriginalNode()));
156: }
157:
158: protected function pPHPStan_Node_MethodCallableNode(MethodCallableNode $expr): string // phpcs:ignore
159: {
160: return sprintf('__phpstanMethodCallable(%s)', $this->p($expr->getOriginalNode()));
161: }
162:
163: protected function pPHPStan_Node_StaticMethodCallableNode(StaticMethodCallableNode $expr): string // phpcs:ignore
164: {
165: return sprintf('__phpstanStaticMethodCallable(%s)', $this->p($expr->getOriginalNode()));
166: }
167:
168: protected function pPHPStan_Node_InstantiationCallableNode(InstantiationCallableNode $expr): string // phpcs:ignore
169: {
170: return sprintf('__phpstanInstantiationCallable(%s)', $this->p($expr->getOriginalNode()));
171: }
172:
173: }
174: