| Index: lib/src/compiler/code_generator.dart
|
| diff --git a/lib/src/compiler/code_generator.dart b/lib/src/compiler/code_generator.dart
|
| index 67263cfe43ba16358b222be280292a0b425a2b48..898c6b57be226f3406c2815c4d858c587801ca44 100644
|
| --- a/lib/src/compiler/code_generator.dart
|
| +++ b/lib/src/compiler/code_generator.dart
|
| @@ -867,7 +867,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| jsMethods.add(_emitIterable(type));
|
| }
|
| } else if (m is FieldDeclaration) {
|
| - if (_extensionTypes.contains(element)) {
|
| + if (_extensionTypes.isNativeClass(element)) {
|
| jsMethods.addAll(_emitNativeFieldAccessors(m));
|
| continue;
|
| }
|
| @@ -937,7 +937,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
|
|
| // Generate a corresponding virtual getter / setter.
|
| var name = _elementMemberName(methodElement,
|
| - allowExtensions: _extensionTypes.contains(type.element));
|
| + allowExtensions: _extensionTypes.isNativeClass(type.element));
|
| if (method.isGetter) {
|
| // Generate a setter
|
| if (field.setter != null || !propertyOverrideResult.foundSetter)
|
| @@ -1000,7 +1000,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| classElem,
|
| (a) =>
|
| isJsPeerInterface(a) ||
|
| - isNativeAnnotation(a) && _extensionTypes.contains(classElem));
|
| + isNativeAnnotation(a) && _extensionTypes.isNativeClass(classElem));
|
| if (jsPeerName != null && jsPeerName.contains(',')) {
|
| jsPeerName = jsPeerName.split(',')[0];
|
| }
|
| @@ -1091,7 +1091,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| if (extensions.isNotEmpty) {
|
| var methodNames = <JS.Expression>[];
|
| for (var e in extensions) {
|
| - methodNames.add(_elementMemberName(e));
|
| + methodNames.add(_elementMemberName(e, allowExtensions: false));
|
| }
|
| body.add(js.statement('dart.defineExtensionMembers(#, #);', [
|
| className,
|
| @@ -1128,7 +1128,8 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| if (inheritedElement != null && inheritedElement.type == element.type) {
|
| continue;
|
| }
|
| - var memberName = _elementMemberName(element);
|
| + var memberName = _elementMemberName(element,
|
| + allowExtensions: _extensionTypes.isNativeClass(classElem));
|
| var parts = _emitFunctionTypeParts(element.type);
|
| var property =
|
| new JS.Property(memberName, new JS.ArrayInitializer(parts));
|
| @@ -1180,7 +1181,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| List<MethodDeclaration> methods,
|
| List<FieldDeclaration> fields,
|
| List<JS.Statement> body) {
|
| - if (_extensionTypes.contains(classElem)) {
|
| + if (_extensionTypes.hasNativeSubtype(classElem.type)) {
|
| var dartxNames = <JS.Expression>[];
|
| for (var m in methods) {
|
| if (!m.isAbstract && !m.isStatic && m.element.isPublic) {
|
| @@ -1206,12 +1207,11 @@ class CodeGenerator extends GeneralizingAstVisitor
|
|
|
| List<ExecutableElement> _extensionsToImplement(ClassElement element) {
|
| var members = <ExecutableElement>[];
|
| - if (_extensionTypes.contains(element)) return members;
|
| + if (_extensionTypes.isNativeClass(element)) return members;
|
|
|
| // Collect all extension types we implement.
|
| var type = element.type;
|
| - var types = new Set<ClassElement>();
|
| - _collectExtensions(type, types);
|
| + var types = _extensionTypes.collectNativeInterfaces(element);
|
| if (types.isEmpty) return members;
|
|
|
| // Collect all possible extension method names.
|
| @@ -1231,21 +1231,6 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| return members;
|
| }
|
|
|
| - /// Collections the type and all supertypes, including interfaces, but
|
| - /// excluding [Object].
|
| - void _collectExtensions(InterfaceType type, Set<ClassElement> types) {
|
| - if (type.isObject) return;
|
| - var element = type.element;
|
| - if (_extensionTypes.contains(element)) types.add(element);
|
| - for (var m in type.mixins.reversed) {
|
| - _collectExtensions(m, types);
|
| - }
|
| - for (var i in type.interfaces) {
|
| - _collectExtensions(i, types);
|
| - }
|
| - _collectExtensions(type.superclass, types);
|
| - }
|
| -
|
| /// Generates the implicit default constructor for class C of the form
|
| /// `C() : super() {}`.
|
| JS.Method _emitImplicitConstructor(
|
| @@ -1665,7 +1650,10 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| }
|
|
|
| return annotate(
|
| - new JS.Method(_elementMemberName(node.element), fn,
|
| + new JS.Method(
|
| + _elementMemberName(node.element,
|
| + allowExtensions: _extensionTypes.isNativeClass(type.element)),
|
| + fn,
|
| isGetter: node.isGetter,
|
| isSetter: node.isSetter,
|
| isStatic: node.isStatic),
|
| @@ -3541,7 +3529,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| var type = getStaticType(target);
|
| return isNullable(target) ||
|
| type.isDynamic ||
|
| - (_extensionTypes.contains(type.element) && target is! SuperExpression);
|
| + (_extensionTypes.hasNativeSubtype(type) && target is! SuperExpression);
|
| }
|
|
|
| /// Shared code for [PrefixedIdentifier] and [PropertyAccess].
|
| @@ -4144,7 +4132,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| }
|
| if (allowExtensions &&
|
| baseType != null &&
|
| - _extensionTypes.contains(baseType.element) &&
|
| + _extensionTypes.hasNativeSubtype(baseType) &&
|
| !isObjectProperty(name)) {
|
| return js.call('dartx.#', _propertyName(name));
|
| }
|
|
|