11
11
12
12
namespace Barryvdh \LaravelIdeHelper ;
13
13
14
- use Illuminate \Support \Arr ;
15
14
use PhpParser \Node \Stmt \GroupUse ;
16
15
use PhpParser \Node \Stmt \Namespace_ ;
17
16
use PhpParser \Node \Stmt \Use_ ;
20
19
21
20
class UsesResolver
22
21
{
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
-
36
22
/**
37
23
* @param string $classFQN
38
- * @return $this
24
+ * @return array
39
25
*/
40
- public function loadFromClass (string $ classFQN )
26
+ public function loadFromClass (string $ classFQN ): array
41
27
{
42
28
return $ this ->loadFromFile (
43
29
$ classFQN ,
@@ -48,9 +34,9 @@ public function loadFromClass(string $classFQN)
48
34
/**
49
35
* @param string $classFQN
50
36
* @param string $filename
51
- * @return $this
37
+ * @return array
52
38
*/
53
- public function loadFromFile (string $ classFQN , string $ filename )
39
+ public function loadFromFile (string $ classFQN , string $ filename ): array
54
40
{
55
41
return $ this ->loadFromCode (
56
42
$ classFQN ,
@@ -63,9 +49,9 @@ public function loadFromFile(string $classFQN, string $filename)
63
49
/**
64
50
* @param string $classFQN
65
51
* @param string $code
66
- * @return $this
52
+ * @return array
67
53
*/
68
- public function loadFromCode (string $ classFQN , string $ code )
54
+ public function loadFromCode (string $ classFQN , string $ code ): array
69
55
{
70
56
$ classFQN = ltrim ($ classFQN , '\\' );
71
57
@@ -79,15 +65,22 @@ public function loadFromCode(string $classFQN, string $code)
79
65
);
80
66
81
67
$ parser = (new ParserFactory ())->create (ParserFactory::PREFER_PHP7 );
68
+ $ namespaceData = null ;
82
69
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 ;
89
74
}
90
- );
75
+ }
76
+
77
+ if ($ namespaceData === null ) {
78
+ return [];
79
+ }
80
+
81
+ /** @var Namespace_ $namespaceData */
82
+
83
+ $ aliases = [];
91
84
92
85
foreach ($ namespaceData ->stmts as $ stmt ) {
93
86
if ($ stmt instanceof Use_) {
@@ -98,37 +91,34 @@ function ($node) use ($namespace) {
98
91
foreach ($ stmt ->uses as $ use ) {
99
92
/** @var UseUse $use */
100
93
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 ();
105
99
}
106
100
} elseif ($ stmt instanceof GroupUse) {
107
101
foreach ($ stmt ->uses as $ use ) {
108
102
/** @var UseUse $use */
109
103
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 ();
114
109
}
115
110
}
116
111
}
117
112
118
- return $ this ;
113
+ return $ aliases ;
119
114
}
120
115
121
116
/**
122
117
* @param string $classFQN
123
- * @param string|null $alias
124
- * @return void
118
+ * @return string
125
119
*/
126
- protected function addClassAlias (string $ classFQN, string $ alias = null )
120
+ protected static function classBasename (string $ classFQN): string
127
121
{
128
- if ($ alias === null ) {
129
- $ alias = class_basename ($ classFQN );
130
- }
131
-
132
- $ this ->classAliases [$ alias ] = $ classFQN ;
122
+ return \preg_replace ('/^.* \\\\([^ \\\\]+)$/ ' , '$1 ' , $ classFQN );
133
123
}
134
124
}
0 commit comments