@@ -3205,7 +3205,7 @@ public function filterBySpecifiedTypes(SpecifiedTypes $specifiedTypes): self
32053205 } else {
32063206 $ scope = $ scope ->removeTypeFromExpression ($ expr , $ type );
32073207 }
3208- $ specifiedExpressions [$ typeSpecification ['exprString ' ]] = ExpressionTypeHolder::createYes ($ expr , $ scope ->getScopeType ($ expr ));
3208+ $ specifiedExpressions [$ typeSpecification ['exprString ' ]] = ExpressionTypeHolder::createYes ($ expr , $ scope ->getType ($ expr ));
32093209 }
32103210
32113211 $ conditions = [];
@@ -3337,7 +3337,7 @@ public function isInFirstLevelStatement(): bool
33373337 return $ this ->inFirstLevelStatement ;
33383338 }
33393339
3340- public function mergeWith (?self $ otherScope, bool $ preserveVacuousConditionals = false ): self
3340+ public function mergeWith (?self $ otherScope ): self
33413341 {
33423342 if ($ otherScope === null || $ this === $ otherScope ) {
33433343 return $ this ;
@@ -3347,18 +3347,6 @@ public function mergeWith(?self $otherScope, bool $preserveVacuousConditionals =
33473347
33483348 $ mergedExpressionTypes = $ this ->mergeVariableHolders ($ ourExpressionTypes , $ theirExpressionTypes );
33493349 $ conditionalExpressions = $ this ->intersectConditionalExpressions ($ otherScope ->conditionalExpressions );
3350- if ($ preserveVacuousConditionals ) {
3351- $ conditionalExpressions = $ this ->preserveVacuousConditionalExpressions (
3352- $ conditionalExpressions ,
3353- $ this ->conditionalExpressions ,
3354- $ theirExpressionTypes ,
3355- );
3356- $ conditionalExpressions = $ this ->preserveVacuousConditionalExpressions (
3357- $ conditionalExpressions ,
3358- $ otherScope ->conditionalExpressions ,
3359- $ ourExpressionTypes ,
3360- );
3361- }
33623350 $ conditionalExpressions = $ this ->createConditionalExpressions (
33633351 $ conditionalExpressions ,
33643352 $ ourExpressionTypes ,
@@ -3464,48 +3452,6 @@ private function intersectConditionalExpressions(array $otherConditionalExpressi
34643452 return $ newConditionalExpressions ;
34653453 }
34663454
3467- /**
3468- * @param array<string, ConditionalExpressionHolder[]> $currentConditionalExpressions
3469- * @param array<string, ConditionalExpressionHolder[]> $sourceConditionalExpressions
3470- * @param array<string, ExpressionTypeHolder> $otherExpressionTypes
3471- * @return array<string, ConditionalExpressionHolder[]>
3472- */
3473- private function preserveVacuousConditionalExpressions (
3474- array $ currentConditionalExpressions ,
3475- array $ sourceConditionalExpressions ,
3476- array $ otherExpressionTypes ,
3477- ): array
3478- {
3479- foreach ($ sourceConditionalExpressions as $ exprString => $ holders ) {
3480- foreach ($ holders as $ key => $ holder ) {
3481- if (isset ($ currentConditionalExpressions [$ exprString ][$ key ])) {
3482- continue ;
3483- }
3484-
3485- $ typeHolder = $ holder ->getTypeHolder ();
3486- if ($ typeHolder ->getCertainty ()->no () && !$ typeHolder ->getExpr () instanceof Variable) {
3487- continue ;
3488- }
3489-
3490- foreach ($ holder ->getConditionExpressionTypeHolders () as $ guardExprString => $ guardTypeHolder ) {
3491- if (!array_key_exists ($ guardExprString , $ otherExpressionTypes )) {
3492- continue ;
3493- }
3494-
3495- $ otherType = $ otherExpressionTypes [$ guardExprString ]->getType ();
3496- $ guardType = $ guardTypeHolder ->getType ();
3497-
3498- if ($ otherType ->isSuperTypeOf ($ guardType )->no ()) {
3499- $ currentConditionalExpressions [$ exprString ][$ key ] = $ holder ;
3500- break ;
3501- }
3502- }
3503- }
3504- }
3505-
3506- return $ currentConditionalExpressions ;
3507- }
3508-
35093455 /**
35103456 * @param array<string, ConditionalExpressionHolder[]> $newConditionalExpressions
35113457 * @param array<string, ConditionalExpressionHolder[]> $existingConditionalExpressions
@@ -3603,6 +3549,13 @@ private function createConditionalExpressions(
36033549 }
36043550
36053551 foreach ($ variableTypeGuards as $ guardExprString => $ guardHolder ) {
3552+ if (
3553+ array_key_exists ($ guardExprString , $ theirExpressionTypes )
3554+ && $ theirExpressionTypes [$ guardExprString ]->getCertainty ()->yes ()
3555+ && !$ guardHolder ->getType ()->isSuperTypeOf ($ theirExpressionTypes [$ guardExprString ]->getType ())->no ()
3556+ ) {
3557+ continue ;
3558+ }
36063559 $ conditionalExpression = new ConditionalExpressionHolder ([$ guardExprString => $ guardHolder ], $ holder );
36073560 $ conditionalExpressions [$ exprString ][$ conditionalExpression ->getKey ()] = $ conditionalExpression ;
36083561 }
@@ -3614,6 +3567,13 @@ private function createConditionalExpressions(
36143567 }
36153568
36163569 foreach ($ typeGuards as $ guardExprString => $ guardHolder ) {
3570+ if (
3571+ array_key_exists ($ guardExprString , $ theirExpressionTypes )
3572+ && $ theirExpressionTypes [$ guardExprString ]->getCertainty ()->yes ()
3573+ && !$ guardHolder ->getType ()->isSuperTypeOf ($ theirExpressionTypes [$ guardExprString ]->getType ())->no ()
3574+ ) {
3575+ continue ;
3576+ }
36173577 $ conditionalExpression = new ConditionalExpressionHolder ([$ guardExprString => $ guardHolder ], new ExpressionTypeHolder ($ mergedExprTypeHolder ->getExpr (), new ErrorType (), TrinaryLogic::createNo ()));
36183578 $ conditionalExpressions [$ exprString ][$ conditionalExpression ->getKey ()] = $ conditionalExpression ;
36193579 }
0 commit comments