write generic signature in getters and setters
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user