Skip to content

Commit 2592c8f

Browse files
committed
PhpNamespace::simplifyName() fixed collision when alias already exists
1 parent 3db5dec commit 2592c8f

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

src/PhpGenerator/PhpNamespace.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,20 +185,28 @@ public function simplifyName(string $name, string $of = self::NAME_NORMAL): stri
185185
return $this->simplifyName(Helpers::extractNamespace($name) . '\\') . Helpers::extractShortName($name);
186186
}
187187

188-
$res = self::startsWith($name, $this->name . '\\')
188+
$shortest = null;
189+
$relative = self::startsWith($name, $this->name . '\\')
189190
? substr($name, strlen($this->name) + 1)
190191
: null;
191192

192193
foreach ($this->aliases[$of] as $alias => $original) {
194+
if ($relative && self::startsWith($relative . '\\', $alias . '\\')) {
195+
$relative = null;
196+
}
193197
if (self::startsWith($name . '\\', $original . '\\')) {
194198
$short = $alias . substr($name, strlen($original));
195-
if (!isset($res) || strlen($res) > strlen($short)) {
196-
$res = $short;
199+
if (!isset($shortest) || strlen($shortest) > strlen($short)) {
200+
$shortest = $short;
197201
}
198202
}
199203
}
200204

201-
return $res ?? ($this->name ? '\\' : '') . $name;
205+
if (isset($shortest, $relative) && strlen($shortest) < strlen($relative)) {
206+
return $relative;
207+
}
208+
209+
return $relative ?? $shortest ?? ($this->name ? '\\' : '') . $name;
202210
}
203211

204212

tests/PhpGenerator/PhpNamespace.aliases.phpt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ $namespace->addUse('Foo');
6767
Assert::same('B', $namespace->simplifyName('Foo\B'));
6868

6969
$namespace->addUse('Bar\C');
70-
Assert::same('C', $namespace->simplifyName('Foo\C'));
70+
Assert::same('Foo\C', $namespace->simplifyName('Foo\C'));
7171

7272
Assert::same('\Bar', $namespace->simplifyName('Bar'));
7373
Assert::same('C', $namespace->simplifyName('\bar\C'));
@@ -80,7 +80,7 @@ $namespace->addUseFunction('Foo\a');
8080

8181
Assert::same('\bar\c', $namespace->simplifyName('bar\c', $namespace::NAME_FUNCTION));
8282
Assert::same('a', $namespace->simplifyName('foo\A', $namespace::NAME_FUNCTION));
83-
Assert::same('C\b', $namespace->simplifyName('foo\C\b', $namespace::NAME_FUNCTION));
83+
Assert::same('Foo\C\b', $namespace->simplifyName('foo\C\b', $namespace::NAME_FUNCTION));
8484
Assert::same('a\b', $namespace->simplifyName('foo\a\b', $namespace::NAME_FUNCTION));
8585

8686
$namespace->addUseFunction('Bar\c');
@@ -156,9 +156,9 @@ $namespace->addUse('C');
156156
Assert::same('C', $namespace->simplifyName('C'));
157157
$namespace->addUse('Bar\C');
158158
Assert::same('C1', $namespace->simplifyName('Bar\C'));
159-
Assert::same('C', $namespace->simplifyName('Foo\C'));
159+
Assert::same('\Foo\C', $namespace->simplifyName('Foo\C'));
160160
$namespace->addUse('Foo\C');
161-
Assert::same('C', $namespace->simplifyName('Foo\C'));
161+
Assert::same('C2', $namespace->simplifyName('Foo\C'));
162162

163163
$namespace = new PhpNamespace('Foo');
164164
$namespace->addUse('Bar\C');

0 commit comments

Comments
 (0)