@@ -677,6 +677,11 @@ class LeastUpperBoundHelper {
677677 return getLeastUpperBound (T1 , _typeSystem.objectNone);
678678 }
679679
680+ var futureOrResult = _futureOr (T1 , T2 );
681+ if (futureOrResult != null ) {
682+ return futureOrResult;
683+ }
684+
680685 // UP(T1, T2) = T2 if T1 <: T2
681686 // UP(T1, T2) = T1 if T2 <: T1
682687 // And other, more complex variants of interface types.
@@ -806,6 +811,56 @@ class LeastUpperBoundHelper {
806811 );
807812 }
808813
814+ DartType _futureOr (DartType T1 , DartType T2 ) {
815+ var T1_futureOr = T1 is InterfaceType && T1 .isDartAsyncFutureOr
816+ ? T1 .typeArguments[0 ]
817+ : null ;
818+
819+ var T1_future = T1 is InterfaceType && T1 .isDartAsyncFuture
820+ ? T1 .typeArguments[0 ]
821+ : null ;
822+
823+ var T2_futureOr = T2 is InterfaceType && T2 .isDartAsyncFutureOr
824+ ? T2 .typeArguments[0 ]
825+ : null ;
826+
827+ var T2_future = T2 is InterfaceType && T2 .isDartAsyncFuture
828+ ? T2 .typeArguments[0 ]
829+ : null ;
830+
831+ // UP(FutureOr<T1>, FutureOr<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
832+ if (T1_futureOr != null && T2_futureOr != null ) {
833+ var T3 = getLeastUpperBound (T1_futureOr , T2_futureOr );
834+ return _typeSystem.typeProvider.futureOrType2 (T3 );
835+ }
836+
837+ // UP(Future<T1>, FutureOr<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
838+ if (T1_future != null && T2_futureOr != null ) {
839+ var T3 = getLeastUpperBound (T1_future , T2_futureOr );
840+ return _typeSystem.typeProvider.futureOrType2 (T3 );
841+ }
842+
843+ // UP(FutureOr<T1>, Future<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
844+ if (T1_futureOr != null && T2_future != null ) {
845+ var T3 = getLeastUpperBound (T1_futureOr , T2_future );
846+ return _typeSystem.typeProvider.futureOrType2 (T3 );
847+ }
848+
849+ // UP(T1, FutureOr<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
850+ if (T2_futureOr != null ) {
851+ var T3 = getLeastUpperBound (T1 , T2_futureOr );
852+ return _typeSystem.typeProvider.futureOrType2 (T3 );
853+ }
854+
855+ // UP(FutureOr<T1>, T2) = FutureOr<T3> where T3 = UP(T1, T2)
856+ if (T1_futureOr != null ) {
857+ var T3 = getLeastUpperBound (T1_futureOr , T2 );
858+ return _typeSystem.typeProvider.futureOrType2 (T3 );
859+ }
860+
861+ return null ;
862+ }
863+
809864 DartType _parameterType (ParameterElement a, ParameterElement b) {
810865 return _typeSystem.getGreatestLowerBound (a.type, b.type);
811866 }
0 commit comments