Chromium Code Reviews| 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)); |