Skip to content

Commit 879b943

Browse files
phpstan-botclaude
andcommitted
Rename ToStringThrowPointHelper to ImplicitToStringCallHelper and return ExpressionResult
Rename the helper to better describe its purpose and change the return type from array{list<InternalThrowPoint>, list<ImpurePoint>} to ExpressionResult for a cleaner API at all call sites. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent a85d75b commit 879b943

12 files changed

+52
-43
lines changed

src/Analyser/ExprHandler/AssignOpHandler.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
use PHPStan\Analyser\ExpressionResult;
1414
use PHPStan\Analyser\ExpressionResultStorage;
1515
use PHPStan\Analyser\ExprHandler;
16-
use PHPStan\Analyser\ExprHandler\Helper\ToStringThrowPointHelper;
16+
use PHPStan\Analyser\ExprHandler\Helper\ImplicitToStringCallHelper;
1717
use PHPStan\Analyser\InternalThrowPoint;
1818
use PHPStan\Analyser\MutatingScope;
1919
use PHPStan\Analyser\NodeScopeResolver;
@@ -37,7 +37,7 @@ final class AssignOpHandler implements ExprHandler
3737
public function __construct(
3838
private AssignHandler $assignHandler,
3939
private InitializerExprTypeResolver $initializerExprTypeResolver,
40-
private ToStringThrowPointHelper $toStringThrowPointHelper,
40+
private ImplicitToStringCallHelper $implicitToStringCallHelper,
4141
)
4242
{
4343
}
@@ -96,9 +96,9 @@ static function (MutatingScope $scope) use ($stmt, $expr, $nodeCallback, $contex
9696
$throwPoints[] = InternalThrowPoint::createExplicit($scope, new ObjectType(DivisionByZeroError::class), $expr, false);
9797
}
9898
if ($expr instanceof Expr\AssignOp\Concat) {
99-
[$toStringThrowPoints, $toStringImpurePoints] = $this->toStringThrowPointHelper->getToStringThrowAndImpurePoints($expr->expr, $scope);
100-
$throwPoints = array_merge($throwPoints, $toStringThrowPoints);
101-
$impurePoints = array_merge($impurePoints, $toStringImpurePoints);
99+
$toStringResult = $this->implicitToStringCallHelper->processImplicitToStringCall($expr->expr, $scope);
100+
$throwPoints = array_merge($throwPoints, $toStringResult->getThrowPoints());
101+
$impurePoints = array_merge($impurePoints, $toStringResult->getImpurePoints());
102102
}
103103

104104
return new ExpressionResult(

src/Analyser/ExprHandler/BinaryOpHandler.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
use PHPStan\Analyser\ExpressionResult;
1414
use PHPStan\Analyser\ExpressionResultStorage;
1515
use PHPStan\Analyser\ExprHandler;
16-
use PHPStan\Analyser\ExprHandler\Helper\ToStringThrowPointHelper;
16+
use PHPStan\Analyser\ExprHandler\Helper\ImplicitToStringCallHelper;
1717
use PHPStan\Analyser\InternalThrowPoint;
1818
use PHPStan\Analyser\MutatingScope;
1919
use PHPStan\Analyser\NodeScopeResolver;
@@ -43,7 +43,7 @@ public function __construct(
4343
private InitializerExprTypeResolver $initializerExprTypeResolver,
4444
private RicherScopeGetTypeHelper $richerScopeGetTypeHelper,
4545
private PhpVersion $phpVersion,
46-
private ToStringThrowPointHelper $toStringThrowPointHelper,
46+
private ImplicitToStringCallHelper $implicitToStringCallHelper,
4747
)
4848
{
4949
}
@@ -72,10 +72,10 @@ public function processExpr(NodeScopeResolver $nodeScopeResolver, Stmt $stmt, Ex
7272
$throwPoints[] = InternalThrowPoint::createExplicit($leftResult->getScope(), new ObjectType(DivisionByZeroError::class), $expr, false);
7373
}
7474
if ($expr instanceof BinaryOp\Concat) {
75-
[$leftToStringThrowPoints, $leftToStringImpurePoints] = $this->toStringThrowPointHelper->getToStringThrowAndImpurePoints($expr->left, $scope);
76-
[$rightToStringThrowPoints, $rightToStringImpurePoints] = $this->toStringThrowPointHelper->getToStringThrowAndImpurePoints($expr->right, $leftResult->getScope());
77-
$throwPoints = array_merge($throwPoints, $leftToStringThrowPoints, $rightToStringThrowPoints);
78-
$impurePoints = array_merge($impurePoints, $leftToStringImpurePoints, $rightToStringImpurePoints);
75+
$leftToStringResult = $this->implicitToStringCallHelper->processImplicitToStringCall($expr->left, $scope);
76+
$rightToStringResult = $this->implicitToStringCallHelper->processImplicitToStringCall($expr->right, $leftResult->getScope());
77+
$throwPoints = array_merge($throwPoints, $leftToStringResult->getThrowPoints(), $rightToStringResult->getThrowPoints());
78+
$impurePoints = array_merge($impurePoints, $leftToStringResult->getImpurePoints(), $rightToStringResult->getImpurePoints());
7979
}
8080
$scope = $rightResult->getScope();
8181

src/Analyser/ExprHandler/CastStringHandler.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
use PHPStan\Analyser\ExpressionResult;
1010
use PHPStan\Analyser\ExpressionResultStorage;
1111
use PHPStan\Analyser\ExprHandler;
12-
use PHPStan\Analyser\ExprHandler\Helper\ToStringThrowPointHelper;
12+
use PHPStan\Analyser\ExprHandler\Helper\ImplicitToStringCallHelper;
1313
use PHPStan\Analyser\MutatingScope;
1414
use PHPStan\Analyser\NodeScopeResolver;
1515
use PHPStan\DependencyInjection\AutowiredService;
@@ -26,7 +26,7 @@ final class CastStringHandler implements ExprHandler
2626

2727
public function __construct(
2828
private InitializerExprTypeResolver $initializerExprTypeResolver,
29-
private ToStringThrowPointHelper $toStringThrowPointHelper,
29+
private ImplicitToStringCallHelper $implicitToStringCallHelper,
3030
)
3131
{
3232
}
@@ -42,9 +42,9 @@ public function processExpr(NodeScopeResolver $nodeScopeResolver, Stmt $stmt, Ex
4242
$impurePoints = $exprResult->getImpurePoints();
4343
$throwPoints = $exprResult->getThrowPoints();
4444

45-
[$toStringThrowPoints, $toStringImpurePoints] = $this->toStringThrowPointHelper->getToStringThrowAndImpurePoints($expr->expr, $scope);
46-
$throwPoints = array_merge($throwPoints, $toStringThrowPoints);
47-
$impurePoints = array_merge($impurePoints, $toStringImpurePoints);
45+
$toStringResult = $this->implicitToStringCallHelper->processImplicitToStringCall($expr->expr, $scope);
46+
$throwPoints = array_merge($throwPoints, $toStringResult->getThrowPoints());
47+
$impurePoints = array_merge($impurePoints, $toStringResult->getImpurePoints());
4848

4949
$scope = $exprResult->getScope();
5050

src/Analyser/ExprHandler/Helper/ToStringThrowPointHelper.php renamed to src/Analyser/ExprHandler/Helper/ImplicitToStringCallHelper.php

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44

55
use PhpParser\Node\Expr;
66
use PhpParser\Node\Identifier;
7+
use PHPStan\Analyser\ExpressionResult;
78
use PHPStan\Analyser\ImpurePoint;
8-
use PHPStan\Analyser\InternalThrowPoint;
99
use PHPStan\Analyser\MutatingScope;
1010
use PHPStan\DependencyInjection\AutowiredService;
1111
use PHPStan\Php\PhpVersion;
1212
use function sprintf;
1313

1414
#[AutowiredService]
15-
final class ToStringThrowPointHelper
15+
final class ImplicitToStringCallHelper
1616
{
1717

1818
public function __construct(
@@ -22,18 +22,21 @@ public function __construct(
2222
{
2323
}
2424

25-
/**
26-
* @return array{list<InternalThrowPoint>, list<ImpurePoint>}
27-
*/
28-
public function getToStringThrowAndImpurePoints(Expr $expr, MutatingScope $scope): array
25+
public function processImplicitToStringCall(Expr $expr, MutatingScope $scope): ExpressionResult
2926
{
3027
$throwPoints = [];
3128
$impurePoints = [];
3229

3330
$exprType = $scope->getType($expr);
3431
$toStringMethod = $scope->getMethodReflection($exprType, '__toString');
3532
if ($toStringMethod === null) {
36-
return [[], []];
33+
return new ExpressionResult(
34+
$scope,
35+
hasYield: false,
36+
isAlwaysTerminating: false,
37+
throwPoints: [],
38+
impurePoints: [],
39+
);
3740
}
3841

3942
if (!$toStringMethod->hasSideEffects()->no()) {
@@ -58,7 +61,13 @@ public function getToStringThrowAndImpurePoints(Expr $expr, MutatingScope $scope
5861
}
5962
}
6063

61-
return [$throwPoints, $impurePoints];
64+
return new ExpressionResult(
65+
$scope,
66+
hasYield: false,
67+
isAlwaysTerminating: false,
68+
throwPoints: $throwPoints,
69+
impurePoints: $impurePoints,
70+
);
6271
}
6372

6473
}

src/Analyser/ExprHandler/InterpolatedStringHandler.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
use PHPStan\Analyser\ExpressionResult;
1111
use PHPStan\Analyser\ExpressionResultStorage;
1212
use PHPStan\Analyser\ExprHandler;
13-
use PHPStan\Analyser\ExprHandler\Helper\ToStringThrowPointHelper;
13+
use PHPStan\Analyser\ExprHandler\Helper\ImplicitToStringCallHelper;
1414
use PHPStan\Analyser\MutatingScope;
1515
use PHPStan\Analyser\NodeScopeResolver;
1616
use PHPStan\DependencyInjection\AutowiredService;
@@ -28,7 +28,7 @@ final class InterpolatedStringHandler implements ExprHandler
2828

2929
public function __construct(
3030
private InitializerExprTypeResolver $initializerExprTypeResolver,
31-
private ToStringThrowPointHelper $toStringThrowPointHelper,
31+
private ImplicitToStringCallHelper $implicitToStringCallHelper,
3232
)
3333
{
3434
}
@@ -53,9 +53,9 @@ public function processExpr(NodeScopeResolver $nodeScopeResolver, Stmt $stmt, Ex
5353
$throwPoints = array_merge($throwPoints, $partResult->getThrowPoints());
5454
$impurePoints = array_merge($impurePoints, $partResult->getImpurePoints());
5555

56-
[$toStringThrowPoints, $toStringImpurePoints] = $this->toStringThrowPointHelper->getToStringThrowAndImpurePoints($part, $scope);
57-
$throwPoints = array_merge($throwPoints, $toStringThrowPoints);
58-
$impurePoints = array_merge($impurePoints, $toStringImpurePoints);
56+
$toStringResult = $this->implicitToStringCallHelper->processImplicitToStringCall($part, $scope);
57+
$throwPoints = array_merge($throwPoints, $toStringResult->getThrowPoints());
58+
$impurePoints = array_merge($impurePoints, $toStringResult->getImpurePoints());
5959

6060
$isAlwaysTerminating = $isAlwaysTerminating || $partResult->isAlwaysTerminating();
6161
$scope = $partResult->getScope();

src/Analyser/ExprHandler/PrintHandler.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
use PHPStan\Analyser\ExpressionResult;
1010
use PHPStan\Analyser\ExpressionResultStorage;
1111
use PHPStan\Analyser\ExprHandler;
12-
use PHPStan\Analyser\ExprHandler\Helper\ToStringThrowPointHelper;
12+
use PHPStan\Analyser\ExprHandler\Helper\ImplicitToStringCallHelper;
1313
use PHPStan\Analyser\ImpurePoint;
1414
use PHPStan\Analyser\MutatingScope;
1515
use PHPStan\Analyser\NodeScopeResolver;
@@ -26,7 +26,7 @@ final class PrintHandler implements ExprHandler
2626
{
2727

2828
public function __construct(
29-
private ToStringThrowPointHelper $toStringThrowPointHelper,
29+
private ImplicitToStringCallHelper $implicitToStringCallHelper,
3030
)
3131
{
3232
}
@@ -47,9 +47,9 @@ public function processExpr(NodeScopeResolver $nodeScopeResolver, Stmt $stmt, Ex
4747
$throwPoints = $exprResult->getThrowPoints();
4848
$impurePoints = $exprResult->getImpurePoints();
4949

50-
[$toStringThrowPoints, $toStringImpurePoints] = $this->toStringThrowPointHelper->getToStringThrowAndImpurePoints($expr->expr, $scope);
51-
$throwPoints = array_merge($throwPoints, $toStringThrowPoints);
52-
$impurePoints = array_merge($impurePoints, $toStringImpurePoints);
50+
$toStringResult = $this->implicitToStringCallHelper->processImplicitToStringCall($expr->expr, $scope);
51+
$throwPoints = array_merge($throwPoints, $toStringResult->getThrowPoints());
52+
$impurePoints = array_merge($impurePoints, $toStringResult->getImpurePoints());
5353

5454
$scope = $exprResult->getScope();
5555

src/Analyser/NodeScopeResolver.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
use PhpParser\NodeTraverser;
5050
use PhpParser\NodeVisitorAbstract;
5151
use PHPStan\Analyser\ExprHandler\AssignHandler;
52-
use PHPStan\Analyser\ExprHandler\Helper\ToStringThrowPointHelper;
52+
use PHPStan\Analyser\ExprHandler\Helper\ImplicitToStringCallHelper;
5353
use PHPStan\BetterReflection\Reflection\Adapter\ReflectionClass;
5454
use PHPStan\BetterReflection\Reflection\ReflectionEnum;
5555
use PHPStan\BetterReflection\Reflector\Reflector;
@@ -237,7 +237,7 @@ public function __construct(
237237
private readonly bool $implicitThrows,
238238
#[AutowiredParameter]
239239
private readonly bool $treatPhpDocTypesAsCertain,
240-
private readonly ToStringThrowPointHelper $toStringThrowPointHelper,
240+
private readonly ImplicitToStringCallHelper $implicitToStringCallHelper,
241241
)
242242
{
243243
$earlyTerminatingMethodNames = [];
@@ -867,8 +867,8 @@ public function processStmtNode(
867867
foreach ($stmt->exprs as $echoExpr) {
868868
$result = $this->processExprNode($stmt, $echoExpr, $scope, $storage, $nodeCallback, ExpressionContext::createDeep());
869869
$throwPoints = array_merge($throwPoints, $result->getThrowPoints());
870-
[$toStringThrowPoints] = $this->toStringThrowPointHelper->getToStringThrowAndImpurePoints($echoExpr, $scope);
871-
$throwPoints = array_merge($throwPoints, $toStringThrowPoints);
870+
$toStringResult = $this->implicitToStringCallHelper->processImplicitToStringCall($echoExpr, $scope);
871+
$throwPoints = array_merge($throwPoints, $toStringResult->getThrowPoints());
872872
$scope = $result->getScope();
873873
$hasYield = $hasYield || $result->hasYield();
874874
$isAlwaysTerminating = $isAlwaysTerminating || $result->isAlwaysTerminating();

src/Testing/RuleTestCase.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ protected function createNodeScopeResolver(): NodeScopeResolver
116116
[],
117117
self::getContainer()->getParameter('exceptions')['implicitThrows'],
118118
$this->shouldTreatPhpDocTypesAsCertain(),
119-
self::getContainer()->getByType(\PHPStan\Analyser\ExprHandler\Helper\ToStringThrowPointHelper::class),
119+
self::getContainer()->getByType(\PHPStan\Analyser\ExprHandler\Helper\ImplicitToStringCallHelper::class),
120120
);
121121
}
122122

src/Testing/TypeInferenceTestCase.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ protected static function createNodeScopeResolver(): NodeScopeResolver
9191
static::getEarlyTerminatingFunctionCalls(),
9292
$container->getParameter('exceptions')['implicitThrows'],
9393
$container->getParameter('treatPhpDocTypesAsCertain'),
94-
$container->getByType(\PHPStan\Analyser\ExprHandler\Helper\ToStringThrowPointHelper::class),
94+
$container->getByType(\PHPStan\Analyser\ExprHandler\Helper\ImplicitToStringCallHelper::class),
9595
);
9696
}
9797

tests/PHPStan/Analyser/AnalyserTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -832,7 +832,7 @@ private function createAnalyser(): Analyser
832832
[],
833833
true,
834834
$this->shouldTreatPhpDocTypesAsCertain(),
835-
$container->getByType(\PHPStan\Analyser\ExprHandler\Helper\ToStringThrowPointHelper::class),
835+
$container->getByType(\PHPStan\Analyser\ExprHandler\Helper\ImplicitToStringCallHelper::class),
836836
);
837837
$lexer = new Lexer();
838838
$fileAnalyser = new FileAnalyser(

0 commit comments

Comments
 (0)