KT-3308: Support local generic functions in codegen

#KT-3308 Fixed
This commit is contained in:
Mikhael Bogdanov
2013-09-24 12:47:59 +04:00
parent 46fec74797
commit 7520ff1420
5 changed files with 50 additions and 3 deletions
@@ -1624,6 +1624,9 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
// descriptor = ((VariableAsFunctionDescriptor) descriptor).getVariableDescriptor();
//}
assert descriptor != null : "Couldn't find descriptor for '" + expression.getText() + "'";
descriptor = descriptor.getOriginal();
if (descriptor instanceof CallableMemberDescriptor) {
CallableMemberDescriptor memberDescriptor = (CallableMemberDescriptor) descriptor;
memberDescriptor = unwrapFakeOverride(memberDescriptor);
@@ -1635,9 +1638,6 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
}
}
assert descriptor != null;
if (descriptor instanceof VariableDescriptorForObject) {
VariableDescriptorForObject variableDescriptor = (VariableDescriptorForObject) descriptor;
ClassDescriptor objectClassDescriptor = variableDescriptor.getObjectClass();
@@ -0,0 +1,14 @@
fun box() : String {
fun <T> local(s : T) : T {
return s;
}
fun test(s : Int) : Int {
return local(s)
}
if (test(10) != 10) return "fail1"
return "OK"
}
@@ -0,0 +1,6 @@
fun box() : String {
fun foo<T>(t:() -> T) : T = t()
return foo {}
return "OK"
}
@@ -0,0 +1,12 @@
fun box() : String {
fun <T> local(s : T) : T {
return s;
}
if (local(10) != 10) return "fail1"
if (local("11") != "11") return "fail2"
return "OK"
}
@@ -1139,6 +1139,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/box/closures"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("capturedLocalGenericFun.kt")
public void testCapturedLocalGenericFun() throws Exception {
doTest("compiler/testData/codegen/box/closures/capturedLocalGenericFun.kt");
}
@TestMetadata("closureInsideConstrucor.kt")
public void testClosureInsideConstrucor() throws Exception {
doTest("compiler/testData/codegen/box/closures/closureInsideConstrucor.kt");
@@ -1189,6 +1194,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
doTest("compiler/testData/codegen/box/closures/kt2151.kt");
}
@TestMetadata("kt3905.kt")
public void testKt3905() throws Exception {
doTest("compiler/testData/codegen/box/closures/kt3905.kt");
}
@TestMetadata("localFunctionInFunction.kt")
public void testLocalFunctionInFunction() throws Exception {
doTest("compiler/testData/codegen/box/closures/localFunctionInFunction.kt");
@@ -1199,6 +1209,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
doTest("compiler/testData/codegen/box/closures/localFunctionInInitializer.kt");
}
@TestMetadata("localGenericFun.kt")
public void testLocalGenericFun() throws Exception {
doTest("compiler/testData/codegen/box/closures/localGenericFun.kt");
}
@TestMetadata("localReturn.kt")
public void testLocalReturn() throws Exception {
doTest("compiler/testData/codegen/box/closures/localReturn.kt");