@@ -1221,36 +1221,25 @@ private function ensureNonNullability(MutatingScope $scope, Expr $expr, bool $fi
1221
1221
{
1222
1222
$ exprToSpecify = $ expr ;
1223
1223
$ specifiedExpressions = [];
1224
- while (
1225
- $ exprToSpecify instanceof PropertyFetch
1226
- || $ exprToSpecify instanceof StaticPropertyFetch
1227
- || (
1228
- $ findMethods && (
1229
- $ exprToSpecify instanceof MethodCall
1230
- || $ exprToSpecify instanceof StaticCall
1231
- )
1232
- )
1233
- ) {
1234
- if (
1235
- $ exprToSpecify instanceof PropertyFetch
1236
- || $ exprToSpecify instanceof MethodCall
1237
- ) {
1224
+ while (true ) {
1225
+ $ exprType = $ scope ->getType ($ exprToSpecify );
1226
+ $ exprTypeWithoutNull = TypeCombinator::removeNull ($ exprType );
1227
+ if (!$ exprType ->equals ($ exprTypeWithoutNull )) {
1228
+ $ specifiedExpressions [] = new EnsuredNonNullabilityResultExpression ($ exprToSpecify , $ exprType );
1229
+ $ scope = $ scope ->specifyExpressionType ($ exprToSpecify , $ exprTypeWithoutNull );
1230
+ }
1231
+
1232
+ if ($ exprToSpecify instanceof PropertyFetch) {
1233
+ $ exprToSpecify = $ exprToSpecify ->var ;
1234
+ } elseif ($ exprToSpecify instanceof StaticPropertyFetch && $ exprToSpecify ->class instanceof Expr) {
1235
+ $ exprToSpecify = $ exprToSpecify ->class ;
1236
+ } elseif ($ findMethods && $ exprToSpecify instanceof MethodCall) {
1238
1237
$ exprToSpecify = $ exprToSpecify ->var ;
1239
- } elseif ($ exprToSpecify ->class instanceof Expr) {
1238
+ } elseif ($ findMethods && $ exprToSpecify instanceof StaticCall && $ exprToSpecify ->class instanceof Expr) {
1240
1239
$ exprToSpecify = $ exprToSpecify ->class ;
1241
1240
} else {
1242
1241
break ;
1243
1242
}
1244
-
1245
- $ exprType = $ scope ->getType ($ exprToSpecify );
1246
- $ exprTypeWithoutNull = TypeCombinator::removeNull ($ exprType );
1247
- if ($ exprType ->equals ($ exprTypeWithoutNull )) {
1248
- continue ;
1249
- }
1250
-
1251
- $ specifiedExpressions [] = new EnsuredNonNullabilityResultExpression ($ exprToSpecify , $ exprType );
1252
-
1253
- $ scope = $ scope ->specifyExpressionType ($ exprToSpecify , $ exprTypeWithoutNull );
1254
1243
}
1255
1244
1256
1245
return new EnsuredNonNullabilityResult ($ scope , $ specifiedExpressions );
@@ -1861,15 +1850,19 @@ static function () use ($expr, $rightResult): MutatingScope {
1861
1850
$ scope = $ this ->lookForExitVariableAssign ($ scope , $ expr ->expr );
1862
1851
} elseif ($ expr instanceof Expr \Isset_) {
1863
1852
$ hasYield = false ;
1853
+ $ nonNullabilityResults = [];
1864
1854
foreach ($ expr ->vars as $ var ) {
1865
1855
$ nonNullabilityResult = $ this ->ensureNonNullability ($ scope , $ var , true );
1866
1856
$ scope = $ this ->lookForEnterVariableAssign ($ nonNullabilityResult ->getScope (), $ var );
1867
1857
$ result = $ this ->processExprNode ($ var , $ scope , $ nodeCallback , $ context ->enterDeep ());
1868
1858
$ scope = $ result ->getScope ();
1869
1859
$ hasYield = $ hasYield || $ result ->hasYield ();
1870
- $ scope = $ this -> revertNonNullability ( $ scope , $ nonNullabilityResult-> getSpecifiedExpressions ()) ;
1860
+ $ nonNullabilityResults [] = $ nonNullabilityResult ;
1871
1861
$ scope = $ this ->lookForExitVariableAssign ($ scope , $ var );
1872
1862
}
1863
+ foreach (array_reverse ($ nonNullabilityResults ) as $ nonNullabilityResult ) {
1864
+ $ scope = $ this ->revertNonNullability ($ scope , $ nonNullabilityResult ->getSpecifiedExpressions ());
1865
+ }
1873
1866
} elseif ($ expr instanceof Instanceof_) {
1874
1867
$ result = $ this ->processExprNode ($ expr ->expr , $ scope , $ nodeCallback , $ context ->enterDeep ());
1875
1868
$ scope = $ result ->getScope ();
0 commit comments