Skip to content

Commit 20042cb

Browse files
committed
Debug when expr was already analysed
1 parent 05b80ef commit 20042cb

File tree

2 files changed

+39
-7
lines changed

2 files changed

+39
-7
lines changed

src/Analyser/Generator/ExprAnalysisResultStorage.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,45 @@ final class ExprAnalysisResultStorage
1414
/** @var SplObjectStorage<Expr, ExprAnalysisResult> */
1515
private SplObjectStorage $expressionAnalysisResults;
1616

17+
/** @var SplObjectStorage<Expr, array{list<IdentifiedGeneratorInStack>, ?string, ?int}> */
18+
private SplObjectStorage $whereAnalysed;
19+
1720
public function __construct()
1821
{
1922
$this->expressionAnalysisResults = new SplObjectStorage();
23+
$this->whereAnalysed = new SplObjectStorage();
2024
}
2125

2226
public function duplicate(): self
2327
{
2428
$new = new self();
2529
$new->expressionAnalysisResults->addAll($this->expressionAnalysisResults);
30+
$new->whereAnalysed->addAll($this->whereAnalysed);
2631
return $new;
2732
}
2833

29-
public function storeExprAnalysisResult(Expr $expr, ExprAnalysisResult $result): void
34+
/**
35+
* @param list<IdentifiedGeneratorInStack> $stack
36+
*/
37+
public function storeExprAnalysisResult(Expr $expr, ExprAnalysisResult $result, array $stack, ?string $file, ?int $line): void
3038
{
3139
$this->expressionAnalysisResults[$expr] = $result;
40+
$this->whereAnalysed[$expr] = [$stack, $file, $line];
3241
}
3342

3443
public function findExprAnalysisResult(Expr $expr): ?ExprAnalysisResult
3544
{
3645
return $this->expressionAnalysisResults[$expr] ?? null;
3746
}
3847

48+
/**
49+
* @return array{list<IdentifiedGeneratorInStack>, ?string, ?int}|null
50+
*/
51+
public function findExprAnalysisResultOrigin(Expr $expr): ?array
52+
{
53+
return $this->whereAnalysed[$expr] ?? null;
54+
}
55+
3956
public function getExprAnalysisResult(Expr $expr): ExprAnalysisResult
4057
{
4158
if (!isset($this->expressionAnalysisResults[$expr])) {

src/Analyser/Generator/GeneratorNodeScopeResolver.php

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ private function runTrampoline(
204204
} elseif ($yielded instanceof ExprAnalysisRequest) {
205205
$stack[] = $gen;
206206
$gen = new IdentifiedGeneratorInStack(
207-
$this->analyseExpr($exprAnalysisResultStorage, $yielded->stmt, $yielded->expr, $yielded->scope, $yielded->context, $yielded->alternativeNodeCallback),
207+
$this->analyseExpr($exprAnalysisResultStorage, $yielded->stmt, $yielded->expr, $yielded->scope, $yielded->context, $yielded->alternativeNodeCallback, $stack, $yielded->originFile, $yielded->originLine),
208208
$yielded->expr,
209209
$yielded->originFile,
210210
$yielded->originLine,
@@ -292,7 +292,7 @@ private function runTrampoline(
292292

293293
$stack[] = $gen;
294294
$gen = new IdentifiedGeneratorInStack(
295-
$this->analyseExpr($exprAnalysisResultStorage, $request->stmt, $request->expr, $request->scope, $request->context, $request->alternativeNodeCallback),
295+
$this->analyseExpr($exprAnalysisResultStorage, $request->stmt, $request->expr, $request->scope, $request->context, $request->alternativeNodeCallback, $stack, $request->originFile, $request->originLine),
296296
$request->expr,
297297
$request->originFile,
298298
$request->originLine,
@@ -418,17 +418,32 @@ private function runInFiber(callable $callback): Generator
418418

419419
/**
420420
* @param (callable(Node, Scope, callable(Node, Scope): void): void)|null $alternativeNodeCallback
421+
* @param list<IdentifiedGeneratorInStack> $stack
421422
* @return Generator<int, GeneratorTValueType, GeneratorTSendType, ExprAnalysisResult>
422423
*/
423-
private function analyseExpr(ExprAnalysisResultStorage $storage, Stmt $stmt, Expr $expr, GeneratorScope $scope, ExpressionContext $context, ?callable $alternativeNodeCallback): Generator
424+
private function analyseExpr(ExprAnalysisResultStorage $storage, Stmt $stmt, Expr $expr, GeneratorScope $scope, ExpressionContext $context, ?callable $alternativeNodeCallback, array $stack, ?string $file, ?int $line): Generator
424425
{
425426
$foundExprAnalysisResult = $storage->findExprAnalysisResult($expr);
426427
if ($foundExprAnalysisResult !== null) {
427428
if ($alternativeNodeCallback instanceof NoopNodeCallback) {
428429
return $foundExprAnalysisResult;
429430
}
430431

431-
throw new ShouldNotHappenException(sprintf('Expr %s on line %d has already been analysed', $this->exprPrinter->printExpr($expr), $expr->getStartLine()));
432+
$where = "\n";
433+
$origin = $storage->findExprAnalysisResultOrigin($expr);
434+
if ($origin !== null) {
435+
[$originStack, $originFile, $originLine] = $origin;
436+
foreach ($originStack as $originStackItem) {
437+
$where .= (string) $originStackItem . "\n";
438+
}
439+
440+
if ($originFile !== null && $originLine !== null) {
441+
$where .= $originFile . ':' . $originLine;
442+
$where .= "\n";
443+
}
444+
}
445+
446+
throw new ShouldNotHappenException(sprintf('Expr %s on line %d has already been analysed in:%s', $this->exprPrinter->printExpr($expr), $expr->getStartLine(), $where));
432447
}
433448

434449
if ($expr instanceof Expr\CallLike && $expr->isFirstClassCallable()) {
@@ -444,7 +459,7 @@ private function analyseExpr(ExprAnalysisResultStorage $storage, Stmt $stmt, Exp
444459
throw new ShouldNotHappenException();
445460
}
446461

447-
$exprGen = $this->analyseExpr($storage, $stmt, $newExpr, $scope, $context, $alternativeNodeCallback);
462+
$exprGen = $this->analyseExpr($storage, $stmt, $newExpr, $scope, $context, $alternativeNodeCallback, $stack, $file, $line);
448463
yield from $exprGen;
449464

450465
return $exprGen->getReturn();
@@ -464,7 +479,7 @@ private function analyseExpr(ExprAnalysisResultStorage $storage, Stmt $stmt, Exp
464479
yield from $gen;
465480

466481
$exprAnalysisResult = $gen->getReturn();
467-
$storage->storeExprAnalysisResult($expr, $exprAnalysisResult);
482+
$storage->storeExprAnalysisResult($expr, $exprAnalysisResult, $stack, $file, $line);
468483

469484
return $exprAnalysisResult;
470485
}

0 commit comments

Comments
 (0)