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

Unified Diff: lib/src/compiler/code_generator.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/code_generator.dart
diff --git a/lib/src/compiler/code_generator.dart b/lib/src/compiler/code_generator.dart
index 199a629e74a9a4fbdc601c56b03680ae25dd8ca9..ac52c9be15d358240986d78807deb9dcaec9a9ed 100644
--- a/lib/src/compiler/code_generator.dart
+++ b/lib/src/compiler/code_generator.dart
@@ -73,6 +73,11 @@ class CodeGenerator extends GeneralizingAstVisitor
/// need storage slots.
HashSet<FieldElement> _fieldsNeedingStorage;
+ /// Information that indicates which properties are partial overrides of
+ /// superclass properties (e.g., getter-only override of a setter or
+ /// vice-versa).
+ HashSet<FieldElement> _propertyOverrides;
Jennifer Messerly 2016/04/20 21:16:39 if following my suggestion in the next file, this
Harry Terkelsen 2016/04/20 23:33:27 Acknowledged.
+
/// The variable for the target of the current `..` cascade expression.
///
/// Usually a [SimpleIdentifier], but it can also be other expressions
@@ -184,7 +189,10 @@ class CodeGenerator extends GeneralizingAstVisitor
throw new StateError('Can only call emitModule once.');
}
- _fieldsNeedingStorage = findFieldsNeedingStorage(
+ _fieldsNeedingStorage = new HashSet<FieldElement>();
+ _propertyOverrides = new HashSet<FieldElement>();
+
+ findFieldsNeedingStorage(_fieldsNeedingStorage, _propertyOverrides,
compilationUnits.map((u) => u.element), _extensionTypes);
// Transform the AST to make coercions explicit.
@@ -782,6 +790,28 @@ class CodeGenerator extends GeneralizingAstVisitor
} else if (m is MethodDeclaration) {
jsMethods.add(_emitMethodDeclaration(type, m));
+ var methodElement = m.element;
+ if (methodElement is PropertyAccessorElement) {
Jennifer Messerly 2016/04/20 21:16:39 it would be good to refactor this into a method _
Harry Terkelsen 2016/04/20 23:33:27 Done.
+ var fieldElement = methodElement.variable;
+ if (_propertyOverrides.contains(fieldElement)) {
Jennifer Messerly 2016/04/20 21:16:39 here we can just call make a call to ask if our pr
+ // Generate a corresponding virtual getter / setter.
+ var name = _elementMemberName(methodElement,
+ allowExtensions: _extensionTypes.contains(type.element));
+ if (m.isGetter) {
+ // Generate a setter
+ var value = new JS.TemporaryId('value');
+ var fn = new JS.Fun(
Jennifer Messerly 2016/04/20 21:16:39 this could be done a bit simpler: var fn = js.cal
Harry Terkelsen 2016/04/20 23:33:28 Done.
+ [value], js.statement('{ super[#] = #; }', [name, value]));
+ jsMethods.add(new JS.Method(name, fn, isSetter: true));
+ } else {
+ // Generate a getter
+ var fn =
Jennifer Messerly 2016/04/20 21:16:39 same here. if using js_ast, I find it's easier to
Harry Terkelsen 2016/04/20 23:33:27 Done.
+ new JS.Fun([], js.statement('{ return super[#]; }', [name]));
+ jsMethods.add(new JS.Method(name, fn, isGetter: true));
+ }
+ }
+ }
+
if (!hasJsPeer && m.isGetter && m.name.name == 'iterator') {
hasIterator = true;
jsMethods.add(_emitIterable(type));

Powered by Google App Engine
This is Rietveld 408576698