Skip to content

Commit 5cc43ee

Browse files
committed
Factory: parsed source code is cached
1 parent a062c55 commit 5cc43ee

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

src/PhpGenerator/Factory.php

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ final class Factory
1919
{
2020
use Nette\SmartObject;
2121

22+
private $bodyCache = [];
23+
private $extractorCache = [];
24+
25+
2226
public function fromClassReflection(\ReflectionClass $from, bool $withBodies = false): ClassType
2327
{
2428
if ($withBodies && $from->isAnonymous()) {
@@ -72,7 +76,7 @@ public function fromClassReflection(\ReflectionClass $from, bool $withBodies = f
7276
}
7377
$class->setProperties($props);
7478

75-
$methods = $bodies = [];
79+
$methods = [];
7680
foreach ($from->getMethods() as $method) {
7781
if (
7882
$method->getDeclaringClass()->name === $from->name
@@ -82,9 +86,10 @@ public function fromClassReflection(\ReflectionClass $from, bool $withBodies = f
8286
if ($withBodies) {
8387
$srcMethod = Nette\Utils\Reflection::getMethodDeclaringMethod($method);
8488
$srcClass = $srcMethod->getDeclaringClass();
85-
$b = $bodies[$srcClass->name] = $bodies[$srcClass->name] ?? $this->getExtractor($srcClass)->extractMethodBodies($srcClass->name);
86-
if (isset($b[$srcMethod->name])) {
87-
$m->setBody($b[$srcMethod->name]);
89+
$bodies = &$this->bodyCache[$srcClass->name];
90+
$bodies = $bodies ?? $this->getExtractor($srcClass)->extractMethodBodies($srcClass->name);
91+
if (isset($bodies[$srcMethod->name])) {
92+
$m->setBody($bodies[$srcMethod->name]);
8893
}
8994
}
9095
}
@@ -271,7 +276,10 @@ private function getVisibility($from): string
271276
private function getExtractor($from): Extractor
272277
{
273278
$file = $from->getFileName();
274-
if (!$file) {
279+
$cache = &$this->extractorCache[$file];
280+
if ($cache !== null) {
281+
return $cache;
282+
} elseif (!$file) {
275283
throw new Nette\InvalidStateException("Source code of $from->name not found.");
276284
}
277285
return new Extractor(file_get_contents($file));

0 commit comments

Comments
 (0)