2424use PHPStan \Analyser \ExpressionTypeHolder ;
2525use PHPStan \Analyser \Generator \ExprAnalysisRequest ;
2626use PHPStan \Analyser \Generator \ExprAnalysisResult ;
27- use PHPStan \Analyser \Generator \ExprAnalysisResultStorage ;
2827use PHPStan \Analyser \Generator \ExprHandler ;
2928use PHPStan \Analyser \Generator \GeneratorScope ;
3029use PHPStan \Analyser \Generator \InternalThrowPoint ;
@@ -102,7 +101,6 @@ public function analyseExpr(
102101 Stmt $ stmt ,
103102 Expr $ expr ,
104103 GeneratorScope $ scope ,
105- ExprAnalysisResultStorage $ storage ,
106104 ExpressionContext $ context ,
107105 ?callable $ alternativeNodeCallback ,
108106 ): Generator
@@ -112,7 +110,6 @@ public function analyseExpr(
112110 $ stmt ,
113111 $ expr ->var ,
114112 $ expr ->expr ,
115- $ storage ,
116113 $ context ,
117114 $ alternativeNodeCallback ,
118115 static function (GeneratorScope $ scope ) use ($ stmt , $ expr , $ context , $ alternativeNodeCallback ): Generator {
@@ -376,7 +373,6 @@ private function processAssignVar(
376373 Node \Stmt $ stmt ,
377374 Expr $ var ,
378375 Expr $ assignedExpr ,
379- ExprAnalysisResultStorage $ storage ,
380376 ExpressionContext $ context ,
381377 ?callable $ alternativeNodeCallback ,
382378 Closure $ processExprCallback ,
@@ -415,10 +411,21 @@ private function processAssignVar(
415411 $ truthyResult ->type ->isSuperTypeOf ($ falseyResult ->type )->no ()
416412 && $ falseyResult ->type ->isSuperTypeOf ($ truthyResult ->type )->no ()
417413 ) {
418- $ conditionalExpressions = $ this ->processSureTypesForConditionalExpressionsAfterAssign ($ storage , $ var ->name , $ conditionalExpressions , $ condResult ->specifiedTruthyTypes , $ truthyResult ->type );
419- $ conditionalExpressions = $ this ->processSureNotTypesForConditionalExpressionsAfterAssign ($ storage , $ var ->name , $ conditionalExpressions , $ condResult ->specifiedTruthyTypes , $ truthyResult ->type );
420- $ conditionalExpressions = $ this ->processSureTypesForConditionalExpressionsAfterAssign ($ storage , $ var ->name , $ conditionalExpressions , $ condResult ->specifiedFalseyTypes , $ falseyResult ->type );
421- $ conditionalExpressions = $ this ->processSureNotTypesForConditionalExpressionsAfterAssign ($ storage , $ var ->name , $ conditionalExpressions , $ condResult ->specifiedFalseyTypes , $ falseyResult ->type );
414+ $ sureTypesGen = $ this ->processSureTypesForConditionalExpressionsAfterAssign ($ var ->name , $ conditionalExpressions , $ condResult ->specifiedTruthyTypes , $ truthyResult ->type );
415+ yield from $ sureTypesGen ;
416+ $ conditionalExpressions = $ sureTypesGen ->getReturn ();
417+
418+ $ sureTypesGen = $ this ->processSureNotTypesForConditionalExpressionsAfterAssign ($ var ->name , $ conditionalExpressions , $ condResult ->specifiedTruthyTypes , $ truthyResult ->type );
419+ yield from $ sureTypesGen ;
420+ $ conditionalExpressions = $ sureTypesGen ->getReturn ();
421+
422+ $ sureTypesGen = $ this ->processSureTypesForConditionalExpressionsAfterAssign ($ var ->name , $ conditionalExpressions , $ condResult ->specifiedFalseyTypes , $ falseyResult ->type );
423+ yield from $ sureTypesGen ;
424+ $ conditionalExpressions = $ sureTypesGen ->getReturn ();
425+
426+ $ sureTypesGen = $ this ->processSureNotTypesForConditionalExpressionsAfterAssign ($ var ->name , $ conditionalExpressions , $ condResult ->specifiedFalseyTypes , $ falseyResult ->type );
427+ yield from $ sureTypesGen ;
428+ $ conditionalExpressions = $ sureTypesGen ->getReturn ();
422429 }
423430 }
424431
@@ -428,10 +435,21 @@ private function processAssignVar(
428435 $ truthyType = TypeCombinator::removeFalsey ($ type );
429436 $ falseyType = TypeCombinator::intersect ($ type , StaticTypeFactory::falsey ());
430437
431- $ conditionalExpressions = $ this ->processSureTypesForConditionalExpressionsAfterAssign ($ storage , $ var ->name , $ conditionalExpressions , $ result ->specifiedTruthyTypes , $ truthyType );
432- $ conditionalExpressions = $ this ->processSureNotTypesForConditionalExpressionsAfterAssign ($ storage , $ var ->name , $ conditionalExpressions , $ result ->specifiedTruthyTypes , $ truthyType );
433- $ conditionalExpressions = $ this ->processSureTypesForConditionalExpressionsAfterAssign ($ storage , $ var ->name , $ conditionalExpressions , $ result ->specifiedFalseyTypes , $ falseyType );
434- $ conditionalExpressions = $ this ->processSureNotTypesForConditionalExpressionsAfterAssign ($ storage , $ var ->name , $ conditionalExpressions , $ result ->specifiedFalseyTypes , $ falseyType );
438+ $ sureTypesGen = $ this ->processSureTypesForConditionalExpressionsAfterAssign ($ var ->name , $ conditionalExpressions , $ result ->specifiedTruthyTypes , $ truthyType );
439+ yield from $ sureTypesGen ;
440+ $ conditionalExpressions = $ sureTypesGen ->getReturn ();
441+
442+ $ sureTypesGen = $ this ->processSureNotTypesForConditionalExpressionsAfterAssign ($ var ->name , $ conditionalExpressions , $ result ->specifiedTruthyTypes , $ truthyType );
443+ yield from $ sureTypesGen ;
444+ $ conditionalExpressions = $ sureTypesGen ->getReturn ();
445+
446+ $ sureTypesGen = $ this ->processSureTypesForConditionalExpressionsAfterAssign ($ var ->name , $ conditionalExpressions , $ result ->specifiedFalseyTypes , $ falseyType );
447+ yield from $ sureTypesGen ;
448+ $ conditionalExpressions = $ sureTypesGen ->getReturn ();
449+
450+ $ sureTypesGen = $ this ->processSureNotTypesForConditionalExpressionsAfterAssign ($ var ->name , $ conditionalExpressions , $ result ->specifiedFalseyTypes , $ falseyType );
451+ yield from $ sureTypesGen ;
452+ $ conditionalExpressions = $ sureTypesGen ->getReturn ();
435453
436454 yield new NodeCallbackRequest (new VariableAssignNode ($ var , $ assignedExpr ), $ scopeBeforeAssignEval );
437455
@@ -562,10 +580,14 @@ private function processAssignVar(
562580 $ offsetValueType = $ varType ;
563581 $ offsetNativeValueType = $ varNativeType ;
564582
565- [$ valueToWrite , $ additionalExpressions ] = $ this ->produceArrayDimFetchAssignValueToWrite ($ dimFetchStack , $ offsetTypes , $ offsetValueType , $ valueToWrite , $ scope , $ storage , false );
583+ $ produceArrayDimFetchAssignValueToWriteGen = $ this ->produceArrayDimFetchAssignValueToWrite ($ dimFetchStack , $ offsetTypes , $ offsetValueType , $ valueToWrite , $ scope , false );
584+ yield from $ produceArrayDimFetchAssignValueToWriteGen ;
585+ [$ valueToWrite , $ additionalExpressions ] = $ produceArrayDimFetchAssignValueToWriteGen ->getReturn ();
566586
567587 if (!$ offsetValueType ->equals ($ offsetNativeValueType ) || !$ valueToWrite ->equals ($ nativeValueToWrite )) {
568- [$ nativeValueToWrite , $ additionalNativeExpressions ] = $ this ->produceArrayDimFetchAssignValueToWrite ($ dimFetchStack , $ offsetNativeTypes , $ offsetNativeValueType , $ nativeValueToWrite , $ scope , $ storage , true );
588+ $ produceArrayDimFetchAssignNativeValueToWriteGen = $ this ->produceArrayDimFetchAssignValueToWrite ($ dimFetchStack , $ offsetNativeTypes , $ offsetNativeValueType , $ nativeValueToWrite , $ scope , true );
589+ yield from $ produceArrayDimFetchAssignNativeValueToWriteGen ;
590+ [$ nativeValueToWrite , $ additionalNativeExpressions ] = $ produceArrayDimFetchAssignNativeValueToWriteGen ->getReturn ();
569591 } else {
570592 $ rewritten = false ;
571593 foreach ($ offsetTypes as $ i => [$ offsetType ]) {
@@ -584,7 +606,9 @@ private function processAssignVar(
584606 continue ;
585607 }
586608
587- [$ nativeValueToWrite ] = $ this ->produceArrayDimFetchAssignValueToWrite ($ dimFetchStack , $ offsetNativeTypes , $ offsetNativeValueType , $ nativeValueToWrite , $ scope , $ storage , true );
609+ $ produceArrayDimFetchAssignNativeValueToWriteGen = $ this ->produceArrayDimFetchAssignValueToWrite ($ dimFetchStack , $ offsetNativeTypes , $ offsetNativeValueType , $ nativeValueToWrite , $ scope , true );
610+ yield from $ produceArrayDimFetchAssignNativeValueToWriteGen ;
611+ [$ nativeValueToWrite ] = $ produceArrayDimFetchAssignNativeValueToWriteGen ->getReturn ();
588612 $ rewritten = true ;
589613 break ;
590614 }
@@ -604,7 +628,7 @@ private function processAssignVar(
604628 if ($ var instanceof PropertyFetch || $ var instanceof StaticPropertyFetch) {
605629 yield new NodeCallbackRequest (new PropertyAssignNode ($ var , $ assignedPropertyExpr , $ isAssignOp ), $ scopeBeforeAssignEval );
606630 if ($ var instanceof PropertyFetch && $ var ->name instanceof Node \Identifier && !$ isAssignOp ) {
607- $ scope = $ scope ->assignInitializedProperty ($ storage -> getExprAnalysisResult ( $ var ->var )->type , $ var ->name ->toString ());
631+ $ scope = $ scope ->assignInitializedProperty (( yield new TypeExprRequest ( $ var ->var ) )->type , $ var ->name ->toString ());
608632 }
609633 }
610634 $ assignExprGen = $ scope ->assignExpression (
@@ -621,7 +645,7 @@ private function processAssignVar(
621645 } elseif ($ var instanceof PropertyFetch || $ var instanceof StaticPropertyFetch) {
622646 yield new NodeCallbackRequest (new PropertyAssignNode ($ var , $ assignedPropertyExpr , $ isAssignOp ), $ scopeBeforeAssignEval );
623647 if ($ var instanceof PropertyFetch && $ var ->name instanceof Node \Identifier && !$ isAssignOp ) {
624- $ scope = $ scope ->assignInitializedProperty ($ storage -> getExprAnalysisResult ( $ var ->var )->type , $ var ->name ->toString ());
648+ $ scope = $ scope ->assignInitializedProperty (( yield new TypeExprRequest ( $ var ->var ) )->type , $ var ->name ->toString ());
625649 }
626650 }
627651 }
@@ -913,7 +937,6 @@ private function processAssignVar(
913937 $ stmt ,
914938 $ arrayItem ->value ,
915939 new GetOffsetValueTypeExpr ($ assignedExpr , $ dimExpr ),
916- $ storage ,
917940 $ context ,
918941 $ alternativeNodeCallback ,
919942 static function (GeneratorScope $ scope ): Generator {
@@ -1077,9 +1100,9 @@ static function (GeneratorScope $scope): Generator {
10771100
10781101 /**
10791102 * @param array<string, ConditionalExpressionHolder[]> $conditionalExpressions
1080- * @return array<string, ConditionalExpressionHolder[]>
1103+ * @return Generator<int, ExprAnalysisRequest|TypeExprRequest, ExprAnalysisResult|TypeExprResult, array<string, ConditionalExpressionHolder[]> >
10811104 */
1082- private function processSureTypesForConditionalExpressionsAfterAssign (ExprAnalysisResultStorage $ storage , string $ variableName , array $ conditionalExpressions , SpecifiedTypes $ specifiedTypes , Type $ variableType ): array
1105+ private function processSureTypesForConditionalExpressionsAfterAssign (string $ variableName , array $ conditionalExpressions , SpecifiedTypes $ specifiedTypes , Type $ variableType ): Generator
10831106 {
10841107 foreach ($ specifiedTypes ->getSureTypes () as $ exprString => [$ expr , $ exprType ]) {
10851108 if (!$ expr instanceof Variable) {
@@ -1101,7 +1124,7 @@ private function processSureTypesForConditionalExpressionsAfterAssign(ExprAnalys
11011124 '$ ' . $ variableName => ExpressionTypeHolder::createYes (new Variable ($ variableName ), $ variableType ),
11021125 ], ExpressionTypeHolder::createYes (
11031126 $ expr ,
1104- TypeCombinator::intersect ($ storage -> getExprAnalysisResult ( $ expr )->type , $ exprType ),
1127+ TypeCombinator::intersect (( yield new TypeExprRequest ( $ expr) )->type , $ exprType ),
11051128 ));
11061129 $ conditionalExpressions [$ exprString ][$ holder ->getKey ()] = $ holder ;
11071130 }
@@ -1111,9 +1134,9 @@ private function processSureTypesForConditionalExpressionsAfterAssign(ExprAnalys
11111134
11121135 /**
11131136 * @param array<string, ConditionalExpressionHolder[]> $conditionalExpressions
1114- * @return array<string, ConditionalExpressionHolder[]>
1137+ * @return Generator<int, ExprAnalysisRequest|TypeExprRequest, ExprAnalysisResult|TypeExprResult, array<string, ConditionalExpressionHolder[]> >
11151138 */
1116- private function processSureNotTypesForConditionalExpressionsAfterAssign (ExprAnalysisResultStorage $ storage , string $ variableName , array $ conditionalExpressions , SpecifiedTypes $ specifiedTypes , Type $ variableType ): array
1139+ private function processSureNotTypesForConditionalExpressionsAfterAssign (string $ variableName , array $ conditionalExpressions , SpecifiedTypes $ specifiedTypes , Type $ variableType ): Generator
11171140 {
11181141 foreach ($ specifiedTypes ->getSureNotTypes () as $ exprString => [$ expr , $ exprType ]) {
11191142 if (!$ expr instanceof Variable) {
@@ -1135,7 +1158,7 @@ private function processSureNotTypesForConditionalExpressionsAfterAssign(ExprAna
11351158 '$ ' . $ variableName => ExpressionTypeHolder::createYes (new Variable ($ variableName ), $ variableType ),
11361159 ], ExpressionTypeHolder::createYes (
11371160 $ expr ,
1138- TypeCombinator::remove ($ storage -> getExprAnalysisResult ( $ expr )->type , $ exprType ),
1161+ TypeCombinator::remove (( yield new TypeExprRequest ( $ expr) )->type , $ exprType ),
11391162 ));
11401163 $ conditionalExpressions [$ exprString ][$ holder ->getKey ()] = $ holder ;
11411164 }
@@ -1210,9 +1233,9 @@ private function isImplicitArrayCreation(array $dimFetchStack, GeneratorScope $s
12101233 * @param list<ArrayDimFetch> $dimFetchStack
12111234 * @param list<array{Type|null, ArrayDimFetch}> $offsetTypes
12121235 *
1213- * @return array{Type, list<array{Expr, Type}>}
1236+ * @return Generator<int, ExprAnalysisRequest|TypeExprRequest, ExprAnalysisResult|TypeExprResult, array{Type, list<array{Expr, Type}>}>
12141237 */
1215- private function produceArrayDimFetchAssignValueToWrite (array $ dimFetchStack , array $ offsetTypes , Type $ offsetValueType , Type $ valueToWrite , GeneratorScope $ scope , ExprAnalysisResultStorage $ storage , bool $ native ): array
1238+ private function produceArrayDimFetchAssignValueToWrite (array $ dimFetchStack , array $ offsetTypes , Type $ offsetValueType , Type $ valueToWrite , GeneratorScope $ scope , bool $ native ): Generator
12161239 {
12171240 $ originalValueToWrite = $ valueToWrite ;
12181241
@@ -1323,7 +1346,7 @@ private function produceArrayDimFetchAssignValueToWrite(array $dimFetchStack, ar
13231346 if ($ key === $ lastDimKey ) {
13241347 $ offsetValueType = $ originalValueToWrite ;
13251348 } else {
1326- $ dimExprAnalysisResult = $ storage -> getExprAnalysisResult ($ dimFetch ->dim );
1349+ $ dimExprAnalysisResult = yield new TypeExprRequest ($ dimFetch ->dim );
13271350 $ offsetType = $ native ? $ dimExprAnalysisResult ->nativeType : $ dimExprAnalysisResult ->type ;
13281351 $ offsetValueType = $ offsetValueType ->getOffsetValueType ($ offsetType );
13291352 }
0 commit comments