Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 14b2f71

Browse files
committed
Refactor keepVoid solution to not leak out of Scope
1 parent 100c78c commit 14b2f71

File tree

4 files changed

+27
-19
lines changed

4 files changed

+27
-19
lines changed

‎src/Analyser/MutatingScope.php‎

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ class MutatingScope implements Scope
150150

151151
private const BOOLEAN_EXPRESSION_MAX_PROCESS_DEPTH = 4;
152152

153+
private const KEEP_VOID_ATTRIBUTE_NAME = 'keepVoid';
154+
153155
/** @var Type[] */
154156
private array $resolvedTypes = [];
155157

@@ -676,8 +678,8 @@ private function getNodeKey(Expr $node): string
676678
$key .= '/*' . $node->getAttribute('startFilePos') . '*/';
677679
}
678680

679-
if ($node->hasAttribute('keepVoid')) {
680-
$key .= '/*keepVoid*/';
681+
if ($node->hasAttribute(self::KEEP_VOID_ATTRIBUTE_NAME)) {
682+
$key .= '/*' . self::KEEP_VOID_ATTRIBUTE_NAME . '*/';
681683
}
682684

683685
return $key;
@@ -1240,9 +1242,7 @@ private function resolveType(string $exprString, Expr $node): Type
12401242
new VoidType(),
12411243
]);
12421244
} else {
1243-
$expr = clone $node->expr;
1244-
$expr->setAttribute('keepVoid', true);
1245-
$returnType = $arrowScope->getType($expr);
1245+
$returnType = $arrowScope->getKeepVoidType($node->expr);
12461246
if ($node->returnType !== null) {
12471247
$returnType = TypehintHelper::decideType($this->getFunctionType($node->returnType, false, false), $returnType);
12481248
}
@@ -1498,8 +1498,8 @@ private function resolveType(string $exprString, Expr $node): Type
14981498
$matchScope = $this;
14991499
foreach ($node->arms as $arm) {
15001500
if ($arm->conds === null) {
1501-
if ($node->hasAttribute('keepVoid')) {
1502-
$arm->body->setAttribute('keepVoid', $node->getAttribute('keepVoid'));
1501+
if ($node->hasAttribute(self::KEEP_VOID_ATTRIBUTE_NAME)) {
1502+
$arm->body->setAttribute(self::KEEP_VOID_ATTRIBUTE_NAME, $node->getAttribute(self::KEEP_VOID_ATTRIBUTE_NAME));
15031503
}
15041504
$types[] = $matchScope->getType($arm->body);
15051505
continue;
@@ -1530,8 +1530,8 @@ private function resolveType(string $exprString, Expr $node): Type
15301530

15311531
if (!$filteringExprType->isFalse()->yes()) {
15321532
$truthyScope = $matchScope->filterByTruthyValue($filteringExpr);
1533-
if ($node->hasAttribute('keepVoid')) {
1534-
$arm->body->setAttribute('keepVoid', $node->getAttribute('keepVoid'));
1533+
if ($node->hasAttribute(self::KEEP_VOID_ATTRIBUTE_NAME)) {
1534+
$arm->body->setAttribute(self::KEEP_VOID_ATTRIBUTE_NAME, $node->getAttribute(self::KEEP_VOID_ATTRIBUTE_NAME));
15351535
}
15361536
$types[] = $truthyScope->getType($arm->body);
15371537
}
@@ -2000,7 +2000,7 @@ private function getNullsafeShortCircuitingType(Expr $expr, Type $type): Type
20002000

20012001
private function transformVoidToNull(Type $type, Node $node): Type
20022002
{
2003-
if ($node->getAttribute('keepVoid') === true) {
2003+
if ($node->getAttribute(self::KEEP_VOID_ATTRIBUTE_NAME) === true) {
20042004
return $type;
20052005
}
20062006

@@ -2204,6 +2204,14 @@ public function getNativeType(Expr $expr): Type
22042204
return $this->promoteNativeTypes()->getType($expr);
22052205
}
22062206

2207+
public function getKeepVoidType(Expr $node): Type
2208+
{
2209+
$clonedNode = clone $node;
2210+
$clonedNode->setAttribute(self::KEEP_VOID_ATTRIBUTE_NAME, true);
2211+
2212+
return $this->getType($clonedNode);
2213+
}
2214+
22072215
/**
22082216
* @api
22092217
* @deprecated Use getNativeType()

‎src/Analyser/Scope.php‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ public function getType(Expr $node): Type;
7777

7878
public function getNativeType(Expr $expr): Type;
7979

80+
public function getKeepVoidType(Expr $node): Type;
81+
8082
/**
8183
* @deprecated Use getNativeType()
8284
*/

‎src/Rules/Comparison/UsageOfVoidMatchExpressionRule.php‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ public function getNodeType(): string
2121
public function processNode(Node $node, Scope $scope): array
2222
{
2323
if (!$scope->isInFirstLevelStatement()) {
24-
$clonedNode = clone $node;
25-
$clonedNode->setAttribute('keepVoid', true);
26-
$matchResultType = $scope->getType($clonedNode);
24+
$matchResultType = $scope->getKeepVoidType($node);
2725
if ($matchResultType->isVoid()->yes()) {
2826
return [RuleErrorBuilder::message('Result of match expression (void) is used.')->build()];
2927
}

‎src/Rules/FunctionCallParametersCheck.php‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,12 @@ public function check(
207207
}
208208
}
209209

210-
if (!$funcCallinstanceofNode\Expr\New_ && !$scope->isInFirstLevelStatement()) {
211-
$clonedFuncCall = clone$funcCall;
212-
$clonedFuncCall->setAttribute('keepVoid', true);
213-
if ($scope->getType($clonedFuncCall)->isVoid()->yes()) {
214-
$errors[] = RuleErrorBuilder::message($messages[7])->line($funcCall->getLine())->build();
215-
}
210+
if (
211+
!$funcCallinstanceofNode\Expr\New_
212+
&& !$scope->isInFirstLevelStatement()
213+
&& $scope->getKeepVoidType($funcCall)->isVoid()->yes()
214+
) {
215+
$errors[] = RuleErrorBuilder::message($messages[7])->line($funcCall->getLine())->build();
216216
}
217217

218218
[$addedErrors, $argumentsWithParameters] = $this->processArguments($parametersAcceptor, $funcCall->getLine(), $isBuiltin, $arguments, $hasNamedArguments, $messages[10], $messages[11]);

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /