Chromium Code Reviews| 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 |
|
Jennifer Messerly
2017/01/24 03:51:03
was this code copied from somewhere else?
Jacob
2017/01/24 19:12:32
That is scary. I had moved that to a shared helper
|
| + 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))]; |
|
Jennifer Messerly
2017/01/24 03:51:03
format?
Jacob
2017/01/24 19:12:32
fixed.
|
| + 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); |