Chromium Code Reviews| Index: lib/compiler/implementation/emitter.dart |
| diff --git a/lib/compiler/implementation/emitter.dart b/lib/compiler/implementation/emitter.dart |
| index 9cd1ea2044529a829af5aefa152220de1cc04473..5b16310ffd8632407a898cc6e83e05ed33ad10fa 100644 |
| --- a/lib/compiler/implementation/emitter.dart |
| +++ b/lib/compiler/implementation/emitter.dart |
| @@ -425,21 +425,7 @@ function(collectedClasses) { |
| if (!parameters.optionalParameters.isEmpty()) { |
| addParameterStubs(member, defineInstanceMember); |
| } |
| - } else if (member.kind === ElementKind.FIELD) { |
| - SourceString name = member.name; |
| - ClassElement cls = member.getEnclosingClass(); |
| - if (cls.lookupSuperMember(name) !== null) { |
| - String fieldName = namer.instanceFieldName(cls, name); |
| - CodeBuffer getterBuffer = new CodeBuffer(); |
| - getterBuffer.add('function() {\n return this.$fieldName;\n }'); |
| - defineInstanceMember(namer.getterName(cls.getLibrary(), name), |
| - getterBuffer); |
| - CodeBuffer setterBuffer = new CodeBuffer(); |
| - setterBuffer.add('function(x) {\n this.$fieldName = x;\n }'); |
| - defineInstanceMember(namer.setterName(cls.getLibrary(), name), |
| - setterBuffer); |
| - } |
| - } else { |
| + } else if (member.kind !== ElementKind.FIELD) { |
| compiler.internalError('unexpected kind: "${member.kind}"', |
| element: member); |
| } |
| @@ -455,15 +441,24 @@ function(collectedClasses) { |
| bool isFirstField = true; |
| void addField(ClassElement enclosingClass, Element member) { |
| assert(!member.isNative()); |
| + |
| + LibraryElement library = member.getLibrary(); |
| + SourceString name = member.name; |
| + bool isPrivate = name.isPrivate(); |
| // See if we can dynamically create getters and setters. |
| // We can only generate getters and setters for [classElement] since |
| // the fields of super classes could be overwritten with getters or |
| // setters. |
| bool needsDynamicGetter = false; |
| bool needsDynamicSetter = false; |
| + // We need to name shadowed fields differently, so they don't clash with |
| + // the non-shadowed field. |
| + bool isShadowed = false; |
| if (enclosingClass === classElement) { |
| needsDynamicGetter = instanceFieldNeedsGetter(member); |
| needsDynamicSetter = instanceFieldNeedsSetter(member); |
| + } else { |
| + isShadowed = classElement.isShadowedByField(member); |
| } |
| if ((isInstantiated && !enclosingClass.isNative()) |
| @@ -474,9 +469,12 @@ function(collectedClasses) { |
| } else { |
| buffer.add(", "); |
| } |
| - SourceString name = member.name; |
| - String fieldName = namer.instanceFieldName(member.getEnclosingClass(), |
| - name); |
| + String fieldName; |
|
kasperl
2012/08/07 08:14:20
Maybe use ?: here?
floitsch
2012/08/07 12:20:16
Done.
|
| + if (isShadowed) { |
| + fieldName = namer.shadowedFieldName(member); |
| + } else { |
| + fieldName = namer.instanceFieldName(library, name); |
| + } |
| // Getters and setters with suffixes will be generated dynamically. |
| buffer.add('"$fieldName'); |
| if (needsDynamicGetter || needsDynamicSetter) { |
| @@ -782,8 +780,7 @@ $classesCollector.$mangledName = {'': |
| if (member.kind == ElementKind.GETTER) { |
| getter = "this.${namer.getterName(member.getLibrary(), member.name)}()"; |
| } else { |
| - String name = namer.instanceFieldName(member.getEnclosingClass(), |
| - member.name); |
| + String name = namer.instanceFieldName(member.getLibrary(), member.name); |
| getter = "this.$name"; |
| } |
| for (Selector selector in selectors) { |