Minor cleanup in FieldOwnerContext

This commit is contained in:
Alexander Udalov
2014-05-22 21:23:28 +04:00
parent 69ef648005
commit 4ec8000121
2 changed files with 18 additions and 20 deletions
@@ -30,7 +30,7 @@ import org.jetbrains.jet.codegen.bridges.BridgesPackage;
import org.jetbrains.jet.codegen.context.ClassContext; import org.jetbrains.jet.codegen.context.ClassContext;
import org.jetbrains.jet.codegen.context.ConstructorContext; import org.jetbrains.jet.codegen.context.ConstructorContext;
import org.jetbrains.jet.codegen.context.MethodContext; 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.GenerationState;
import org.jetbrains.jet.codegen.state.JetTypeMapper; import org.jetbrains.jet.codegen.state.JetTypeMapper;
import org.jetbrains.jet.descriptors.serialization.BitEncoding; import org.jetbrains.jet.descriptors.serialization.BitEncoding;
@@ -1034,7 +1034,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
for (PropertyAndDefaultValue info : classObjectPropertiesToCopy) { for (PropertyAndDefaultValue info : classObjectPropertiesToCopy) {
PropertyDescriptor property = info.descriptor; 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); typeMapper.mapType(property).getDescriptor(), null, info.defaultValue);
AnnotationCodegen.forField(fv, typeMapper).genAnnotations(property); AnnotationCodegen.forField(fv, typeMapper).genAnnotations(property);
@@ -1177,7 +1177,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
iv.load(codegen.myFrameMap.getIndex(descriptor), type); iv.load(codegen.myFrameMap.getIndex(descriptor), type);
PropertyDescriptor propertyDescriptor = bindingContext.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, parameter); PropertyDescriptor propertyDescriptor = bindingContext.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, parameter);
assert propertyDescriptor != null : "Property descriptor is not found for 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++; curParam++;
} }
@@ -20,16 +20,17 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.OwnerKind; import org.jetbrains.jet.codegen.OwnerKind;
import org.jetbrains.jet.codegen.binding.MutableClosure; 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 org.jetbrains.jet.lang.resolve.java.JvmAbi;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
public abstract class FieldOwnerContext<T extends DeclarationDescriptor> extends CodegenContext<T> { public abstract class FieldOwnerContext<T extends DeclarationDescriptor> extends CodegenContext<T> {
//default property name -> map<property descriptor -> bytecode name> //default property name -> map<property descriptor -> bytecode name>
private Map<String, Map<PropertyDescriptor, String>> fieldNames = new HashMap<String, Map<PropertyDescriptor, String>>(); private final Map<String, Map<PropertyDescriptor, String>> fieldNames = new HashMap<String, Map<PropertyDescriptor, String>>();
public FieldOwnerContext( public FieldOwnerContext(
@NotNull T contextDescriptor, @NotNull T contextDescriptor,
@@ -42,19 +43,16 @@ public abstract class FieldOwnerContext<T extends DeclarationDescriptor> extends
super(contextDescriptor, contextKind, parentContext, closure, thisDescriptor, expressionCodegen); super(contextDescriptor, contextKind, parentContext, closure, thisDescriptor, expressionCodegen);
} }
public String getFieldName(PropertyDescriptor descriptor) { @NotNull
return getFieldName(descriptor, false); public String getFieldName(@NotNull PropertyDescriptor descriptor, boolean isDelegated) {
} assert descriptor.getKind().isReal() : "Only declared properties can have backing fields: " + descriptor;
public String getFieldName(PropertyDescriptor descriptor, boolean isDelegated) {
assert descriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE;
boolean isExtension = descriptor.getReceiverParameter() != null; 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) { @NotNull
descriptor = descriptor.getOriginal(); private String getFieldName(@NotNull PropertyDescriptor descriptor, boolean isDelegated, boolean isExtension) {
String defaultPropertyName = JvmAbi.getDefaultPropertyName(descriptor.getName(), isDelegated, isExtension); String defaultPropertyName = JvmAbi.getDefaultPropertyName(descriptor.getName(), isDelegated, isExtension);
Map<PropertyDescriptor, String> descriptor2Name = fieldNames.get(defaultPropertyName); Map<PropertyDescriptor, String> descriptor2Name = fieldNames.get(defaultPropertyName);
@@ -64,10 +62,10 @@ public abstract class FieldOwnerContext<T extends DeclarationDescriptor> extends
} }
String actualName = descriptor2Name.get(descriptor); String actualName = descriptor2Name.get(descriptor);
if (actualName == null) { if (actualName != null) return actualName;
actualName = descriptor2Name.isEmpty() ? defaultPropertyName : defaultPropertyName + "$" + descriptor2Name.size();
descriptor2Name.put(descriptor, actualName); String newName = descriptor2Name.isEmpty() ? defaultPropertyName : defaultPropertyName + "$" + descriptor2Name.size();
} descriptor2Name.put(descriptor, newName);
return actualName; return newName;
} }
} }