@@ -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