Minor refactoring of TImpl codegen
Extract some methods
This commit is contained in:
@@ -37,7 +37,6 @@ import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
|
|||||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
|
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
|
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
|
|
||||||
import org.jetbrains.jet.lang.types.JetType;
|
import org.jetbrains.jet.lang.types.JetType;
|
||||||
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
||||||
import org.jetbrains.jet.lexer.JetTokens;
|
import org.jetbrains.jet.lexer.JetTokens;
|
||||||
@@ -47,8 +46,7 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import static org.jetbrains.asm4.Opcodes.*;
|
import static org.jetbrains.asm4.Opcodes.*;
|
||||||
import static org.jetbrains.jet.codegen.CodegenUtil.isInterface;
|
import static org.jetbrains.jet.codegen.CodegenUtil.*;
|
||||||
import static org.jetbrains.jet.codegen.CodegenUtil.isNullableType;
|
|
||||||
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isClassObject;
|
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isClassObject;
|
||||||
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JAVA_STRING_TYPE;
|
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JAVA_STRING_TYPE;
|
||||||
|
|
||||||
@@ -269,6 +267,16 @@ public class AsmUtil {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public static Type getTraitImplThisParameterType(@NotNull ClassDescriptor traitDescriptor, @NotNull JetTypeMapper typeMapper) {
|
||||||
|
JetType jetType = getSuperClass(traitDescriptor);
|
||||||
|
Type type = typeMapper.mapType(jetType);
|
||||||
|
if (type.getInternalName().equals("java/lang/Object")) {
|
||||||
|
return typeMapper.mapType(traitDescriptor.getDefaultType());
|
||||||
|
}
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
private static Type stringValueOfOrStringBuilderAppendType(Type type) {
|
private static Type stringValueOfOrStringBuilderAppendType(Type type) {
|
||||||
int sort = type.getSort();
|
int sort = type.getSort();
|
||||||
return sort == Type.OBJECT || sort == Type.ARRAY
|
return sort == Type.OBJECT || sort == Type.ARRAY
|
||||||
|
|||||||
@@ -64,7 +64,6 @@ import static org.jetbrains.jet.codegen.AsmUtil.*;
|
|||||||
import static org.jetbrains.jet.codegen.CodegenUtil.*;
|
import static org.jetbrains.jet.codegen.CodegenUtil.*;
|
||||||
import static org.jetbrains.jet.codegen.binding.CodegenBinding.*;
|
import static org.jetbrains.jet.codegen.binding.CodegenBinding.*;
|
||||||
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.callableDescriptorToDeclaration;
|
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.callableDescriptorToDeclaration;
|
||||||
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration;
|
|
||||||
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*;
|
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*;
|
||||||
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JAVA_STRING_TYPE;
|
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JAVA_STRING_TYPE;
|
||||||
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE;
|
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE;
|
||||||
@@ -1431,12 +1430,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
reg += argTypes[i].getSize();
|
reg += argTypes[i].getSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
JetType jetType = CodegenUtil.getSuperClass(declaration);
|
Type type = getTraitImplThisParameterType(declaration, typeMapper);
|
||||||
Type type = typeMapper.mapType(jetType, JetTypeMapperMode.IMPL);
|
|
||||||
if (type.getInternalName().equals("java/lang/Object")) {
|
|
||||||
jetType = declaration.getDefaultType();
|
|
||||||
type = typeMapper.mapType(jetType, JetTypeMapperMode.IMPL);
|
|
||||||
}
|
|
||||||
|
|
||||||
String fdescriptor = functionOriginal.getDescriptor().replace("(", "(" + type.getDescriptor());
|
String fdescriptor = functionOriginal.getDescriptor().replace("(", "(" + type.getDescriptor());
|
||||||
Type type1 =
|
Type type1 =
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import java.util.Map;
|
|||||||
|
|
||||||
import static org.jetbrains.asm4.Opcodes.*;
|
import static org.jetbrains.asm4.Opcodes.*;
|
||||||
import static org.jetbrains.jet.codegen.AsmUtil.boxType;
|
import static org.jetbrains.jet.codegen.AsmUtil.boxType;
|
||||||
|
import static org.jetbrains.jet.codegen.AsmUtil.getTraitImplThisParameterType;
|
||||||
import static org.jetbrains.jet.codegen.CodegenUtil.*;
|
import static org.jetbrains.jet.codegen.CodegenUtil.*;
|
||||||
import static org.jetbrains.jet.codegen.binding.CodegenBinding.*;
|
import static org.jetbrains.jet.codegen.binding.CodegenBinding.*;
|
||||||
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration;
|
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration;
|
||||||
@@ -547,10 +548,11 @@ public class JetTypeMapper extends BindingTraceAware {
|
|||||||
thisClass, receiverParameterType, null);
|
thisClass, receiverParameterType, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isAccessor(FunctionDescriptor functionDescriptor) {
|
private static boolean isAccessor(@NotNull CallableMemberDescriptor descriptor) {
|
||||||
return functionDescriptor instanceof AccessorForFunctionDescriptor ||
|
return descriptor instanceof AccessorForFunctionDescriptor ||
|
||||||
functionDescriptor instanceof AccessorForPropertyDescriptor.Getter ||
|
descriptor instanceof AccessorForPropertyDescriptor ||
|
||||||
functionDescriptor instanceof AccessorForPropertyDescriptor.Setter;
|
descriptor instanceof AccessorForPropertyDescriptor.Getter ||
|
||||||
|
descriptor instanceof AccessorForPropertyDescriptor.Setter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -566,7 +568,6 @@ public class JetTypeMapper extends BindingTraceAware {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private JvmMethodSignature mapSignature(FunctionDescriptor f, boolean needGenericSignature, OwnerKind kind) {
|
private JvmMethodSignature mapSignature(FunctionDescriptor f, boolean needGenericSignature, OwnerKind kind) {
|
||||||
|
|
||||||
if (kind == OwnerKind.TRAIT_IMPL) {
|
if (kind == OwnerKind.TRAIT_IMPL) {
|
||||||
needGenericSignature = false;
|
needGenericSignature = false;
|
||||||
}
|
}
|
||||||
@@ -575,35 +576,11 @@ public class JetTypeMapper extends BindingTraceAware {
|
|||||||
|
|
||||||
writeFormalTypeParameters(f.getTypeParameters(), signatureVisitor);
|
writeFormalTypeParameters(f.getTypeParameters(), signatureVisitor);
|
||||||
|
|
||||||
JetType receiverType = DescriptorUtils.getReceiverParameterType(f.getReceiverParameter());
|
|
||||||
List<ValueParameterDescriptor> parameters = f.getValueParameters();
|
|
||||||
|
|
||||||
signatureVisitor.writeParametersStart();
|
signatureVisitor.writeParametersStart();
|
||||||
|
writeThisIfNeeded(f, kind, signatureVisitor);
|
||||||
|
writeReceiverIfNeeded(f.getReceiverParameter(), signatureVisitor);
|
||||||
|
|
||||||
if (kind == OwnerKind.TRAIT_IMPL) {
|
for (ValueParameterDescriptor parameter : f.getValueParameters()) {
|
||||||
ClassDescriptor containingDeclaration = (ClassDescriptor) f.getContainingDeclaration();
|
|
||||||
JetType jetType = CodegenUtil.getSuperClass(containingDeclaration);
|
|
||||||
Type type = mapType(jetType);
|
|
||||||
if (type.getInternalName().equals("java/lang/Object")) {
|
|
||||||
jetType = containingDeclaration.getDefaultType();
|
|
||||||
type = mapType(jetType);
|
|
||||||
}
|
|
||||||
|
|
||||||
signatureVisitor.writeParameterType(JvmMethodParameterKind.THIS);
|
|
||||||
signatureVisitor.writeAsmType(type, jetType.isNullable());
|
|
||||||
signatureVisitor.writeParameterTypeEnd();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
writeThisForAccessorIfNeeded(f, signatureVisitor);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (receiverType != null) {
|
|
||||||
signatureVisitor.writeParameterType(JvmMethodParameterKind.RECEIVER);
|
|
||||||
mapType(receiverType, signatureVisitor, JetTypeMapperMode.VALUE);
|
|
||||||
signatureVisitor.writeParameterTypeEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (ValueParameterDescriptor parameter : parameters) {
|
|
||||||
writeParameter(signatureVisitor, parameter.getType());
|
writeParameter(signatureVisitor, parameter.getType());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -622,10 +599,28 @@ public class JetTypeMapper extends BindingTraceAware {
|
|||||||
return signatureVisitor.makeJvmMethodSignature(f.getName().getName());
|
return signatureVisitor.makeJvmMethodSignature(f.getName().getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeThisForAccessorIfNeeded(FunctionDescriptor f, BothSignatureWriter signatureVisitor) {
|
private void writeThisIfNeeded(
|
||||||
if (isAccessor(f) && f.getExpectedThisObject() != null) {
|
@NotNull CallableMemberDescriptor descriptor,
|
||||||
|
@NotNull OwnerKind kind,
|
||||||
|
@NotNull BothSignatureWriter signatureVisitor
|
||||||
|
) {
|
||||||
|
if (kind == OwnerKind.TRAIT_IMPL) {
|
||||||
|
ClassDescriptor containingDeclaration = (ClassDescriptor) descriptor.getContainingDeclaration();
|
||||||
|
Type type = getTraitImplThisParameterType(containingDeclaration, this);
|
||||||
|
|
||||||
signatureVisitor.writeParameterType(JvmMethodParameterKind.THIS);
|
signatureVisitor.writeParameterType(JvmMethodParameterKind.THIS);
|
||||||
mapType(((ClassifierDescriptor) f.getContainingDeclaration()).getDefaultType(), signatureVisitor, JetTypeMapperMode.VALUE);
|
signatureVisitor.writeAsmType(type, false);
|
||||||
|
signatureVisitor.writeParameterTypeEnd();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
writeThisForAccessorIfNeeded(descriptor, signatureVisitor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeThisForAccessorIfNeeded(@NotNull CallableMemberDescriptor descriptor, @NotNull BothSignatureWriter signatureVisitor) {
|
||||||
|
if (isAccessor(descriptor) && descriptor.getExpectedThisObject() != null) {
|
||||||
|
signatureVisitor.writeParameterType(JvmMethodParameterKind.THIS);
|
||||||
|
mapType(((ClassifierDescriptor) descriptor.getContainingDeclaration()).getDefaultType(), signatureVisitor, JetTypeMapperMode.VALUE);
|
||||||
signatureVisitor.writeParameterTypeEnd();
|
signatureVisitor.writeParameterTypeEnd();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user