Skip to content

Commit

Permalink
Prevent overly greedy $scope->getType() calls in Yield*Rules
Browse files Browse the repository at this point in the history
  • Loading branch information
staabm authored and ondrejmirtes committed Dec 13, 2022
1 parent 9e423bc commit 8c58c09
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 8 deletions.
2 changes: 1 addition & 1 deletion src/Rules/Generators/YieldFromTypeRule.php
Expand Up @@ -126,7 +126,7 @@ public function processNode(Node $node, Scope $scope): array
))->build();
}

if ($scope->getType($node)->isVoid()->yes() && !$scope->isInFirstLevelStatement()) {
if (!$scope->isInFirstLevelStatement() && $scope->getType($node)->isVoid()->yes()) {
$messages[] = RuleErrorBuilder::message('Result of yield from (void) is used.')->build();
}

Expand Down
15 changes: 8 additions & 7 deletions src/Rules/Generators/YieldTypeRule.php
Expand Up @@ -53,12 +53,6 @@ public function processNode(Node $node, Scope $scope): array
$keyType = $scope->getType($node->key);
}

if ($node->value === null) {
$valueType = new NullType();
} else {
$valueType = $scope->getType($node->value);
}

$messages = [];
if (!$this->ruleLevelHelper->accepts($returnType->getIterableKeyType(), $keyType, $scope->isDeclareStrictTypes())) {
$verbosityLevel = VerbosityLevel::getRecommendedLevelByType($returnType->getIterableKeyType(), $keyType);
Expand All @@ -68,6 +62,13 @@ public function processNode(Node $node, Scope $scope): array
$keyType->describe($verbosityLevel),
))->build();
}

if ($node->value === null) {
$valueType = new NullType();
} else {
$valueType = $scope->getType($node->value);
}

if (!$this->ruleLevelHelper->accepts($returnType->getIterableValueType(), $valueType, $scope->isDeclareStrictTypes())) {
$verbosityLevel = VerbosityLevel::getRecommendedLevelByType($returnType->getIterableValueType(), $valueType);
$messages[] = RuleErrorBuilder::message(sprintf(
Expand All @@ -76,7 +77,7 @@ public function processNode(Node $node, Scope $scope): array
$valueType->describe($verbosityLevel),
))->build();
}
if ($scope->getType($node)->isVoid()->yes() && !$scope->isInFirstLevelStatement()) {
if (!$scope->isInFirstLevelStatement() && $scope->getType($node)->isVoid()->yes()) {
$messages[] = RuleErrorBuilder::message('Result of yield (void) is used.')->build();
}

Expand Down

0 comments on commit 8c58c09

Please sign in to comment.