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