Index: lib/src/compiler/js_field_storage.dart |
diff --git a/lib/src/compiler/js_field_storage.dart b/lib/src/compiler/js_field_storage.dart |
index 1a70229d68fd707575d61d240f87916191f5791f..e18cba693897bb9a49c2e663171d43f615315acc 100644 |
--- a/lib/src/compiler/js_field_storage.dart |
+++ b/lib/src/compiler/js_field_storage.dart |
@@ -9,9 +9,11 @@ import 'extension_types.dart'; |
/// We use a storage slot for fields that override or can be overridden by |
Jennifer Messerly
2016/04/20 21:16:40
Update this comment? And method name?
Harry Terkelsen
2016/04/20 23:33:28
Done.
|
/// getter/setter pairs. |
-HashSet<FieldElement> findFieldsNeedingStorage( |
- Iterable<CompilationUnitElement> units, ExtensionTypeSet extensionTypes) { |
- var overrides = new HashSet<FieldElement>(); |
+void findFieldsNeedingStorage( |
Jennifer Messerly
2016/04/20 21:16:40
Oh wow!
So it looks like this old code was doing
Harry Terkelsen
2016/04/20 23:33:28
Done.
|
+ HashSet<FieldElement> overrides, |
+ HashSet<FieldElement> propertyOverrides, |
+ Iterable<CompilationUnitElement> units, |
+ ExtensionTypeSet extensionTypes) { |
for (var unit in units) { |
for (var cls in unit.types) { |
var superclasses = getSuperclasses(cls); |
@@ -20,20 +22,29 @@ HashSet<FieldElement> findFieldsNeedingStorage( |
checkForPropertyOverride( |
field, superclasses, overrides, extensionTypes); |
} |
+ if (field.isSynthetic) { |
+ if (field.setter == null) { |
+ checkForPropertyOverride( |
+ field, superclasses, propertyOverrides, extensionTypes, |
+ checkGetter: false); |
+ } else if (field.getter == null) { |
+ checkForPropertyOverride( |
+ field, superclasses, propertyOverrides, extensionTypes, |
+ checkSetter: false); |
+ } |
+ } |
} |
} |
} |
- |
- return overrides; |
} |
void checkForPropertyOverride( |
FieldElement field, |
List<ClassElement> superclasses, |
HashSet<FieldElement> overrides, |
- ExtensionTypeSet extensionTypes) { |
- assert(!field.isSynthetic); |
- |
+ ExtensionTypeSet extensionTypes, |
+ {bool checkGetter: true, |
+ bool checkSetter: true}) { |
var library = field.library; |
bool found = false; |
@@ -49,9 +60,15 @@ void checkForPropertyOverride( |
break; |
} |
- found = true; |
- // Record that the super property is overridden. |
- if (superprop.library == library) overrides.add(superprop); |
+ // TODO(vsm): Get rid of redundant check here. |
Jennifer Messerly
2016/04/20 21:16:40
+1 we should clean this up. Here's a refactor:
/
Harry Terkelsen
2016/04/20 23:33:28
Done.
|
+ if (checkGetter && getter != null && !getter.isAbstract || |
+ checkSetter && setter != null && !setter.isAbstract) { |
+ found = true; |
+ // TODO(vsm): Why do we need this? |
Jennifer Messerly
2016/04/20 21:16:40
this is not needed anymore. Please dead code remov
Harry Terkelsen
2016/04/20 23:33:28
Done.
|
+ // Record that the super property is overridden. |
+ if (checkGetter && checkSetter && superprop.library == library) |
+ overrides.add(superprop); |
+ } |
} |
} |