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