Skip to content

Commit 875c9a7

Browse files
committed
PhpNamespace: added resolveName()
1 parent e74e5b1 commit 875c9a7

File tree

3 files changed

+124
-3
lines changed

3 files changed

+124
-3
lines changed

readme.md

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,20 @@ $namespace->addUse(Http\Request::class, 'HttpReq');
586586
$namespace->addUseFunction('iter\range');
587587
```
588588

589+
To simplify a fully qualified class, function or constant name according to the defined aliases, use the `simplifyName` method:
590+
591+
```php
592+
echo $namespace->simplifyName('Foo\Bar'); // 'Bar', because 'Foo' is current namespace
593+
echo $namespace->simplifyName('iter\range', $namespace::NAME_FUNCTION); // 'range', because of the defined use-statement
594+
```
595+
596+
Conversely, you can convert a simplified class, function or constant name to a fully qualified one using the `resolveName` method:
597+
598+
```php
599+
echo $namespace->resolveName('Bar'); // 'Foo\Bar'
600+
echo $namespace->resolveName('range', $namespace::NAME_FUNCTION); // 'iter\range'
601+
```
602+
589603
Class Names Resolving
590604
---------------------
591605

@@ -599,11 +613,11 @@ $namespace = new Nette\PhpGenerator\PhpNamespace('Foo');
599613
$namespace->addUse('Bar\AliasedClass');
600614

601615
$class = $namespace->addClass('Demo');
602-
$class->addImplement('Foo\A') // it will resolve to A
603-
->addTrait('Bar\AliasedClass'); // it will resolve to AliasedClass
616+
$class->addImplement('Foo\A') // it will simplify to A
617+
->addTrait('Bar\AliasedClass'); // it will simplify to AliasedClass
604618

605619
$method = $class->addMethod('method');
606-
$method->addComment('@return ' . $namespace->simplifyType('Foo\D')); // in comments resolve manually
620+
$method->addComment('@return ' . $namespace->simplifyType('Foo\D')); // in comments simplify manually
607621
$method->addParameter('arg')
608622
->setType('Bar\OtherClass'); // it will resolve to \Bar\OtherClass
609623

src/PhpGenerator/PhpNamespace.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,27 @@ public function unresolveName(string $name): string
167167
}
168168

169169

170+
public function resolveName(string $name, string $of = self::NAME_NORMAL): string
171+
{
172+
if (isset(Helpers::KEYWORDS[strtolower($name)]) || $name === '') {
173+
return $name;
174+
} elseif ($name[0] === '\\') {
175+
return substr($name, 1);
176+
}
177+
178+
$aliases = array_change_key_case($this->aliases[$of]);
179+
if ($of !== self::NAME_NORMAL) {
180+
return $aliases[strtolower($name)]
181+
?? $this->resolveName(Helpers::extractNamespace($name) . '\\') . Helpers::extractShortName($name);
182+
}
183+
184+
$parts = explode('\\', $name, 2);
185+
return ($res = $aliases[strtolower($parts[0])] ?? null)
186+
? $res . (isset($parts[1]) ? '\\' . $parts[1] : '')
187+
: $this->name . ($this->name ? '\\' : '') . $name;
188+
}
189+
190+
170191
public function simplifyType(string $type, string $of = self::NAME_NORMAL): string
171192
{
172193
return preg_replace_callback('~[\w\x7f-\xff\\\\]+~', function ($m) use ($of) { return $this->simplifyName($m[0], $of); }, $type);
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Nette\PhpGenerator\PhpNamespace;
6+
use Tester\Assert;
7+
8+
require __DIR__ . '/../bootstrap.php';
9+
10+
11+
// global namespace
12+
$namespace = new PhpNamespace('');
13+
14+
Assert::same('', $namespace->getName());
15+
Assert::same('', $namespace->resolveName(''));
16+
Assert::same('', $namespace->resolveName('\\'));
17+
Assert::same('A', $namespace->resolveName('A'));
18+
Assert::same('A', $namespace->resolveName('\A'));
19+
Assert::same('foo\A', $namespace->resolveName('foo\A'));
20+
21+
$namespace->addUse('Bar\C');
22+
23+
Assert::same('Bar', $namespace->resolveName('Bar'));
24+
Assert::same('Bar\C', $namespace->resolveName('c'));
25+
Assert::same('Bar\C\D', $namespace->resolveName('C\D'));
26+
27+
$namespace->addUseFunction('Foo\a');
28+
29+
Assert::same('bar\c', $namespace->resolveName('bar\c', $namespace::NAME_FUNCTION));
30+
Assert::same('Foo\a', $namespace->resolveName('A', $namespace::NAME_FUNCTION));
31+
Assert::same('foo\a\b', $namespace->resolveName('foo\a\b', $namespace::NAME_FUNCTION));
32+
33+
$namespace->addUseFunction('Bar\c');
34+
35+
Assert::same('Bar', $namespace->resolveName('Bar', $namespace::NAME_FUNCTION));
36+
Assert::same('Bar\c', $namespace->resolveName('C', $namespace::NAME_FUNCTION));
37+
Assert::same('Bar\C\d', $namespace->resolveName('c\d', $namespace::NAME_FUNCTION));
38+
39+
$namespace->addUseConstant('Bar\c');
40+
41+
Assert::same('Bar', $namespace->resolveName('Bar', $namespace::NAME_CONSTANT));
42+
Assert::same('Bar\c', $namespace->resolveName('C', $namespace::NAME_CONSTANT));
43+
Assert::same('Bar\C\d', $namespace->resolveName('c\d', $namespace::NAME_CONSTANT));
44+
45+
46+
47+
// namespace
48+
$namespace = new PhpNamespace('Foo');
49+
50+
foreach (['String', 'string', 'int', 'float', 'bool', 'array', 'callable', 'self', 'parent', ''] as $type) {
51+
Assert::same($type, $namespace->resolveName($type));
52+
}
53+
54+
Assert::same('Foo', $namespace->getName());
55+
Assert::same('', $namespace->resolveName(''));
56+
Assert::same('', $namespace->resolveName('\\'));
57+
Assert::same('A', $namespace->resolveName('\A'));
58+
Assert::same('Foo\A', $namespace->resolveName('A'));
59+
60+
$namespace->addUse('Foo');
61+
Assert::same('Foo\B', $namespace->resolveName('B'));
62+
63+
$namespace->addUse('Bar\C');
64+
Assert::same('Foo\C', $namespace->resolveName('Foo\C'));
65+
66+
Assert::same('Bar', $namespace->resolveName('\Bar'));
67+
Assert::same('Bar\C', $namespace->resolveName('C'));
68+
Assert::same('Bar\C', $namespace->resolveName('c'));
69+
Assert::same('Bar\C\D', $namespace->resolveName('c\D'));
70+
71+
$namespace->addUseFunction('Foo\a');
72+
73+
foreach (['String', 'string', 'int', 'float', 'bool', 'array', 'callable', 'self', 'parent', ''] as $type) {
74+
Assert::same($type, $namespace->resolveName($type, $namespace::NAME_FUNCTION));
75+
}
76+
77+
Assert::same('bar\c', $namespace->resolveName('\bar\c', $namespace::NAME_FUNCTION));
78+
Assert::same('Foo\a', $namespace->resolveName('A', $namespace::NAME_FUNCTION));
79+
Assert::same('Foo\C\b', $namespace->resolveName('foo\C\b', $namespace::NAME_FUNCTION));
80+
Assert::same('Foo\A\b', $namespace->resolveName('A\b', $namespace::NAME_FUNCTION));
81+
82+
$namespace->addUseFunction('Bar\c');
83+
84+
Assert::same('Bar', $namespace->resolveName('\Bar', $namespace::NAME_FUNCTION));
85+
Assert::same('Bar\c', $namespace->resolveName('C', $namespace::NAME_FUNCTION));
86+
Assert::same('Bar\C\d', $namespace->resolveName('c\d', $namespace::NAME_FUNCTION));

0 commit comments

Comments
 (0)