Skip to content

Commit a7987eb

Browse files
authored
Twig templates: traverse even arrays of view models (#290)
1 parent a60d04d commit a7987eb

File tree

2 files changed

+9
-17
lines changed

2 files changed

+9
-17
lines changed

src/Provider/TwigUsageProvider.php

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
use PHPStan\Reflection\ExtendedMethodReflection;
1919
use PHPStan\Reflection\ParametersAcceptorSelector;
2020
use PHPStan\Reflection\ReflectionProvider;
21-
use PHPStan\Type\Type;
2221
use PHPStan\Type\UnionType;
2322
use ReflectionException;
2423
use ShipMonk\PHPStan\DeadCode\Enum\AccessType;
@@ -294,8 +293,7 @@ private function getUsagesFromTemplateReturn(
294293
return [];
295294
}
296295

297-
$returnType = $scope->getType($node->expr);
298-
$referencedClassNames = $this->extractObjectTypes($returnType);
296+
$referencedClassNames = $scope->getType($node->expr)->getReferencedClasses();
299297

300298
$usages = [];
301299
$visited = [];
@@ -337,9 +335,7 @@ private function getUsagesFromRenderCall(
337335
}
338336

339337
$parametersArg = $args[$parametersArgIndex];
340-
$parametersType = $scope->getType($parametersArg->value);
341-
342-
$objectTypes = $this->extractObjectTypes($parametersType);
338+
$objectTypes = $scope->getType($parametersArg->value)->getReferencedClasses();
343339

344340
$usages = [];
345341
$visited = [];
@@ -457,14 +453,6 @@ private function isInControllerMethodWithTemplate(
457453
return false;
458454
}
459455

460-
/**
461-
* @return list<string>
462-
*/
463-
private function extractObjectTypes(Type $returnType): array
464-
{
465-
return $returnType->getReferencedClasses();
466-
}
467-
468456
/**
469457
* @param non-empty-string $context
470458
* @param array<string, true> $visited
@@ -533,7 +521,7 @@ private function getPublicMembersUsages(
533521
foreach ($variants as $variant) {
534522
$returnType = $variant->getReturnType();
535523

536-
foreach ($returnType->getObjectClassNames() as $returnClassName) {
524+
foreach ($returnType->getReferencedClasses() as $returnClassName) {
537525
$usages = [
538526
...$usages,
539527
...$this->traverseClassNameRecursively(
@@ -557,7 +545,7 @@ private function getPublicMembersUsages(
557545
$propertyReflection = $classReflection->getNativeProperty($property->getName());
558546
$newContext = "{$context} -> {$shortClassName}::\${$property->getName()}";
559547

560-
foreach ($propertyReflection->getReadableType()->getObjectClassNames() as $propertyClassName) {
548+
foreach ($propertyReflection->getReadableType()->getReferencedClasses() as $propertyClassName) {
561549
$usages = [
562550
...$usages,
563551
...$this->traverseClassNameRecursively(

tests/Rule/data/providers/twig-template.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ final class TemplateNestedData
2222
public int $nestedProperty = 1;
2323

2424
public function getValue(): string { return 'nested'; }
25-
public function getDeep(): TemplateDeepData { return new TemplateDeepData(); }
25+
26+
/**
27+
* @return TemplateDeepData[]
28+
*/
29+
public function getDeep(): array { return [new TemplateDeepData()]; }
2630
}
2731

2832
final class TemplateDeepData

0 commit comments

Comments
 (0)