Skip to content

Commit df4d3ac

Browse files
committed
Fully qualified namespace not checked in note visitors - #59
1 parent 8f2fff5 commit df4d3ac

File tree

6 files changed

+48
-6
lines changed

6 files changed

+48
-6
lines changed

src/NodeVisitor/ClassExtends.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ public function afterTraverse(array $nodes): ?array
5757

5858
private function checkExtendsExists(Stmt\Class_ $node): bool
5959
{
60-
$exists = $this->extends === (string) $node->extends;
60+
$exists = $this->extends === ($node->extends instanceof Name\FullyQualified
61+
? '\\' . $node->extends->toString()
62+
: (string) $node->extends);
6163

6264
if (false === $exists && null !== $node->extends) {
6365
throw new LogicException(\sprintf(

src/NodeVisitor/ClassImplements.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
namespace OpenCodeModeling\CodeAst\NodeVisitor;
1212

1313
use PhpParser\Node\Name;
14+
use PhpParser\Node\Name\FullyQualified;
1415
use PhpParser\Node\Stmt;
1516
use PhpParser\Node\Stmt\Namespace_;
1617
use PhpParser\NodeVisitorAbstract;
@@ -74,7 +75,9 @@ private function filterImplements(array $nodes): array
7475
if ($stmt instanceof Stmt\Class_) {
7576
foreach ($stmt->implements as $implementName) {
7677
$implements = \array_filter($implements, static function (string $implement) use ($implementName) {
77-
return $implement !== (string) $implementName;
78+
return $implement !== ($implementName instanceof FullyQualified
79+
? '\\' . $implementName->toString()
80+
: (string) $implementName);
7881
});
7982
}
8083
}

src/NodeVisitor/ClassUseTrait.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ private function filterTraits(array $nodes): array
7373
foreach ($classStmt->traits as $trait) {
7474
$useTraits = \array_filter($useTraits,
7575
static function (string $implement) use ($trait) {
76-
return $implement !== (string) $trait;
76+
return $implement !== ($trait instanceof Name\FullyQualified
77+
? '\\' . $trait->toString()
78+
: (string) $trait);
7779
});
7880
}
7981
}

tests/Builder/ClassBuilderTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ final class TestClass extends BaseClass implements \Iterator, Bar
7676
EOF;
7777

7878
$this->assertSame($expected, $this->printer->prettyPrintFile($nodeTraverser->traverse($ast)));
79+
$this->assertSame($expected, $this->printer->prettyPrintFile($nodeTraverser->traverse($this->parser->parse($expected))));
7980
}
8081

8182
/**

tests/NodeVisitor/ClassExtendsTest.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,38 @@ class TestClass extends MyBaseClass
170170
$this->assertSame($expected, $this->printer->prettyPrintFile($nodeTraverser->traverse($ast)));
171171
}
172172

173+
/**
174+
* @test
175+
*/
176+
public function it_checks_class_extends_with_fully_qualified_namespace_for_existing_file(): void
177+
{
178+
$code = <<<EOF
179+
<?php
180+
181+
namespace My\Awesome\Service;
182+
183+
class TestClass extends \MyBaseClass {}
184+
EOF;
185+
186+
$ast = $this->parser->parse($code);
187+
188+
$nodeTraverser = new NodeTraverser();
189+
$nodeTraverser->addVisitor(new ClassFile(new ClassGenerator('TestClass')));
190+
$nodeTraverser->addVisitor(new ClassExtends('\\MyBaseClass'));
191+
192+
$expected = <<<EOF
193+
<?php
194+
195+
namespace My\Awesome\Service;
196+
197+
class TestClass extends \MyBaseClass
198+
{
199+
}
200+
EOF;
201+
202+
$this->assertSame($expected, $this->printer->prettyPrintFile($nodeTraverser->traverse($ast)));
203+
}
204+
173205
/**
174206
* @test
175207
*/

tests/NodeVisitor/ClassUseTraitTest.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public function it_add_namespace_imports_in_correct_order(): void
4343
$ast = $this->parser->parse($this->classCode());
4444

4545
$nodeTraverser = new NodeTraverser();
46-
$nodeTraverser->addVisitor(new ClassUseTrait('MyService\Foo', 'MyService\Bar'));
46+
$nodeTraverser->addVisitor(new ClassUseTrait('\MyService\Foo', 'MyService\Bar', 'MyService\FooBar'));
4747

4848
$this->assertSame($this->expectedClassCode(), $this->printer->prettyPrintFile($nodeTraverser->traverse($ast)));
4949
}
@@ -59,7 +59,8 @@ private function classCode(): string
5959
6060
class TestClass
6161
{
62-
use MyService\Foo;
62+
use \MyService\Foo;
63+
use MyService\FooBar;
6364
6465
public function testMethod()
6566
{
@@ -79,7 +80,8 @@ private function expectedClassCode(): string
7980
class TestClass
8081
{
8182
use MyService\Bar;
82-
use MyService\Foo;
83+
use \MyService\Foo;
84+
use MyService\FooBar;
8385
public function testMethod()
8486
{
8587
}

0 commit comments

Comments
 (0)