Index: pkg/analyzer/lib/src/generated/type_system.dart |
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart |
index 1ed098dd935d46568487bf3b8e8d3eba1d188225..931764d34e980e325562a41500e5ecc214a00a01 100644 |
--- a/pkg/analyzer/lib/src/generated/type_system.dart |
+++ b/pkg/analyzer/lib/src/generated/type_system.dart |
@@ -47,6 +47,8 @@ typedef bool _GuardedSubtypeChecker<T>(T t1, T t2, Set<TypeImpl> visitedTypes); |
class StrongTypeSystemImpl extends TypeSystem { |
static bool _comparingTypeParameterBounds = false; |
+ bool allowDynamicAsBottom = true; |
+ |
/** |
* True if declaration casts should be allowed, otherwise false. |
* |
@@ -135,6 +137,8 @@ class StrongTypeSystemImpl extends TypeSystem { |
/// Computes the greatest lower bound of [type1] and [type2]. |
DartType getGreatestLowerBound(DartType type1, DartType type2, |
{dynamicIsBottom: false}) { |
+ dynamicIsBottom = dynamicIsBottom && allowDynamicAsBottom; |
+ |
// The greatest lower bound relation is reflexive. |
if (identical(type1, type2)) { |
return type1; |
@@ -211,6 +215,8 @@ class StrongTypeSystemImpl extends TypeSystem { |
@override |
DartType getLeastUpperBound(DartType type1, DartType type2, |
{bool dynamicIsBottom: false}) { |
+ dynamicIsBottom = dynamicIsBottom && allowDynamicAsBottom; |
+ |
if (isNullableType(type1) && isNonNullableType(type2)) { |
assert(type2 is InterfaceType); |
type2 = getLeastNullableSupertype(type2 as InterfaceType); |
@@ -476,7 +482,8 @@ class StrongTypeSystemImpl extends TypeSystem { |
if (t is FunctionType) { |
if (!_isTop(t.returnType) || |
- anyParameterType(t, (pt) => !_isBottom(pt, dynamicIsBottom: true))) { |
+ anyParameterType(t, |
+ (pt) => !_isBottom(pt, dynamicIsBottom: allowDynamicAsBottom))) { |
return false; |
} else { |
return true; |
@@ -645,7 +652,8 @@ class StrongTypeSystemImpl extends TypeSystem { |
DartType paramType; |
if (fType != null && gType != null) { |
// If both functions have this parameter, include both of their types. |
- paramType = getLeastUpperBound(fType, gType, dynamicIsBottom: true); |
+ paramType = getLeastUpperBound(fType, gType, |
+ dynamicIsBottom: allowDynamicAsBottom); |
} else { |
paramType = fType ?? gType; |
} |
@@ -727,7 +735,7 @@ class StrongTypeSystemImpl extends TypeSystem { |
@override |
DartType _functionParameterBound(DartType f, DartType g) => |
- getGreatestLowerBound(f, g, dynamicIsBottom: true); |
+ getGreatestLowerBound(f, g, dynamicIsBottom: allowDynamicAsBottom); |
/// Given a type return its name prepended with the URI to its containing |
/// library and separated by a comma. |
@@ -811,7 +819,7 @@ class StrongTypeSystemImpl extends TypeSystem { |
return FunctionTypeImpl.relate(f1, f2, isSubtypeOf, instantiateToBounds, |
parameterRelation: (p1, p2) => _isSubtypeOf( |
p2.type, p1.type, visitedTypes, |
- dynamicIsBottom: true)); |
+ dynamicIsBottom: allowDynamicAsBottom)); |
} |
bool _isInterfaceSubtypeOf( |
@@ -870,6 +878,8 @@ class StrongTypeSystemImpl extends TypeSystem { |
bool _isSubtypeOf(DartType t1, DartType t2, Set<TypeImpl> visitedTypes, |
{bool dynamicIsBottom: false}) { |
+ dynamicIsBottom = dynamicIsBottom && allowDynamicAsBottom; |
+ |
if (identical(t1, t2)) { |
return true; |
} |
@@ -980,6 +990,8 @@ class StrongTypeSystemImpl extends TypeSystem { |
DartType _substituteForUnknownType(DartType type, |
{bool lowerBound: false, dynamicIsBottom: false}) { |
+ dynamicIsBottom = dynamicIsBottom && allowDynamicAsBottom; |
+ |
if (identical(type, UnknownInferredType.instance)) { |
if (lowerBound && !dynamicIsBottom) { |
// TODO(jmesserly): this should be the bottom type, once i can be |
@@ -1003,7 +1015,7 @@ class StrongTypeSystemImpl extends TypeSystem { |
// Parameters are contravariant, so flip the constraint direction. |
// Also pass dynamicIsBottom, because this is a fuzzy arrow. |
var newType = _substituteForUnknownType(p.type, |
- lowerBound: !lowerBound, dynamicIsBottom: true); |
+ lowerBound: !lowerBound, dynamicIsBottom: allowDynamicAsBottom); |
return new ParameterElementImpl.synthetic( |
p.name, newType, p.parameterKind); |
}); |