| Index: pkg/dev_compiler/lib/src/compiler/code_generator.dart
|
| diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
|
| index 221d94ca9bdec9c773ecbd8bd8371ab22c711948..c997f9f08588f393da5f0811595083d54555ca1c 100644
|
| --- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart
|
| +++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
|
| @@ -738,15 +738,15 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| var virtualFields = <FieldElement, JS.TemporaryId>{};
|
| var virtualFieldSymbols = <JS.Statement>[];
|
| var staticFieldOverrides = new HashSet<FieldElement>();
|
| + var extensions = _extensionsToImplement(classElem);
|
| _registerPropertyOverrides(classElem, className, superclasses, allFields,
|
| - virtualFields, virtualFieldSymbols, staticFieldOverrides);
|
| + virtualFields, virtualFieldSymbols, staticFieldOverrides, extensions);
|
|
|
| var classExpr = _emitClassExpression(classElem,
|
| _emitClassMethods(node, ctors, fields, superclasses, virtualFields),
|
| fields: allFields);
|
|
|
| var body = <JS.Statement>[];
|
| - var extensions = _extensionsToImplement(classElem);
|
| _initExtensionSymbols(classElem, methods, fields, body);
|
| _emitSuperHelperSymbols(_superHelperSymbols, body);
|
|
|
| @@ -760,7 +760,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| _emitClassTypeTests(classElem, className, body);
|
|
|
| _defineNamedConstructors(ctors, body, className, isCallable);
|
| - _emitVirtualFieldSymbols(virtualFieldSymbols, body);
|
| + body.addAll(virtualFieldSymbols);
|
| _emitClassSignature(
|
| methods, allFields, classElem, ctors, extensions, className, body);
|
| _defineExtensionMembers(extensions, className, body);
|
| @@ -1001,22 +1001,25 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| List<FieldDeclaration> fields,
|
| Map<FieldElement, JS.TemporaryId> virtualFields,
|
| List<JS.Statement> virtualFieldSymbols,
|
| - Set<FieldElement> staticFieldOverrides) {
|
| + Set<FieldElement> staticFieldOverrides,
|
| + Iterable<ExecutableElement> extensionMembers) {
|
| + var extensionNames =
|
| + new HashSet<String>.from(extensionMembers.map((e) => e.name));
|
| for (var field in fields) {
|
| - for (VariableDeclaration field in field.fields.variables) {
|
| - var overrideInfo =
|
| - checkForPropertyOverride(field.element, superclasses);
|
| - if (overrideInfo.foundGetter || overrideInfo.foundSetter) {
|
| - if (field.element.isStatic) {
|
| - staticFieldOverrides.add(field.element);
|
| + for (VariableDeclaration fieldDecl in field.fields.variables) {
|
| + var field = fieldDecl.element as FieldElement;
|
| + var overrideInfo = checkForPropertyOverride(field, superclasses);
|
| + if (overrideInfo.foundGetter ||
|
| + overrideInfo.foundSetter ||
|
| + extensionNames.contains(field.name)) {
|
| + if (field.isStatic) {
|
| + staticFieldOverrides.add(field);
|
| } else {
|
| - var fieldName =
|
| - _emitMemberName(field.element.name, type: classElem.type);
|
| - var virtualField = new JS.TemporaryId(field.element.name);
|
| - virtualFields[field.element] = virtualField;
|
| + var virtualField = new JS.TemporaryId(field.name);
|
| + virtualFields[field] = virtualField;
|
| virtualFieldSymbols.add(js.statement(
|
| 'const # = Symbol(#.name + "." + #.toString());',
|
| - [virtualField, className, fieldName]));
|
| + [virtualField, className, _declareMemberName(field.getter)]));
|
| }
|
| }
|
| }
|
| @@ -1042,11 +1045,6 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| }
|
| }
|
|
|
| - void _emitVirtualFieldSymbols(
|
| - List<JS.Statement> virtualFields, List<JS.Statement> body) {
|
| - body.addAll(virtualFields);
|
| - }
|
| -
|
| List<JS.Identifier> _emitTypeFormals(List<TypeParameterElement> typeFormals) {
|
| return typeFormals
|
| .map((t) => new JS.Identifier(t.name))
|
| @@ -1214,7 +1212,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| // Generate getter
|
| var fn = new JS.Fun([], js.statement('{ return this.#; }', [name]));
|
| var method =
|
| - new JS.Method(_elementMemberName(field.getter), fn, isGetter: true);
|
| + new JS.Method(_declareMemberName(field.getter), fn, isGetter: true);
|
| jsMethods.add(method);
|
|
|
| // Generate setter
|
| @@ -1222,7 +1220,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| var value = new JS.TemporaryId('value');
|
| fn = new JS.Fun(
|
| [value], js.statement('{ this.# = #; }', [name, value]));
|
| - method = new JS.Method(_elementMemberName(field.setter), fn,
|
| + method = new JS.Method(_declareMemberName(field.setter), fn,
|
| isSetter: true);
|
| jsMethods.add(method);
|
| }
|
| @@ -1434,7 +1432,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
|
|
| var fnBody =
|
| js.call('this.noSuchMethod(new dart.InvocationImpl(#, #, #))', [
|
| - _elementMemberName(method),
|
| + _declareMemberName(method),
|
| positionalArgs,
|
| new JS.ObjectInitializer(invocationProps)
|
| ]);
|
| @@ -1449,7 +1447,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| // TODO(jmesserly): generic type arguments will get dropped.
|
| // We have a similar issue with `dgsend` helpers.
|
| return new JS.Method(
|
| - _elementMemberName(method,
|
| + _declareMemberName(method,
|
| useExtension:
|
| _extensionTypes.isNativeClass(method.enclosingElement)),
|
| _makeGenericFunction(fn),
|
| @@ -1482,8 +1480,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| Map<FieldElement, JS.TemporaryId> virtualFields) {
|
| var virtualField = virtualFields[field.element];
|
| var result = <JS.Method>[];
|
| - var name = _emitMemberName(field.element.name,
|
| - type: (field.element.enclosingElement as ClassElement).type);
|
| + var name = _declareMemberName((field.element as FieldElement).getter);
|
| var getter = js.call('function() { return this[#]; }', [virtualField]);
|
| result.add(new JS.Method(name, getter, isGetter: true));
|
|
|
| @@ -1512,8 +1509,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| checkForPropertyOverride(methodElement.variable, superclasses);
|
|
|
| // Generate a corresponding virtual getter / setter.
|
| - var name = _elementMemberName(methodElement,
|
| - useExtension: _extensionTypes.isNativeClass(type.element));
|
| + var name = _declareMemberName(methodElement);
|
| if (method.isGetter) {
|
| // Generate a setter
|
| if (field.setter != null || !propertyOverrideResult.foundSetter)
|
| @@ -1676,7 +1672,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| if (extensions.isNotEmpty) {
|
| var methodNames = <JS.Expression>[];
|
| for (var e in extensions) {
|
| - methodNames.add(_elementMemberName(e, useExtension: false));
|
| + methodNames.add(_declareMemberName(e, useExtension: false));
|
| }
|
| body.add(js.statement('dart.defineExtensionMembers(#, #);', [
|
| className,
|
| @@ -1742,8 +1738,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| if (inheritedElement != null && inheritedElement.type == element.type) {
|
| continue;
|
| }
|
| - var memberName = _elementMemberName(element,
|
| - useExtension: _extensionTypes.isNativeClass(classElem));
|
| + var memberName = _declareMemberName(element);
|
| var property = new JS.Property(memberName, type);
|
| tMember.add(property);
|
| // TODO(vsm): Why do we need this?
|
| @@ -1757,8 +1752,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| for (FieldDeclaration node in fields) {
|
| for (VariableDeclaration field in node.fields.variables) {
|
| var element = field.element as FieldElement;
|
| - var memberName = _elementMemberName(element.getter,
|
| - useExtension: _extensionTypes.isNativeClass(classElem));
|
| + var memberName = _declareMemberName(element.getter);
|
| var type = _emitAnnotatedType(element.type, node.metadata);
|
| var property = new JS.Property(memberName, type);
|
| (node.isStatic ? tStaticFields : tInstanceFields).add(property);
|
| @@ -1841,7 +1835,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| var dartxNames = <JS.Expression>[];
|
| for (var m in methods) {
|
| if (!m.isAbstract && !m.isStatic && m.element.isPublic) {
|
| - dartxNames.add(_elementMemberName(m.element, useExtension: false));
|
| + dartxNames.add(_declareMemberName(m.element, useExtension: false));
|
| }
|
| }
|
| for (var fieldDecl in fields) {
|
| @@ -1849,7 +1843,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| for (var field in fieldDecl.fields.variables) {
|
| var e = field.element as FieldElement;
|
| if (e.isPublic) {
|
| - dartxNames.add(_elementMemberName(e.getter, useExtension: false));
|
| + dartxNames.add(_declareMemberName(e.getter, useExtension: false));
|
| }
|
| }
|
| }
|
| @@ -2153,13 +2147,8 @@ class CodeGenerator extends GeneralizingAstVisitor
|
|
|
| var body = <JS.Statement>[];
|
| fields.forEach((FieldElement e, JS.Expression initialValue) {
|
| - if (virtualFields.containsKey(e)) {
|
| - body.add(
|
| - js.statement('this[#] = #;', [virtualFields[e], initialValue]));
|
| - } else {
|
| - var access = _emitMemberName(e.name, type: e.enclosingElement.type);
|
| - body.add(js.statement('this.# = #;', [access, initialValue]));
|
| - }
|
| + JS.Expression access = virtualFields[e] ?? _declareMemberName(e.getter);
|
| + body.add(js.statement('this.# = #;', [access, initialValue]));
|
| });
|
|
|
| if (isConst) _loader.finishTopLevel(cls.element);
|
| @@ -2297,10 +2286,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| }
|
|
|
| return annotate(
|
| - new JS.Method(
|
| - _elementMemberName(node.element,
|
| - useExtension: _extensionTypes.isNativeClass(type.element)),
|
| - fn,
|
| + new JS.Method(_declareMemberName(node.element), fn,
|
| isGetter: node.isGetter,
|
| isSetter: node.isSetter,
|
| isStatic: node.isStatic),
|
| @@ -5217,7 +5203,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| ///
|
| /// Unlike call sites, we always have an element available, so we can use it
|
| /// directly rather than computing the relevant options for [_emitMemberName].
|
| - JS.Expression _elementMemberName(ExecutableElement e, {bool useExtension}) {
|
| + JS.Expression _declareMemberName(ExecutableElement e, {bool useExtension}) {
|
| String name;
|
| if (e is PropertyAccessorElement) {
|
| name = e.variable.name;
|
| @@ -5225,10 +5211,10 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| name = e.name;
|
| }
|
| return _emitMemberName(name,
|
| - type: (e.enclosingElement as ClassElement).type,
|
| unary: e.parameters.isEmpty,
|
| isStatic: e.isStatic,
|
| - useExtension: useExtension);
|
| + useExtension:
|
| + useExtension ?? _extensionTypes.isNativeClass(e.enclosingElement));
|
| }
|
|
|
| /// This handles member renaming for private names and operators.
|
|
|