Skip to content

Commit 575f131

Browse files
avoid parse anonymous class for isFinal, isAbstract, isReadonly (#495)
1 parent 10f3c42 commit 575f131

File tree

2 files changed

+89
-3
lines changed

2 files changed

+89
-3
lines changed

src/Analyzer/FileVisitor.php

+9-3
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,17 @@ private function handleClassNode(Node $node): void
109109
->addExtends($node->extends->toString(), $node->getLine());
110110
}
111111

112-
$this->classDescriptionBuilder->setFinal($node->isFinal());
112+
if (!$node->isAnonymous()) {
113+
$this->classDescriptionBuilder->setFinal($node->isFinal());
114+
}
113115

114-
$this->classDescriptionBuilder->setReadonly($node->isReadonly());
116+
if (!$node->isAnonymous()) {
117+
$this->classDescriptionBuilder->setReadonly($node->isReadonly());
118+
}
115119

116-
$this->classDescriptionBuilder->setAbstract($node->isAbstract());
120+
if (!$node->isAnonymous()) {
121+
$this->classDescriptionBuilder->setAbstract($node->isAbstract());
122+
}
117123
}
118124

119125
private function handleEnumNode(Node $node): void

tests/Unit/Analyzer/FileVisitorTest.php

+80
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
use Arkitect\CLI\TargetPhpVersion;
1313
use Arkitect\Expression\ForClasses\DependsOnlyOnTheseNamespaces;
1414
use Arkitect\Expression\ForClasses\Implement;
15+
use Arkitect\Expression\ForClasses\IsAbstract;
16+
use Arkitect\Expression\ForClasses\IsFinal;
17+
use Arkitect\Expression\ForClasses\IsReadonly;
1518
use Arkitect\Expression\ForClasses\NotContainDocBlockLike;
1619
use Arkitect\Expression\ForClasses\NotHaveDependencyOutsideNamespace;
1720
use Arkitect\Rules\ParsingError;
@@ -1506,4 +1509,81 @@ public function __construct(string $firstName, string $lastName) {
15061509

15071510
self::assertInstanceOf(ClassDescription::class, $cd[0]);
15081511
}
1512+
1513+
public function test_is_final_when_there_is_anonymous_final(): void
1514+
{
1515+
$code = <<< 'EOF'
1516+
<?php
1517+
namespace App\Foo;
1518+
1519+
final class User {
1520+
public function __construct() {
1521+
$class = new class() extends Bundle {}
1522+
}
1523+
}
1524+
EOF;
1525+
1526+
/** @var FileParser $fp */
1527+
$fp = FileParserFactory::createFileParser(TargetPhpVersion::create('8.4'));
1528+
$fp->parse($code, 'relativePathName');
1529+
1530+
$cd = $fp->getClassDescriptions();
1531+
$violations = new Violations();
1532+
$isFinal = new IsFinal();
1533+
$isFinal->evaluate($cd[0], $violations, 'we want to add this rule for our software');
1534+
1535+
self::assertCount(0, $violations);
1536+
}
1537+
1538+
public function test_is_abstract_when_there_is_anonymous_final(): void
1539+
{
1540+
$code = <<< 'EOF'
1541+
<?php
1542+
namespace App\Foo;
1543+
1544+
abstract class User {
1545+
public function bar() {
1546+
$class = new class() extends Bundle {}
1547+
}
1548+
1549+
abstract public function foo() {}
1550+
}
1551+
EOF;
1552+
1553+
/** @var FileParser $fp */
1554+
$fp = FileParserFactory::createFileParser(TargetPhpVersion::create('8.4'));
1555+
$fp->parse($code, 'relativePathName');
1556+
1557+
$cd = $fp->getClassDescriptions();
1558+
$violations = new Violations();
1559+
$isAbstract = new IsAbstract();
1560+
$isAbstract->evaluate($cd[0], $violations, 'we want to add this rule for our software');
1561+
1562+
self::assertCount(0, $violations);
1563+
}
1564+
1565+
public function test_is_readonly_when_there_is_anonymous_final(): void
1566+
{
1567+
$code = <<< 'EOF'
1568+
<?php
1569+
namespace App\Foo;
1570+
1571+
readonly class User {
1572+
public function __construct() {
1573+
$class = new class() extends Bundle {}
1574+
}
1575+
}
1576+
EOF;
1577+
1578+
/** @var FileParser $fp */
1579+
$fp = FileParserFactory::createFileParser(TargetPhpVersion::create('8.4'));
1580+
$fp->parse($code, 'relativePathName');
1581+
1582+
$cd = $fp->getClassDescriptions();
1583+
$violations = new Violations();
1584+
$isReadOnly = new IsReadonly();
1585+
$isReadOnly->evaluate($cd[0], $violations, 'we want to add this rule for our software');
1586+
1587+
self::assertCount(0, $violations);
1588+
}
15091589
}

0 commit comments

Comments
 (0)