| Index: pkg/analyzer/lib/src/task/strong/rules.dart
|
| diff --git a/pkg/analyzer/lib/src/task/strong/rules.dart b/pkg/analyzer/lib/src/task/strong/rules.dart
|
| index b575dbfc65be357f07135d418467cc2cb5fe8d16..3cd6db2a6875935017079a8d1dbf7c4445e32f4d 100644
|
| --- a/pkg/analyzer/lib/src/task/strong/rules.dart
|
| +++ b/pkg/analyzer/lib/src/task/strong/rules.dart
|
| @@ -376,8 +376,6 @@ class TypeRules {
|
|
|
| // Produce a coercion which coerces something of type fromT
|
| // to something of type toT.
|
| - // If wrap is true and both are function types, a closure
|
| - // wrapper coercion is produced using _wrapTo (see above)
|
| // Returns the error coercion if the types cannot be coerced
|
| // according to our current criteria.
|
| Coercion _coerceTo(DartType fromT, DartType toT) {
|
| @@ -387,11 +385,12 @@ class TypeRules {
|
| // fromT <: toT, no coercion needed
|
| if (isSubTypeOf(fromT, toT)) return Coercion.identity(toT);
|
|
|
| - // For now, reject conversions between function types and
|
| - // call method objects. We could choose to allow casts here.
|
| - // Wrapping a function type to assign it to a call method
|
| - // object will never succeed. Wrapping the other way could
|
| - // be allowed.
|
| + // TODO(vsm): We can get rid of the second clause if we disallow
|
| + // all sideways casts - see TODO below.
|
| + // -------
|
| + // Note: a function type is never assignable to a class per the Dart
|
| + // spec - even if it has a compatible call method. We disallow as
|
| + // well for consistency.
|
| if ((fromT is FunctionType && getCallMethodType(toT) != null) ||
|
| (toT is FunctionType && getCallMethodType(fromT) != null)) {
|
| return Coercion.error();
|
| @@ -400,6 +399,10 @@ class TypeRules {
|
| // Downcast if toT <: fromT
|
| if (isSubTypeOf(toT, fromT)) return Coercion.cast(fromT, toT);
|
|
|
| + // TODO(vsm): Once we have generic methods, we should delete this
|
| + // workaround. These sideways casts are always ones we warn about
|
| + // - i.e., we think they are likely to fail at runtime.
|
| + // -------
|
| // Downcast if toT <===> fromT
|
| // The intention here is to allow casts that are sideways in the restricted
|
| // type system, but allowed in the regular dart type system, since these
|
| @@ -409,6 +412,7 @@ class TypeRules {
|
| if (fromT.isAssignableTo(toT)) {
|
| return Coercion.cast(fromT, toT);
|
| }
|
| +
|
| return Coercion.error();
|
| }
|
|
|
|
|