Skip to content

Commit fd71a76

Browse files
committed
naming type->argument
1 parent e3fdd23 commit fd71a76

10 files changed

+86
-66
lines changed

bin/generate.php

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,22 @@
88

99
require __DIR__ . '/../vendor/autoload.php';
1010

11-
$sourceDir = $argv[1];
12-
$outputDir = $argv[2];
11+
$timeStart = microtime(true);
12+
13+
$sourceDir = $argv[1];
14+
if (empty($sourceDir) || !is_dir($sourceDir)) {
15+
exit(1);
16+
}
17+
18+
$outputDir = $argv[2];
19+
if (empty($outputDir) || !is_dir($outputDir)) {
20+
exit(1);
21+
}
22+
1323
$psr4Prefix = $argv[3];
24+
if (empty($psr4Prefix)) {
25+
exit(1);
26+
}
1427

1528
$classLoader = new ClassLoader();
1629
$classLoader->setPsr4($psr4Prefix, $sourceDir);
@@ -31,7 +44,7 @@
3144

3245
printf(" - %s\n", $concreteClass->fqn);
3346
}
34-
echo "Generated files containing " . count($result->getConcreteClasses()) . " concrete classes\n";
35-
47+
$timeFin = microtime(true);
3648

49+
printf("Generated %d concrete classes in %.3f seconds, %.3f MB memory used\n", count($result->getConcreteClasses()), $timeFin - $timeStart, memory_get_usage(true) / 1024 / 1024);
3750

bin/test.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,11 @@
6060
printf("%s - %d concrete classes [%s]\n", $directory->getBasename(), count($result->getConcreteClasses()), ($success ? 'ok' : 'fail'));
6161
}
6262

63+
if ($allTestsSuccess) {
64+
print("\nAll tests passed successfully!\n");
65+
} else {
66+
print("\nThere are some errors\n");
67+
exit(1);
68+
}
69+
6370
exit($allTestsSuccess ? 0 : 1);

src/Command/DumpCommand.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ protected function configure()
2323

2424
protected function execute(InputInterface $input, OutputInterface $output)
2525
{
26+
$timeStart = microtime(true);
2627
$this->getIO()->write('<info>Generating concrete classes</info>');
2728

2829
$composer = $this->getComposer();
@@ -80,7 +81,13 @@ protected function execute(InputInterface $input, OutputInterface $output)
8081
}
8182
}
8283

83-
$this->getIO()->write('<info>Generated files containing ' . $filesCount . ' concrete classes</info>');
84+
$timeFin = microtime(true);
85+
$this->getIO()->write(sprintf(
86+
"Generated %d concrete classes in %.3f seconds, %.3f MB memory used",
87+
$filesCount,
88+
$timeFin - $timeStart,
89+
memory_get_usage(true) / 1024 / 1024)
90+
);
8491
}
8592

8693
private function getClassLoader(array $autoloads, AutoloadGenerator $autoloadGenerator, Filesystem $filesystem, string $basePath, string $vendorPath): ClassLoader

src/Compiler/ClassFinder/ClassFinder.php

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
namespace Mrsuh\PhpGenerics\Compiler\ClassFinder;
44

55
use Composer\Autoload\ClassLoader;
6-
use Mrsuh\PhpGenerics\Exception\ClassNotFoundException;
6+
use Mrsuh\PhpGenerics\Exception\FileEmptyException;
7+
use Mrsuh\PhpGenerics\Exception\FileNotFoundException;
78
use Mrsuh\PhpGenerics\Exception\FileNotReadableException;
89

910
class ClassFinder implements ClassFinderInterface
@@ -20,20 +21,20 @@ public function isFileExistsByClassFqn(string $fqn): bool
2021
return !empty($this->classLoader->findFile($fqn));
2122
}
2223

23-
/**
24-
* @throws ClassNotFoundException
25-
* @throws FileNotReadableException
26-
*/
2724
public function getFileContentByClassFqn(string $fqn): string
2825
{
2926
$filePath = $this->classLoader->findFile($fqn);
3027
if (!$filePath) {
31-
throw new ClassNotFoundException(sprintf('Can\'t find class file %s', $fqn));
28+
throw new \RuntimeException(sprintf('Can\'t find file for class "%s"', $fqn));
29+
}
30+
31+
if (!is_readable($filePath)) {
32+
throw new \RuntimeException(sprintf('Can\'t read file "%s"', $filePath));
3233
}
3334

3435
$content = file_get_contents($filePath);
35-
if ($content === false) {
36-
throw new FileNotReadableException(sprintf('Can\'t read class %s from file %s', $fqn, $filePath));
36+
if (empty($content)) {
37+
throw new \RuntimeException(sprintf('File "%s" has empty content', $filePath));
3738
}
3839

3940
return $content;

src/Compiler/Compiler.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use Mrsuh\PhpGenerics\Compiler\Cache\ConcreteClassCache;
66
use Mrsuh\PhpGenerics\Compiler\Cache\GenericClassCache;
77
use Mrsuh\PhpGenerics\Compiler\ClassFinder\ClassFinderInterface;
8-
use Mrsuh\PhpGenerics\Exception\FileNotReadableException;
98
use Symfony\Component\Finder\Finder;
109

1110
class Compiler
@@ -30,14 +29,19 @@ public function compile(string $directory): Result
3029

3130
$result = new Result();
3231
foreach ($sourceFiles as $sourceFile) {
33-
$content = file_get_contents($sourceFile->getRealPath());
3432

33+
$sourceFilePath = $sourceFile->getRealPath();
34+
35+
if (!is_readable($sourceFilePath)) {
36+
throw new \RuntimeException(sprintf('Can\'t read file "%s"', $sourceFilePath));
37+
}
38+
39+
$content = file_get_contents($sourceFilePath);
3540
if (empty($content)) {
36-
throw new FileNotReadableException('Can\'t read file ' . $sourceFile->getRealPath());
41+
throw new \RuntimeException(sprintf('File "%s" has empty content', $sourceFilePath));
3742
}
3843

3944
$ast = Parser::resolveNames(Parser::parse($content));
40-
4145
if (!Parser::hasGenericClassUsages($ast)) {
4246
continue;
4347
}

src/Compiler/GenericClass.php

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,11 @@ private function generateConcreteClassFqn(array $genericTypes): string
8282

8383
public function generateConcreteClass(array $arguments, Result $result): ConcreteClass
8484
{
85+
/** Usage class */
8586
if (count($this->parameters) === 0 && count($arguments) === 0) {
86-
$concreteGenericsMap = new GenericTypesMap($this->classFinder);
87+
$concreteGenericsMap = new GenericParametersMap($this->classFinder);
8788
} else {
88-
$concreteGenericsMap = GenericTypesMap::fromParametersAndArguments($this->classFinder, $this->parameters, $arguments);
89+
$concreteGenericsMap = GenericParametersMap::fromParametersAndArguments($this->classFinder, $this->parameters, $arguments);
8990
}
9091

9192
$ast = Parser::cloneAst($this->ast);
@@ -195,16 +196,16 @@ public function generateConcreteClass(array $arguments, Result $result): Concret
195196
}
196197
}
197198

198-
Parser::setNodeName($classNode->name, $this->generateConcreteClassName($concreteGenericsMap->getConcreteTypes()));
199+
Parser::setNodeName($classNode->name, $this->generateConcreteClassName($concreteGenericsMap->getConcreteArguments()));
199200

200201
return new ConcreteClass(
201-
$this->generateConcreteClassName($concreteGenericsMap->getConcreteTypes()),
202-
$this->generateConcreteClassFqn($concreteGenericsMap->getConcreteTypes()),
202+
$this->generateConcreteClassName($concreteGenericsMap->getConcreteArguments()),
203+
$this->generateConcreteClassFqn($concreteGenericsMap->getConcreteArguments()),
203204
$ast
204205
);
205206
}
206207

207-
private function handleClass(Node &$node, GenericTypesMap $genericTypesMap, Result $result): void
208+
private function handleClass(Node &$node, GenericParametersMap $genericParametersMap, Result $result): void
208209
{
209210
if (!Parser::isGenericClass($node)) {
210211
return;
@@ -219,7 +220,7 @@ private function handleClass(Node &$node, GenericTypesMap $genericTypesMap, Resu
219220

220221
$genericClass = $this->genericClassCache->get($genericClassFqn);
221222

222-
$arguments = $genericTypesMap->generateFullArgumentsForNewGenericClass((array)Parser::getGenericParameters($node));
223+
$arguments = $genericParametersMap->generateFullArgumentsForNewGenericClass((array)Parser::getGenericParameters($node));
223224

224225
$concreteClassCacheKey = $genericClass->getConcreteClassCacheKey($arguments);
225226
if (!$this->concreteClassCache->has($concreteClassCacheKey)) {

src/Compiler/GenericTypesMap.php renamed to src/Compiler/GenericParametersMap.php

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
use Mrsuh\PhpGenerics\Compiler\ClassFinder\ClassFinderInterface;
66
use PhpParser\Node\GenericParameter;
77

8-
class GenericTypesMap
8+
class GenericParametersMap
99
{
10-
private array $types = [];
10+
private array $parameters = [];
1111
private ClassFinderInterface $classFinder;
1212

1313
public function __construct(ClassFinderInterface $classFinder)
@@ -24,27 +24,27 @@ public static function fromParametersAndArguments(ClassFinderInterface $classFin
2424
$map = new self($classFinder);
2525

2626
if (count($arguments) > count($parameters)) {
27-
throw new \TypeError('Invalid types count');
27+
throw new \TypeError(sprintf('Arguments count "%d" is bigger than parameters count "%d"', count($arguments), count($parameters)));
2828
}
2929

3030
foreach ($parameters as $index => $genericParameter) {
3131
$genericParameterName = Parser::getNodeName($genericParameter->name, $classFinder);
3232

3333
if (isset($arguments[$index])) {
34-
$concreteType = $arguments[$index];
34+
$concreteArgument = $arguments[$index];
3535
} else {
3636
$default = $genericParameter->default;
3737
if ($default === null) {
38-
throw new \TypeError('There is no default value for argument ' . ($index + 1));
38+
throw new \TypeError(sprintf('There is no default value for argument "%d"', $index + 1));
3939
}
40-
$concreteType = Parser::getNodeName($default, $classFinder);
40+
$concreteArgument = Parser::getNodeName($default, $classFinder);
4141
}
4242

43-
if (empty($concreteType)) {
44-
throw new \TypeError('Invalid argument ' . ($index + 1));
43+
if (empty($concreteArgument)) {
44+
throw new \TypeError(sprintf('Invalid argument %d', $index + 1));
4545
}
4646

47-
$map->set($genericParameterName, $concreteType);
47+
$map->set($genericParameterName, $concreteArgument);
4848
}
4949

5050
return $map;
@@ -80,33 +80,33 @@ public function generateFullArgumentsForNewGenericClass(array $genericParameters
8080
return $genericArguments;
8181
}
8282

83-
public function set(string $type, string $concreteType): void
83+
public function set(string $parameter, string $argument): void
8484
{
85-
$this->types[$type] = $concreteType;
85+
$this->parameters[$parameter] = $argument;
8686
}
8787

88-
public function get(string $type): string
88+
public function get(string $parameter): string
8989
{
90-
return $this->types[$type] ?? '';
90+
return $this->parameters[$parameter] ?? '';
9191
}
9292

93-
public function has(string $type): bool
93+
public function has(string $parameter): bool
9494
{
95-
return isset($this->types[$type]);
95+
return isset($this->parameters[$parameter]);
9696
}
9797

98-
public function getConcreteTypes(): array
98+
public function getConcreteArguments(): array
9999
{
100-
return array_values($this->types);
100+
return array_values($this->parameters);
101101
}
102102

103103
public function count(): int
104104
{
105-
return count($this->types);
105+
return count($this->parameters);
106106
}
107107

108108
public function all(): array
109109
{
110-
return $this->types;
110+
return $this->parameters;
111111
}
112112
}

src/Compiler/Parser.php

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ public static function filterOne(array $nodes, array $classes): ?Node
5454
$nodes = self::filter($nodes, $classes);
5555

5656
if (count($nodes) > 1) {
57-
throw new \Exception('Nodes more than one');
57+
throw new \RuntimeException(sprintf(
58+
'AST has more than one node for classes "%s"',
59+
implode(', ', $classes)
60+
));
5861
}
5962

6063
if (count($nodes) === 0) {
@@ -81,7 +84,7 @@ public static function getNodeName(Node $node, ClassFinderInterface $classFinder
8184
case $node instanceof Node\Identifier:
8285
return (string)$node->name;
8386
default:
84-
throw new \TypeError(sprintf('Invalid nodeName class %s', get_class($node)));
87+
throw new \TypeError(sprintf('Invalid node name class "%s"', get_class($node)));
8588
}
8689
}
8790

@@ -99,7 +102,7 @@ public static function setNodeName(Node &$node, string $type): void
99102
$node->name = $type;
100103
break;
101104
default:
102-
throw new \TypeError(sprintf('Invalid node name type %s', get_class($node)));
105+
throw new \TypeError(sprintf('Invalid node name class "%s"', get_class($node)));
103106
}
104107
}
105108

@@ -119,11 +122,11 @@ public static function isBuiltinType(string $type): bool
119122
return isset($builtinTypes[strtolower($type)]);
120123
}
121124

122-
public static function setNodeType(Node &$node, GenericTypesMap $genericTypesMap, ClassFinderInterface $classFinder): void
125+
public static function setNodeType(Node &$node, GenericParametersMap $genericParametersMap, ClassFinderInterface $classFinder): void
123126
{
124127
$currentType = self::getNodeName($node, $classFinder);
125-
if ($genericTypesMap->has($currentType)) {
126-
self::setNodeName($node, $genericTypesMap->get($currentType));
128+
if ($genericParametersMap->has($currentType)) {
129+
self::setNodeName($node, $genericParametersMap->get($currentType));
127130
}
128131
}
129132

@@ -138,7 +141,7 @@ public static function getNodeTypes(Node &$node): array
138141
case $node instanceof Node\UnionType:
139142
return $node->types;
140143
default:
141-
throw new \TypeError('Invalid type');
144+
throw new \TypeError('Invalid node type');
142145
}
143146
}
144147

src/Exception/ClassNotFoundException.php

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/Exception/FileNotReadableException.php

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)