@@ -25,6 +25,8 @@ class BetterReflectionParser implements ParserInterface
2525 */
2626 private ?array $ aliases = null ;
2727
28+ private ?array $ classAliases = null ;
29+
2830 /**
2931 * @param ReaderInterface[] $sources
3032 * @param ReaderInterface[] $resolvingSources These sources are used to resolve reflections but won't generate stubs
@@ -58,6 +60,9 @@ public function parse(): void
5860 );
5961 }
6062
63+ $ classAliases = [];
64+ $ secondarySourceLocators [] = new AliasSourceLocator ($ mainSourceLocator , $ classAliases );
65+
6166 // php internals
6267 $ secondarySourceLocators [] = new MemoizingSourceLocator (
6368 new PhpInternalSourceLocator ($ astLocator , new ReflectionSourceStubber ())
@@ -74,10 +79,19 @@ public function parse(): void
7479 $ aliases = [];
7580
7681 $ classIdent = new IdentifierType (IdentifierType::IDENTIFIER_CLASS );
82+
7783 foreach ($ reflector ->reflectAllClasses () as $ class ) {
7884 $ className = $ class ->getName ();
79- $ classes [$ class ->getNamespaceName ()][$ className ] = new ReflectionClass ($ class );
8085
86+ $ docComment = $ class ->getDocComment () ?? '' ;
87+ $ classAliasPos = \strpos ($ docComment , '@alias ' );
88+ if ($ classAliasPos !== false ) {
89+ $ lineEnding = \strpos ($ docComment , "\n" , $ classAliasPos );
90+ $ alias = \ltrim (\substr ($ docComment , $ classAliasPos + 7 , $ lineEnding - $ classAliasPos - 7 ), '\\' );
91+ $ classAliases [$ alias ] = \ltrim ($ className , '\\' );
92+ }
93+
94+ $ classes [$ class ->getNamespaceName ()][$ className ] = new ReflectionClass ($ class );
8195 $ aliases [self ::TYPE_CLASS ][$ className ] = $ astLocator ->getNamespaceUses ($ classIdent , $ className );
8296 }
8397
@@ -97,6 +111,7 @@ public function parse(): void
97111// $this->functions = $functions;
98112// $this->constants = $constants;
99113 $ this ->aliases = $ aliases ;
114+ $ this ->classAliases = $ classAliases ;
100115 }
101116
102117 /**
@@ -153,4 +168,16 @@ public function getAliases(string $classOrFunctionName, string $type): array
153168
154169 return $ this ->aliases [$ type ][$ classOrFunctionName ];
155170 }
171+
172+ /**
173+ * @inheritdoc
174+ */
175+ public function getClassAliases (): array
176+ {
177+ if ($ this ->classAliases === null ) {
178+ throw new \BadMethodCallException ('BetterReflectionParser::parse wasn \'t called yet! ' );
179+ }
180+
181+ return $ this ->classAliases ;
182+ }
156183}
0 commit comments