Skip to content

Commit 389aed1

Browse files
committed
Extractor: refactoring
1 parent 47c9380 commit 389aed1

File tree

2 files changed

+55
-70
lines changed

2 files changed

+55
-70
lines changed

src/PhpGenerator/Extractor.php

Lines changed: 50 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ public function enterNode(Node $node)
180180
}
181181
};
182182

183-
$visitor->callback = function (Node $node) use (&$class, &$namespace, $phpFile) {
183+
$visitor->callback = function (Node $node) use (&$namespace, $phpFile) {
184184
if ($node instanceof Node\Stmt\Class_ && !$node->name) {
185185
return PhpParser\NodeTraverser::DONT_TRAVERSE_CHILDREN;
186186
}
@@ -189,17 +189,9 @@ public function enterNode(Node $node)
189189
&& $node->key->name === 'strict_types'
190190
&& $node->value instanceof Node\Scalar\LNumber => $phpFile->setStrictTypes((bool) $node->value->value),
191191
$node instanceof Node\Stmt\Namespace_ => $namespace = $node->name?->toString(),
192-
$node instanceof Node\Stmt\Use_ => $this->addUseToNamespace($node, $phpFile->addNamespace($namespace)),
193-
$node instanceof Node\Stmt\Class_ => $class = $this->addClassToFile($phpFile, $node),
194-
$node instanceof Node\Stmt\Interface_ => $class = $this->addInterfaceToFile($phpFile, $node),
195-
$node instanceof Node\Stmt\Trait_ => $class = $this->addTraitToFile($phpFile, $node),
196-
$node instanceof Node\Stmt\Enum_ => $class = $this->addEnumToFile($phpFile, $node),
192+
$node instanceof Node\Stmt\Use_ => $this->addUseToNamespace($phpFile->addNamespace($namespace), $node),
193+
$node instanceof Node\Stmt\ClassLike => $this->addClassLikeToFile($phpFile, $node),
197194
$node instanceof Node\Stmt\Function_ => $this->addFunctionToFile($phpFile, $node),
198-
$node instanceof Node\Stmt\TraitUse => $this->addTraitToClass($class, $node),
199-
$node instanceof Node\Stmt\Property => $this->addPropertyToClass($class, $node),
200-
$node instanceof Node\Stmt\ClassMethod => $this->addMethodToClass($class, $node),
201-
$node instanceof Node\Stmt\ClassConst => $this->addConstantToClass($class, $node),
202-
$node instanceof Node\Stmt\EnumCase => $this->addEnumCaseToClass($class, $node),
203195
default => null,
204196
};
205197
if ($node instanceof Node\FunctionLike) {
@@ -222,7 +214,7 @@ public function enterNode(Node $node)
222214
}
223215

224216

225-
private function addUseToNamespace(Node\Stmt\Use_ $node, PhpNamespace $namespace): void
217+
private function addUseToNamespace(PhpNamespace $namespace, Node\Stmt\Use_ $node): void
226218
{
227219
$of = [
228220
$node::TYPE_NORMAL => PhpNamespace::NameNormal,
@@ -235,62 +227,53 @@ private function addUseToNamespace(Node\Stmt\Use_ $node, PhpNamespace $namespace
235227
}
236228

237229

238-
private function addClassToFile(PhpFile $phpFile, Node\Stmt\Class_ $node): ClassType
230+
private function addClassLikeToFile(PhpFile $phpFile, Node\Stmt\ClassLike $node): ClassLike
239231
{
240-
$class = $phpFile->addClass($node->namespacedName->toString());
241-
if ($node->extends) {
242-
$class->setExtends($node->extends->toString());
243-
}
244-
245-
foreach ($node->implements as $item) {
246-
$class->addImplement($item->toString());
247-
}
248-
249-
$class->setFinal($node->isFinal());
250-
$class->setAbstract($node->isAbstract());
251-
$class->setReadOnly(method_exists($node, 'isReadonly') && $node->isReadonly());
252-
$this->addCommentAndAttributes($class, $node);
253-
return $class;
254-
}
255-
256-
257-
private function addInterfaceToFile(PhpFile $phpFile, Node\Stmt\Interface_ $node): InterfaceType
258-
{
259-
$class = $phpFile->addInterface($node->namespacedName->toString());
260-
foreach ($node->extends as $item) {
261-
$class->addExtend($item->toString());
232+
if ($node instanceof Node\Stmt\Class_) {
233+
$class = $phpFile->addClass($node->namespacedName->toString());
234+
$class->setFinal($node->isFinal());
235+
$class->setAbstract($node->isAbstract());
236+
$class->setReadOnly(method_exists($node, 'isReadonly') && $node->isReadonly());
237+
if ($node->extends) {
238+
$class->setExtends($node->extends->toString());
239+
}
240+
foreach ($node->implements as $item) {
241+
$class->addImplement($item->toString());
242+
}
243+
} elseif ($node instanceof Node\Stmt\Interface_) {
244+
$class = $phpFile->addInterface($node->namespacedName->toString());
245+
foreach ($node->extends as $item) {
246+
$class->addExtend($item->toString());
247+
}
248+
} elseif ($node instanceof Node\Stmt\Trait_) {
249+
$class = $phpFile->addTrait($node->namespacedName->toString());
250+
251+
} elseif ($node instanceof Node\Stmt\Enum_) {
252+
$class = $phpFile->addEnum($node->namespacedName->toString());
253+
$class->setType($node->scalarType?->toString());
254+
foreach ($node->implements as $item) {
255+
$class->addImplement($item->toString());
256+
}
262257
}
263258

264259
$this->addCommentAndAttributes($class, $node);
260+
$this->addClassMembers($class, $node);
265261
return $class;
266262
}
267263

268264

269-
private function addTraitToFile(PhpFile $phpFile, Node\Stmt\Trait_ $node): TraitType
270-
{
271-
$class = $phpFile->addTrait($node->namespacedName->toString());
272-
$this->addCommentAndAttributes($class, $node);
273-
return $class;
274-
}
275-
276-
277-
private function addEnumToFile(PhpFile $phpFile, Node\Stmt\Enum_ $node): EnumType
265+
private function addClassMembers(ClassLike $class, Node\Stmt\ClassLike $node): void
278266
{
279-
$enum = $phpFile->addEnum($node->namespacedName->toString());
280-
$enum->setType($node->scalarType?->toString());
281-
foreach ($node->implements as $item) {
282-
$enum->addImplement($item->toString());
267+
foreach ($node->stmts as $stmt) {
268+
match (true) {
269+
$stmt instanceof Node\Stmt\TraitUse => $this->addTraitToClass($class, $stmt),
270+
$stmt instanceof Node\Stmt\Property => $this->addPropertyToClass($class, $stmt),
271+
$stmt instanceof Node\Stmt\ClassMethod => $this->addMethodToClass($class, $stmt),
272+
$stmt instanceof Node\Stmt\ClassConst => $this->addConstantToClass($class, $stmt),
273+
$stmt instanceof Node\Stmt\EnumCase => $this->addEnumCaseToClass($class, $stmt),
274+
default => null,
275+
};
283276
}
284-
285-
$this->addCommentAndAttributes($enum, $node);
286-
return $enum;
287-
}
288-
289-
290-
private function addFunctionToFile(PhpFile $phpFile, Node\Stmt\Function_ $node): void
291-
{
292-
$function = $phpFile->addFunction($node->namespacedName->toString());
293-
$this->setupFunction($function, $node);
294277
}
295278

296279

@@ -359,6 +342,13 @@ private function addEnumCaseToClass(EnumType $class, Node\Stmt\EnumCase $node):
359342
}
360343

361344

345+
private function addFunctionToFile(PhpFile $phpFile, Node\Stmt\Function_ $node): void
346+
{
347+
$function = $phpFile->addFunction($node->namespacedName->toString());
348+
$this->setupFunction($function, $node);
349+
}
350+
351+
362352
private function addCommentAndAttributes(
363353
PhpFile|ClassLike|Constant|Property|GlobalFunction|Method|Parameter|EnumCase|TraitUse $element,
364354
Node $node,
@@ -411,7 +401,8 @@ private function setupFunction(GlobalFunction|Method $function, Node\FunctionLik
411401

412402
$this->addCommentAndAttributes($function, $node);
413403
if ($node->getStmts()) {
414-
$function->setBody($this->getReformattedContents($node->getStmts(), 2));
404+
$indent = $function instanceof GlobalFunction ? 1 : 2;
405+
$function->setBody($this->getReformattedContents($node->getStmts(), $indent));
415406
}
416407
}
417408

src/PhpGenerator/Factory.php

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public function fromClassReflection(
101101
$methods[] = $m = $this->fromMethodReflection($method);
102102
if ($withBodies) {
103103
$bodies = &$this->bodyCache[$declaringClass->name];
104-
$bodies ??= $this->getExtractor($declaringClass)->extractMethodBodies($declaringClass->name);
104+
$bodies ??= $this->getExtractor($declaringClass->getFileName())->extractMethodBodies($declaringClass->name);
105105
if (isset($bodies[$declaringMethod->name])) {
106106
$m->setBody($bodies[$declaringMethod->name]);
107107
}
@@ -181,7 +181,7 @@ public function fromFunctionReflection(\ReflectionFunction $from, bool $withBody
181181
throw new Nette\NotSupportedException('The $withBody parameter cannot be used for closures or internal functions.');
182182
}
183183

184-
$function->setBody($this->getExtractor($from)->extractFunctionBody($from->name));
184+
$function->setBody($this->getExtractor($from->getFileName())->extractFunctionBody($from->name));
185185
}
186186

187187
return $function;
@@ -309,16 +309,10 @@ private function getVisibility($from): string
309309
}
310310

311311

312-
private function getExtractor($from): Extractor
312+
private function getExtractor(string $file): Extractor
313313
{
314-
$file = $from->getFileName();
315314
$cache = &$this->extractorCache[$file];
316-
if ($cache !== null) {
317-
return $cache;
318-
} elseif (!$file) {
319-
throw new Nette\InvalidStateException("Source code of $from->name not found.");
320-
}
321-
322-
return new Extractor(file_get_contents($file));
315+
$cache ??= new Extractor(file_get_contents($file));
316+
return $cache;
323317
}
324318
}

0 commit comments

Comments
 (0)