2626final class JsonThrowOnErrorRector extends AbstractRector implements MinPhpVersionInterface
2727{
2828 private bool $ hasChanged = false ;
29- private const FLAGS = ['JSON_THROW_ON_ERROR ' ];
29+ private const array FLAGS = ['JSON_THROW_ON_ERROR ' ];
3030
3131 public function __construct (
3232 private readonly ValueResolver $ valueResolver ,
@@ -62,9 +62,6 @@ public function getNodeTypes(): array
6262 return NodeGroup::STMTS_AWARE ;
6363 }
6464
65- /**
66- * @param StmtsAware $node
67- */
6865 public function refactor (Node $ node ): ?Node
6966 {
7067 // if found, skip it :)
@@ -134,11 +131,13 @@ private function shouldSkipFuncCall(FuncCall $funcCall): bool
134131 return $ this ->isFirstValueStringOrArray ($ funcCall );
135132 }
136133
137- private function processJsonEncode (FuncCall $ funcCall ): ? FuncCall
134+ private function processJsonEncode (FuncCall $ funcCall ): FuncCall
138135 {
139136 $ flags = [];
140137 if (isset ($ funcCall ->args [1 ])) {
141- $ flags = $ this ->getFlags ($ funcCall ->args [1 ]);
138+ /** @var Arg|Node\Expr\BinaryOp\BitwiseOr|ConstFetch $arg */
139+ $ arg = $ funcCall ->args [1 ];
140+ $ flags = $ this ->getFlags ($ arg );
142141 }
143142 if (!is_null ($ newArg = $ this ->getArgWithFlags ($ flags ))) {
144143 $ this ->hasChanged = true ;
@@ -147,11 +146,13 @@ private function processJsonEncode(FuncCall $funcCall): ?FuncCall
147146 return $ funcCall ;
148147 }
149148
150- private function processJsonDecode (FuncCall $ funcCall ): ? FuncCall
149+ private function processJsonDecode (FuncCall $ funcCall ): FuncCall
151150 {
152151 $ flags = [];
153152 if (isset ($ funcCall ->args [3 ])) {
154- $ flags = $ this ->getFlags ($ funcCall ->args [3 ]);
153+ /** @var Arg|Node\Expr\BinaryOp\BitwiseOr|ConstFetch $arg */
154+ $ arg = $ funcCall ->args [3 ];
155+ $ flags = $ this ->getFlags ($ arg );
155156 }
156157
157158 // set default to inter-args
@@ -191,7 +192,11 @@ private function isFirstValueStringOrArray(FuncCall $funcCall): bool
191192 return is_array ($ value );
192193 }
193194
194- private function getFlags (Arg |Node \Expr \BinaryOp \BitwiseOr |ConstFetch $ arg , array $ result = []): array
195+ /**
196+ * @param string[] $flags
197+ * @return string[]
198+ */
199+ private function getFlags (Arg |Node \Expr \BinaryOp \BitwiseOr |ConstFetch $ arg , array $ flags = []): array
195200 {
196201 if ($ arg instanceof ConstFetch) {
197202 $ constFetch = $ arg ;
@@ -201,19 +206,27 @@ private function getFlags(Arg|Node\Expr\BinaryOp\BitwiseOr|ConstFetch $arg, arra
201206 } else {
202207 $ array = $ arg ->jsonSerialize ();
203208 }
204- if ($ arg ->value instanceof ConstFetch) { // single flag
209+ if ($ arg instanceof Arg && $ arg ->value instanceof ConstFetch) { // single flag
205210 $ constFetch = $ arg ->value ;
206211 } else { // multiple flag
207- $ result = $ this ->getFlags ($ array ['left ' ], $ result );
212+ $ flags = $ this ->getFlags ($ array ['left ' ], $ flags );
208213 $ constFetch = $ array ['right ' ];
209214 }
210215 }
211216 if (!is_null ($ constFetch )) {
212- $ result [] = $ constFetch ->jsonSerialize ()['name ' ]->getFirst ();
217+ /** @var ConstFetch $constFetch */
218+ $ json = $ constFetch ->jsonSerialize ();
219+ if (isset ($ json ['name ' ]) && $ json ['name ' ] instanceof Name) {
220+ $ name = $ json ['name ' ];
221+ $ flags [] = $ name ->getFirst ();
222+ }
213223 }
214- return $ result ;
224+ return $ flags ;
215225 }
216226
227+ /**
228+ * @param string[] $flags
229+ */
217230 private function getArgWithFlags (array $ flags ): Arg |null
218231 {
219232 $ oldNbFlags = count ($ flags );
@@ -246,6 +259,9 @@ private function getArgWithFlags(array $flags): Arg|null
246259 );
247260 }
248261 }
262+ if (is_null ($ result )) {
263+ return null ;
264+ }
249265 return new Arg ($ result );
250266 }
251267}
0 commit comments