write generic signature in getters and setters

This commit is contained in:
Stepan Koltsov
2012-01-13 03:55:09 +04:00
parent c78cb3cc19
commit 85ec4d980f
5 changed files with 95 additions and 20 deletions
@@ -350,7 +350,7 @@ public class BothSignatureWriter {
return kotlinParameterTypes; return kotlinParameterTypes;
} }
@Nullable @NotNull
public String makeKotlinReturnTypeSignature() { public String makeKotlinReturnTypeSignature() {
checkState(State.METHOD_END); checkState(State.METHOD_END);
return kotlinReturnType; return kotlinReturnType;
@@ -54,7 +54,8 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
public static CallableMethod asCallableMethod(FunctionDescriptor fd) { public static CallableMethod asCallableMethod(FunctionDescriptor fd) {
Method descriptor = erasedInvokeSignature(fd); Method descriptor = erasedInvokeSignature(fd);
String owner = getInternalClassName(fd); String owner = getInternalClassName(fd);
final CallableMethod result = new CallableMethod(owner, new JvmMethodSignature(descriptor, null, null, null, null), INVOKEVIRTUAL, Arrays.asList(descriptor.getArgumentTypes())); JvmMethodSignature jvmMethodSignature = new JvmMethodSignature(descriptor, null, null, null, "");
final CallableMethod result = new CallableMethod(owner, jvmMethodSignature, INVOKEVIRTUAL, Arrays.asList(descriptor.getArgumentTypes()));
if (fd.getReceiverParameter().exists()) { if (fd.getReceiverParameter().exists()) {
result.setNeedsReceiver(fd); result.setNeedsReceiver(fd);
} }
@@ -165,7 +166,8 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
final CodegenContext.ClosureContext closureContext = context.intoClosure(funDescriptor, function, name, this, state.getTypeMapper()); final CodegenContext.ClosureContext closureContext = context.intoClosure(funDescriptor, function, name, this, state.getTypeMapper());
FunctionCodegen fc = new FunctionCodegen(closureContext, cv, state); FunctionCodegen fc = new FunctionCodegen(closureContext, cv, state);
fc.generateMethod(body, new JvmMethodSignature(invokeSignature(funDescriptor), null, null, null, null), null, funDescriptor); JvmMethodSignature jvmMethodSignature = new JvmMethodSignature(invokeSignature(funDescriptor), null, null, null, "");
fc.generateMethod(body, jvmMethodSignature, null, funDescriptor);
return closureContext.outerWasUsed; return closureContext.outerWasUsed;
} }
@@ -361,7 +361,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
} }
constructorMethod = new Method("<init>", Type.VOID_TYPE, parameterTypes.toArray(new Type[parameterTypes.size()])); constructorMethod = new Method("<init>", Type.VOID_TYPE, parameterTypes.toArray(new Type[parameterTypes.size()]));
callableMethod = new CallableMethod("", new JvmMethodSignature(constructorMethod, null, null, null, null) /* TODO */, Opcodes.INVOKESPECIAL, Collections.<Type>emptyList()); callableMethod = new CallableMethod("", new JvmMethodSignature(constructorMethod, null, null, null, "") /* TODO */, Opcodes.INVOKESPECIAL, Collections.<Type>emptyList());
} }
else { else {
callableMethod = typeMapper.mapToCallableMethod(constructorDescriptor, kind); callableMethod = typeMapper.mapToCallableMethod(constructorDescriptor, kind);
@@ -494,7 +494,7 @@ public class JetTypeMapper {
} }
Method method = new Method(f.getName(), returnType, parameterTypes.toArray(new Type[parameterTypes.size()])); Method method = new Method(f.getName(), returnType, parameterTypes.toArray(new Type[parameterTypes.size()]));
if (signatureVisitor == null) { if (signatureVisitor == null) {
return new JvmMethodSignature(method, null, null, null, null); return new JvmMethodSignature(method, null, null, null, "");
} else { } else {
return new JvmMethodSignature(method, signatureVisitor.makeJavaString(), return new JvmMethodSignature(method, signatureVisitor.makeJavaString(),
signatureVisitor.makeKotlinMethodTypeParameters(), signatureVisitor.makeKotlinMethodTypeParameters(),
@@ -570,34 +570,61 @@ public class JetTypeMapper {
} }
Type returnType = mapReturnType(f.getReturnType()); Type returnType = mapReturnType(f.getReturnType());
// TODO: proper generic signature // TODO: proper generic signature
return new JvmMethodSignature(new Method(name, returnType, parameterTypes.toArray(new Type[parameterTypes.size()])), null, null, null, null); return new JvmMethodSignature(new Method(name, returnType, parameterTypes.toArray(new Type[parameterTypes.size()])), null, null, null, "");
} }
public JvmPropertyAccessorSignature mapGetterSignature(PropertyDescriptor descriptor, OwnerKind kind) { public JvmPropertyAccessorSignature mapGetterSignature(PropertyDescriptor descriptor, OwnerKind kind) {
Type returnType = mapType(descriptor.getOutType());
String name = PropertyCodegen.getterName(descriptor.getName()); String name = PropertyCodegen.getterName(descriptor.getName());
ArrayList<Type> params = new ArrayList<Type>(); ArrayList<Type> params = new ArrayList<Type>();
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD);
signatureWriter.writerFormalTypeParametersStart();
signatureWriter.writeFormalTypeParametersEnd();
signatureWriter.writeParametersStart();
if(kind == OwnerKind.TRAIT_IMPL) { if(kind == OwnerKind.TRAIT_IMPL) {
ClassDescriptor containingDeclaration = (ClassDescriptor) descriptor.getContainingDeclaration(); ClassDescriptor containingDeclaration = (ClassDescriptor) descriptor.getContainingDeclaration();
assert containingDeclaration != null; assert containingDeclaration != null;
params.add(mapType(containingDeclaration.getDefaultType())); signatureWriter.writeParameterType();
params.add(mapType(containingDeclaration.getDefaultType(), signatureWriter));
signatureWriter.writeParameterTypeEnd();
} }
if(descriptor.getReceiverParameter().exists()) { if(descriptor.getReceiverParameter().exists()) {
params.add(mapType(descriptor.getReceiverParameter().getType())); signatureWriter.writeParameterType();
params.add(mapType(descriptor.getReceiverParameter().getType(), signatureWriter));
signatureWriter.writeParameterTypeEnd();
} }
for (TypeParameterDescriptor typeParameterDescriptor : descriptor.getTypeParameters()) { for (TypeParameterDescriptor typeParameterDescriptor : descriptor.getTypeParameters()) {
if(typeParameterDescriptor.isReified()) { if(typeParameterDescriptor.isReified()) {
signatureWriter.writeParameterType();
params.add(TYPE_TYPEINFO); params.add(TYPE_TYPEINFO);
visitAsmType(signatureWriter, TYPE_TYPEINFO, false);
signatureWriter.writeParameterTypeEnd();
} }
} }
signatureWriter.writeParametersEnd();
signatureWriter.writeReturnType();
Type returnType = mapType(descriptor.getOutType(), signatureWriter);
signatureWriter.writeReturnTypeEnd();
// TODO: proper generic signature // TODO: proper generic signature
JvmMethodSignature jvmMethodSignature = new JvmMethodSignature(new Method(name, returnType, params.toArray(new Type[params.size()])), null, null, null, null); Method asmMethod = new Method(name, returnType, params.toArray(new Type[params.size()]));
JvmMethodSignature jvmMethodSignature = new JvmMethodSignature(
asmMethod,
signatureWriter.makeJavaString(),
signatureWriter.makeKotlinMethodTypeParameters(),
signatureWriter.makeKotlinParameterTypes(),
signatureWriter.makeKotlinReturnTypeSignature()
);
return new JvmPropertyAccessorSignature(jvmMethodSignature, ""); return new JvmPropertyAccessorSignature(jvmMethodSignature, jvmMethodSignature.getKotlinReturnType());
} }
@Nullable @Nullable
@@ -605,32 +632,61 @@ public class JetTypeMapper {
if (!descriptor.isVar()) { if (!descriptor.isVar()) {
return null; return null;
} }
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD);
signatureWriter.writerFormalTypeParametersStart();
signatureWriter.writeFormalTypeParametersEnd();
JetType outType = descriptor.getOutType(); JetType outType = descriptor.getOutType();
signatureWriter.writeParametersStart();
String name = PropertyCodegen.setterName(descriptor.getName()); String name = PropertyCodegen.setterName(descriptor.getName());
ArrayList<Type> params = new ArrayList<Type>(); ArrayList<Type> params = new ArrayList<Type>();
if(kind == OwnerKind.TRAIT_IMPL) { if(kind == OwnerKind.TRAIT_IMPL) {
ClassDescriptor containingDeclaration = (ClassDescriptor) descriptor.getContainingDeclaration(); ClassDescriptor containingDeclaration = (ClassDescriptor) descriptor.getContainingDeclaration();
assert containingDeclaration != null; assert containingDeclaration != null;
params.add(mapType(containingDeclaration.getDefaultType())); signatureWriter.writeParameterType();
params.add(mapType(containingDeclaration.getDefaultType(), signatureWriter));
signatureWriter.writeParameterTypeEnd();
} }
if(descriptor.getReceiverParameter().exists()) { if(descriptor.getReceiverParameter().exists()) {
params.add(mapType(descriptor.getReceiverParameter().getType())); signatureWriter.writeParameterType();
params.add(mapType(descriptor.getReceiverParameter().getType(), signatureWriter));
signatureWriter.writeParameterTypeEnd();
} }
for (TypeParameterDescriptor typeParameterDescriptor : descriptor.getTypeParameters()) { for (TypeParameterDescriptor typeParameterDescriptor : descriptor.getTypeParameters()) {
if(typeParameterDescriptor.isReified()) { if(typeParameterDescriptor.isReified()) {
signatureWriter.writeParameterType();
params.add(TYPE_TYPEINFO); params.add(TYPE_TYPEINFO);
signatureWriter.writeParameterType();
visitAsmType(signatureWriter, TYPE_TYPEINFO, false);
signatureWriter.writeParameterTypeEnd();
} }
} }
params.add(mapType(outType)); signatureWriter.writeParameterType();
params.add(mapType(outType, signatureWriter));
signatureWriter.writeParameterTypeEnd();
signatureWriter.writeParametersEnd();
signatureWriter.writeReturnType();
visitAsmType(signatureWriter, Type.VOID_TYPE, false);
signatureWriter.writeReturnTypeEnd();
// TODO: proper generic signature Method asmMethod = new Method(name, Type.VOID_TYPE, params.toArray(new Type[params.size()]));
JvmMethodSignature jvmMethodSignature = new JvmMethodSignature(new Method(name, Type.VOID_TYPE, params.toArray(new Type[params.size()])), null, null, null, null); JvmMethodSignature jvmMethodSignature = new JvmMethodSignature(
return new JvmPropertyAccessorSignature(jvmMethodSignature, ""); asmMethod,
signatureWriter.makeJavaString(),
signatureWriter.makeKotlinMethodTypeParameters(),
signatureWriter.makeKotlinParameterTypes(),
signatureWriter.makeKotlinReturnTypeSignature()
);
return new JvmPropertyAccessorSignature(jvmMethodSignature, jvmMethodSignature.getKotlinParameterType(jvmMethodSignature.getParameterCount() - 1));
} }
private JvmMethodSignature mapConstructorSignature(ConstructorDescriptor descriptor, List<Type> valueParameterTypes) { private JvmMethodSignature mapConstructorSignature(ConstructorDescriptor descriptor, List<Type> valueParameterTypes) {
@@ -652,7 +708,7 @@ public class JetTypeMapper {
} }
Method method = new Method("<init>", Type.VOID_TYPE, parameterTypes.toArray(new Type[parameterTypes.size()])); Method method = new Method("<init>", Type.VOID_TYPE, parameterTypes.toArray(new Type[parameterTypes.size()]));
return new JvmMethodSignature(method, null, null, null, null); // TODO: generics signature return new JvmMethodSignature(method, null, null, null, ""); // TODO: generics signature
} }
public CallableMethod mapToCallableMethod(ConstructorDescriptor descriptor, OwnerKind kind) { public CallableMethod mapToCallableMethod(ConstructorDescriptor descriptor, OwnerKind kind) {
@@ -16,10 +16,11 @@ public class JvmMethodSignature {
private final String genericsSignature; private final String genericsSignature;
private final String kotlinTypeParameter; private final String kotlinTypeParameter;
private final List<String> kotlinParameterTypes; private final List<String> kotlinParameterTypes;
@NotNull
private final String kotlinReturnType; private final String kotlinReturnType;
public JvmMethodSignature(@NotNull Method asmMethod, @Nullable String genericsSignature, public JvmMethodSignature(@NotNull Method asmMethod, @Nullable String genericsSignature,
@Nullable String kotlinTypeParameters, @Nullable List<String> kotlinParameterTypes, @Nullable String kotlinReturnType) { @Nullable String kotlinTypeParameters, @Nullable List<String> kotlinParameterTypes, @NotNull String kotlinReturnType) {
this.asmMethod = asmMethod; this.asmMethod = asmMethod;
this.genericsSignature = genericsSignature; this.genericsSignature = genericsSignature;
this.kotlinTypeParameter = kotlinTypeParameters; this.kotlinTypeParameter = kotlinTypeParameters;
@@ -39,10 +40,26 @@ public class JvmMethodSignature {
return kotlinTypeParameter; return kotlinTypeParameter;
} }
@Nullable
public List<String> getKotlinParameterTypes() { public List<String> getKotlinParameterTypes() {
return kotlinParameterTypes; return kotlinParameterTypes;
} }
public int getParameterCount() {
// TODO: slow
return asmMethod.getArgumentTypes().length;
}
@NotNull
public String getKotlinParameterType(int i) {
if (kotlinParameterTypes == null) {
return "";
} else {
return kotlinParameterTypes.get(i);
}
}
@NotNull
public String getKotlinReturnType() { public String getKotlinReturnType() {
return kotlinReturnType; return kotlinReturnType;
} }