| Index: pkg/analyzer/lib/src/task/strong_mode.dart
|
| diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
|
| index 823319893f36c3e1831fe4786ed144c8a8f823e0..8e21243e98c1d30b6f33895ef24cbd7557daa544 100644
|
| --- a/pkg/analyzer/lib/src/task/strong_mode.dart
|
| +++ b/pkg/analyzer/lib/src/task/strong_mode.dart
|
| @@ -286,8 +286,7 @@ class InstanceMemberInferrer {
|
| if (!accessorElement.isSynthetic &&
|
| accessorElement.isGetter &&
|
| !accessorElement.isStatic &&
|
| - accessorElement.hasImplicitReturnType &&
|
| - _getReturnType(accessorElement).isDynamic) {
|
| + accessorElement.hasImplicitReturnType) {
|
| List<ExecutableElement> overriddenGetters = inheritanceManager
|
| .lookupOverrides(
|
| accessorElement.enclosingElement, accessorElement.name);
|
| @@ -301,10 +300,11 @@ class InstanceMemberInferrer {
|
| if (setter != null) {
|
| overriddenSetters.add(setter);
|
| }
|
| - if (_isCompatible(newType, overriddenSetters)) {
|
| - _setReturnType(accessorElement, newType);
|
| - (accessorElement.variable as FieldElementImpl).type = newType;
|
| + if (!_isCompatible(newType, overriddenSetters)) {
|
| + newType = typeProvider.dynamicType;
|
| }
|
| + _setReturnType(accessorElement, newType);
|
| + (accessorElement.variable as FieldElementImpl).type = newType;
|
| }
|
| }
|
| }
|
| @@ -354,8 +354,7 @@ class InstanceMemberInferrer {
|
| void _inferField(FieldElement fieldElement) {
|
| if (!fieldElement.isSynthetic &&
|
| !fieldElement.isStatic &&
|
| - fieldElement.hasImplicitType &&
|
| - fieldElement.type.isDynamic) {
|
| + fieldElement.hasImplicitType) {
|
| //
|
| // First look for overridden getters with the same name as the field.
|
| //
|
| @@ -381,11 +380,12 @@ class InstanceMemberInferrer {
|
| newType = fieldElement.initializer.returnType;
|
| }
|
| }
|
| - if (newType != null && !newType.isBottom) {
|
| - (fieldElement as FieldElementImpl).type = newType;
|
| - _setReturnType(fieldElement.getter, newType);
|
| - _setParameterType(fieldElement.setter, newType);
|
| + if (newType == null || newType.isBottom) {
|
| + newType = typeProvider.dynamicType;
|
| }
|
| + (fieldElement as FieldElementImpl).type = newType;
|
| + _setReturnType(fieldElement.getter, newType);
|
| + _setParameterType(fieldElement.setter, newType);
|
| }
|
| }
|
|
|
| @@ -401,8 +401,7 @@ class InstanceMemberInferrer {
|
| //
|
| // Infer the return type.
|
| //
|
| - if (methodElement.hasImplicitReturnType &&
|
| - _getReturnType(methodElement).isDynamic) {
|
| + if (methodElement.hasImplicitReturnType) {
|
| overriddenMethods = inheritanceManager.lookupOverrides(
|
| methodElement.enclosingElement, methodElement.name);
|
| if (overriddenMethods.isEmpty || !_onlyMethods(overriddenMethods)) {
|
| @@ -418,19 +417,14 @@ class InstanceMemberInferrer {
|
| var length = parameters.length;
|
| for (int i = 0; i < length; ++i) {
|
| ParameterElement parameter = parameters[i];
|
| - if (parameter.hasImplicitType && parameter.type.isDynamic) {
|
| + if (parameter is ParameterElementImpl && parameter.hasImplicitType) {
|
| overriddenMethods = overriddenMethods ??
|
| inheritanceManager.lookupOverrides(
|
| methodElement.enclosingElement, methodElement.name);
|
| if (overriddenMethods.isEmpty || !_onlyMethods(overriddenMethods)) {
|
| return;
|
| }
|
| - DartType type = _computeParameterType(parameter, i, overriddenMethods);
|
| - if (!type.isDynamic) {
|
| - if (parameter is ParameterElementImpl) {
|
| - parameter.type = type;
|
| - }
|
| - }
|
| + parameter.type = _computeParameterType(parameter, i, overriddenMethods);
|
| }
|
| }
|
| }
|
|
|