From 6ae7ed1cc4d4b883ecd4135286d67c0d9e459e8c Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 26 May 2015 18:20:33 +0300 Subject: [PATCH] Add some new tests on functions and extension functions --- .../invoke/castFunctionToExtension.kt | 11 +++++++++++ .../functionReferenceErasedToKFunction/J.java | 10 ++++++++++ .../functionReferenceErasedToKFunction/K.kt | 13 +++++++++++++ .../function/listOfStringsMapLength.kt | 2 ++ .../tests/annotations/extensionFunctionType.kt | 10 ++++++++++ .../annotations/extensionFunctionType.txt | 18 ++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 6 ++++++ .../BlackBoxCodegenTestGenerated.java | 6 ++++++ .../BlackBoxWithJavaCodegenTestGenerated.java | 6 ++++++ ...BlackBoxWithStdlibCodegenTestGenerated.java | 6 ++++++ 10 files changed, 88 insertions(+) create mode 100644 compiler/testData/codegen/box/functions/invoke/castFunctionToExtension.kt create mode 100644 compiler/testData/codegen/boxWithJava/reflection/functionReferenceErasedToKFunction/J.java create mode 100644 compiler/testData/codegen/boxWithJava/reflection/functionReferenceErasedToKFunction/K.kt create mode 100644 compiler/testData/codegen/boxWithStdlib/callableReference/function/listOfStringsMapLength.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/extensionFunctionType.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/extensionFunctionType.txt diff --git a/compiler/testData/codegen/box/functions/invoke/castFunctionToExtension.kt b/compiler/testData/codegen/box/functions/invoke/castFunctionToExtension.kt new file mode 100644 index 00000000000..cb638d7b24f --- /dev/null +++ b/compiler/testData/codegen/box/functions/invoke/castFunctionToExtension.kt @@ -0,0 +1,11 @@ +fun box(): String { + val f = fun (s: String): String = s + val g = f as String.() -> String + if ("OK".g() != "OK") return "Fail 1" + + val h = fun String.(): String = this + val i = h as (String) -> String + if (i("OK") != "OK") return "Fail 2" + + return "OK" +} diff --git a/compiler/testData/codegen/boxWithJava/reflection/functionReferenceErasedToKFunction/J.java b/compiler/testData/codegen/boxWithJava/reflection/functionReferenceErasedToKFunction/J.java new file mode 100644 index 00000000000..6536c732dea --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/reflection/functionReferenceErasedToKFunction/J.java @@ -0,0 +1,10 @@ +import kotlin.jvm.functions.Function2; +import kotlin.reflect.KMemberFunction; + +public class J { + public static String go() { + KMemberFunction fun = K.Companion.getRef(); + Object result = ((Function2) fun).invoke(new K(), "KO"); + return (String) result; + } +} diff --git a/compiler/testData/codegen/boxWithJava/reflection/functionReferenceErasedToKFunction/K.kt b/compiler/testData/codegen/boxWithJava/reflection/functionReferenceErasedToKFunction/K.kt new file mode 100644 index 00000000000..4b7ada578e4 --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/reflection/functionReferenceErasedToKFunction/K.kt @@ -0,0 +1,13 @@ +class K { + fun reverse(s: String): String { + return s.reverse() + } + + companion object { + fun getRef() = K::reverse + } +} + +fun box(): String { + return J.go() +} diff --git a/compiler/testData/codegen/boxWithStdlib/callableReference/function/listOfStringsMapLength.kt b/compiler/testData/codegen/boxWithStdlib/callableReference/function/listOfStringsMapLength.kt new file mode 100644 index 00000000000..1e1deb2df86 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/callableReference/function/listOfStringsMapLength.kt @@ -0,0 +1,2 @@ +fun box(): String = + if (listOf("abc", "de", "f").map(String::length) == listOf(3, 2, 1)) "OK" else "Fail" diff --git a/compiler/testData/diagnostics/tests/annotations/extensionFunctionType.kt b/compiler/testData/diagnostics/tests/annotations/extensionFunctionType.kt new file mode 100644 index 00000000000..61ab3238531 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/extensionFunctionType.kt @@ -0,0 +1,10 @@ +// This test checks that annotations on extension function types are preserved. See the corresponding .txt file + +annotation class ann + +interface Some { + fun f1(): String.() -> Int + fun f2(): @extension String.() -> Int + fun f3(): @ann String.() -> Int + fun f4(): @extension @ann String.() -> Int +} diff --git a/compiler/testData/diagnostics/tests/annotations/extensionFunctionType.txt b/compiler/testData/diagnostics/tests/annotations/extensionFunctionType.txt new file mode 100644 index 00000000000..dbef146c30d --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/extensionFunctionType.txt @@ -0,0 +1,18 @@ +package + +internal interface Some { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + internal abstract fun f1(): kotlin.String.() -> kotlin.Int + internal abstract fun f2(): @[kotlin.extension()] kotlin.String.() -> kotlin.Int + internal abstract fun f3(): @[ann()] kotlin.String.() -> kotlin.Int + internal abstract fun f4(): @[kotlin.extension() ann()] kotlin.String.() -> kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal final annotation class ann : kotlin.Annotation { + public constructor ann() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index df909e446e0..2ecbd5131ec 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -711,6 +711,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("extensionFunctionType.kt") + public void testExtensionFunctionType() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/extensionFunctionType.kt"); + doTest(fileName); + } + @TestMetadata("forParameterAnnotationResolve.kt") public void testForParameterAnnotationResolve() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/forParameterAnnotationResolve.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java index 57092536b34..b4ed32c7436 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -3894,6 +3894,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/functions/invoke"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("castFunctionToExtension.kt") + public void testCastFunctionToExtension() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/functions/invoke/castFunctionToExtension.kt"); + doTest(fileName); + } + @TestMetadata("extensionInvokeOnExpr.kt") public void testExtensionInvokeOnExpr() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/functions/invoke/extensionInvokeOnExpr.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java index 72dd17b4f5b..fabc42c0a99 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java @@ -229,6 +229,12 @@ public class BlackBoxWithJavaCodegenTestGenerated extends AbstractBlackBoxCodege JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxWithJava/reflection"), Pattern.compile("^([^\\.]+)$"), true); } + @TestMetadata("functionReferenceErasedToKFunction") + public void testFunctionReferenceErasedToKFunction() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/reflection/functionReferenceErasedToKFunction/"); + doTestWithJava(fileName); + } + @TestMetadata("javaPropertyInheritedInKotlin") public void testJavaPropertyInheritedInKotlin() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/reflection/javaPropertyInheritedInKotlin/"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index 25b4c9fc486..dc090857081 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -513,6 +513,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode doTestWithStdlib(fileName); } + @TestMetadata("listOfStringsMapLength.kt") + public void testListOfStringsMapLength() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/callableReference/function/listOfStringsMapLength.kt"); + doTestWithStdlib(fileName); + } + @TestMetadata("nestedConstructorFromClass.kt") public void testNestedConstructorFromClass() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/callableReference/function/nestedConstructorFromClass.kt");