Skip to content

Commit e28b947

Browse files
authored
Merge pull request #2 from Tarik02/fix-resolve-namespace-uses
Fix resolve namespace uses
2 parents a95b7f3 + 114b7b6 commit e28b947

File tree

3 files changed

+49
-59
lines changed

3 files changed

+49
-59
lines changed

src/Alias.php

+1-3
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,7 @@ public function __construct($config, $alias, $facade, $magicMethods = [], $inter
7979
$this->detectExtendsNamespace();
8080

8181
if (!empty($this->namespace)) {
82-
$this->classAliases = (new UsesResolver())
83-
->loadFromClass($this->root)
84-
->getClassAliases();
82+
$this->classAliases = (new UsesResolver())->loadFromClass($this->root);
8583

8684
//Create a DocBlock and serializer instance
8785
$this->phpdoc = new DocBlock(new ReflectionClass($alias), new Context($this->namespace, $this->classAliases));

src/UsesResolver.php

+34-44
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
namespace Barryvdh\LaravelIdeHelper;
1313

14-
use Illuminate\Support\Arr;
1514
use PhpParser\Node\Stmt\GroupUse;
1615
use PhpParser\Node\Stmt\Namespace_;
1716
use PhpParser\Node\Stmt\Use_;
@@ -20,24 +19,11 @@
2019

2120
class UsesResolver
2221
{
23-
/**
24-
* @var array
25-
*/
26-
protected $classAliases = [];
27-
28-
/**
29-
* @return array
30-
*/
31-
public function getClassAliases()
32-
{
33-
return $this->classAliases;
34-
}
35-
3622
/**
3723
* @param string $classFQN
38-
* @return $this
24+
* @return array
3925
*/
40-
public function loadFromClass(string $classFQN)
26+
public function loadFromClass(string $classFQN): array
4127
{
4228
return $this->loadFromFile(
4329
$classFQN,
@@ -48,9 +34,9 @@ public function loadFromClass(string $classFQN)
4834
/**
4935
* @param string $classFQN
5036
* @param string $filename
51-
* @return $this
37+
* @return array
5238
*/
53-
public function loadFromFile(string $classFQN, string $filename)
39+
public function loadFromFile(string $classFQN, string $filename): array
5440
{
5541
return $this->loadFromCode(
5642
$classFQN,
@@ -63,9 +49,9 @@ public function loadFromFile(string $classFQN, string $filename)
6349
/**
6450
* @param string $classFQN
6551
* @param string $code
66-
* @return $this
52+
* @return array
6753
*/
68-
public function loadFromCode(string $classFQN, string $code)
54+
public function loadFromCode(string $classFQN, string $code): array
6955
{
7056
$classFQN = ltrim($classFQN, '\\');
7157

@@ -79,15 +65,22 @@ public function loadFromCode(string $classFQN, string $code)
7965
);
8066

8167
$parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7);
68+
$namespaceData = null;
8269

83-
/** @var Namespace_ $namespaceData */
84-
$namespaceData = Arr::first(
85-
$parser->parse($code),
86-
function ($node) use ($namespace) {
87-
return $node instanceof Namespace_
88-
&& $node->name->toCodeString() === $namespace;
70+
foreach ($parser->parse($code) as $node) {
71+
if ($node instanceof Namespace_ && $node->name->toCodeString() === $namespace) {
72+
$namespaceData = $node;
73+
break;
8974
}
90-
);
75+
}
76+
77+
if ($namespaceData === null) {
78+
return [];
79+
}
80+
81+
/** @var Namespace_ $namespaceData */
82+
83+
$aliases = [];
9184

9285
foreach ($namespaceData->stmts as $stmt) {
9386
if ($stmt instanceof Use_) {
@@ -98,37 +91,34 @@ function ($node) use ($namespace) {
9891
foreach ($stmt->uses as $use) {
9992
/** @var UseUse $use */
10093

101-
$this->addClassAlias(
102-
'\\' . $use->name->toCodeString(),
103-
$use->alias ? $use->alias->name : null
104-
);
94+
$alias = $use->alias ?
95+
$use->alias->name :
96+
self::classBasename($use->name->toCodeString());
97+
98+
$aliases[$alias] = '\\' . $use->name->toCodeString();
10599
}
106100
} elseif ($stmt instanceof GroupUse) {
107101
foreach ($stmt->uses as $use) {
108102
/** @var UseUse $use */
109103

110-
$this->addClassAlias(
111-
'\\' . $stmt->prefix->toCodeString() . '\\' . $use->name->toCodeString(),
112-
$use->alias ? $use->alias->name : null
113-
);
104+
$alias = $use->alias ?
105+
$use->alias->name :
106+
self::classBasename($use->name->toCodeString());
107+
108+
$aliases[$alias] = '\\' . $stmt->prefix->toCodeString() . '\\' . $use->name->toCodeString();
114109
}
115110
}
116111
}
117112

118-
return $this;
113+
return $aliases;
119114
}
120115

121116
/**
122117
* @param string $classFQN
123-
* @param string|null $alias
124-
* @return void
118+
* @return string
125119
*/
126-
protected function addClassAlias(string $classFQN, string $alias = null)
120+
protected static function classBasename(string $classFQN): string
127121
{
128-
if ($alias === null) {
129-
$alias = class_basename($classFQN);
130-
}
131-
132-
$this->classAliases[$alias] = $classFQN;
122+
return \preg_replace('/^.*\\\\([^\\\\]+)$/', '$1', $classFQN);
133123
}
134124
}

tests/UsesResolverTest.php

+14-12
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,13 @@ class UsesResolverTest extends TestCase
2929
}
3030
DOC;
3131

32-
$usesResolver->loadFromCode('Barryvdh\\LaravelIdeHelper\\Tests\\UsesResolverTest', $code);
33-
34-
$this->assertEquals($usesResolver->getClassAliases(), [
35-
'MyUsesResolver' => '\\Barryvdh\\LaravelIdeHelper\\UsesResolver',
36-
'TestCase' => '\\PHPUnit\Framework\TestCase',
37-
]);
32+
$this->assertEquals(
33+
$usesResolver->loadFromCode('Barryvdh\\LaravelIdeHelper\\Tests\\UsesResolverTest', $code),
34+
[
35+
'MyUsesResolver' => '\\Barryvdh\\LaravelIdeHelper\\UsesResolver',
36+
'TestCase' => '\\PHPUnit\Framework\TestCase',
37+
]
38+
);
3839
}
3940

4041
/**
@@ -44,11 +45,12 @@ public function testLoadFromClass()
4445
{
4546
$usesResolver = new UsesResolver();
4647

47-
$usesResolver->loadFromClass(self::class);
48-
49-
$this->assertEquals($usesResolver->getClassAliases(), [
50-
'UsesResolver' => '\\Barryvdh\\LaravelIdeHelper\\UsesResolver',
51-
'TestCase' => '\\PHPUnit\Framework\TestCase',
52-
]);
48+
$this->assertEquals(
49+
$usesResolver->loadFromClass(self::class),
50+
[
51+
'UsesResolver' => '\\Barryvdh\\LaravelIdeHelper\\UsesResolver',
52+
'TestCase' => '\\PHPUnit\Framework\TestCase',
53+
]
54+
);
5355
}
5456
}

0 commit comments

Comments
 (0)