| Index: lib/compiler/implementation/js_backend/native_emitter.dart
|
| diff --git a/lib/compiler/implementation/js_backend/native_emitter.dart b/lib/compiler/implementation/js_backend/native_emitter.dart
|
| index 4747a6e12af203703bd04f5b1b6abf4636328254..d66a30eda4c258db18e0259d8aa7d74e44f62386 100644
|
| --- a/lib/compiler/implementation/js_backend/native_emitter.dart
|
| +++ b/lib/compiler/implementation/js_backend/native_emitter.dart
|
| @@ -95,13 +95,19 @@ class NativeEmitter {
|
|
|
| String get defineNativeClassFunction {
|
| return """
|
| -function(cls, fields, methods) {
|
| +function(cls, desc) {
|
| + var fields = desc[''] || [];
|
| var generateGetterSetter = ${emitter.generateGetterSetterFunction};
|
| for (var i = 0; i < fields.length; i++) {
|
| - generateGetterSetter(fields[i], methods);
|
| + generateGetterSetter(fields[i], desc);
|
| }
|
| - for (var method in methods) {
|
| - $dynamicName(method)[cls] = methods[method];
|
| + var hasOwnProperty = Object.prototype.hasOwnProperty;
|
| + for (var method in desc) {
|
| + if (method !== '') {
|
| + if (hasOwnProperty.call(desc, method)) {
|
| + $dynamicName(method)[cls] = desc[method];
|
| + }
|
| + }
|
| }
|
| }""";
|
| }
|
| @@ -157,23 +163,39 @@ function(cls, fields, methods) {
|
| }
|
|
|
| CodeBuffer fieldBuffer = new CodeBuffer();
|
| - List<String> checkedSetters =
|
| - emitter.emitClassFields(classElement, fieldBuffer);
|
| + CodeBuffer getterSetterBuffer = new CodeBuffer();
|
| +
|
| + emitter.emitClassFields(classElement, fieldBuffer);
|
| + emitter.emitClassGettersSetters(classElement, getterSetterBuffer,
|
| + omitLeadingComma: true);
|
|
|
| CodeBuffer methodBuffer = new CodeBuffer();
|
| emitter.emitInstanceMembers(classElement, methodBuffer, false);
|
|
|
| - if (methodBuffer.isEmpty() && fieldBuffer.isEmpty()) return;
|
| + if (methodBuffer.isEmpty()
|
| + && fieldBuffer.isEmpty()
|
| + && getterSetterBuffer.isEmpty()) {
|
| + return;
|
| + }
|
|
|
| String nativeName = toNativeName(classElement);
|
| - nativeBuffer.add("$defineNativeClassName('$nativeName', [");
|
| - nativeBuffer.add(fieldBuffer);
|
| - nativeBuffer.add('], {');
|
| - if (!checkedSetters.isEmpty()) {
|
| - nativeBuffer.add('${Strings.join(checkedSetters, ",\n")}');
|
| - nativeBuffer.add(',\n');
|
| + nativeBuffer.add("$defineNativeClassName('$nativeName', ");
|
| + nativeBuffer.add('{');
|
| + bool firstInMap = true;
|
| + if (!fieldBuffer.isEmpty()) {
|
| + firstInMap = false;
|
| + nativeBuffer.add(fieldBuffer);
|
| + }
|
| + if (!getterSetterBuffer.isEmpty()) {
|
| + if (!firstInMap) nativeBuffer.add(",");
|
| + firstInMap = false;
|
| + nativeBuffer.add("\n ");
|
| + nativeBuffer.add(getterSetterBuffer);
|
| + }
|
| + if (!methodBuffer.isEmpty()) {
|
| + if (!firstInMap) nativeBuffer.add(",");
|
| + nativeBuffer.add(methodBuffer);
|
| }
|
| - nativeBuffer.add(methodBuffer);
|
| nativeBuffer.add('\n});\n\n');
|
|
|
| classesWithDynamicDispatch.add(classElement);
|
|
|