Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(635)

Unified Diff: lib/src/compiler/js_field_storage.dart

Issue 1899373002: Emit forwarding getter/setter when overriding just a getter or setter. (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: fix complex setters/getters Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
+ }
}
}

Powered by Google App Engine
This is Rietveld 408576698