Skip to content

Commit 761ef4d

Browse files
parsing enum file (#276)
1 parent 5d77762 commit 761ef4d

File tree

5 files changed

+44
-2
lines changed

5 files changed

+44
-2
lines changed

src/Analyzer/FileVisitor.php

+13
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,13 @@ public function enterNode(Node $node): void
126126
->addDependency(new ClassDependency($node->class->toString(), $node->getLine()));
127127
}
128128

129+
if ($node instanceof Node\Stmt\Enum_ && null !== $node->namespacedName) {
130+
/** @psalm-suppress UndefinedPropertyFetch */
131+
$this->classDescriptionBuilder = ClassDescriptionBuilder::create(
132+
$node->namespacedName->toCodeString()
133+
);
134+
}
135+
129136
/**
130137
* matches parameters dependency in functions and method definitions like
131138
* public function __construct(Symfony\Component\HttpFoundation\Request $request).
@@ -154,6 +161,12 @@ public function leaveNode(Node $node): void
154161

155162
$this->classDescriptions[] = $classDescription;
156163
}
164+
165+
if ($node instanceof Node\Stmt\Enum_ && null !== $this->classDescriptionBuilder) {
166+
$classDescription = $this->classDescriptionBuilder->get();
167+
168+
$this->classDescriptions[] = $classDescription;
169+
}
157170
}
158171

159172
private function isSelfOrStaticOrParent(string $dependencyClass): bool

src/CLI/Runner.php

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Arkitect\CLI;
66

7+
use Arkitect\Analyzer\ClassDescription;
78
use Arkitect\Analyzer\FileParser;
89
use Arkitect\Analyzer\FileParserFactory;
910
use Arkitect\Analyzer\Parser;
@@ -60,6 +61,7 @@ public function check(
6061
$parsingErrors->add($parsedError);
6162
}
6263

64+
/** @var ClassDescription $classDescription */
6365
foreach ($fileParser->getClassDescriptions() as $classDescription) {
6466
foreach ($classSetRule->getRules() as $rule) {
6567
$rule->check($classDescription, $violations);

src/Rules/ArchRule.php

-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ public function check(ClassDescription $classDescription, Violations $violations
3737
return;
3838
}
3939

40-
//TODO
4140
$this->shoulds->checkAll($classDescription, $violations, $this->because);
4241
}
4342
}

src/Rules/Constraints.php

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ public function add(Expression $expression): void
1616
$this->expressions[] = $expression;
1717
}
1818

19-
//TODO
2019
public function checkAll(ClassDescription $classDescription, Violations $violations, string $because): void
2120
{
2221
/** @var Expression $expression */

tests/Unit/Analyzer/FileVisitorTest.php

+29
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Arkitect\Analyzer\FullyQualifiedClassName;
1111
use Arkitect\CLI\TargetPhpVersion;
1212
use Arkitect\Expression\ForClasses\DependsOnlyOnTheseNamespaces;
13+
use Arkitect\Expression\ForClasses\Implement;
1314
use Arkitect\Expression\ForClasses\NotHaveDependencyOutsideNamespace;
1415
use Arkitect\Rules\ParsingError;
1516
use Arkitect\Rules\Violations;
@@ -419,4 +420,32 @@ public function getStatic(): self
419420

420421
$this->assertCount(1, $violations);
421422
}
423+
424+
public function test_it_can_parse_enum(): void
425+
{
426+
$code = <<< 'EOF'
427+
<?php
428+
namespace Root\Cars;
429+
enum Enum
430+
{
431+
case Hearts;
432+
case Diamonds;
433+
case Clubs;
434+
case Spades;
435+
}
436+
EOF;
437+
438+
/** @var FileParser $fp */
439+
$fp = FileParserFactory::createFileParser(TargetPhpVersion::create('8.1'));
440+
$fp->parse($code, 'relativePathName');
441+
442+
$cd = $fp->getClassDescriptions();
443+
444+
$violations = new Violations();
445+
446+
$notHaveDependencyOutsideNamespace = new Implement('MyInterface');
447+
$notHaveDependencyOutsideNamespace->evaluate($cd[0], $violations, 'we want to add this rule for our software');
448+
449+
$this->assertCount(1, $violations);
450+
}
422451
}

0 commit comments

Comments
 (0)