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