Index: pkg/dev_compiler/lib/src/compiler/property_model.dart |
diff --git a/pkg/dev_compiler/lib/src/compiler/property_model.dart b/pkg/dev_compiler/lib/src/compiler/property_model.dart |
index 86b15ab0cd0bfc7149c534633ec9d503706d3cae..6817373e72a3506f78ddf6fec241cd438bbe065c 100644 |
--- a/pkg/dev_compiler/lib/src/compiler/property_model.dart |
+++ b/pkg/dev_compiler/lib/src/compiler/property_model.dart |
@@ -190,8 +190,15 @@ class ClassPropertyModel { |
final extensionMembers = new Set<ExecutableElement>(); |
final mixinExtensionMembers = new Set<ExecutableElement>(); |
- ClassPropertyModel.build(ExtensionTypeSet extensionTypes, |
- VirtualFieldModel fieldModel, ClassElement classElem) { |
+ /// Parameters that are covariant due to covariant generics. |
+ final Set<Element> covariantParameters; |
+ |
+ ClassPropertyModel.build( |
+ ExtensionTypeSet extensionTypes, |
+ VirtualFieldModel fieldModel, |
+ ClassElement classElem, |
+ this.covariantParameters, |
+ Set<ExecutableElement> covariantPrivateMembers) { |
// Visit superclasses to collect information about their fields/accessors. |
// This is expensive so we try to collect everything in one pass. |
for (var base in getSuperclasses(classElem)) { |
@@ -233,8 +240,13 @@ class ClassPropertyModel { |
var name = field.name; |
// Is it a field? |
if (!field.isSynthetic && field is FieldElementImpl) { |
+ var setter = field.setter; |
if (virtualAccessorNames.contains(name) || |
- fieldModel.isVirtual(field)) { |
+ fieldModel.isVirtual(field) || |
+ setter != null && |
+ covariantParameters != null && |
+ covariantParameters.contains(setter.parameters[0]) && |
+ covariantPrivateMembers.contains(setter)) { |
if (field.isStatic) { |
staticFieldOverrides.add(field); |
} else { |