@@ -259,61 +259,59 @@ protected function reportChanged($report, $contextBefore, $contextAfter, $method
259
259
$ report ->add ($ this ->context , $ data );
260
260
$ signatureChanged = true ;
261
261
} elseif ($ signatureChanges ['parameter_typing_changed ' ]) {
262
- $ paramsBefore = $ methodBefore ->params ;
263
- $ paramsAfter = $ methodAfter ->params ;
264
-
265
- $ isSafeNullableChange = false ;
266
- // Check if only difference is added explicit nullable `?` prefix
267
- foreach ($ paramsBefore as $ index => $ paramBefore ) {
268
- $ paramAfter = $ paramsAfter [$ index ] ?? null ;
269
- if (!$ paramAfter ) {
270
- continue ;
262
+ // Compare each param to detect if it's only an implicit-nullable to explicit-nullable change
263
+ $ isSafeNullableChange = true ;
264
+ $ paramCount = min (count ($ paramsBefore ), count ($ paramsAfter ));
265
+ for ($ i = 0 ; $ i < $ paramCount ; $ i ++) {
266
+ $ beforeParam = $ paramsBefore [$ i ];
267
+ $ afterParam = $ paramsAfter [$ i ];
268
+
269
+ $ beforeType = $ beforeParam ->type ;
270
+ $ afterType = $ afterParam ->type ;
271
+
272
+ $ beforeDefaultIsNull = isset ($ beforeParam ->default ) && $ beforeParam ->default ->value === null ;
273
+ print_r ("Default value: $ beforeParam ->default ->value \n" );
274
+
275
+ // Case: type changed from no type but default null → ?Type
276
+ if ($ beforeType === null && $ afterType instanceof \PhpParser \Node \NullableType && $ beforeDefaultIsNull ) {
277
+ continue ; // safe
271
278
}
272
-
273
- $ beforeType = $ paramBefore ->type ;
274
- $ afterType = $ paramAfter ->type ;
275
- echo "\nBefore type \n" ;
276
- print_r ($ beforeType );
277
- echo "\nAfter type \n" ;
278
- print_r ($ afterType );
279
- echo "\nBefore Instance of Name \n" ;
280
- print_r ($ beforeType instanceof \PhpParser \Node \Name);
281
- echo "\nAfter Instance of NullableType \n" ;
282
- print_r ($ afterType instanceof \PhpParser \Node \NullableType);
283
- echo "\nAfter Instance of Name \n" ;
284
- echo "Beforetype is " .$ beforeType ->toString (). " Aftertype is " .$ afterType ->toString ()."\n" ;
285
-
286
-
287
- echo "\n---------------------- \n" ;
288
- echo "\nBefore Instance of NullableType \n" ;
289
- print_r ($ beforeType instanceof \PhpParser \Node \NullableType);
290
-
291
- echo "\n---------------------- \n" ;
292
- if ($ beforeType && $ afterType &&
293
- $ beforeType instanceof \PhpParser \Node \Name &&
279
+ echo "\nafter type nullable \n" ;
280
+ var_dump ($ afterType instanceof \PhpParser \Node \NullableType);
281
+ echo "\nbefore type nullable \n" ;
282
+ var_dump ($ beforeType instanceof \PhpParser \Node \NullableType);
283
+
284
+ // Case: type changed from Type to ?Type (explicitly nullable)
285
+ if (
286
+ $ beforeType instanceof \PhpParser \Node \Identifier &&
294
287
$ afterType instanceof \PhpParser \Node \NullableType &&
295
- $ afterType ->type instanceof \PhpParser \Node \Name &&
296
- $ beforeType ->toString () === $ afterType ->type ->toString ()) {
297
- $ isSafeNullableChange = true ;
298
- } else {
299
- $ isSafeNullableChange = false ;
300
- break ;
288
+ $ afterType ->type instanceof \PhpParser \Node \Identifier &&
289
+ $ beforeType ->name === $ afterType ->type ->name &&
290
+ $ beforeDefaultIsNull
291
+ ) {
292
+ continue ; // safe
301
293
}
294
+
295
+ $ isSafeNullableChange = false ;
296
+ break ;
302
297
}
303
298
if ($ isSafeNullableChange ) {
299
+ // Treat as PATCH instead of MAJOR
304
300
$ data = new ClassMethodParameterTypingChangedNullable (
305
301
$ this ->context ,
306
302
$ this ->fileAfter ,
307
303
$ contextAfter ,
308
304
$ methodAfter
309
305
);
306
+ // $report->add($this->context, $data);
310
307
} else {
311
308
$ data = new ClassMethodParameterTypingChanged (
312
309
$ this ->context ,
313
310
$ this ->fileAfter ,
314
311
$ contextAfter ,
315
312
$ methodAfter
316
313
);
314
+
317
315
}
318
316
$ report ->add ($ this ->context , $ data );
319
317
$ signatureChanged = true ;
0 commit comments