Skip to content

Commit 46e7209

Browse files
committed
Prevent unnecssary Type traversal
1 parent f387269 commit 46e7209

File tree

3 files changed

+43
-30
lines changed

3 files changed

+43
-30
lines changed

src/Analyser/TypeSpecifier.php

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1553,36 +1553,43 @@ private function specifyTypesFromAsserts(TypeSpecifierContext $context, Expr\Cal
15531553

15541554
foreach ($asserts as $assert) {
15551555
foreach ($argsMap[substr($assert->getParameter()->getParameterName(), 1)] ?? [] as $parameterExpr) {
1556-
$assertedType = TypeTraverser::map($assert->getType(), static function (Type $type, callable $traverse) use ($argsMap, $scope): Type {
1557-
if ($type instanceof ConditionalTypeForParameter) {
1558-
$parameterName = substr($type->getParameterName(), 1);
1559-
if (array_key_exists($parameterName, $argsMap)) {
1560-
$argType = TypeCombinator::union(...array_map(static fn (Expr $expr) => $scope->getType($expr), $argsMap[$parameterName]));
1561-
$type = $type->toConditional($argType);
1556+
$assertedType = $assert->getType();
1557+
1558+
if ($assertedType->hasTemplateOrLateResolvableType()) {
1559+
$assertedType = TypeTraverser::map($assertedType, static function (Type $type, callable $traverse) use ($argsMap, $scope): Type {
1560+
if ($type instanceof ConditionalTypeForParameter) {
1561+
$parameterName = substr($type->getParameterName(), 1);
1562+
if (array_key_exists($parameterName, $argsMap)) {
1563+
$argType = TypeCombinator::union(...array_map(static fn (Expr $expr) => $scope->getType($expr), $argsMap[$parameterName]));
1564+
$type = $type->toConditional($argType);
1565+
}
15621566
}
1563-
}
15641567

1565-
return $traverse($type);
1566-
});
1568+
return $traverse($type);
1569+
});
1570+
}
15671571

15681572
$assertExpr = $assert->getParameter()->getExpr($parameterExpr);
15691573

1570-
$templateTypeMap = $parametersAcceptor->getResolvedTemplateTypeMap();
15711574
$containsUnresolvedTemplate = false;
1572-
TypeTraverser::map(
1573-
$assert->getOriginalType(),
1574-
static function (Type $type, callable $traverse) use ($templateTypeMap, &$containsUnresolvedTemplate) {
1575-
if ($type instanceof TemplateType && $type->getScope()->getClassName() !== null) {
1576-
$resolvedType = $templateTypeMap->getType($type->getName());
1577-
if ($resolvedType === null || $type->getBound()->equals($resolvedType)) {
1578-
$containsUnresolvedTemplate = true;
1579-
return $type;
1575+
if ($assert->getOriginalType()->hasTemplateOrLateResolvableType()) {
1576+
$templateTypeMap = $parametersAcceptor->getResolvedTemplateTypeMap();
1577+
1578+
TypeTraverser::map(
1579+
$assert->getOriginalType(),
1580+
static function (Type $type, callable $traverse) use ($templateTypeMap, &$containsUnresolvedTemplate) {
1581+
if ($type instanceof TemplateType && $type->getScope()->getClassName() !== null) {
1582+
$resolvedType = $templateTypeMap->getType($type->getName());
1583+
if ($resolvedType === null || $type->getBound()->equals($resolvedType)) {
1584+
$containsUnresolvedTemplate = true;
1585+
return $type;
1586+
}
15801587
}
1581-
}
15821588

1583-
return $traverse($type);
1584-
},
1585-
);
1589+
return $traverse($type);
1590+
},
1591+
);
1592+
}
15861593

15871594
$newTypes = $this->create(
15881595
$assertExpr,

src/Rules/FunctionDefinitionCheck.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,10 @@ private function checkParametersAcceptor(
591591
$templateTypes = $templateTypeMap->getTypes();
592592
if (count($templateTypes) > 0) {
593593
foreach ($parametersAcceptor->getParameters() as $parameter) {
594+
if (!$parameter->getType()->hasTemplateOrLateResolvableType()) {
595+
continue;
596+
}
597+
594598
TypeTraverser::map($parameter->getType(), static function (Type $type, callable $traverse) use (&$templateTypes): Type {
595599
if ($type instanceof TemplateType) {
596600
unset($templateTypes[$type->getName()]);

src/Rules/PhpDoc/ConditionalReturnTypeRuleHelper.php

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,16 @@ public function check(ExtendedParametersAcceptor $acceptor): array
7777
continue;
7878
}
7979
$templateTypes = [];
80-
TypeTraverser::map($subjectType, static function (Type $type, callable $traverse) use (&$templateTypes): Type {
81-
if ($type instanceof TemplateType) {
82-
$templateTypes[] = $type;
83-
return $type;
84-
}
85-
86-
return $traverse($type);
87-
});
80+
if ($subjectType->hasTemplateOrLateResolvableType()) {
81+
TypeTraverser::map($subjectType, static function (Type $type, callable $traverse) use (&$templateTypes): Type {
82+
if ($type instanceof TemplateType) {
83+
$templateTypes[] = $type;
84+
return $type;
85+
}
86+
87+
return $traverse($type);
88+
});
89+
}
8890

8991
if (count($templateTypes) === 0) {
9092
$errors[] = RuleErrorBuilder::message(sprintf('Conditional return type uses subject type %s which is not part of PHPDoc @template tags.', $subjectType->describe(VerbosityLevel::typeOnly())))

0 commit comments

Comments
 (0)