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;
}
@Nullable
@NotNull
public String makeKotlinReturnTypeSignature() {
checkState(State.METHOD_END);
return kotlinReturnType;
@@ -54,7 +54,8 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
public static CallableMethod asCallableMethod(FunctionDescriptor fd) {
Method descriptor = erasedInvokeSignature(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()) {
result.setNeedsReceiver(fd);
}
@@ -165,7 +166,8 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
final CodegenContext.ClosureContext closureContext = context.intoClosure(funDescriptor, function, name, this, state.getTypeMapper());
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;
}
@@ -361,7 +361,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
}
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 {
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()]));
if (signatureVisitor == null) {
return new JvmMethodSignature(method, null, null, null, null);
return new JvmMethodSignature(method, null, null, null, "");
} else {
return new JvmMethodSignature(method, signatureVisitor.makeJavaString(),
signatureVisitor.makeKotlinMethodTypeParameters(),
@@ -570,34 +570,61 @@ public class JetTypeMapper {
}
Type returnType = mapReturnType(f.getReturnType());
// 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) {
Type returnType = mapType(descriptor.getOutType());
String name = PropertyCodegen.getterName(descriptor.getName());
ArrayList<Type> params = new ArrayList<Type>();
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD);
signatureWriter.writerFormalTypeParametersStart();
signatureWriter.writeFormalTypeParametersEnd();
signatureWriter.writeParametersStart();
if(kind == OwnerKind.TRAIT_IMPL) {
ClassDescriptor containingDeclaration = (ClassDescriptor) descriptor.getContainingDeclaration();
assert containingDeclaration != null;
params.add(mapType(containingDeclaration.getDefaultType()));
signatureWriter.writeParameterType();
params.add(mapType(containingDeclaration.getDefaultType(), signatureWriter));
signatureWriter.writeParameterTypeEnd();
}
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()) {
if(typeParameterDescriptor.isReified()) {
signatureWriter.writeParameterType();
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
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
@@ -605,32 +632,61 @@ public class JetTypeMapper {
if (!descriptor.isVar()) {
return null;
}
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD);
signatureWriter.writerFormalTypeParametersStart();
signatureWriter.writeFormalTypeParametersEnd();
JetType outType = descriptor.getOutType();
signatureWriter.writeParametersStart();
String name = PropertyCodegen.setterName(descriptor.getName());
ArrayList<Type> params = new ArrayList<Type>();
if(kind == OwnerKind.TRAIT_IMPL) {
ClassDescriptor containingDeclaration = (ClassDescriptor) descriptor.getContainingDeclaration();
assert containingDeclaration != null;
params.add(mapType(containingDeclaration.getDefaultType()));
signatureWriter.writeParameterType();
params.add(mapType(containingDeclaration.getDefaultType(), signatureWriter));
signatureWriter.writeParameterTypeEnd();
}
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()) {
if(typeParameterDescriptor.isReified()) {
signatureWriter.writeParameterType();
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
JvmMethodSignature jvmMethodSignature = new JvmMethodSignature(new Method(name, Type.VOID_TYPE, params.toArray(new Type[params.size()])), null, null, null, null);
return new JvmPropertyAccessorSignature(jvmMethodSignature, "");
Method asmMethod = new Method(name, Type.VOID_TYPE, params.toArray(new Type[params.size()]));
JvmMethodSignature jvmMethodSignature = new 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) {
@@ -652,7 +708,7 @@ public class JetTypeMapper {
}
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) {
@@ -16,10 +16,11 @@ public class JvmMethodSignature {
private final String genericsSignature;
private final String kotlinTypeParameter;
private final List<String> kotlinParameterTypes;
@NotNull
private final String kotlinReturnType;
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.genericsSignature = genericsSignature;
this.kotlinTypeParameter = kotlinTypeParameters;
@@ -39,10 +40,26 @@ public class JvmMethodSignature {
return kotlinTypeParameter;
}
@Nullable
public List<String> getKotlinParameterTypes() {
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() {
return kotlinReturnType;
}