Write generic signature for closure FunctionN superclass
ClosureCodegen.appendType() now appends any Type as a type parameter correctly
This commit is contained in:
@@ -73,7 +73,7 @@ public class ClosureCodegen extends GenerationStateAware {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ClosureCodegen gen(JetDeclarationWithBody fun, CodegenContext context, ExpressionCodegen expressionCodegen) {
|
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());
|
ClassBuilder cv = state.getFactory().newVisitor(name.getInternalName(), fun.getContainingFile());
|
||||||
|
|
||||||
FunctionDescriptor funDescriptor = bindingContext.get(BindingContext.FUNCTION, fun);
|
FunctionDescriptor funDescriptor = bindingContext.get(BindingContext.FUNCTION, fun);
|
||||||
@@ -89,10 +89,13 @@ public class ClosureCodegen extends GenerationStateAware {
|
|||||||
|
|
||||||
SignatureWriter signatureWriter = new SignatureWriter();
|
SignatureWriter signatureWriter = new SignatureWriter();
|
||||||
|
|
||||||
List<ValueParameterDescriptor> parameters = funDescriptor.getValueParameters();
|
|
||||||
JvmClassName funClass = getInternalClassName(funDescriptor);
|
JvmClassName funClass = getInternalClassName(funDescriptor);
|
||||||
signatureWriter.visitClassType(funClass.getInternalName());
|
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(), '=');
|
appendType(signatureWriter, parameter.getType(), '=');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,7 +110,7 @@ public class ClosureCodegen extends GenerationStateAware {
|
|||||||
V1_6,
|
V1_6,
|
||||||
ACC_FINAL | ACC_SUPER,
|
ACC_FINAL | ACC_SUPER,
|
||||||
name.getInternalName(),
|
name.getInternalName(),
|
||||||
null,
|
signatureWriter.toString(),
|
||||||
superclass.getInternalName(),
|
superclass.getInternalName(),
|
||||||
superInterfaces
|
superInterfaces
|
||||||
);
|
);
|
||||||
@@ -123,7 +126,7 @@ public class ClosureCodegen extends GenerationStateAware {
|
|||||||
generateConstInstance(fun, cv);
|
generateConstInstance(fun, cv);
|
||||||
}
|
}
|
||||||
|
|
||||||
genClosureFields(closure, cv, state.getTypeMapper());
|
genClosureFields(closure, cv, typeMapper);
|
||||||
|
|
||||||
cv.done();
|
cv.done();
|
||||||
|
|
||||||
@@ -301,7 +304,17 @@ public class ClosureCodegen extends GenerationStateAware {
|
|||||||
signatureWriter.visitTypeArgument(variance);
|
signatureWriter.visitTypeArgument(variance);
|
||||||
|
|
||||||
Type rawRetType = typeMapper.mapType(type, JetTypeMapperMode.TYPE_PARAMETER);
|
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();
|
signatureWriter.visitEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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<String>) : List<String> -> l }
|
||||||
|
|
||||||
|
val extensionFun = { Any.() : Unit -> }
|
||||||
|
val extensionWithArgFun = { Long.(x: Any) : Date -> Date() }
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
assertGenericSuper("jet.FunctionImpl0<jet.Unit>", unitFun)
|
||||||
|
assertGenericSuper("jet.FunctionImpl0<java.lang.Integer>", intFun)
|
||||||
|
assertGenericSuper("jet.FunctionImpl1<java.lang.String, jet.Unit>", stringParamFun)
|
||||||
|
assertGenericSuper("jet.FunctionImpl1<java.util.List, java.util.List>", listFun)
|
||||||
|
|
||||||
|
assertGenericSuper("jet.ExtensionFunctionImpl0<java.lang.Object, jet.Unit>", extensionFun)
|
||||||
|
assertGenericSuper("jet.ExtensionFunctionImpl1<java.lang.Long, java.lang.Object, java.util.Date>", extensionWithArgFun)
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+15
-1
@@ -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 */
|
/** This class is generated by {@link org.jetbrains.jet.generators.tests.GenerateTests}. DO NOT MODIFY MANUALLY */
|
||||||
@SuppressWarnings("all")
|
@SuppressWarnings("all")
|
||||||
@TestMetadata("compiler/testData/codegen/box")
|
@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 class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||||
public void testAllFilesPresentInBox() throws Exception {
|
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);
|
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")
|
@TestMetadata("compiler/testData/codegen/box/safeCall")
|
||||||
public static class SafeCall extends AbstractBlackBoxCodegenTest {
|
public static class SafeCall extends AbstractBlackBoxCodegenTest {
|
||||||
public void testAllFilesPresentInSafeCall() throws Exception {
|
public void testAllFilesPresentInSafeCall() throws Exception {
|
||||||
@@ -3644,6 +3657,7 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
suite.addTest(OperatorConventions.innerSuite());
|
suite.addTest(OperatorConventions.innerSuite());
|
||||||
suite.addTestSuite(PrimitiveTypes.class);
|
suite.addTestSuite(PrimitiveTypes.class);
|
||||||
suite.addTestSuite(Properties.class);
|
suite.addTestSuite(Properties.class);
|
||||||
|
suite.addTestSuite(Reflection.class);
|
||||||
suite.addTestSuite(SafeCall.class);
|
suite.addTestSuite(SafeCall.class);
|
||||||
suite.addTestSuite(Sam.class);
|
suite.addTestSuite(Sam.class);
|
||||||
suite.addTestSuite(Strings.class);
|
suite.addTestSuite(Strings.class);
|
||||||
|
|||||||
Reference in New Issue
Block a user