Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
| index 4a1ed62c1adb197d128aefa225b47da5c5fe0607..e081a178fa18f3a691edac9ed597760bf54c732e 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
| @@ -727,7 +727,6 @@ $lazyInitializerLogic |
| compiler.codegenWorld.instantiatedClasses.contains(classElement); |
| void visitField(ClassElement enclosingClass, Element member) { |
| - assert(!member.isNative()); |
| assert(invariant(classElement, member.isDeclaration)); |
| LibraryElement library = member.getLibrary(); |
| @@ -752,9 +751,12 @@ $lazyInitializerLogic |
| if ((isInstantiated && !enclosingClass.isNative()) |
| || needsGetter |
| || needsSetter) { |
| - String fieldName = isShadowed |
| + String accessorName = isShadowed |
| ? namer.shadowedFieldName(member) |
| : namer.getName(member); |
| + String fieldName = member.isNative() |
| + ? member.nativeName() |
| + : accessorName; |
| bool needsCheckedSetter = false; |
| if (needsSetter && compiler.enableTypeAssertions |
| && canGenerateCheckedSetter(member)) { |
| @@ -831,6 +833,12 @@ $lazyInitializerLogic |
| bool needsGetter, |
| bool needsSetter, |
| bool needsCheckedSetter) { |
| + |
| + if (!getterAndSetterCanBeImplementedByFieldSpec( |
|
sra1
2012/11/30 07:12:17
Erik: This is a bit unsatisfactory that this funct
|
| + member, name, needsGetter, needsSetter)) { |
| + return; |
| + } |
| + |
| if (isFirstField) { |
| buffer.add('"": ['); |
| isFirstField = false; |
| @@ -860,23 +868,58 @@ $lazyInitializerLogic |
| void emitClassGettersSetters(ClassElement classElement, |
| CodeBuffer buffer, |
| bool emitLeadingComma) { |
| + emitComma() { |
| + if (emitLeadingComma) { |
| + buffer.add(",\n "); |
| + } else { |
| + emitLeadingComma = true; |
| + } |
| + } |
| + |
| visitClassFields(classElement, (Element member, |
| String name, |
| bool needsGetter, |
| bool needsSetter, |
| bool needsCheckedSetter) { |
| + if (name == null) throw 123; |
| + if (getterAndSetterCanBeImplementedByFieldSpec( |
| + member, name, needsGetter, needsSetter)) { |
| + needsGetter = false; |
| + needsSetter = false; |
| + } |
| + if (needsGetter) { |
| + emitComma(); |
| + generateGetter(member, name, buffer); |
| + } |
| + if (needsSetter) { |
| + emitComma(); |
| + generateSetter(member, name, buffer); |
| + } |
| if (needsCheckedSetter) { |
| assert(!needsSetter); |
| - if (emitLeadingComma) { |
| - buffer.add(",\n "); |
| - } else { |
| - emitLeadingComma = true; |
| - } |
| + emitComma(); |
| generateCheckedSetter(member, name, buffer); |
| } |
| }); |
| } |
| + bool getterAndSetterCanBeImplementedByFieldSpec(Element member, |
| + String name, |
| + bool needsGetter, |
| + bool needsSetter) { |
| + if (needsGetter) { |
| + if (namer.getterName(member.getLibrary(), member.name) != 'get\$$name') { |
| + return false; |
| + } |
| + } |
| + if (needsSetter) { |
| + if (namer.setterName(member.getLibrary(), member.name) != 'set\$$name') { |
| + return false; |
| + } |
| + } |
| + return true; |
| + } |
| + |
| /** |
| * Documentation wanted -- johnniwinther |
| * |
| @@ -1249,7 +1292,9 @@ $classesCollector.$mangledName = {'': |
| if (member.isGetter()) { |
| getter = "this.${namer.getterName(member.getLibrary(), member.name)}()"; |
| } else { |
| - String name = namer.instanceFieldName(memberLibrary, member.name); |
| + String name = member.isNative() |
| + ? member.nativeName() |
| + : namer.instanceFieldName(memberLibrary, member.name); |
| getter = "this.$name"; |
| } |
| for (Selector selector in selectors) { |