| 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 afabcf3a6cb464103b5cce1d8cd97a446732f367..77823503650cbbcb42ceb97ad30ac5f37a78748c 100644
|
| --- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart
|
| +++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
|
| @@ -1164,11 +1164,27 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| js.call('function() { return #[this.index]; }', nameMap) as JS.Fun);
|
|
|
| // Create enum class
|
| + JS.Property build(String name, List<JS.Property> elements) {
|
| + var o =
|
| + new JS.ObjectInitializer(elements, multiline: elements.length > 1);
|
| + // TODO(vsm): Remove
|
| + var e = js.call('() => #', o);
|
| + return new JS.Property(_propertyName(name), e);
|
| + }
|
| +
|
| var classExpr = new JS.ClassExpression(new JS.Identifier(type.name),
|
| _emitClassHeritage(element), [constructor, toStringF]);
|
| var id = _emitTopLevelName(element);
|
| +
|
| + // Emit metadata for synthetic enum index member.
|
| + // TODO(jacobr): make field readonly when that is supported.
|
| + var tInstanceFields = <JS.Property>[new JS.Property(_emitMemberName('index'), _emitAnnotatedType(intClass.type, null))];
|
| + var sigFields = <JS.Property>[build('fields', tInstanceFields)];
|
| + var sig = new JS.ObjectInitializer(sigFields);
|
| +
|
| var result = [
|
| - js.statement('# = #', [id, classExpr])
|
| + js.statement('# = #', [id, classExpr]),
|
| + _callHelperStatement('setSignature(#, #);', [id, sig])
|
| ];
|
|
|
| // defineEnumValues internally depends on dart.constList which uses
|
| @@ -1506,7 +1522,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
|
|
| var fnBody = js.call('this.noSuchMethod(new #.InvocationImpl(#, #, #))', [
|
| _runtimeModule,
|
| - _declareMemberName(method),
|
| + _declareMemberName(method, useDisplayName: true),
|
| positionalArgs,
|
| new JS.ObjectInitializer(invocationProps)
|
| ]);
|
| @@ -1949,14 +1965,14 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| }
|
|
|
| List<ExecutableElement> _extensionsToImplement(ClassElement element) {
|
| - var members = <ExecutableElement>[];
|
| - if (_extensionTypes.isNativeClass(element)) return members;
|
| + if (_extensionTypes.isNativeClass(element)) return [];
|
|
|
| // Collect all extension types we implement.
|
| var type = element.type;
|
| var types = _extensionTypes.collectNativeInterfaces(element);
|
| - if (types.isEmpty) return members;
|
| + if (types.isEmpty) return [];
|
|
|
| + var members = new Set<ExecutableElement>();
|
| // Collect all possible extension method names.
|
| var extensionMembers = new HashSet<String>();
|
| for (var t in types) {
|
| @@ -1971,7 +1987,9 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| members.add(m);
|
| }
|
| }
|
| - return members;
|
| + members.addAll(_collectMockMethods(type)
|
| + .where((m) => extensionMembers.contains(m.name)));
|
| + return members.toList();
|
| }
|
|
|
| /// Generates the implicit default constructor for class C of the form
|
| @@ -5480,17 +5498,14 @@ 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 _declareMemberName(ExecutableElement e, {bool useExtension}) {
|
| - String name;
|
| - if (e is PropertyAccessorElement) {
|
| - name = e.variable.name;
|
| - } else {
|
| - name = e.name;
|
| - }
|
| + JS.Expression _declareMemberName(ExecutableElement e,
|
| + {bool useExtension, useDisplayName = false}) {
|
| + var name = (e is PropertyAccessorElement) ? e.variable.name : e.name;
|
| return _emitMemberName(name,
|
| isStatic: e.isStatic,
|
| useExtension:
|
| - useExtension ?? _extensionTypes.isNativeClass(e.enclosingElement));
|
| + useExtension ?? _extensionTypes.isNativeClass(e.enclosingElement),
|
| + useDisplayName: useDisplayName);
|
| }
|
|
|
| /// This handles member renaming for private names and operators.
|
| @@ -5537,6 +5552,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| {DartType type,
|
| bool isStatic: false,
|
| bool useExtension,
|
| + bool useDisplayName: false,
|
| Element element}) {
|
| // Static members skip the rename steps and may require JS interop renames.
|
| if (isStatic) {
|
| @@ -5549,20 +5565,22 @@ class CodeGenerator extends GeneralizingAstVisitor
|
|
|
| // When generating synthetic names, we use _ as the prefix, since Dart names
|
| // won't have this (eliminated above), nor will static names reach here.
|
| - switch (name) {
|
| - case '[]':
|
| - name = '_get';
|
| - break;
|
| - case '[]=':
|
| - name = '_set';
|
| - break;
|
| - case 'unary-':
|
| - name = '_negate';
|
| - break;
|
| - case 'constructor':
|
| - case 'prototype':
|
| - name = '_$name';
|
| - break;
|
| + if (!useDisplayName) {
|
| + switch (name) {
|
| + case '[]':
|
| + name = '_get';
|
| + break;
|
| + case '[]=':
|
| + name = '_set';
|
| + break;
|
| + case 'unary-':
|
| + name = '_negate';
|
| + break;
|
| + case 'constructor':
|
| + case 'prototype':
|
| + name = '_$name';
|
| + break;
|
| + }
|
| }
|
|
|
| var result = _propertyName(name);
|
|
|