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); |
} |
} |
} |