From 0ec1f2014014190552cbe75753a47433eae87e07 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 25 Mar 2013 21:52:02 +0400 Subject: [PATCH] Write generic signature for closure FunctionN superclass ClosureCodegen.appendType() now appends any Type as a type parameter correctly --- .../jetbrains/jet/codegen/ClosureCodegen.java | 25 ++++++++++++---- .../functionLiteralGenericSignature.kt | 29 +++++++++++++++++++ .../BlackBoxCodegenTestGenerated.java | 16 +++++++++- 3 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/codegen/box/reflection/functionLiteralGenericSignature.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java index 38f41b55e0e..7f2743454f9 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -73,7 +73,7 @@ public class ClosureCodegen extends GenerationStateAware { } public ClosureCodegen gen(JetDeclarationWithBody fun, CodegenContext context, ExpressionCodegen expressionCodegen) { - name = classNameForAnonymousClass(state.getBindingContext(), fun); + name = classNameForAnonymousClass(bindingContext, fun); ClassBuilder cv = state.getFactory().newVisitor(name.getInternalName(), fun.getContainingFile()); FunctionDescriptor funDescriptor = bindingContext.get(BindingContext.FUNCTION, fun); @@ -89,10 +89,13 @@ public class ClosureCodegen extends GenerationStateAware { SignatureWriter signatureWriter = new SignatureWriter(); - List parameters = funDescriptor.getValueParameters(); JvmClassName funClass = getInternalClassName(funDescriptor); signatureWriter.visitClassType(funClass.getInternalName()); - for (ValueParameterDescriptor parameter : parameters) { + ReceiverParameterDescriptor receiverParameter = funDescriptor.getReceiverParameter(); + if (receiverParameter != null) { + appendType(signatureWriter, receiverParameter.getType(), '='); + } + for (ValueParameterDescriptor parameter : funDescriptor.getValueParameters()) { appendType(signatureWriter, parameter.getType(), '='); } @@ -107,7 +110,7 @@ public class ClosureCodegen extends GenerationStateAware { V1_6, ACC_FINAL | ACC_SUPER, name.getInternalName(), - null, + signatureWriter.toString(), superclass.getInternalName(), superInterfaces ); @@ -123,7 +126,7 @@ public class ClosureCodegen extends GenerationStateAware { generateConstInstance(fun, cv); } - genClosureFields(closure, cv, state.getTypeMapper()); + genClosureFields(closure, cv, typeMapper); cv.done(); @@ -301,7 +304,17 @@ public class ClosureCodegen extends GenerationStateAware { signatureWriter.visitTypeArgument(variance); Type rawRetType = typeMapper.mapType(type, JetTypeMapperMode.TYPE_PARAMETER); - signatureWriter.visitClassType(rawRetType.getInternalName()); + while (rawRetType.getSort() == Type.ARRAY) { + signatureWriter.visitArrayType(); + rawRetType = rawRetType.getElementType(); + } + if (rawRetType.getSort() == Type.OBJECT) { + signatureWriter.visitClassType(rawRetType.getInternalName()); + } + else { + // rawRetType is primitive + signatureWriter.visitBaseType(rawRetType.getDescriptor().charAt(0)); + } signatureWriter.visitEnd(); } diff --git a/compiler/testData/codegen/box/reflection/functionLiteralGenericSignature.kt b/compiler/testData/codegen/box/reflection/functionLiteralGenericSignature.kt new file mode 100644 index 00000000000..5e5d9c482f9 --- /dev/null +++ b/compiler/testData/codegen/box/reflection/functionLiteralGenericSignature.kt @@ -0,0 +1,29 @@ +import java.util.Date + +fun assertGenericSuper(expected: String, function: Any?) { + val clazz = (function as java.lang.Object).getClass()!! + val genericSuper = clazz.getGenericSuperclass()!! + if ("$genericSuper" != expected) + throw AssertionError("Fail, expected: $expected, actual: $genericSuper") +} + + +val unitFun = { } +val intFun = { 42 } +val stringParamFun = { (x: String) : Unit -> } +val listFun = { (l: List) : List -> l } + +val extensionFun = { Any.() : Unit -> } +val extensionWithArgFun = { Long.(x: Any) : Date -> Date() } + +fun box(): String { + assertGenericSuper("jet.FunctionImpl0", unitFun) + assertGenericSuper("jet.FunctionImpl0", intFun) + assertGenericSuper("jet.FunctionImpl1", stringParamFun) + assertGenericSuper("jet.FunctionImpl1", listFun) + + assertGenericSuper("jet.ExtensionFunctionImpl0", extensionFun) + assertGenericSuper("jet.ExtensionFunctionImpl1", extensionWithArgFun) + + return "OK" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 4915286d0a1..0fa3b1b3e6b 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -31,7 +31,7 @@ import org.jetbrains.jet.codegen.generated.AbstractBlackBoxCodegenTest; /** This class is generated by {@link org.jetbrains.jet.generators.tests.GenerateTests}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") @TestMetadata("compiler/testData/codegen/box") -@InnerTestClasses({BlackBoxCodegenTestGenerated.Arrays.class, BlackBoxCodegenTestGenerated.Bridges.class, BlackBoxCodegenTestGenerated.Casts.class, BlackBoxCodegenTestGenerated.Classes.class, BlackBoxCodegenTestGenerated.Closures.class, BlackBoxCodegenTestGenerated.ControlStructures.class, BlackBoxCodegenTestGenerated.DefaultArguments.class, BlackBoxCodegenTestGenerated.Elvis.class, BlackBoxCodegenTestGenerated.Enum.class, BlackBoxCodegenTestGenerated.ExclExcl.class, BlackBoxCodegenTestGenerated.ExtensionFunctions.class, BlackBoxCodegenTestGenerated.ExtensionProperties.class, BlackBoxCodegenTestGenerated.Functions.class, BlackBoxCodegenTestGenerated.InnerNested.class, BlackBoxCodegenTestGenerated.Instructions.class, BlackBoxCodegenTestGenerated.Intrinsics.class, BlackBoxCodegenTestGenerated.Labels.class, BlackBoxCodegenTestGenerated.LocalClasses.class, BlackBoxCodegenTestGenerated.MultiDecl.class, BlackBoxCodegenTestGenerated.Namespace.class, BlackBoxCodegenTestGenerated.Objects.class, BlackBoxCodegenTestGenerated.OperatorConventions.class, BlackBoxCodegenTestGenerated.PrimitiveTypes.class, BlackBoxCodegenTestGenerated.Properties.class, BlackBoxCodegenTestGenerated.SafeCall.class, BlackBoxCodegenTestGenerated.Sam.class, BlackBoxCodegenTestGenerated.Strings.class, BlackBoxCodegenTestGenerated.Super.class, BlackBoxCodegenTestGenerated.Traits.class, BlackBoxCodegenTestGenerated.TypeInfo.class, BlackBoxCodegenTestGenerated.Unit.class, BlackBoxCodegenTestGenerated.Vararg.class, BlackBoxCodegenTestGenerated.When.class}) +@InnerTestClasses({BlackBoxCodegenTestGenerated.Arrays.class, BlackBoxCodegenTestGenerated.Bridges.class, BlackBoxCodegenTestGenerated.Casts.class, BlackBoxCodegenTestGenerated.Classes.class, BlackBoxCodegenTestGenerated.Closures.class, BlackBoxCodegenTestGenerated.ControlStructures.class, BlackBoxCodegenTestGenerated.DefaultArguments.class, BlackBoxCodegenTestGenerated.Elvis.class, BlackBoxCodegenTestGenerated.Enum.class, BlackBoxCodegenTestGenerated.ExclExcl.class, BlackBoxCodegenTestGenerated.ExtensionFunctions.class, BlackBoxCodegenTestGenerated.ExtensionProperties.class, BlackBoxCodegenTestGenerated.Functions.class, BlackBoxCodegenTestGenerated.InnerNested.class, BlackBoxCodegenTestGenerated.Instructions.class, BlackBoxCodegenTestGenerated.Intrinsics.class, BlackBoxCodegenTestGenerated.Labels.class, BlackBoxCodegenTestGenerated.LocalClasses.class, BlackBoxCodegenTestGenerated.MultiDecl.class, BlackBoxCodegenTestGenerated.Namespace.class, BlackBoxCodegenTestGenerated.Objects.class, BlackBoxCodegenTestGenerated.OperatorConventions.class, BlackBoxCodegenTestGenerated.PrimitiveTypes.class, BlackBoxCodegenTestGenerated.Properties.class, BlackBoxCodegenTestGenerated.Reflection.class, BlackBoxCodegenTestGenerated.SafeCall.class, BlackBoxCodegenTestGenerated.Sam.class, BlackBoxCodegenTestGenerated.Strings.class, BlackBoxCodegenTestGenerated.Super.class, BlackBoxCodegenTestGenerated.Traits.class, BlackBoxCodegenTestGenerated.TypeInfo.class, BlackBoxCodegenTestGenerated.Unit.class, BlackBoxCodegenTestGenerated.Vararg.class, BlackBoxCodegenTestGenerated.When.class}) public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { public void testAllFilesPresentInBox() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/box"), Pattern.compile("^(.+)\\.kt$"), true); @@ -3145,6 +3145,19 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { } + @TestMetadata("compiler/testData/codegen/box/reflection") + public static class Reflection extends AbstractBlackBoxCodegenTest { + public void testAllFilesPresentInReflection() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/box/reflection"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("functionLiteralGenericSignature.kt") + public void testFunctionLiteralGenericSignature() throws Exception { + doTest("compiler/testData/codegen/box/reflection/functionLiteralGenericSignature.kt"); + } + + } + @TestMetadata("compiler/testData/codegen/box/safeCall") public static class SafeCall extends AbstractBlackBoxCodegenTest { public void testAllFilesPresentInSafeCall() throws Exception { @@ -3644,6 +3657,7 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { suite.addTest(OperatorConventions.innerSuite()); suite.addTestSuite(PrimitiveTypes.class); suite.addTestSuite(Properties.class); + suite.addTestSuite(Reflection.class); suite.addTestSuite(SafeCall.class); suite.addTestSuite(Sam.class); suite.addTestSuite(Strings.class);