Skip to content

Commit 766fd64

Browse files
committed
Fix references resolver behaviour
1 parent 590e641 commit 766fd64

File tree

3 files changed

+29
-14
lines changed

3 files changed

+29
-14
lines changed

src/Mapping/Reference/Reader/NativeReferencesReader.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ private function readNamespace(\Iterator $tokens): string
8181
while ($tokens->valid()) {
8282
$current = $tokens->current();
8383

84-
if ($current->id === \T_NAME_QUALIFIED) {
84+
if ($current->id === \T_NAME_QUALIFIED || $current->id === \T_STRING) {
8585
$result = $current->text;
8686
} elseif ($current->text === ';') {
8787
$tokens->next();

src/Mapping/Reference/ReferencesResolver.php

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace TypeLang\Mapper\Mapping\Reference;
66

7+
use phpDocumentor\Reflection\Types\True_;
78
use TypeLang\Mapper\Mapping\Reference\Reader\ReferencesReaderInterface;
89
use TypeLang\Parser\Node\Name;
910
use TypeLang\Parser\Node\Stmt\TypeStatement;
@@ -79,19 +80,18 @@ private function formatUseStatements(array $uses): array
7980
$result = [];
8081

8182
foreach ($uses as $alias => $fqn) {
83+
// In case of "use Some as Alias;" stmt found
8284
if (\is_string($alias)) {
8385
$result[$alias] = $fqn;
8486
continue;
8587
}
8688

87-
$nameOffset = \strrpos($fqn, '\\');
89+
// In case of "use Some;" or "use Some\Any;" stmts found
90+
$className = ($nameOffset = \strrpos($fqn, '\\')) !== false
91+
? \substr($fqn, $nameOffset + 1)
92+
: $fqn;
8893

89-
if ($nameOffset === false) {
90-
$result[$fqn] = $fqn;
91-
continue;
92-
}
93-
94-
dd($nameOffset);
94+
$result[$className] = $fqn;
9595
}
9696

9797
return $result;
@@ -115,7 +115,22 @@ private function fromCurrentNamespace(Name $name, \ReflectionClass $class): Name
115115
return $name;
116116
}
117117

118-
return (new Name($namespace))
118+
$result = (new Name($namespace))
119119
->withAdded($name);
120+
121+
if ($this->isClassExists($result)) {
122+
return $result;
123+
}
124+
125+
return $name;
126+
}
127+
128+
private function isClassExists(Name $name): bool
129+
{
130+
$fqn = $name->toString();
131+
132+
return \class_exists($fqn)
133+
|| \interface_exists($fqn, false)
134+
|| \trait_exists($fqn, false);
120135
}
121136
}

tests/Mapping/Reference/ReferencesResolverTest.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ private function getResolver(array $useStatements = []): ReferencesResolver
2626
#[TestDox('if no "use" stmt, then the namespace must be same as the class')]
2727
public function testResolveWithSimpleNameInSameNamespace(): void
2828
{
29-
$needle = new NamedTypeNode('TestClass');
29+
$needle = new NamedTypeNode('ClassWithGroupUsesStub');
3030
$haystack = new \ReflectionClass(SimpleClassStub::class);
3131

3232
$result = $this->getResolver()
3333
->resolve($needle, $haystack);
3434

3535
self::assertInstanceOf(NamedTypeNode::class, $result);
36-
self::assertSame('TypeLang\Mapper\Tests\Mapping\Reference\Stub\TestClass', $result->name->toString());
36+
self::assertSame('TypeLang\Mapper\Tests\Mapping\Reference\Stub\ClassWithGroupUsesStub', $result->name->toString());
3737
}
3838

3939
public function testResolveWithUseStatement(): void
@@ -67,14 +67,14 @@ public function testResolveWithAliasedUseStatement(): void
6767

6868
public function testResolveWithNamespaceKeyword(): void
6969
{
70-
$needle = new NamedTypeNode('namespace\\TestClass');
70+
$needle = new NamedTypeNode('namespace\\Attribute');
7171
$haystack = new \ReflectionClass(SimpleClassStub::class);
7272

7373
$result = $this->getResolver()
7474
->resolve($needle, $haystack);
7575

7676
self::assertInstanceOf(NamedTypeNode::class, $result);
77-
self::assertSame('TypeLang\\Mapper\\Tests\\Mapping\\Reference\\Stub\\TestClass', $result->name->toString());
77+
self::assertSame('Attribute', $result->name->toString());
7878
}
7979

8080
public function testResolveWithNamespaceKeywordInGlobalNamespace(): void
@@ -110,7 +110,7 @@ public function testResolveWithComplexNamespaceKeyword(): void
110110
->resolve($needle, $haystack);
111111

112112
self::assertInstanceOf(NamedTypeNode::class, $result);
113-
self::assertSame('TypeLang\\Mapper\\Tests\\Mapping\\Reference\\Stub\\Sub\\Namespace\\TestClass', $result->name->toString());
113+
self::assertSame('Sub\\Namespace\\TestClass', $result->name->toString());
114114
}
115115

116116
public function testResolveWithMixedUseStatements(): void

0 commit comments

Comments
 (0)