| Index: lib/src/checker/rules.dart
|
| diff --git a/lib/src/checker/rules.dart b/lib/src/checker/rules.dart
|
| index bc253f287ddcf5a6a78de7032fe80e21ce102447..3d2790770e0783912e09ef27a33911fc5b72860f 100644
|
| --- a/lib/src/checker/rules.dart
|
| +++ b/lib/src/checker/rules.dart
|
| @@ -133,19 +133,35 @@ class RestrictedRules extends TypeRules {
|
| }
|
| }
|
|
|
| + bool _anyParameterType(FunctionType ft, bool predicate(DartType t)) {
|
| + return ft.normalParameterTypes.any(predicate) ||
|
| + ft.optionalParameterTypes.any(predicate) ||
|
| + ft.namedParameterTypes.values.any(predicate);
|
| + }
|
| +
|
| // TODO(leafp): Revisit this.
|
| bool isGroundType(DartType t) {
|
| - if (t is FunctionType) return false;
|
| if (t is TypeParameterType) return false;
|
| if (t.isDynamic) return true;
|
|
|
| - // t must be an InterfaceType.
|
| - var typeArguments = (t as InterfaceType).typeArguments;
|
| - for (var typeArgument in typeArguments) {
|
| - if (!typeArgument.isDynamic) return false;
|
| + if (t is FunctionType) {
|
| + if (!t.returnType.isDynamic ||
|
| + _anyParameterType(t, (pt) => !pt.isDynamic)) {
|
| + return false;
|
| + } else {
|
| + return true;
|
| + }
|
| }
|
|
|
| - return true;
|
| + if (t is InterfaceType) {
|
| + var typeArguments = t.typeArguments;
|
| + for (var typeArgument in typeArguments) {
|
| + if (!typeArgument.isDynamic) return false;
|
| + }
|
| + return true;
|
| + }
|
| +
|
| + throw new StateError("Unexpected type");
|
| }
|
|
|
| FunctionType getCallMethodType(DartType t) {
|
| @@ -510,16 +526,8 @@ class RestrictedRules extends TypeRules {
|
| return false;
|
| }
|
| }
|
| +
|
| var ft = t as FunctionType;
|
| - for (var parameterType in ft.normalParameterTypes) {
|
| - if (parameterType.isDynamic) return true;
|
| - }
|
| - for (var parameterType in ft.optionalParameterTypes) {
|
| - if (parameterType.isDynamic) return true;
|
| - }
|
| - for (var parameterType in ft.namedParameterTypes.values) {
|
| - if (parameterType.isDynamic) return true;
|
| - }
|
| - return false;
|
| + return _anyParameterType(ft, (pt) => pt.isDynamic);
|
| }
|
| }
|
|
|