diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index ee8ffe78cae..b23c9258857 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -30,7 +30,7 @@ import org.jetbrains.jet.codegen.bridges.BridgesPackage; import org.jetbrains.jet.codegen.context.ClassContext; import org.jetbrains.jet.codegen.context.ConstructorContext; import org.jetbrains.jet.codegen.context.MethodContext; -import org.jetbrains.jet.codegen.signature.*; +import org.jetbrains.jet.codegen.signature.BothSignatureWriter; import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.JetTypeMapper; import org.jetbrains.jet.descriptors.serialization.BitEncoding; @@ -1034,7 +1034,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { for (PropertyAndDefaultValue info : classObjectPropertiesToCopy) { PropertyDescriptor property = info.descriptor; - FieldVisitor fv = v.newField(null, ACC_STATIC | ACC_FINAL | ACC_PUBLIC, context.getFieldName(property), + FieldVisitor fv = v.newField(null, ACC_STATIC | ACC_FINAL | ACC_PUBLIC, context.getFieldName(property, false), typeMapper.mapType(property).getDescriptor(), null, info.defaultValue); AnnotationCodegen.forField(fv, typeMapper).genAnnotations(property); @@ -1177,7 +1177,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { iv.load(codegen.myFrameMap.getIndex(descriptor), type); PropertyDescriptor propertyDescriptor = bindingContext.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, parameter); assert propertyDescriptor != null : "Property descriptor is not found for primary constructor parameter: " + parameter; - iv.putfield(classAsmType.getInternalName(), context.getFieldName(propertyDescriptor), type.getDescriptor()); + iv.putfield(classAsmType.getInternalName(), context.getFieldName(propertyDescriptor, false), type.getDescriptor()); } curParam++; } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/context/FieldOwnerContext.java b/compiler/backend/src/org/jetbrains/jet/codegen/context/FieldOwnerContext.java index ece881dda9e..c4d91177101 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/context/FieldOwnerContext.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/context/FieldOwnerContext.java @@ -20,16 +20,17 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.codegen.OwnerKind; import org.jetbrains.jet.codegen.binding.MutableClosure; -import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.descriptors.ClassDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.resolve.java.JvmAbi; import java.util.HashMap; import java.util.Map; public abstract class FieldOwnerContext extends CodegenContext { - //default property name -> map bytecode name> - private Map> fieldNames = new HashMap>(); + private final Map> fieldNames = new HashMap>(); public FieldOwnerContext( @NotNull T contextDescriptor, @@ -42,19 +43,16 @@ public abstract class FieldOwnerContext extends super(contextDescriptor, contextKind, parentContext, closure, thisDescriptor, expressionCodegen); } - public String getFieldName(PropertyDescriptor descriptor) { - return getFieldName(descriptor, false); - } - - public String getFieldName(PropertyDescriptor descriptor, boolean isDelegated) { - assert descriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE; + @NotNull + public String getFieldName(@NotNull PropertyDescriptor descriptor, boolean isDelegated) { + assert descriptor.getKind().isReal() : "Only declared properties can have backing fields: " + descriptor; boolean isExtension = descriptor.getReceiverParameter() != null; - return getFieldName(descriptor, isDelegated, isExtension); + return getFieldName(descriptor.getOriginal(), isDelegated, isExtension); } - private String getFieldName(PropertyDescriptor descriptor, boolean isDelegated, boolean isExtension) { - descriptor = descriptor.getOriginal(); + @NotNull + private String getFieldName(@NotNull PropertyDescriptor descriptor, boolean isDelegated, boolean isExtension) { String defaultPropertyName = JvmAbi.getDefaultPropertyName(descriptor.getName(), isDelegated, isExtension); Map descriptor2Name = fieldNames.get(defaultPropertyName); @@ -64,10 +62,10 @@ public abstract class FieldOwnerContext extends } String actualName = descriptor2Name.get(descriptor); - if (actualName == null) { - actualName = descriptor2Name.isEmpty() ? defaultPropertyName : defaultPropertyName + "$" + descriptor2Name.size(); - descriptor2Name.put(descriptor, actualName); - } - return actualName; + if (actualName != null) return actualName; + + String newName = descriptor2Name.isEmpty() ? defaultPropertyName : defaultPropertyName + "$" + descriptor2Name.size(); + descriptor2Name.put(descriptor, newName); + return newName; } }