Skip to content

Commit 6289bd2

Browse files
committed
AC-14557:: False positives in the backward-incompatible changes report (SVC)
1 parent 3a5091e commit 6289bd2

File tree

2 files changed

+20
-9
lines changed

2 files changed

+20
-9
lines changed

src/Analyzer/ClassMethodAnalyzer.php

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
use PHPSemVerChecker\Operation\ClassMethodParameterTypingRemoved;
4242
use PHPSemVerChecker\Operation\ClassMethodRemoved;
4343
use PHPSemVerChecker\Report\Report;
44+
use Magento\SemanticVersionChecker\Operation\ClassMethodParameterTypingChangedNullable;
4445

4546
/**
4647
* Class method analyzer.
@@ -258,29 +259,26 @@ protected function reportChanged($report, $contextBefore, $contextAfter, $method
258259
$report->add($this->context, $data);
259260
$signatureChanged = true;
260261
} elseif ($signatureChanges['parameter_typing_changed']) {
261-
$paramBefore = $paramsBefore[$signatureChanges['changed_param_index']];
262-
$paramAfter = $paramsAfter[$signatureChanges['changed_param_index']];
263262

264263
if (
265-
$paramAfter->type instanceof NullableType &&
266-
!($paramBefore->type instanceof NullableType)
264+
$signatureChanges['parameter_nullable_type_added'] ||
265+
$signatureChanges['parameter_nullable_type_removed']
267266
) {
268-
$data = new \Magento\SemanticVersionChecker\Operation\ClassMethodParameterTypingChangedNullable(
267+
$data = new ClassMethodParameterTypingChangedNullable(
269268
$this->context,
270269
$this->fileAfter,
271270
$contextAfter,
272271
$methodAfter
273272
);
274-
$report->add($this->context, $data);
275273
} else {
276274
$data = new ClassMethodParameterTypingChanged(
277275
$this->context,
278276
$this->fileAfter,
279277
$contextAfter,
280278
$methodAfter
281279
);
282-
$report->add($this->context, $data);
283280
}
281+
$report->add($this->context, $data);
284282
$signatureChanged = true;
285283
}
286284

src/Comparator/Signature.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,26 +130,39 @@ public static function analyze(array $parametersA, array $parametersB): array
130130
$changes = array_merge($changes, [
131131
'parameter_typing_added' => false,
132132
'parameter_typing_removed' => false,
133-
'parameter_typing_changed' => false
133+
'parameter_typing_changed' => false,
134+
'parameter_nullable_type_added' => false,
135+
'parameter_nullable_type_removed' => false,
136+
'changed_param_index' => 0
134137
]);
135138
$lengthA = count($parametersA);
136139
$lengthB = count($parametersB);
137140

138141
$iterations = min($lengthA, $lengthB);
139142
for ($i = 0; $i < $iterations; ++$i) {
143+
144+
$typeBefore = $parametersA[$i]->type;
145+
$typeAfter = $parametersB[$i]->type;
140146
// Re-implement type checking to handle type changes as a single operation instead of both add and remove
141147
if (Type::get($parametersA[$i]->type) !== Type::get($parametersB[$i]->type)) {
142148
// This section changed from parent::analyze() to handle typing changes
143149
if ($parametersA[$i]->type !== null && $parametersB[$i]->type !== null) {
144150
$changes['parameter_typing_changed'] = true;
151+
// Custom: detect nullable added
152+
if ($typeBefore instanceof \PhpParser\Node\NullableType && !$typeAfter instanceof \PhpParser\Node\NullableType) {
153+
$changes['parameter_nullable_type_removed'] = true;
154+
$changes['changed_param_index'] = $i;
155+
} elseif (!$typeBefore instanceof \PhpParser\Node\NullableType && $typeAfter instanceof \PhpParser\Node\NullableType) {
156+
$changes['parameter_nullable_type_added'] = true;
157+
$changes['changed_param_index'] = $i;
158+
}
145159
} elseif ($parametersA[$i]->type !== null) {
146160
$changes['parameter_typing_removed'] = true;
147161
} elseif ($parametersB[$i]->type !== null) {
148162
$changes['parameter_typing_added'] = true;
149163
}
150164
}
151165
}
152-
153166
return $changes;
154167
}
155168
}

0 commit comments

Comments
 (0)