@@ -1758,24 +1758,15 @@ private function enterFunctionLike(
17581758 $ ifType = $ parameterType ->isNegated () ? $ parameterType ->getElse () : $ parameterType ->getIf ();
17591759 $ elseType = $ parameterType ->isNegated () ? $ parameterType ->getIf () : $ parameterType ->getElse ();
17601760
1761- $ ifConditionType = TypeCombinator::intersect ($ targetParameter ->getType (), $ parameterType ->getTarget ());
1762- $ elseConditionType = TypeCombinator::remove ($ targetParameter ->getType (), $ parameterType ->getTarget ());
1763-
1764- $ ifConditionTypes = $ ifConditionType instanceof UnionType ? $ ifConditionType ->getTypes () : [$ ifConditionType ];
1765- foreach ($ ifConditionTypes as $ conditionType ) {
1766- $ holder = new ConditionalExpressionHolder ([
1767- $ parameterType ->getParameterName () => ExpressionTypeHolder::createYes (new Variable ($ targetParameterName ), $ conditionType ),
1768- ], ExpressionTypeHolder::createYes (new Variable ($ parameter ->getName ()), $ ifType ));
1769- $ conditionalTypes ['$ ' . $ parameter ->getName ()][$ holder ->getKey ()] = $ holder ;
1770- }
1771-
1772- $ elseConditionTypes = $ elseConditionType instanceof UnionType ? $ elseConditionType ->getTypes () : [$ elseConditionType ];
1773- foreach ($ elseConditionTypes as $ conditionType ) {
1774- $ holder = new ConditionalExpressionHolder ([
1775- $ parameterType ->getParameterName () => ExpressionTypeHolder::createYes (new Variable ($ targetParameterName ), $ conditionType ),
1776- ], ExpressionTypeHolder::createYes (new Variable ($ parameter ->getName ()), $ elseType ));
1777- $ conditionalTypes ['$ ' . $ parameter ->getName ()][$ holder ->getKey ()] = $ holder ;
1778- }
1761+ $ holder = new ConditionalExpressionHolder ([
1762+ $ parameterType ->getParameterName () => ExpressionTypeHolder::createYes (new Variable ($ targetParameterName ), TypeCombinator::intersect ($ targetParameter ->getType (), $ parameterType ->getTarget ())),
1763+ ], ExpressionTypeHolder::createYes (new Variable ($ parameter ->getName ()), $ ifType ), true );
1764+ $ conditionalTypes ['$ ' . $ parameter ->getName ()][$ holder ->getKey ()] = $ holder ;
1765+
1766+ $ holder = new ConditionalExpressionHolder ([
1767+ $ parameterType ->getParameterName () => ExpressionTypeHolder::createYes (new Variable ($ targetParameterName ), TypeCombinator::remove ($ targetParameter ->getType (), $ parameterType ->getTarget ())),
1768+ ], ExpressionTypeHolder::createYes (new Variable ($ parameter ->getName ()), $ elseType ), true );
1769+ $ conditionalTypes ['$ ' . $ parameter ->getName ()][$ holder ->getKey ()] = $ holder ;
17791770 }
17801771 }
17811772
@@ -3227,9 +3218,22 @@ public function filterBySpecifiedTypes(SpecifiedTypes $specifiedTypes): self
32273218 }
32283219 foreach ($ conditionalExpressions as $ conditionalExpression ) {
32293220 foreach ($ conditionalExpression ->getConditionExpressionTypeHolders () as $ holderExprString => $ conditionalTypeHolder ) {
3230- if (!array_key_exists ($ holderExprString , $ specifiedExpressions ) || ! $ specifiedExpressions [ $ holderExprString ]-> equals ( $ conditionalTypeHolder ) ) {
3221+ if (!array_key_exists ($ holderExprString , $ specifiedExpressions )) {
32313222 continue 2 ;
32323223 }
3224+ $ specifiedHolder = $ specifiedExpressions [$ holderExprString ];
3225+ if (!$ specifiedHolder ->getCertainty ()->equals ($ conditionalTypeHolder ->getCertainty ())) {
3226+ continue 2 ;
3227+ }
3228+ if ($ conditionalExpression ->useSubtypeForConditionMatching ()) {
3229+ if (!$ conditionalTypeHolder ->getType ()->isSuperTypeOf ($ specifiedHolder ->getType ())->yes ()) {
3230+ continue 2 ;
3231+ }
3232+ } else {
3233+ if (!$ specifiedHolder ->equals ($ conditionalTypeHolder )) {
3234+ continue 2 ;
3235+ }
3236+ }
32333237 }
32343238
32353239 $ conditions [$ conditionalExprString ][] = $ conditionalExpression ;
0 commit comments