|
20 | 20 | use Magento\SemanticVersionChecker\Operation\ClassMethodOptionalParameterAdded; |
21 | 21 | use Magento\SemanticVersionChecker\Operation\ClassMethodOverwriteAdded; |
22 | 22 | use Magento\SemanticVersionChecker\Operation\ClassMethodParameterTypingChanged; |
23 | | -use Magento\SemanticVersionChecker\Operation\ClassMethodParameterTypingChangedNullable; |
24 | 23 | use Magento\SemanticVersionChecker\Operation\ClassMethodReturnTypingChanged; |
25 | 24 | use Magento\SemanticVersionChecker\Operation\ExtendableClassConstructorOptionalParameterAdded; |
26 | 25 | use Magento\SemanticVersionChecker\Operation\Visibility\MethodDecreased as VisibilityMethodDecreased; |
@@ -259,77 +258,29 @@ protected function reportChanged($report, $contextBefore, $contextAfter, $method |
259 | 258 | $report->add($this->context, $data); |
260 | 259 | $signatureChanged = true; |
261 | 260 | } elseif ($signatureChanges['parameter_typing_changed']) { |
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 | | - // $beforeParam-> |
270 | | - |
271 | | - $beforeType = $beforeParam->type; |
272 | | - $afterType = $afterParam->type; |
273 | | - // $beforeParam->default-> |
274 | | - |
275 | | - $beforeNullable = $this->isNullable($beforeType); |
276 | | - $afterNullable = $this->isNullable($afterType); |
277 | | - |
278 | | - $beforeTypeName = $this->getTypeName($beforeType); |
279 | | - $afterTypeName = $this->getTypeName($afterType); |
280 | | - |
281 | | - if ($beforeNullable !== $afterNullable && $beforeTypeName === $afterTypeName) { |
282 | | - echo "️Nullable type change detected for parameter \${$beforeParam->var->name}:\n"; |
283 | | - echo "Before: " . ($beforeNullable ? '?' : '') . $beforeTypeName . "\n"; |
284 | | - echo "After: " . ($afterNullable ? '?' : '') . $afterTypeName . "\n"; |
285 | | - } |
286 | | - |
287 | | - |
288 | | - $beforeDefaultIsNull = isset($beforeParam->default) && $beforeParam->default->value === null; |
289 | | - print_r("Default value: $beforeParam->default->value\n"); |
290 | | - |
291 | | - // Case: type changed from no type but default null → ?Type |
292 | | - if ($beforeType === null && $afterType instanceof \PhpParser\Node\NullableType && $beforeDefaultIsNull) { |
293 | | - continue; // safe |
294 | | - } |
295 | | - echo "\nafter type nullable\n"; |
296 | | - var_dump($afterType instanceof \PhpParser\Node\NullableType); |
297 | | - echo "\nbefore type nullable\n"; |
298 | | - var_dump($beforeType instanceof \PhpParser\Node\NullableType); |
299 | | - |
300 | | - // Case: type changed from Type to ?Type (explicitly nullable) |
301 | | - if ( |
302 | | - $beforeType instanceof \PhpParser\Node\Identifier && |
303 | | - $afterType instanceof \PhpParser\Node\NullableType && |
304 | | - $afterType->type instanceof \PhpParser\Node\Identifier && |
305 | | - $beforeType->name === $afterType->type->name && |
306 | | - $beforeDefaultIsNull |
307 | | - ) { |
308 | | - continue; // safe |
309 | | - } |
310 | | - |
311 | | - $isSafeNullableChange = false; |
312 | | - break; |
313 | | - } |
314 | | - if ($isSafeNullableChange) { |
315 | | - // Treat as PATCH instead of MAJOR |
316 | | - $data = new ClassMethodParameterTypingChangedNullable( |
| 261 | + $paramBefore = $paramsBefore[$signatureChanges['changed_param_index']]; |
| 262 | + $paramAfter = $paramsAfter[$signatureChanges['changed_param_index']]; |
| 263 | + |
| 264 | + if ( |
| 265 | + $paramAfter->type instanceof NullableType && |
| 266 | + !($paramBefore->type instanceof NullableType) |
| 267 | + ) { |
| 268 | + $data = new \Magento\SemanticVersionChecker\Operation\ClassMethodParameterTypingChangedNullable( |
317 | 269 | $this->context, |
318 | 270 | $this->fileAfter, |
319 | 271 | $contextAfter, |
320 | 272 | $methodAfter |
321 | 273 | ); |
322 | | - // $report->add($this->context, $data); |
| 274 | + $report->add($this->context, $data); |
323 | 275 | } else { |
324 | 276 | $data = new ClassMethodParameterTypingChanged( |
325 | 277 | $this->context, |
326 | 278 | $this->fileAfter, |
327 | 279 | $contextAfter, |
328 | 280 | $methodAfter |
329 | 281 | ); |
330 | | - |
| 282 | + $report->add($this->context, $data); |
331 | 283 | } |
332 | | - $report->add($this->context, $data); |
333 | 284 | $signatureChanged = true; |
334 | 285 | } |
335 | 286 |
|
@@ -437,19 +388,6 @@ protected function reportChanged($report, $contextBefore, $contextAfter, $method |
437 | 388 | } |
438 | 389 | } |
439 | 390 |
|
440 | | - private function isNullable($type): bool { |
441 | | - return $type instanceof \PhpParser\Node\NullableType; |
442 | | - } |
443 | | - |
444 | | - private function getTypeName($type): ?string { |
445 | | - if ($type instanceof \PhpParser\Node\NullableType) { |
446 | | - return $type->type instanceof \PhpParser\Node\Identifier ? $type->type->name : null; |
447 | | - } elseif ($type instanceof \PhpParser\Node\Identifier) { |
448 | | - return $type->name; |
449 | | - } |
450 | | - return null; // For union types or no type |
451 | | - } |
452 | | - |
453 | 391 | /** |
454 | 392 | * Checks if return type declaration or annotation was changed |
455 | 393 | * |
|
0 commit comments