Skip to content

Commit c7560ad

Browse files
authored
Merge pull request #45 from magento-gl/AC-8781
AC-8781:Fatal Error when introducing Union Type in SVC
2 parents a7338bf + 035555c commit c7560ad

File tree

2 files changed

+92
-2
lines changed

2 files changed

+92
-2
lines changed

src/Comparator/Signature.php

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
namespace Magento\SemanticVersionChecker\Comparator;
1111

12-
use PHPSemVerChecker\Comparator\Type;
12+
use PHPSemVerChecker\Comparator\Node;
1313

1414
class Signature extends \PHPSemVerChecker\Comparator\Signature
1515
{
@@ -74,7 +74,59 @@ public static function isObjectParams(array $params)
7474
*/
7575
public static function analyze(array $parametersA, array $parametersB)
7676
{
77-
$changes = parent::analyze($parametersA, $parametersB);
77+
// @TODO need to revert this change once new version of tomzx/php-semver-checker is released
78+
// After https://github.com/tomzx/php-semver-checker/issues/179 issue is addressed.
79+
// Moving the implementation of library to core to fix critical failure due to this library issue
80+
$changes = [
81+
'parameter_added' => false,
82+
'parameter_removed' => false,
83+
'parameter_renamed' => false,
84+
'parameter_typing_added' => false,
85+
'parameter_typing_removed' => false,
86+
'parameter_default_added' => false,
87+
'parameter_default_removed' => false,
88+
'parameter_default_value_changed' => false,
89+
];
90+
$lengthA = count($parametersA);
91+
$lengthB = count($parametersB);
92+
93+
// TODO([email protected]): This is only true if newer params do not have defaults
94+
if ($lengthA < $lengthB) {
95+
$changes['parameter_added'] = true;
96+
} elseif ($lengthA > $lengthB) {
97+
$changes['parameter_removed'] = true;
98+
}
99+
100+
$iterations = min($lengthA, $lengthB);
101+
for ($i = 0; $i < $iterations; ++$i) {
102+
// Name checking
103+
if ($parametersA[$i]->var->name !== $parametersB[$i]->var->name) {
104+
$changes['parameter_renamed'] = true;
105+
}
106+
107+
// Type checking
108+
if (Type::get($parametersA[$i]->type) !== Type::get($parametersB[$i]->type)) {
109+
if ($parametersA[$i]->type !== null) {
110+
$changes['parameter_typing_removed'] = true;
111+
}
112+
if ($parametersB[$i]->type !== null) {
113+
$changes['parameter_typing_added'] = true;
114+
}
115+
}
116+
117+
// Default checking
118+
if ($parametersA[$i]->default === null && $parametersB[$i]->default === null) {
119+
// Do nothing
120+
} elseif ($parametersA[$i]->default !== null && $parametersB[$i]->default === null) {
121+
$changes['parameter_default_removed'] = true;
122+
} elseif ($parametersA[$i]->default === null && $parametersB[$i]->default !== null) {
123+
$changes['parameter_default_added'] = true;
124+
// TODO([email protected]): Not all nodes have a value property
125+
} elseif (!Node::isEqual($parametersA[$i]->default, $parametersB[$i]->default)) {
126+
$changes['parameter_default_value_changed'] = true;
127+
}
128+
}
129+
78130
$changes = array_merge($changes, [
79131
'parameter_typing_added' => false,
80132
'parameter_typing_removed' => false,

src/Comparator/Type.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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\Comparator;
11+
12+
use PhpParser\Node\Name;
13+
use PhpParser\Node\NullableType;
14+
use PhpParser\Node\UnionType;
15+
16+
class Type extends \PHPSemVerChecker\Comparator\Type
17+
{
18+
/**
19+
* @param Name|NullableType|string|null $type
20+
* @return string|null
21+
*/
22+
public static function get($type)
23+
{
24+
if (! is_object($type)) {
25+
return $type;
26+
}
27+
28+
if ($type instanceof NullableType) {
29+
return '?' . static::get($type->type);
30+
}
31+
32+
if ($type instanceof UnionType) {
33+
return $type->getType();
34+
}
35+
36+
return $type->toString();
37+
}
38+
}

0 commit comments

Comments
 (0)