Skip to content

Commit 1cdbe42

Browse files
committed
Merge branch 'pr/99'
2 parents 7944fd1 + 6bf8b87 commit 1cdbe42

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+867
-153
lines changed

.editorconfig

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
; This file is for unifying the coding style for different editors and IDEs.
2+
; More information at http://editorconfig.org
3+
4+
root = true
5+
6+
[*]
7+
indent_style = tab
8+
end_of_line = lf
9+
insert_final_newline = true
10+
trim_trailing_whitespace = true
11+
12+
[*.bat]
13+
end_of_line = crlf
14+
15+
[*.yml]
16+
indent_style = space
17+
indent_size = 2

docs/Ruleset.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ V070 | MINOR | Function parameter typing removed
1515
V071 | MINOR | Function parameter default added
1616
V072 | MAJOR | Function parameter default removed
1717
V073 | MINOR | Function parameter default value changed
18+
V160 | PATCH | Function name case changed
1819

1920
# Classes
2021

@@ -70,6 +71,10 @@ V096 | PATCH | Class private method parameter default removed
7071
V097 | MAJOR | Class public method parameter default value changed
7172
V098 | MAJOR | Class protected method parameter default value changed
7273
V099 | PATCH | Class private method parameter default value changed
74+
V150 | PATCH | Class public method name case changed
75+
V156 | PATCH | Class protected method name case changed
76+
V157 | PATCH | Class private method name case changed
77+
V154 | PATCH | Class name case changed
7378
VXXX | MAJOR | *Final class public method parameter added*
7479
VXXX | MAJOR | *Final class protected method parameter added*
7580
VXXX | PATCH | *Final class private method parameter added*
@@ -109,6 +114,8 @@ V076 | MAJOR | Interface method parameter typing removed
109114
V077 | MINOR | Interface method parameter default added
110115
V078 | MAJOR | Interface method parameter default removed
111116
V079 | MAJOR | Interface method parameter default value changed
117+
V151 | PATCH | Interface method name case changed
118+
V153 | PATCH | Interface name case changed
112119

113120
# Trait
114121

@@ -158,6 +165,10 @@ V114 | MAJOR | Trait private method parameter default removed
158165
V115 | MAJOR | Trait public method parameter default value changed
159166
V116 | MAJOR | Trait protected method parameter default value changed
160167
V117 | MAJOR | Trait private method parameter default value changed
168+
V152 | PATCH | Trait public method name case changed
169+
V158 | PATCH | Trait protected method name case changed
170+
V159 | PATCH | Trait private method name case changed
171+
V155 | PATCH | Trait name case changed
161172

162173
# To classify
163174

src/PHPSemVerChecker/Analyzer/Analyzer.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
use PHPSemVerChecker\Registry\Registry;
66
use PHPSemVerChecker\Report\Report;
77

8-
class Analyzer {
8+
class Analyzer
9+
{
910
/**
1011
* Compare with a destination registry (what the new source code is like).
1112
*

src/PHPSemVerChecker/Analyzer/ClassAnalyzer.php

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
namespace PHPSemVerChecker\Analyzer;
44

55
use PHPSemVerChecker\Operation\ClassAdded;
6+
use PHPSemVerChecker\Operation\ClassCaseChanged;
67
use PHPSemVerChecker\Operation\ClassRemoved;
78
use PHPSemVerChecker\Registry\Registry;
89
use PHPSemVerChecker\Report\Report;
910

10-
class ClassAnalyzer {
11+
class ClassAnalyzer
12+
{
1113
/**
1214
* @var string
1315
*/
@@ -22,30 +24,61 @@ public function analyze(Registry $registryBefore, Registry $registryAfter)
2224
{
2325
$report = new Report();
2426

25-
$keysBefore = array_keys($registryBefore->data['class']);
26-
$keysAfter = array_keys($registryAfter->data['class']);
27-
$added = array_diff($keysAfter, $keysBefore);
28-
$removed = array_diff($keysBefore, $keysAfter);
29-
$toVerify = array_intersect($keysBefore, $keysAfter);
27+
$classesBefore = $registryBefore->data['class'];
28+
$classesAfter = $registryAfter->data['class'];
29+
30+
$classesBeforeKeyed = [];
31+
$filesBeforeKeyed = [];
32+
foreach ($classesBefore as $key => $classBefore) {
33+
$classesBeforeKeyed[strtolower($classBefore->name)] = $classBefore;
34+
$filesBeforeKeyed[strtolower($classBefore->name)] = $registryBefore->mapping['class'][$key];
35+
}
36+
37+
$classesAfterKeyed = [];
38+
$filesAfterKeyed = [];
39+
foreach ($classesAfter as $key => $classAfter) {
40+
$classesAfterKeyed[strtolower($classAfter->name)] = $classAfter;
41+
$filesAfterKeyed[strtolower($classAfter->name)] = $registryAfter->mapping['class'][$key];
42+
}
43+
44+
$classNamesBefore = array_keys($classesBeforeKeyed);
45+
$classNamesAfter = array_keys($classesAfterKeyed);
46+
$added = array_diff($classNamesAfter, $classNamesBefore);
47+
$removed = array_diff($classNamesBefore, $classNamesAfter);
48+
$toVerify = array_intersect($classNamesBefore, $classNamesAfter);
3049

3150
foreach ($removed as $key) {
32-
$fileBefore = $registryBefore->mapping['class'][$key];
33-
$classBefore = $registryBefore->data['class'][$key];
51+
$fileBefore = $filesBeforeKeyed[$key];
52+
$classBefore = $classesBeforeKeyed[$key];
3453

3554
$data = new ClassRemoved($fileBefore, $classBefore);
3655
$report->addClass($data);
3756
}
3857

3958
foreach ($toVerify as $key) {
40-
$fileBefore = $registryBefore->mapping['class'][$key];
59+
$fileBefore = $filesBeforeKeyed[$key];
4160
/** @var \PhpParser\Node\Stmt\Class_ $classBefore */
42-
$classBefore = $registryBefore->data['class'][$key];
43-
$fileAfter = $registryAfter->mapping['class'][$key];
61+
$classBefore = $classesBeforeKeyed[$key];
62+
$fileAfter = $filesAfterKeyed[$key];
4463
/** @var \PhpParser\Node\Stmt\Class_ $classBefore */
45-
$classAfter = $registryAfter->data['class'][$key];
64+
$classAfter = $classesAfterKeyed[$key];
4665

4766
// Leave non-strict comparison here
4867
if ($classBefore != $classAfter) {
68+
// Check for case change of class name.
69+
// If we entered this section then the normalized names (lowercase) were equal.
70+
if ($classBefore->name !== $classAfter->name) {
71+
$report->add(
72+
$this->context,
73+
new ClassCaseChanged(
74+
$fileBefore,
75+
$classBefore,
76+
$fileAfter,
77+
$classAfter
78+
)
79+
);
80+
}
81+
4982
$analyzers = [
5083
new ClassMethodAnalyzer('class', $fileBefore, $fileAfter),
5184
new PropertyAnalyzer('class', $fileBefore, $fileAfter),
@@ -59,8 +92,8 @@ public function analyze(Registry $registryBefore, Registry $registryAfter)
5992
}
6093

6194
foreach ($added as $key) {
62-
$fileAfter = $registryAfter->mapping['class'][$key];
63-
$classAfter = $registryAfter->data['class'][$key];
95+
$fileAfter = $filesAfterKeyed[$key];
96+
$classAfter = $classesAfterKeyed[$key];
6497

6598
$data = new ClassAdded($fileAfter, $classAfter);
6699
$report->addClass($data);

src/PHPSemVerChecker/Analyzer/ClassMethodAnalyzer.php

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use PHPSemVerChecker\Comparator\Implementation;
77
use PHPSemVerChecker\Comparator\Signature;
88
use PHPSemVerChecker\Operation\ClassMethodAdded;
9+
use PHPSemVerChecker\Operation\ClassMethodCaseChanged;
910
use PHPSemVerChecker\Operation\ClassMethodImplementationChanged;
1011
use PHPSemVerChecker\Operation\ClassMethodOperationUnary;
1112
use PHPSemVerChecker\Operation\ClassMethodParameterAdded;
@@ -19,7 +20,8 @@
1920
use PHPSemVerChecker\Operation\ClassMethodRemoved;
2021
use PHPSemVerChecker\Report\Report;
2122

22-
class ClassMethodAnalyzer {
23+
class ClassMethodAnalyzer
24+
{
2325
/**
2426
* @var string
2527
*/
@@ -59,12 +61,12 @@ public function analyze(Stmt $contextBefore, Stmt $contextAfter)
5961

6062
$methodsBeforeKeyed = [];
6163
foreach ($methodsBefore as $method) {
62-
$methodsBeforeKeyed[$method->name] = $method;
64+
$methodsBeforeKeyed[strtolower($method->name)] = $method;
6365
}
6466

6567
$methodsAfterKeyed = [];
6668
foreach ($methodsAfter as $method) {
67-
$methodsAfterKeyed[$method->name] = $method;
69+
$methodsAfterKeyed[strtolower($method->name)] = $method;
6870
}
6971

7072
$methodNamesBefore = array_keys($methodsBeforeKeyed);
@@ -84,25 +86,39 @@ public function analyze(Stmt $contextBefore, Stmt $contextAfter)
8486

8587
foreach ($methodsToVerify as $method) {
8688
/** @var \PhpParser\Node\Stmt\ClassMethod $methodBefore */
87-
$methodBefore = $methodsBeforeKeyed[$method];
89+
$methodBefore = $methodsBeforeKeyed[strtolower($method)];
8890
/** @var \PhpParser\Node\Stmt\ClassMethod $methodAfter */
89-
$methodAfter = $methodsAfterKeyed[$method];
91+
$methodAfter = $methodsAfterKeyed[strtolower($method)];
9092

9193
// Leave non-strict comparison here
9294
if ($methodBefore != $methodAfter) {
93-
$paramsBefore = $methodBefore->params;
94-
$paramsAfter = $methodAfter->params;
95+
// Detect method case changed.
96+
// If we entered this section then the normalized names (lowercase) were equal.
97+
if ($methodBefore->name !== $methodAfter->name) {
98+
$report->add(
99+
$this->context,
100+
new ClassMethodCaseChanged(
101+
$this->context,
102+
$this->fileBefore,
103+
$contextAfter,
104+
$methodBefore,
105+
$this->fileAfter,
106+
$contextAfter,
107+
$methodAfter
108+
)
109+
);
110+
}
95111

96-
$signatureResult = Signature::analyze($paramsBefore, $paramsAfter);
112+
$signatureResult = Signature::analyze($methodBefore->getParams(), $methodAfter->getParams());
97113

98114
$changes = [
99-
'parameter_added' => ClassMethodParameterAdded::class,
100-
'parameter_removed' => ClassMethodParameterRemoved::class,
101-
'parameter_renamed' => ClassMethodParameterNameChanged::class,
102-
'parameter_typing_added' => ClassMethodParameterTypingAdded::class,
103-
'parameter_typing_removed' => ClassMethodParameterTypingRemoved::class,
104-
'parameter_default_added' => ClassMethodParameterDefaultAdded::class,
105-
'parameter_default_removed' => ClassMethodParameterDefaultRemoved::class,
115+
'parameter_added' => ClassMethodParameterAdded::class,
116+
'parameter_removed' => ClassMethodParameterRemoved::class,
117+
'parameter_renamed' => ClassMethodParameterNameChanged::class,
118+
'parameter_typing_added' => ClassMethodParameterTypingAdded::class,
119+
'parameter_typing_removed' => ClassMethodParameterTypingRemoved::class,
120+
'parameter_default_added' => ClassMethodParameterDefaultAdded::class,
121+
'parameter_default_removed' => ClassMethodParameterDefaultRemoved::class,
106122
'parameter_default_value_changed' => ClassMethodParameterDefaultValueChanged::class,
107123
];
108124

@@ -113,23 +129,39 @@ public function analyze(Stmt $contextBefore, Stmt $contextAfter)
113129
if (is_a($class, ClassMethodOperationUnary::class, true)) {
114130
$data = new $class($this->context, $this->fileAfter, $contextAfter, $methodAfter);
115131
} else {
116-
$data = new $class($this->context, $this->fileBefore, $contextBefore, $methodBefore, $this->fileAfter, $contextAfter, $methodAfter);
132+
$data = new $class(
133+
$this->context,
134+
$this->fileBefore,
135+
$contextBefore,
136+
$methodBefore,
137+
$this->fileAfter,
138+
$contextAfter,
139+
$methodAfter
140+
);
117141
}
118142
$report->add($this->context, $data);
119143
}
120144

121145
// Difference in source code
122146
// Cast to array because interfaces do not have stmts (= null)
123147
if ( ! Implementation::isSame((array)$methodBefore->stmts, (array)$methodAfter->stmts)) {
124-
$data = new ClassMethodImplementationChanged($this->context, $this->fileBefore, $contextBefore, $methodBefore, $this->fileAfter, $contextAfter, $methodAfter);
148+
$data = new ClassMethodImplementationChanged(
149+
$this->context,
150+
$this->fileBefore,
151+
$contextBefore,
152+
$methodBefore,
153+
$this->fileAfter,
154+
$contextAfter,
155+
$methodAfter
156+
);
125157
$report->add($this->context, $data);
126158
}
127159
}
128160
}
129161

130162
// Added methods implies MINOR BUMP
131163
foreach ($methodsAdded as $method) {
132-
$methodAfter = $methodsAfterKeyed[$method];
164+
$methodAfter = $methodsAfterKeyed[strtolower($method)];
133165
$data = new ClassMethodAdded($this->context, $this->fileAfter, $contextAfter, $methodAfter);
134166
$report->add($this->context, $data);
135167
}

0 commit comments

Comments
 (0)