Skip to content

Commit 002f3e1

Browse files
committed
Fix a regression where classes, functions, interfaces and traits with different namespace but similar name where merged into a single instance, ignoring the namespace.
1 parent 17a825f commit 002f3e1

File tree

8 files changed

+242
-74
lines changed

8 files changed

+242
-74
lines changed

src/PHPSemVerChecker/Analyzer/ClassAnalyzer.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,18 @@ public function analyze(Registry $registryBefore, Registry $registryAfter)
2727
$classesBefore = $registryBefore->data['class'];
2828
$classesAfter = $registryAfter->data['class'];
2929

30-
$classesBeforeKeyed = [];
3130
$filesBeforeKeyed = [];
31+
$classesBeforeKeyed = [];
3232
foreach ($classesBefore as $key => $classBefore) {
33-
$classesBeforeKeyed[strtolower($classBefore->name)] = $classBefore;
34-
$filesBeforeKeyed[strtolower($classBefore->name)] = $registryBefore->mapping['class'][$key];
33+
$filesBeforeKeyed[strtolower($key)] = $registryBefore->mapping['class'][$key];
34+
$classesBeforeKeyed[strtolower($key)] = $classBefore;
3535
}
3636

37-
$classesAfterKeyed = [];
3837
$filesAfterKeyed = [];
38+
$classesAfterKeyed = [];
3939
foreach ($classesAfter as $key => $classAfter) {
40-
$classesAfterKeyed[strtolower($classAfter->name)] = $classAfter;
41-
$filesAfterKeyed[strtolower($classAfter->name)] = $registryAfter->mapping['class'][$key];
40+
$filesAfterKeyed[strtolower($key)] = $registryAfter->mapping['class'][$key];
41+
$classesAfterKeyed[strtolower($key)] = $classAfter;
4242
}
4343

4444
$classNamesBefore = array_keys($classesBeforeKeyed);

src/PHPSemVerChecker/Analyzer/FunctionAnalyzer.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,18 @@ public function analyze(Registry $registryBefore, Registry $registryAfter)
4040
$functionsBefore = $registryBefore->data['function'];
4141
$functionsAfter = $registryAfter->data['function'];
4242

43-
$functionsBeforeKeyed = [];
4443
$filesBeforeKeyed = [];
44+
$functionsBeforeKeyed = [];
4545
foreach ($functionsBefore as $key => $functionBefore) {
46-
$functionsBeforeKeyed[strtolower($functionBefore->name)] = $functionBefore;
47-
$filesBeforeKeyed[strtolower($functionBefore->name)] = $registryBefore->mapping['function'][$key];
46+
$filesBeforeKeyed[strtolower($key)] = $registryBefore->mapping['function'][$key];
47+
$functionsBeforeKeyed[strtolower($key)] = $functionBefore;
4848
}
4949

50-
$functionsAfterKeyed = [];
5150
$filesAfterKeyed = [];
51+
$functionsAfterKeyed = [];
5252
foreach ($functionsAfter as $key => $functionAfter) {
53-
$functionsAfterKeyed[strtolower($functionAfter->name)] = $functionAfter;
54-
$filesAfterKeyed[strtolower($functionAfter->name)] = $registryAfter->mapping['function'][$key];
53+
$filesAfterKeyed[strtolower($key)] = $registryAfter->mapping['function'][$key];
54+
$functionsAfterKeyed[strtolower($key)] = $functionAfter;
5555
}
5656

5757
$functionNamesBefore = array_keys($functionsBeforeKeyed);
@@ -123,8 +123,8 @@ public function analyze(Registry $registryBefore, Registry $registryAfter)
123123
}
124124

125125
foreach ($added as $key) {
126-
$fileAfter = $registryAfter->mapping['function'][$key];
127-
$functionAfter = $registryAfter->data['function'][$key];
126+
$fileAfter = $filesAfterKeyed[$key];
127+
$functionAfter = $functionsAfterKeyed[$key];
128128

129129
$data = new FunctionAdded($fileAfter, $functionAfter);
130130
$report->addFunction($data);

src/PHPSemVerChecker/Analyzer/InterfaceAnalyzer.php

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,18 @@ public function analyze(Registry $registryBefore, Registry $registryAfter)
2727
$interfacesBefore = $registryBefore->data['interface'];
2828
$interfacesAfter = $registryAfter->data['interface'];
2929

30-
$interfacesBeforeKeyed = [];
3130
$filesBeforeKeyed = [];
31+
$interfacesBeforeKeyed = [];
3232
foreach ($interfacesBefore as $key => $interfaceBefore) {
33-
$interfacesBeforeKeyed[strtolower($interfaceBefore->name)] = $interfaceBefore;
34-
$filesBeforeKeyed[strtolower($interfaceBefore->name)] = $registryBefore->mapping['interface'][$key];
33+
$filesBeforeKeyed[strtolower($key)] = $registryBefore->mapping['interface'][$key];
34+
$interfacesBeforeKeyed[strtolower($key)] = $interfaceBefore;
3535
}
3636

37-
$interfacesAfterKeyed = [];
3837
$filesAfterKeyed = [];
38+
$interfacesAfterKeyed = [];
3939
foreach ($interfacesAfter as $key => $interfaceAfter) {
40-
$interfacesAfterKeyed[strtolower($interfaceAfter->name)] = $interfaceAfter;
41-
$filesAfterKeyed[strtolower($interfaceAfter->name)] = $registryAfter->mapping['interface'][$key];
40+
$filesAfterKeyed[strtolower($key)] = $registryAfter->mapping['interface'][$key];
41+
$interfacesAfterKeyed[strtolower($key)] = $interfaceAfter;
4242
}
4343

4444
$interfaceNamesBefore = array_keys($interfacesBeforeKeyed);
@@ -86,7 +86,6 @@ public function analyze(Registry $registryBefore, Registry $registryAfter)
8686
}
8787

8888
foreach ($added as $key) {
89-
9089
$fileAfter = $filesAfterKeyed[$key];
9190
$interfaceAfter = $interfacesAfterKeyed[$key];
9291

src/PHPSemVerChecker/Analyzer/TraitAnalyzer.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,18 @@ public function analyze(Registry $registryBefore, Registry $registryAfter)
2727
$traitsBefore = $registryBefore->data['trait'];
2828
$traitsAfter = $registryAfter->data['trait'];
2929

30-
$traitsBeforeKeyed = [];
3130
$filesBeforeKeyed = [];
31+
$traitsBeforeKeyed = [];
3232
foreach ($traitsBefore as $key => $traitBefore) {
33-
$traitsBeforeKeyed[strtolower($traitBefore->name)] = $traitBefore;
34-
$filesBeforeKeyed[strtolower($traitBefore->name)] = $registryBefore->mapping['trait'][$key];
33+
$filesBeforeKeyed[strtolower($key)] = $registryBefore->mapping['trait'][$key];
34+
$traitsBeforeKeyed[strtolower($key)] = $traitBefore;
3535
}
3636

37-
$traitsAfterKeyed = [];
3837
$filesAfterKeyed = [];
38+
$traitsAfterKeyed = [];
3939
foreach ($traitsAfter as $key => $traitAfter) {
40-
$traitsAfterKeyed[strtolower($traitAfter->name)] = $traitAfter;
41-
$filesAfterKeyed[strtolower($traitAfter->name)] = $registryAfter->mapping['trait'][$key];
40+
$filesAfterKeyed[strtolower($key)] = $registryAfter->mapping['trait'][$key];
41+
$traitsAfterKeyed[strtolower($key)] = $traitAfter;
4242
}
4343

4444
$traitNamesBefore = array_keys($traitsBeforeKeyed);
@@ -91,7 +91,7 @@ public function analyze(Registry $registryBefore, Registry $registryAfter)
9191

9292
foreach ($added as $key) {
9393
$fileAfter = $filesAfterKeyed[$key];
94-
$traitAfter = $traitsAfter[$key];
94+
$traitAfter = $traitsAfterKeyed[$key];
9595

9696
$data = new TraitAdded($fileAfter, $traitAfter);
9797
$report->addTrait($data);

tests/PHPSemVerChecker/Analyzer/FunctionAnalyzerTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace PHPSemVerChecker\Test\Analyzer;
44

55
use PhpParser\Node\Expr\FuncCall;
6+
use PhpParser\Node\Name;
67
use PhpParser\Node\Param;
78
use PhpParser\Node\Scalar\String_;
89
use PhpParser\Node\Stmt\Function_;
@@ -417,4 +418,22 @@ public function testFunctionCaseChanged()
417418
$this->assertSame('Function name case was changed.', $report['function'][$expectedLevel][0]->getReason());
418419
$this->assertSame('someFunctionName', $report['function'][$expectedLevel][0]->getTarget());
419420
}
421+
422+
public function testFunctionNamespaceDoNotOverlap()
423+
{
424+
$before = new Registry();
425+
$after = new Registry();
426+
427+
$before->addFunction(new Function_('tmp'));
428+
$function = new Function_('tmp');
429+
$function->namespacedName = Name::concat('namespaceTmp', 'tmp');
430+
$before->addFunction($function);
431+
432+
$analyzer = new FunctionAnalyzer();
433+
$report = $analyzer->analyze($before, $after);
434+
435+
$context = 'function';
436+
$expectedLevel = Level::MAJOR;
437+
$this->assertCount(2, $report[$context][$expectedLevel], 'Interfaces with similar names but different namespace are possibly considered the same in the analyzer logic');
438+
}
420439
}

tests/PHPSemVerChecker/Analyzer/InterfaceAnalyzerTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace PHPSemVerChecker\Test\Analyzer;
44

5+
use PhpParser\Node\Name;
56
use PhpParser\Node\Stmt\Interface_;
67
use PHPSemVerChecker\Analyzer\InterfaceAnalyzer;
78
use PHPSemVerChecker\Registry\Registry;
@@ -83,4 +84,22 @@ public function testInterfaceCaseChanged()
8384
$this->assertSame('V153', $report[$context][$expectedLevel][0]->getCode());
8485
$this->assertSame('Interface name case was changed.', $report[$context][$expectedLevel][0]->getReason());
8586
}
87+
88+
public function testInterfaceNamespaceDoNotOverlap()
89+
{
90+
$before = new Registry();
91+
$after = new Registry();
92+
93+
$before->addInterface(new Interface_('tmp'));
94+
$interface = new Interface_('tmp');
95+
$interface->namespacedName = Name::concat('namespaceTmp', 'tmp');
96+
$before->addInterface($interface);
97+
98+
$analyzer = new InterfaceAnalyzer();
99+
$report = $analyzer->analyze($before, $after);
100+
101+
$context = 'interface';
102+
$expectedLevel = Level::MAJOR;
103+
$this->assertCount(2, $report[$context][$expectedLevel], 'Interfaces with similar names but different namespace are possibly considered the same in the analyzer logic');
104+
}
86105
}

tests/PHPSemVerChecker/Analyzer/TraitAnalyzerTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace PHPSemVerChecker\Test\Analyzer;
44

5+
use PhpParser\Node\Name;
56
use PhpParser\Node\Stmt\Trait_;
67
use PHPSemVerChecker\Analyzer\TraitAnalyzer;
78
use PHPSemVerChecker\Registry\Registry;
@@ -81,4 +82,22 @@ public function testTraitCaseChanged()
8182
$this->assertSame('Trait name case was changed.', $report[$context][$expectedLevel][0]->getReason());
8283
$this->assertSame('testtrait', $report[$context][$expectedLevel][0]->getTarget());
8384
}
85+
86+
public function testTraitNamespaceDoNotOverlap()
87+
{
88+
$before = new Registry();
89+
$after = new Registry();
90+
91+
$before->addTrait(new Trait_('tmp'));
92+
$trait = new Trait_('tmp');
93+
$trait->namespacedName = Name::concat('namespaceTmp', 'tmp');
94+
$before->addTrait($trait);
95+
96+
$analyzer = new TraitAnalyzer();
97+
$report = $analyzer->analyze($before, $after);
98+
99+
$context = 'trait';
100+
$expectedLevel = Level::MAJOR;
101+
$this->assertCount(2, $report[$context][$expectedLevel], 'Traits with similar names but different namespace are possibly considered the same in the analyzer logic');
102+
}
84103
}

0 commit comments

Comments
 (0)