Skip to content

Commit ec362ac

Browse files
committed
AC-14557:: False positives in the backward-incompatible changes report (SVC)
1 parent 6c35f07 commit ec362ac

File tree

2 files changed

+95
-11
lines changed

2 files changed

+95
-11
lines changed

src/Analyzer/ClassMethodAnalyzer.php

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use Magento\SemanticVersionChecker\Operation\ClassMethodOptionalParameterAdded;
2121
use Magento\SemanticVersionChecker\Operation\ClassMethodOverwriteAdded;
2222
use Magento\SemanticVersionChecker\Operation\ClassMethodParameterTypingChanged;
23+
use Magento\SemanticVersionChecker\Operation\ClassMethodParameterTypingChangedNullable;
2324
use Magento\SemanticVersionChecker\Operation\ClassMethodReturnTypingChanged;
2425
use Magento\SemanticVersionChecker\Operation\ExtendableClassConstructorOptionalParameterAdded;
2526
use Magento\SemanticVersionChecker\Operation\Visibility\MethodDecreased as VisibilityMethodDecreased;
@@ -258,17 +259,46 @@ protected function reportChanged($report, $contextBefore, $contextAfter, $method
258259
$report->add($this->context, $data);
259260
$signatureChanged = true;
260261
} elseif ($signatureChanges['parameter_typing_changed']) {
261-
$data = new ClassMethodParameterTypingChanged(
262-
$this->context,
263-
$this->fileAfter,
264-
$contextAfter,
265-
$methodAfter
266-
);
267-
echo "\nTemporary added code \n";
268-
print_r($data);
269-
echo "\n======\n";
270-
print_r($data, true);
271-
echo "\nEnd Temporary added code \n";
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;
271+
}
272+
273+
$beforeType = $paramBefore->type;
274+
$afterType = $paramAfter->type;
275+
276+
if ($beforeType && $afterType &&
277+
$beforeType instanceof \PhpParser\Node\Name &&
278+
$afterType instanceof \PhpParser\Node\NullableType &&
279+
$afterType->type instanceof \PhpParser\Node\Name &&
280+
$beforeType->toString() === $afterType->type->toString()) {
281+
$isSafeNullableChange = true;
282+
} else {
283+
$isSafeNullableChange = false;
284+
break;
285+
}
286+
}
287+
if ($isSafeNullableChange) {
288+
$data = new ClassMethodParameterTypingChangedNullable(
289+
$this->context,
290+
$this->fileAfter,
291+
$contextAfter,
292+
$methodAfter
293+
);
294+
} else {
295+
$data = new ClassMethodParameterTypingChanged(
296+
$this->context,
297+
$this->fileAfter,
298+
$contextAfter,
299+
$methodAfter
300+
);
301+
}
272302
$report->add($this->context, $data);
273303
$signatureChanged = true;
274304
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
namespace Magento\SemanticVersionChecker\Operation;
11+
12+
use PHPSemVerChecker\Operation\ClassMethodOperationUnary;
13+
use PHPSemVerChecker\SemanticVersioning\Level;
14+
15+
class ClassMethodParameterTypingChangedNullable extends ClassMethodOperationUnary
16+
{
17+
/**
18+
* @var array
19+
*/
20+
protected $code = [
21+
'class' => ['M113', 'M114', 'M115'],
22+
'interface' => ['M116'],
23+
'trait' => ['M117', 'M118', 'M119']
24+
];
25+
26+
/**
27+
* @var array
28+
*/
29+
private $mapping = [
30+
'M113' => Level::PATCH,
31+
'M114' => Level::MAJOR,
32+
'M115' => Level::PATCH,
33+
'M116' => Level::MAJOR,
34+
'M117' => Level::MAJOR,
35+
'M118' => Level::MAJOR,
36+
'M119' => Level::MAJOR
37+
];
38+
39+
40+
/**
41+
* @var string
42+
*/
43+
protected $reason = 'Method parameter typing changed.';
44+
45+
/**
46+
* Returns level of error.
47+
*
48+
* @return mixed
49+
*/
50+
public function getLevel(): int
51+
{
52+
return $this->mapping[$this->getCode()];
53+
}
54+
}

0 commit comments

Comments
 (0)