Skip to content

Commit 897cded

Browse files
committed
Fine grained File interfaces - close #77
1 parent 0344d37 commit 897cded

File tree

7 files changed

+113
-67
lines changed

7 files changed

+113
-67
lines changed

src/Builder/ClassBuilder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
use PhpParser\NodeVisitor;
2424
use PhpParser\Parser;
2525

26-
final class ClassBuilder implements File
26+
final class ClassBuilder implements PhpFile
2727
{
2828
/** @var string|null */
2929
private ?string $namespace = null;

src/Builder/File.php

Lines changed: 0 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
interface File
1818
{
19-
public function getNamespace(): ?string;
20-
2119
public function getName(): ?string;
2220

2321
/**
@@ -27,58 +25,4 @@ public function getName(): ?string;
2725
public function generate(Parser $parser): array;
2826

2927
public function injectVisitors(NodeTraverser $nodeTraverser, Parser $parser): void;
30-
31-
public function hasConstant(string $constantName): bool;
32-
33-
/**
34-
* Removing will not work on existing files
35-
*
36-
* @param string ...$constants
37-
* @return $this
38-
*/
39-
public function removeConstant(string ...$constants): self;
40-
41-
/**
42-
* Uses uasort internally
43-
*
44-
* @param callable $sort (ClassConstBuilder $a, ClassConstBuilder $b)
45-
* @return self
46-
*/
47-
public function sortConstants(callable $sort): self;
48-
49-
public function hasMethod(string $methodName): bool;
50-
51-
/**
52-
* Removing will not work on existing files
53-
*
54-
* @param string ...$methodNames
55-
* @return $this
56-
*/
57-
public function removeMethod(string ...$methodNames): self;
58-
59-
/**
60-
* Uses uasort internally
61-
*
62-
* @param callable $sort (ClassMethodBuilder $a, ClassMethodBuilder $b)
63-
* @return self
64-
*/
65-
public function sortMethods(callable $sort): self;
66-
67-
/**
68-
* Uses uasort internally
69-
*
70-
* @param callable $sort (string $a, string $b)
71-
* @return self
72-
*/
73-
public function sortNamespaceImports(callable $sort): self;
74-
75-
/**
76-
* Removing will not work on existing files
77-
*
78-
* @param string ...$namespaceImports
79-
* @return $this
80-
*/
81-
public function removeNamespaceImport(string ...$namespaceImports): self;
82-
83-
public function hasNamespaceImport(string $namespace): bool;
8428
}

src/Builder/FileCollection.php

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,20 @@ private function __construct(File ...$files)
3939
}
4040
}
4141

42-
public function add(File $file): self
42+
public function add(File ...$files): self
4343
{
44-
$this->items[$this->identifier($file)] = $file;
44+
foreach ($files as $file) {
45+
$this->items[$this->identifier($file)] = $file;
46+
}
4547

4648
return $this;
4749
}
4850

49-
public function remove(File $file): self
51+
public function remove(File ...$files): self
5052
{
51-
unset($this->items[$this->identifier($file)]);
53+
foreach ($files as $file) {
54+
unset($this->items[$this->identifier($file)]);
55+
}
5256

5357
return $this;
5458
}
@@ -58,6 +62,24 @@ public function contains(File $file): bool
5862
return isset($this->items[$this->identifier($file)]);
5963
}
6064

65+
public function addFileCollection(FileCollection $fileCollection): self
66+
{
67+
foreach ($fileCollection as $file) {
68+
$this->add($file);
69+
}
70+
71+
return $this;
72+
}
73+
74+
public function removeFileCollection(FileCollection $fileCollection): self
75+
{
76+
foreach ($fileCollection as $file) {
77+
$this->remove($file);
78+
}
79+
80+
return $this;
81+
}
82+
6183
public function filter(callable $filter): self
6284
{
6385
return new self(...\array_values(
@@ -111,10 +133,14 @@ public function count(): int
111133

112134
private function identifier(File $file): string
113135
{
114-
$namespace = $file->getNamespace() !== null ? ('\\' . $file->getNamespace()) : '';
115-
$name = $file->getName() !== null ? ('\\' . $file->getName()) : '';
136+
$identifier = '';
116137

117-
$identifier = $namespace . $name;
138+
if ($file instanceof PhpFile) {
139+
$namespace = $file->getNamespace() !== null ? ('\\' . $file->getNamespace()) : '';
140+
$name = $file->getName() !== null ? ('\\' . $file->getName()) : '';
141+
142+
$identifier = $namespace . $name;
143+
}
118144

119145
if ($identifier === '') {
120146
return \spl_object_hash($file);

src/Builder/InterfaceBuilder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
use PhpParser\NodeVisitor;
2222
use PhpParser\Parser;
2323

24-
final class InterfaceBuilder implements File
24+
final class InterfaceBuilder implements PhpFile
2525
{
2626
/** @var string|null */
2727
private ?string $namespace = null;

src/Builder/PhpFile.php

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?php
2+
3+
/**
4+
* @see https://github.com/open-code-modeling/php-code-ast for the canonical source repository
5+
* @copyright https://github.com/open-code-modeling/php-code-ast/blob/master/COPYRIGHT.md
6+
* @license https://github.com/open-code-modeling/php-code-ast/blob/master/LICENSE.md MIT License
7+
*/
8+
9+
declare(strict_types=1);
10+
11+
namespace OpenCodeModeling\CodeAst\Builder;
12+
13+
interface PhpFile extends File
14+
{
15+
public function getNamespace(): ?string;
16+
17+
/**
18+
* Uses uasort internally
19+
*
20+
* @param callable $sort (string $a, string $b)
21+
* @return self
22+
*/
23+
public function sortNamespaceImports(callable $sort): self;
24+
25+
/**
26+
* Removing will not work on existing files
27+
*
28+
* @param string ...$namespaceImports
29+
* @return $this
30+
*/
31+
public function removeNamespaceImport(string ...$namespaceImports): self;
32+
33+
public function hasNamespaceImport(string $namespace): bool;
34+
35+
public function hasConstant(string $constantName): bool;
36+
37+
/**
38+
* Removing will not work on existing files
39+
*
40+
* @param string ...$constants
41+
* @return $this
42+
*/
43+
public function removeConstant(string ...$constants): self;
44+
45+
/**
46+
* Uses uasort internally
47+
*
48+
* @param callable $sort (ClassConstBuilder $a, ClassConstBuilder $b)
49+
* @return self
50+
*/
51+
public function sortConstants(callable $sort): self;
52+
53+
public function hasMethod(string $methodName): bool;
54+
55+
/**
56+
* Removing will not work on existing files
57+
*
58+
* @param string ...$methodNames
59+
* @return $this
60+
*/
61+
public function removeMethod(string ...$methodNames): self;
62+
63+
/**
64+
* Uses uasort internally
65+
*
66+
* @param callable $sort (ClassMethodBuilder $a, ClassMethodBuilder $b)
67+
* @return self
68+
*/
69+
public function sortMethods(callable $sort): self;
70+
}

src/FileCodeGenerator.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use OpenCodeModeling\CodeAst\Builder\ClassMethodBuilder;
1616
use OpenCodeModeling\CodeAst\Builder\File;
1717
use OpenCodeModeling\CodeAst\Builder\FileCollection;
18+
use OpenCodeModeling\CodeAst\Builder\PhpFile;
1819
use OpenCodeModeling\CodeAst\Code\ClassConstGenerator;
1920
use OpenCodeModeling\CodeAst\Package\ClassInfo;
2021
use OpenCodeModeling\CodeAst\Package\ClassInfoList;
@@ -71,6 +72,10 @@ public function generateFiles(
7172
$previousNamespace = '__invalid//namespace__';
7273

7374
foreach ($fileCollection as $classBuilder) {
75+
if (! $classBuilder instanceof PhpFile) {
76+
continue;
77+
}
78+
7479
if ($previousNamespace !== $classBuilder->getNamespace()) {
7580
$previousNamespace = $classBuilder->getNamespace();
7681
$classInfo = $this->classInfoList->classInfoForNamespace($previousNamespace);

tests/FileCodeGeneratorTest.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212

1313
use OpenCodeModeling\CodeAst\Builder\ClassBuilder;
1414
use OpenCodeModeling\CodeAst\Builder\ClassPropertyBuilder;
15-
use OpenCodeModeling\CodeAst\Builder\File;
1615
use OpenCodeModeling\CodeAst\Builder\FileCollection;
1716
use OpenCodeModeling\CodeAst\Builder\InterfaceBuilder;
17+
use OpenCodeModeling\CodeAst\Builder\PhpFile;
1818
use OpenCodeModeling\CodeAst\FileCodeGenerator;
1919
use OpenCodeModeling\CodeAst\Package\ClassInfo;
2020
use OpenCodeModeling\CodeAst\Package\ClassInfoList;
@@ -145,7 +145,7 @@ public function test();
145145
}
146146
EOF;
147147

148-
$currentFileAst = function (File $classBuilder, ClassInfo $classInfo) use (
148+
$currentFileAst = function (PhpFile $classBuilder, ClassInfo $classInfo) use (
149149
$expectedMyInterface,
150150
$expectedTestClass
151151
) {
@@ -304,6 +304,7 @@ public function bar() : bool
304304
EOF;
305305

306306
$fileCollection = FileCollection::fromItems($testClass, $testClassOther);
307+
$fileCollection = FileCollection::emptyList()->addFileCollection($fileCollection);
307308

308309
$this->fileCodeGenerator->addGetterMethodsForProperties(
309310
$fileCollection,

0 commit comments

Comments
 (0)