From 85ec4d980f5238e51b41e50cf140a5c7286889ca Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Fri, 13 Jan 2012 03:55:09 +0400 Subject: [PATCH] write generic signature in getters and setters --- .../jet/codegen/BothSignatureWriter.java | 2 +- .../jetbrains/jet/codegen/ClosureCodegen.java | 6 +- .../codegen/ImplementationBodyCodegen.java | 2 +- .../jetbrains/jet/codegen/JetTypeMapper.java | 86 +++++++++++++++---- .../jet/codegen/JvmMethodSignature.java | 19 +++- 5 files changed, 95 insertions(+), 20 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java b/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java index e8afc6a442d..3024b076800 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java @@ -350,7 +350,7 @@ public class BothSignatureWriter { return kotlinParameterTypes; } - @Nullable + @NotNull public String makeKotlinReturnTypeSignature() { checkState(State.METHOD_END); return kotlinReturnType; diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java index af5f47422ec..d49a9befa10 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -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; } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 4c640154ee6..5a51059fe62 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -361,7 +361,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } constructorMethod = new Method("", Type.VOID_TYPE, parameterTypes.toArray(new Type[parameterTypes.size()])); - callableMethod = new CallableMethod("", new JvmMethodSignature(constructorMethod, null, null, null, null) /* TODO */, Opcodes.INVOKESPECIAL, Collections.emptyList()); + callableMethod = new CallableMethod("", new JvmMethodSignature(constructorMethod, null, null, null, "") /* TODO */, Opcodes.INVOKESPECIAL, Collections.emptyList()); } else { callableMethod = typeMapper.mapToCallableMethod(constructorDescriptor, kind); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index aa532db1235..f7f0f310f2a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -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 params = new ArrayList(); + + 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 params = new ArrayList(); 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 valueParameterTypes) { @@ -652,7 +708,7 @@ public class JetTypeMapper { } Method method = new Method("", 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) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JvmMethodSignature.java b/compiler/backend/src/org/jetbrains/jet/codegen/JvmMethodSignature.java index 2deac1ab39b..64333aab773 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JvmMethodSignature.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JvmMethodSignature.java @@ -16,10 +16,11 @@ public class JvmMethodSignature { private final String genericsSignature; private final String kotlinTypeParameter; private final List kotlinParameterTypes; + @NotNull private final String kotlinReturnType; public JvmMethodSignature(@NotNull Method asmMethod, @Nullable String genericsSignature, - @Nullable String kotlinTypeParameters, @Nullable List kotlinParameterTypes, @Nullable String kotlinReturnType) { + @Nullable String kotlinTypeParameters, @Nullable List 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 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; }