From 145aa5a276e1264446c53c58d9f1b977982e2834 Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Tue, 22 Jul 2014 15:21:35 +0400 Subject: [PATCH] JS backend: tests for reflection support --- .../AbstractCallableReferenceTest.java | 27 +++ .../FunctionCallableReferenceTest.java | 182 ++++++++++++++++++ .../k2js/test/semantics/MultiPackageTest.java | 4 + .../test/semantics/NativeInteropTest.java | 20 ++ .../PropertyCallableReferenceTest.java | 80 ++++++++ .../function/cases/abstractClassMember.kt | 12 ++ .../function/cases/booleanNotIntrinsic.kt | 8 + .../function/cases/classMemberAndExtension.kt | 25 +++ .../classMemberAndExtensionCompatibility.kt | 32 +++ .../function/cases/classMemberFromClass.kt | 14 ++ .../cases/classMemberFromExtension.kt | 15 ++ .../classMemberFromTopLevelStringNoArgs.kt | 22 +++ ...assMemberFromTopLevelStringOneStringArg.kt | 21 ++ .../classMemberFromTopLevelUnitNoArgs.kt | 29 +++ ...classMemberFromTopLevelUnitOneStringArg.kt | 29 +++ .../function/cases/classMemberOverridden.kt | 16 ++ .../cases/classMemberOverriddenInObject.kt | 15 ++ .../function/cases/closureWithSideEffect.kt | 12 ++ .../cases/constructorFromTopLevelNoArgs.kt | 8 + .../constructorFromTopLevelOneStringArg.kt | 6 + .../function/cases/constructorsWithArgs.kt | 21 ++ .../function/cases/extension.kt | 9 + .../function/cases/extensionFromClass.kt | 10 + .../function/cases/extensionFromExtension.kt | 10 + .../function/cases/extensionFromTopLevel.kt | 25 +++ .../extensionFromTopLevelStringNoArgs.kt | 21 ++ ...extensionFromTopLevelStringOneStringArg.kt | 19 ++ .../cases/extensionFromTopLevelUnitNoArgs.kt | 26 +++ .../extensionFromTopLevelUnitOneStringArg.kt | 26 +++ .../function/cases/extensionToPrimitive.kt | 7 + .../function/cases/extensionWithClosure.kt | 14 ++ .../cases/localAndTopLevelExtensions.kt | 22 +++ .../function/cases/localLocal.kt | 13 ++ .../function/cases/recursiveClosure.kt | 10 + .../function/cases/simple.kt | 7 + .../function/cases/simpleClosure.kt | 10 + .../function/cases/simpleWithArg.kt | 7 + .../function/cases/stringNativeExtension.kt | 8 + .../function/cases/topLevelFromClass.kt | 22 +++ .../function/cases/topLevelFromExtension.kt | 22 +++ .../cases/topLevelFromTopLevelStringNoArgs.kt | 20 ++ .../cases/topLevelFromTopLevelViaFunCall.kt | 20 ++ .../cases/topLevelFromTopLevelWithArg.kt | 18 ++ .../function/cases/unitWithSideEffect.kt | 18 ++ .../property/cases/accessViaSubclass.kt | 12 ++ .../property/cases/delegated.kt | 25 +++ .../property/cases/delegatedMutable.kt | 25 +++ .../property/cases/extensionProperty.kt | 40 ++++ .../cases/kClassInstanceIsInitializedFirst.kt | 16 ++ .../property/cases/memberProperty.kt | 31 +++ .../property/cases/overriddenInSubclass.kt | 12 ++ .../property/cases/simpleExtension.kt | 15 ++ .../property/cases/simpleMember.kt | 12 ++ .../property/cases/simpleMutableExtension.kt | 21 ++ .../property/cases/simpleMutableMember.kt | 19 ++ .../property/cases/simpleMutableTopLevel.kt | 15 ++ .../property/cases/simpleTopLevel.kt | 13 ++ .../property/cases/topLevelVar.kt | 20 ++ .../cases/reflectionFromOtherPackage/a.kt | 22 +++ .../cases/reflectionFromOtherPackage/b.kt | 29 +++ .../native/cases/nativeExtensionLikeMember.kt | 40 ++++ .../native/cases/passMemberOrExtFromNative.kt | 28 +++ .../native/cases/passMemberOrExtToNative.kt | 38 ++++ .../cases/passTopLevelFunctionFromNative.kt | 19 ++ .../passTopLevelOrLocalFunctionToNative.kt | 22 +++ .../native/nativeExtensionLikeMember.js | 5 + .../native/passMemberOrExtFromNative.js | 14 ++ .../native/native/passMemberOrExtToNative.js | 3 + .../native/passTopLevelFunctionFromNative.js | 3 + .../passTopLevelOrLocalFunctionToNative.js | 3 + 70 files changed, 1464 insertions(+) create mode 100644 js/js.tests/test/org/jetbrains/k2js/test/semantics/AbstractCallableReferenceTest.java create mode 100644 js/js.tests/test/org/jetbrains/k2js/test/semantics/FunctionCallableReferenceTest.java create mode 100644 js/js.tests/test/org/jetbrains/k2js/test/semantics/PropertyCallableReferenceTest.java create mode 100644 js/js.translator/testData/callableReference/function/cases/abstractClassMember.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/booleanNotIntrinsic.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/classMemberAndExtension.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/classMemberAndExtensionCompatibility.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/classMemberFromClass.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/classMemberFromExtension.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/classMemberFromTopLevelStringNoArgs.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/classMemberFromTopLevelStringOneStringArg.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/classMemberFromTopLevelUnitNoArgs.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/classMemberFromTopLevelUnitOneStringArg.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/classMemberOverridden.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/classMemberOverriddenInObject.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/closureWithSideEffect.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/constructorFromTopLevelNoArgs.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/constructorFromTopLevelOneStringArg.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/constructorsWithArgs.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/extension.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/extensionFromClass.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/extensionFromExtension.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/extensionFromTopLevel.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/extensionFromTopLevelStringNoArgs.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/extensionFromTopLevelStringOneStringArg.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/extensionFromTopLevelUnitNoArgs.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/extensionFromTopLevelUnitOneStringArg.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/extensionToPrimitive.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/extensionWithClosure.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/localAndTopLevelExtensions.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/localLocal.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/recursiveClosure.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/simple.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/simpleClosure.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/simpleWithArg.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/stringNativeExtension.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/topLevelFromClass.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/topLevelFromExtension.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/topLevelFromTopLevelStringNoArgs.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/topLevelFromTopLevelViaFunCall.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/topLevelFromTopLevelWithArg.kt create mode 100644 js/js.translator/testData/callableReference/function/cases/unitWithSideEffect.kt create mode 100644 js/js.translator/testData/callableReference/property/cases/accessViaSubclass.kt create mode 100644 js/js.translator/testData/callableReference/property/cases/delegated.kt create mode 100644 js/js.translator/testData/callableReference/property/cases/delegatedMutable.kt create mode 100644 js/js.translator/testData/callableReference/property/cases/extensionProperty.kt create mode 100644 js/js.translator/testData/callableReference/property/cases/kClassInstanceIsInitializedFirst.kt create mode 100644 js/js.translator/testData/callableReference/property/cases/memberProperty.kt create mode 100644 js/js.translator/testData/callableReference/property/cases/overriddenInSubclass.kt create mode 100644 js/js.translator/testData/callableReference/property/cases/simpleExtension.kt create mode 100644 js/js.translator/testData/callableReference/property/cases/simpleMember.kt create mode 100644 js/js.translator/testData/callableReference/property/cases/simpleMutableExtension.kt create mode 100644 js/js.translator/testData/callableReference/property/cases/simpleMutableMember.kt create mode 100644 js/js.translator/testData/callableReference/property/cases/simpleMutableTopLevel.kt create mode 100644 js/js.translator/testData/callableReference/property/cases/simpleTopLevel.kt create mode 100644 js/js.translator/testData/callableReference/property/cases/topLevelVar.kt create mode 100644 js/js.translator/testData/multiPackage/cases/reflectionFromOtherPackage/a.kt create mode 100644 js/js.translator/testData/multiPackage/cases/reflectionFromOtherPackage/b.kt create mode 100644 js/js.translator/testData/native/cases/nativeExtensionLikeMember.kt create mode 100644 js/js.translator/testData/native/cases/passMemberOrExtFromNative.kt create mode 100644 js/js.translator/testData/native/cases/passMemberOrExtToNative.kt create mode 100644 js/js.translator/testData/native/cases/passTopLevelFunctionFromNative.kt create mode 100644 js/js.translator/testData/native/cases/passTopLevelOrLocalFunctionToNative.kt create mode 100644 js/js.translator/testData/native/native/nativeExtensionLikeMember.js create mode 100644 js/js.translator/testData/native/native/passMemberOrExtFromNative.js create mode 100644 js/js.translator/testData/native/native/passMemberOrExtToNative.js create mode 100644 js/js.translator/testData/native/native/passTopLevelFunctionFromNative.js create mode 100644 js/js.translator/testData/native/native/passTopLevelOrLocalFunctionToNative.js diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/AbstractCallableReferenceTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/AbstractCallableReferenceTest.java new file mode 100644 index 00000000000..dc8255f0ac2 --- /dev/null +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/AbstractCallableReferenceTest.java @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.k2js.test.semantics; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.k2js.test.SingleFileTranslationTest; + +public abstract class AbstractCallableReferenceTest extends SingleFileTranslationTest { + + public AbstractCallableReferenceTest(@NotNull String main) { + super("callableReference/" + main); + } +} diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/FunctionCallableReferenceTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/FunctionCallableReferenceTest.java new file mode 100644 index 00000000000..35919e6e170 --- /dev/null +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/FunctionCallableReferenceTest.java @@ -0,0 +1,182 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.k2js.test.semantics; + +public final class FunctionCallableReferenceTest extends AbstractCallableReferenceTest { + + public FunctionCallableReferenceTest() { + super("function/"); + } + + public void testTopLevelFromClass() throws Exception { + checkFooBoxIsOk(); + } + + public void testTopLevelFromExtension() throws Exception { + checkFooBoxIsOk(); + } + + public void testTopLevelFromTopLevelStringNoArgs() throws Exception { + checkFooBoxIsOk(); + } + + public void testTopLevelFromTopLevelWithArg() throws Exception { + fooBoxTest(); + } + + public void testTopLevelFromTopLevelViaFunCall() throws Exception { + fooBoxTest(); + } + + public void testClassMemberFromClass() throws Exception { + checkFooBoxIsOk(); + } + + public void testClassMemberFromExtension() throws Exception { + checkFooBoxIsOk(); + } + + public void testClassMemberFromTopLevelStringNoArgs() throws Exception { + checkFooBoxIsOk(); + } + + public void testClassMemberFromTopLevelStringOneStringArg() throws Exception { + checkFooBoxIsOk(); + } + + public void testClassMemberFromTopLevelUnitNoArgs() throws Exception { + checkFooBoxIsOk(); + } + + public void testClassMemberFromTopLevelUnitOneStringArg() throws Exception { + checkFooBoxIsOk(); + } + + public void testExtensionFromTopLevel() throws Exception { + fooBoxTest(); + } + + public void testExtensionFromClass() throws Exception { + checkFooBoxIsOk(); + } + + public void testExtensionFromExtension() throws Exception { + checkFooBoxIsOk(); + } + + public void testExtensionFromTopLevelStringNoArgs() throws Exception { + checkFooBoxIsOk(); + } + + public void testExtensionFromTopLevelStringOneStringArg() throws Exception { + checkFooBoxIsOk(); + } + + public void testExtensionFromTopLevelUnitNoArgs() throws Exception { + checkFooBoxIsOk(); + } + + public void testExtensionFromTopLevelUnitOneStringArg() throws Exception { + checkFooBoxIsOk(); + } + + public void testConstructorFromTopLevelNoArgs() throws Exception { + checkFooBoxIsOk(); + } + + public void testConstructorFromTopLevelOneStringArg() throws Exception { + checkFooBoxIsOk(); + } + + public void testConstructorsWithArgs() throws Exception { + checkFooBoxIsOk(); + } + + public void testAbstractClassMember() throws Exception { + checkFooBoxIsOk(); + } + + public void testClassMemberOverridden() throws Exception { + checkFooBoxIsOk(); + } + + public void testClassMemberOverriddenInObject() throws Exception { + checkFooBoxIsOk(); + } + + public void testClassMemberAndExtension() throws Exception { + checkFooBoxIsOk(); + } + + public void testClassMemberAndExtensionCompatibility() throws Exception { + checkFooBoxIsOk(); + } + + public void testLocalAndTopLevelExtensions() throws Exception { + checkFooBoxIsOk(); + } + + public void testClosureWithSideEffect() throws Exception { + checkFooBoxIsOk(); + } + + public void testExtension() throws Exception { + checkFooBoxIsOk(); + } + + public void testExtensionToPrimitive() throws Exception { + checkFooBoxIsOk(); + } + + public void testExtensionWithClosure() throws Exception { + checkFooBoxIsOk(); + } + + public void testLocalLocal() throws Exception { + checkFooBoxIsOk(); + } + + public void testRecursiveClosure() throws Exception { + checkFooBoxIsOk(); + } + + public void testUnitWithSideEffect() throws Exception { + checkFooBoxIsOk(); + } + + public void testSimple() throws Exception { + checkFooBoxIsOk(); + } + + public void testSimpleClosure() throws Exception { + checkFooBoxIsOk(); + } + + public void testSimpleWithArg() throws Exception { + checkFooBoxIsOk(); + } + + public void testStringNativeExtension() throws Exception { + checkFooBoxIsOk(); + } + + /* + public void testBooleanNotIntrinsic() throws Exception { + checkFooBoxIsOk(); + } + */ +} diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/MultiPackageTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/MultiPackageTest.java index 563b26b8c1f..a92567d8306 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/MultiPackageTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/MultiPackageTest.java @@ -38,6 +38,10 @@ public class MultiPackageTest extends MultipleFilesTranslationTest { checkFooBoxIsTrue("packageVariableVisibleFromOtherPackage"); } + public void testReflectionFromOtherPackage() throws Exception { + checkFooBoxIsTrue("reflectionFromOtherPackage"); + } + public void testNestedPackageFunctionCalledFromOtherPackage() throws Exception { runMultiFileTest("nestedPackageFunctionCalledFromOtherPackage", "a.foo", TEST_FUNCTION, true); } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/NativeInteropTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/NativeInteropTest.java index 1e3593be7b5..db6c33197e1 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/NativeInteropTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/NativeInteropTest.java @@ -89,11 +89,31 @@ public final class NativeInteropTest extends SingleFileTranslationTest { checkFooBoxIsOk(); } + public void testNativeExtensionLikeMember() throws Exception { + checkFooBoxIsOk(); + } + public void testPassExtLambdaToNative() throws Exception { checkFooBoxIsOk(); } + public void testPassMemberOrExtToNative() throws Exception { + checkFooBoxIsOk(); + } + public void testPassExtLambdaFromNative() throws Exception { checkFooBoxIsOk(); } + + public void testPassMemberOrExtFromNative() throws Exception { + checkFooBoxIsOk(); + } + + public void testPassTopLevelOrLocalFunctionToNative() throws Exception { + checkFooBoxIsOk(); + } + + public void testPassTopLevelFunctionFromNative() throws Exception { + checkFooBoxIsOk(); + } } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/PropertyCallableReferenceTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/PropertyCallableReferenceTest.java new file mode 100644 index 00000000000..10d58a0068c --- /dev/null +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/PropertyCallableReferenceTest.java @@ -0,0 +1,80 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.k2js.test.semantics; + +public class PropertyCallableReferenceTest extends AbstractCallableReferenceTest { + + public PropertyCallableReferenceTest() { + super("property/"); + } + + public void testTopLevelVar() throws Exception { + checkFooBoxIsOk(); + } + + public void testExtensionProperty() throws Exception { + checkFooBoxIsOk(); + } + + public void testMemberProperty() throws Exception { + checkFooBoxIsOk(); + } + + public void testAccessViaSubclass() throws Exception { + checkFooBoxIsOk(); + } + + public void testDelegated() throws Exception { + checkFooBoxIsOk(); + } + + public void testDelegatedMutable() throws Exception { + checkFooBoxIsOk(); + } + + public void testKClassInstanceIsInitializedFirst() throws Exception { + checkFooBoxIsOk(); + } + + public void testOverriddenInSubclass() throws Exception { + checkFooBoxIsOk(); + } + + public void testSimpleExtension() throws Exception { + checkFooBoxIsOk(); + } + + public void testSimpleMember() throws Exception { + checkFooBoxIsOk(); + } + + public void testSimpleMutableExtension() throws Exception { + checkFooBoxIsOk(); + } + + public void testSimpleMutableMember() throws Exception { + checkFooBoxIsOk(); + } + + public void testSimpleMutableTopLevel() throws Exception { + checkFooBoxIsOk(); + } + + public void testSimpleTopLevel() throws Exception { + checkFooBoxIsOk(); + } +} diff --git a/js/js.translator/testData/callableReference/function/cases/abstractClassMember.kt b/js/js.translator/testData/callableReference/function/cases/abstractClassMember.kt new file mode 100644 index 00000000000..e9a395ff2d1 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/abstractClassMember.kt @@ -0,0 +1,12 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +abstract class A { + abstract fun foo(): String +} + +class B : A() { + override fun foo() = "OK" +} + +fun box(): String = B().(A::foo)() diff --git a/js/js.translator/testData/callableReference/function/cases/booleanNotIntrinsic.kt b/js/js.translator/testData/callableReference/function/cases/booleanNotIntrinsic.kt new file mode 100644 index 00000000000..e08772611c0 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/booleanNotIntrinsic.kt @@ -0,0 +1,8 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +fun box(): String { + if (true.(Boolean::not)() != false) return "Fail 1" + if (false.(Boolean::not)() != true) return "Fail 2" + return "OK" +} diff --git a/js/js.translator/testData/callableReference/function/cases/classMemberAndExtension.kt b/js/js.translator/testData/callableReference/function/cases/classMemberAndExtension.kt new file mode 100644 index 00000000000..e3297fc6d7e --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/classMemberAndExtension.kt @@ -0,0 +1,25 @@ +package foo + +class A { + val s = "sA" + fun memBar(other: String): String = s +":memBar:" + other +} + +fun A.extBar(other: String):String = s + ":extBar:" + other + +fun box():String { + fun A.locExtBar(other: String):String = s + ":locExtBar:" + other + + val a = A() + + var r = a.(A::memBar)("!!") + if (r != "sA:memBar:!!") return r + + r = a.(A::extBar)("!!") + if (r != "sA:extBar:!!") return r + + r = a.(A::locExtBar)("!!") + if (r != "sA:locExtBar:!!") return r + + return "OK" +} \ No newline at end of file diff --git a/js/js.translator/testData/callableReference/function/cases/classMemberAndExtensionCompatibility.kt b/js/js.translator/testData/callableReference/function/cases/classMemberAndExtensionCompatibility.kt new file mode 100644 index 00000000000..da9091f4f2d --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/classMemberAndExtensionCompatibility.kt @@ -0,0 +1,32 @@ +package foo + +fun run(a: A, arg: String, funRef:A.(String) -> String): String { + return a.(funRef)(arg) +} + +class A { + val s = "sA" + fun memBar(other: String): String = s +":memBar:" + other +} + +fun A.extBar(other: String):String = s + ":extBar:" + other + +fun box():String { + fun A.locExtBar(other: String):String = s + ":locExtBar:" + other + + val a = A() + + var r = run(a, "!!", A::memBar) + if (r != "sA:memBar:!!") return r + + r = run(a, "!!", A::extBar) + if (r != "sA:extBar:!!") return r + + r = run(a, "!!", A::locExtBar) + if (r != "sA:locExtBar:!!") return r + + r = run(a, "!!") {A.(other:String):String -> s + ":literal:" + other } + if (r != "sA:literal:!!") return r + + return "OK" +} \ No newline at end of file diff --git a/js/js.translator/testData/callableReference/function/cases/classMemberFromClass.kt b/js/js.translator/testData/callableReference/function/cases/classMemberFromClass.kt new file mode 100644 index 00000000000..437d60f1b74 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/classMemberFromClass.kt @@ -0,0 +1,14 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +class A { + fun bar(k: Int) = k + + fun result() = this.(::bar)(111) +} + +fun box(): String { + val result = A().result() + if (result != 111) return "Fail $result" + return "OK" +} diff --git a/js/js.translator/testData/callableReference/function/cases/classMemberFromExtension.kt b/js/js.translator/testData/callableReference/function/cases/classMemberFromExtension.kt new file mode 100644 index 00000000000..3320e69657e --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/classMemberFromExtension.kt @@ -0,0 +1,15 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +class A { + fun o() = 111 + fun k(k: Int) = k +} + +fun A.bar() = this.(::o)() + this.(A::k)(222) + +fun box(): String { + val result = A().bar() + if (result != 333) return "Fail $result" + return "OK" +} diff --git a/js/js.translator/testData/callableReference/function/cases/classMemberFromTopLevelStringNoArgs.kt b/js/js.translator/testData/callableReference/function/cases/classMemberFromTopLevelStringNoArgs.kt new file mode 100644 index 00000000000..88c380b34e3 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/classMemberFromTopLevelStringNoArgs.kt @@ -0,0 +1,22 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +fun run(arg1: A, funRef:A.() -> String): String { + return arg1.funRef() +} + +class A { + fun foo() = "OK" +} + +fun box(): String { + val x = A::foo + var r = A().x() + if (r != "OK") return r + + r = run(A(), A::foo) + if (r != "OK") return r + + return "OK" +} + diff --git a/js/js.translator/testData/callableReference/function/cases/classMemberFromTopLevelStringOneStringArg.kt b/js/js.translator/testData/callableReference/function/cases/classMemberFromTopLevelStringOneStringArg.kt new file mode 100644 index 00000000000..d38f4139e12 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/classMemberFromTopLevelStringOneStringArg.kt @@ -0,0 +1,21 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +fun run(arg1: A, arg2: String, funRef:A.(String) -> String): String { + return arg1.funRef(arg2) +} + +class A { + fun foo(result: String):String = result +} + +fun box(): String { + val x = A::foo + var r = A().x("OK") + + if (r != "OK") return r + + r = run(A(), "OK", A::foo) + if (r != "OK") return r + return "OK" +} diff --git a/js/js.translator/testData/callableReference/function/cases/classMemberFromTopLevelUnitNoArgs.kt b/js/js.translator/testData/callableReference/function/cases/classMemberFromTopLevelUnitNoArgs.kt new file mode 100644 index 00000000000..b9305e91102 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/classMemberFromTopLevelUnitNoArgs.kt @@ -0,0 +1,29 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +fun run(arg1: A, funRef:A.() -> Unit): Unit { + return arg1.funRef() +} + +class A { + var result = "Fail" + + fun foo() { + result = "OK" + } +} + +fun box(): String { + val a = A() + val x = A::foo + a.x() + var r = a.result + if (r != "OK") return r + + val a1 = A() + run(a1, A::foo) + r = a.result + if (r != "OK") return r + + return "OK" +} diff --git a/js/js.translator/testData/callableReference/function/cases/classMemberFromTopLevelUnitOneStringArg.kt b/js/js.translator/testData/callableReference/function/cases/classMemberFromTopLevelUnitOneStringArg.kt new file mode 100644 index 00000000000..4b5bbcc85dd --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/classMemberFromTopLevelUnitOneStringArg.kt @@ -0,0 +1,29 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +fun run(arg1: A, arg2: String, funRef:A.(String) -> Unit): Unit { + return arg1.funRef(arg2) +} + +class A { + var result = "Fail" + + fun foo(newResult: String) { + result = newResult + } +} + +fun box(): String { + val a = A() + val x = A::foo + a.x("OK") + var r = a.result + if (r != "OK") return r + + val a1 = A() + run(a1, "OK", A::foo) + r = a1.result + if (r != "OK") return r + + return "OK" +} diff --git a/js/js.translator/testData/callableReference/function/cases/classMemberOverridden.kt b/js/js.translator/testData/callableReference/function/cases/classMemberOverridden.kt new file mode 100644 index 00000000000..b5084c182dd --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/classMemberOverridden.kt @@ -0,0 +1,16 @@ +package foo + +open class A { + open fun foo(a:String,b:String): String = "fooA:" + a + b +} + +class B : A() { + override fun foo(a:String,b:String): String = "fooB:" + a + b +} + +fun box(): String { + val b = B() + var ref = A::foo + val result = b.(ref)("1", "2") + return (if (result == "fooB:12") "OK" else result) +} diff --git a/js/js.translator/testData/callableReference/function/cases/classMemberOverriddenInObject.kt b/js/js.translator/testData/callableReference/function/cases/classMemberOverriddenInObject.kt new file mode 100644 index 00000000000..ac2a4f3716f --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/classMemberOverriddenInObject.kt @@ -0,0 +1,15 @@ +package foo + +open class A { + open fun foo(a:String,b:String): String = "fooA:" + a + b +} + +object B : A() { + override fun foo(a:String,b:String): String = "fooB:" + a + b +} + +fun box(): String { + var ref = B::foo + val result = B.(ref)("1", "2") + return (if (result == "fooB:12") "OK" else result) +} diff --git a/js/js.translator/testData/callableReference/function/cases/closureWithSideEffect.kt b/js/js.translator/testData/callableReference/function/cases/closureWithSideEffect.kt new file mode 100644 index 00000000000..8a341bf806b --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/closureWithSideEffect.kt @@ -0,0 +1,12 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/local/. +package foo + +fun box(): String { + var result = "Fail" + + fun changeToOK() { result = "OK" } + + val ok = ::changeToOK + ok() + return result +} diff --git a/js/js.translator/testData/callableReference/function/cases/constructorFromTopLevelNoArgs.kt b/js/js.translator/testData/callableReference/function/cases/constructorFromTopLevelNoArgs.kt new file mode 100644 index 00000000000..da4eb3ae742 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/constructorFromTopLevelNoArgs.kt @@ -0,0 +1,8 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +class A { + var result = "OK" +} + +fun box() = (::A)().result diff --git a/js/js.translator/testData/callableReference/function/cases/constructorFromTopLevelOneStringArg.kt b/js/js.translator/testData/callableReference/function/cases/constructorFromTopLevelOneStringArg.kt new file mode 100644 index 00000000000..b94da65a133 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/constructorFromTopLevelOneStringArg.kt @@ -0,0 +1,6 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +class A(val result: String) + +fun box() = (::A)("OK").result diff --git a/js/js.translator/testData/callableReference/function/cases/constructorsWithArgs.kt b/js/js.translator/testData/callableReference/function/cases/constructorsWithArgs.kt new file mode 100644 index 00000000000..b50439dafc2 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/constructorsWithArgs.kt @@ -0,0 +1,21 @@ +package foo + +class A(val x:Int) { + var s = "sA" + { + s += ":init:" + x + } +} + +class B(val arg1:String, val arg2:String) { + var msg = "" + { + msg = arg1 + arg2 + } +} + +fun box():String { + val ref = ::A + var result = ref(1).s + (::B)("23", "45").msg + return (if (result == "sA:init:12345") "OK" else result) +} \ No newline at end of file diff --git a/js/js.translator/testData/callableReference/function/cases/extension.kt b/js/js.translator/testData/callableReference/function/cases/extension.kt new file mode 100644 index 00000000000..704a1f0b8c4 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/extension.kt @@ -0,0 +1,9 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/local/. +package foo + +class A + +fun box(): String { + fun A.foo() = "OK" + return A().(A::foo)() +} diff --git a/js/js.translator/testData/callableReference/function/cases/extensionFromClass.kt b/js/js.translator/testData/callableReference/function/cases/extensionFromClass.kt new file mode 100644 index 00000000000..03d12c89dc1 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/extensionFromClass.kt @@ -0,0 +1,10 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +class A { + fun result() = this.(::bar)("OK") +} + +fun A.bar(x: String) = x + +fun box() = A().result() diff --git a/js/js.translator/testData/callableReference/function/cases/extensionFromExtension.kt b/js/js.translator/testData/callableReference/function/cases/extensionFromExtension.kt new file mode 100644 index 00000000000..39f76b5b8a6 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/extensionFromExtension.kt @@ -0,0 +1,10 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +class A + +fun A.foo() = this.(A::bar)("OK") + +fun A.bar(x: String) = x + +fun box() = A().foo() diff --git a/js/js.translator/testData/callableReference/function/cases/extensionFromTopLevel.kt b/js/js.translator/testData/callableReference/function/cases/extensionFromTopLevel.kt new file mode 100644 index 00000000000..01468e38276 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/extensionFromTopLevel.kt @@ -0,0 +1,25 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +fun run(arg1: A, arg2: T, funRef:A.(T) -> T): T { + return arg1.funRef(arg2) +} + +class A { + var xx: Int = 100 +} + +fun A.bar(x: Int): Int { + this.xx = this.xx * 2 + return x +} + +fun box(): Boolean { + val funRef = A::bar + val obj = A() + var result = obj.(funRef)(25) + if (result != 25 || obj.xx != 200) return false + + result = run(A(), 25, funRef) + return result == 25 && obj.xx == 200 +} \ No newline at end of file diff --git a/js/js.translator/testData/callableReference/function/cases/extensionFromTopLevelStringNoArgs.kt b/js/js.translator/testData/callableReference/function/cases/extensionFromTopLevelStringNoArgs.kt new file mode 100644 index 00000000000..26a597855d3 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/extensionFromTopLevelStringNoArgs.kt @@ -0,0 +1,21 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +fun run(arg1: A, funRef:A.() -> String): String { + return arg1.funRef() +} + +class A + +fun A.foo() = "OK" + +fun box(): String { + val x = A::foo + var r = A().x() + if (r != "OK") return r + + r = run(A(), A::foo) + if (r != "OK") return r + + return "OK" +} diff --git a/js/js.translator/testData/callableReference/function/cases/extensionFromTopLevelStringOneStringArg.kt b/js/js.translator/testData/callableReference/function/cases/extensionFromTopLevelStringOneStringArg.kt new file mode 100644 index 00000000000..3c4d6976e6f --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/extensionFromTopLevelStringOneStringArg.kt @@ -0,0 +1,19 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +fun run(arg1: A, arg2: String, funRef:A.(String) -> String): String { + return arg1.funRef(arg2) +} + +class A + +fun A.foo(result: String) = result + +fun box(): String { + val x = A::foo + var r = A().x("OK") + if (r != "OK") return r + + r = run(A(), "OK", A::foo) + return "OK" +} diff --git a/js/js.translator/testData/callableReference/function/cases/extensionFromTopLevelUnitNoArgs.kt b/js/js.translator/testData/callableReference/function/cases/extensionFromTopLevelUnitNoArgs.kt new file mode 100644 index 00000000000..4ca7aa999f6 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/extensionFromTopLevelUnitNoArgs.kt @@ -0,0 +1,26 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +fun run(arg1: A, funRef:A.() -> Unit): Unit { + return arg1.funRef() +} + +class A { + var result = "Fail" +} + +fun A.foo() { + result = "OK" +} + +fun box(): String { + val a = A() + val x = A::foo + a.x() + + if (a.result != "OK") return a.result + + val a1 = A() + run(a1, A::foo) + return a.result +} diff --git a/js/js.translator/testData/callableReference/function/cases/extensionFromTopLevelUnitOneStringArg.kt b/js/js.translator/testData/callableReference/function/cases/extensionFromTopLevelUnitOneStringArg.kt new file mode 100644 index 00000000000..303595bd7fd --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/extensionFromTopLevelUnitOneStringArg.kt @@ -0,0 +1,26 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +fun run(arg1: A, arg2: String, funRef:A.(String) -> Unit): Unit { + return arg1.funRef(arg2) +} + +class A { + var result = "Fail" +} + +fun A.foo(newResult: String) { + result = newResult +} + +fun box(): String { + val a = A() + val x = A::foo + a.x("OK") + + if (a.result != "OK") return a.result + + val a1 = A() + run(a1, "OK", A::foo) + return a.result +} diff --git a/js/js.translator/testData/callableReference/function/cases/extensionToPrimitive.kt b/js/js.translator/testData/callableReference/function/cases/extensionToPrimitive.kt new file mode 100644 index 00000000000..f4d9ebc8410 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/extensionToPrimitive.kt @@ -0,0 +1,7 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/local/. +package foo + +fun box(): String { + fun Int.is42With(that: Int) = this + 2 * that == 42 + return if (16.(Int::is42With)(13)) "OK" else "Fail" +} diff --git a/js/js.translator/testData/callableReference/function/cases/extensionWithClosure.kt b/js/js.translator/testData/callableReference/function/cases/extensionWithClosure.kt new file mode 100644 index 00000000000..03db48e36ae --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/extensionWithClosure.kt @@ -0,0 +1,14 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/local/. +package foo + +class A + +fun box(): String { + var result = "Fail" + + fun A.ext() { result = "OK" } + + val f = A::ext + A().f() + return result +} diff --git a/js/js.translator/testData/callableReference/function/cases/localAndTopLevelExtensions.kt b/js/js.translator/testData/callableReference/function/cases/localAndTopLevelExtensions.kt new file mode 100644 index 00000000000..49b58d9439d --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/localAndTopLevelExtensions.kt @@ -0,0 +1,22 @@ +package foo + +fun Int.sum0(other: Int): Int = this + other; + +fun box(): String { + fun Int.sum1(other: Int): Int = this + other + + val sum2 = {Int.(other : Int) : Int -> this + other} + + var x = 10 + x = x.sum0(5) + x = x.sum1(5) + x = x.sum2(5) + + var y = 10 + y = y.(Int::sum0)(5) + y = y.(Int::sum1)(5) + y = y.sum2(5) + + var result:String = (if (x == y && x == 25) "OK" else "x=${x} y=${y}") + return result +} diff --git a/js/js.translator/testData/callableReference/function/cases/localLocal.kt b/js/js.translator/testData/callableReference/function/cases/localLocal.kt new file mode 100644 index 00000000000..2a0c89ec5c1 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/localLocal.kt @@ -0,0 +1,13 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/local/. +package foo + +fun box(): String { + fun foo(): String { + fun bar() = "OK" + val ref = ::bar + return ref() + } + + val ref = ::foo + return ref() +} diff --git a/js/js.translator/testData/callableReference/function/cases/recursiveClosure.kt b/js/js.translator/testData/callableReference/function/cases/recursiveClosure.kt new file mode 100644 index 00000000000..5e5cdef4b54 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/recursiveClosure.kt @@ -0,0 +1,10 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/local/. +package foo + +fun foo(until: Int): String { + fun bar(x: Int): String = + if (x == until) "OK" else bar(x + 1) + return (::bar)(0) +} + +fun box() = foo(10) diff --git a/js/js.translator/testData/callableReference/function/cases/simple.kt b/js/js.translator/testData/callableReference/function/cases/simple.kt new file mode 100644 index 00000000000..e96bf075f21 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/simple.kt @@ -0,0 +1,7 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/local/. +package foo + +fun box(): String { + fun foo() = "OK" + return (::foo)() +} diff --git a/js/js.translator/testData/callableReference/function/cases/simpleClosure.kt b/js/js.translator/testData/callableReference/function/cases/simpleClosure.kt new file mode 100644 index 00000000000..d8b8833a7a7 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/simpleClosure.kt @@ -0,0 +1,10 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/local/. +package foo + +fun box(): String { + val result = "OK" + + fun foo() = result + + return (::foo)() +} diff --git a/js/js.translator/testData/callableReference/function/cases/simpleWithArg.kt b/js/js.translator/testData/callableReference/function/cases/simpleWithArg.kt new file mode 100644 index 00000000000..70a7ee4d445 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/simpleWithArg.kt @@ -0,0 +1,7 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/local/. +package foo + +fun box(): String { + fun foo(s: String) = s + return (::foo)("OK") +} diff --git a/js/js.translator/testData/callableReference/function/cases/stringNativeExtension.kt b/js/js.translator/testData/callableReference/function/cases/stringNativeExtension.kt new file mode 100644 index 00000000000..52a1655a976 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/stringNativeExtension.kt @@ -0,0 +1,8 @@ +package foo + +fun box(): String { + var s = "abc" + assertEquals("ABC", s.(String::toUpperCase)()) + + return "OK" +} diff --git a/js/js.translator/testData/callableReference/function/cases/topLevelFromClass.kt b/js/js.translator/testData/callableReference/function/cases/topLevelFromClass.kt new file mode 100644 index 00000000000..a4e0c9f683e --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/topLevelFromClass.kt @@ -0,0 +1,22 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +fun run(arg1: T, arg2: T, funRef:(T,T) -> T): T { + return funRef(arg1, arg2) +} + +fun tmp(o: Int, k: Int) = o + k + +class A { + fun bar() = (::tmp)(111, 222) +} + +fun box(): String { + val result = A().bar() + if (result != 333) return "Fail $result" + + var r = run(111, 222, ::tmp) + if (result != 333) return "Fail $result" + + return "OK" +} diff --git a/js/js.translator/testData/callableReference/function/cases/topLevelFromExtension.kt b/js/js.translator/testData/callableReference/function/cases/topLevelFromExtension.kt new file mode 100644 index 00000000000..c3392553b8c --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/topLevelFromExtension.kt @@ -0,0 +1,22 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +fun run(arg1: T, arg2: T, funRef:(T,T) -> T): T { + return funRef(arg1, arg2) +} + +fun tmp(o: Int, k: Int) = o + k + +class A + +fun A.bar() = (::tmp)(111, 222) + +fun box(): String { + val result = A().bar() + if (result != 333) return "Fail $result" + + var r = run(111, 222, ::tmp) + if (result != 333) return "Fail $result" + + return "OK" +} diff --git a/js/js.translator/testData/callableReference/function/cases/topLevelFromTopLevelStringNoArgs.kt b/js/js.translator/testData/callableReference/function/cases/topLevelFromTopLevelStringNoArgs.kt new file mode 100644 index 00000000000..30501942f53 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/topLevelFromTopLevelStringNoArgs.kt @@ -0,0 +1,20 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +fun run(funRef:() -> String): String { + return funRef() +} + +fun bar() = "OK" + +fun box(): String { + val x = ::bar + + var r = x() + if (r != "OK") return r + + r = run(::bar) + if (r != "OK") return r + + return "OK" +} diff --git a/js/js.translator/testData/callableReference/function/cases/topLevelFromTopLevelViaFunCall.kt b/js/js.translator/testData/callableReference/function/cases/topLevelFromTopLevelViaFunCall.kt new file mode 100644 index 00000000000..42f9fcc64e8 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/topLevelFromTopLevelViaFunCall.kt @@ -0,0 +1,20 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +fun run(arg: Int, funRef:(Int) -> Int): Int { + return funRef(arg) +} + +fun inc(x: Int) = x + 1 + +fun tmp():Function1 { + return ::inc +} + +fun box(): Boolean { + if (tmp()(5) != 6) return false + + if (run(5, tmp()) != 6) return false + + return true +} \ No newline at end of file diff --git a/js/js.translator/testData/callableReference/function/cases/topLevelFromTopLevelWithArg.kt b/js/js.translator/testData/callableReference/function/cases/topLevelFromTopLevelWithArg.kt new file mode 100644 index 00000000000..d6a7f4fbd01 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/topLevelFromTopLevelWithArg.kt @@ -0,0 +1,18 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/. +package foo + +fun run(arg: Int, funRef:(Int) -> Int): Int { + return funRef(arg) +} +fun inc(x: Int) = x + 1 + +fun box(): Boolean { + val funRef = ::inc + if (funRef(5) != 6) return false + + if (run(5, funRef) != 6) return false + + if (run(5) {x -> x + 1} != 6) return false + + return true +} \ No newline at end of file diff --git a/js/js.translator/testData/callableReference/function/cases/unitWithSideEffect.kt b/js/js.translator/testData/callableReference/function/cases/unitWithSideEffect.kt new file mode 100644 index 00000000000..ec68be634e1 --- /dev/null +++ b/js/js.translator/testData/callableReference/function/cases/unitWithSideEffect.kt @@ -0,0 +1,18 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/function/local/. +package foo + +var state = 23 + +fun box(): String { + fun incrementState(inc: Int) { + state += inc + } + + val inc = ::incrementState + inc(12) + inc(-5) + inc(27) + inc(-15) + + return if (state == 42) "OK" else "Fail $state" +} diff --git a/js/js.translator/testData/callableReference/property/cases/accessViaSubclass.kt b/js/js.translator/testData/callableReference/property/cases/accessViaSubclass.kt new file mode 100644 index 00000000000..57c177147de --- /dev/null +++ b/js/js.translator/testData/callableReference/property/cases/accessViaSubclass.kt @@ -0,0 +1,12 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/property/. +package foo + +abstract class Base { + val result = "OK" +} + +class Derived : Base() + +fun box(): String { + return (Base::result).get(Derived()) +} diff --git a/js/js.translator/testData/callableReference/property/cases/delegated.kt b/js/js.translator/testData/callableReference/property/cases/delegated.kt new file mode 100644 index 00000000000..580027960ee --- /dev/null +++ b/js/js.translator/testData/callableReference/property/cases/delegated.kt @@ -0,0 +1,25 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/property/. +package foo + +object NumberDecrypter { + fun get(instance: Any?, data: PropertyMetadata) = when (data.name) { + "four" -> 4 + "two" -> 2 + else -> throw Exception() + } +} + +val four: Int by NumberDecrypter + +class A { + val two: Int by NumberDecrypter +} + +fun box(): String { + val x = ::four.get() + if (x != 4) return "Fail x: $x" + val a = A() + val y = A::two.get(a) + if (y != 2) return "Fail y: $y" + return "OK" +} diff --git a/js/js.translator/testData/callableReference/property/cases/delegatedMutable.kt b/js/js.translator/testData/callableReference/property/cases/delegatedMutable.kt new file mode 100644 index 00000000000..f8c963122ee --- /dev/null +++ b/js/js.translator/testData/callableReference/property/cases/delegatedMutable.kt @@ -0,0 +1,25 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/property/. +package foo + +object Delegate { + var value = "lol" + + fun get(instance: Any?, data: PropertyMetadata): String { + return value + } + + fun set(instance: Any?, data: PropertyMetadata, newValue: String) { + value = newValue + } +} + +var result: String by Delegate + +fun box(): String { + val f = ::result + if (f.get() != "lol") return "Fail 1: {$f.get()}" + Delegate.value = "rofl" + if (f.get() != "rofl") return "Fail 2: {$f.get()}" + f.set("OK") + return f.get() +} diff --git a/js/js.translator/testData/callableReference/property/cases/extensionProperty.kt b/js/js.translator/testData/callableReference/property/cases/extensionProperty.kt new file mode 100644 index 00000000000..d0dd6077d4c --- /dev/null +++ b/js/js.translator/testData/callableReference/property/cases/extensionProperty.kt @@ -0,0 +1,40 @@ +package foo + + +open class A(var msg:String) { +} + +class B:A("FromB") { +} + +var global:String = "" + +var A.ext:String + get() = ":A.ext ${this.msg}:" + set(value) { global = ":A.ext ${value}" } + +var B.ext:String + get() = ":B.ext ${this.msg}:" + set(value) { global = ":B.ext ${value}" } + +fun box(): String { + val a = A("Test") + + var refAExt = A::ext + var refBExt = B::ext + + assertEquals("ext", refAExt.name) + assertEquals("ext", refBExt.name) + + assertEquals(":A.ext Test:", refAExt.get(a)) + assertEquals(":B.ext FromB:", refBExt.get(B())) + + refAExt.set(a, "newA") + assertEquals(":A.ext newA", global) + + global = "" + refBExt.set(B(), "newB") + assertEquals(":B.ext newB", global) + + return "OK" +} diff --git a/js/js.translator/testData/callableReference/property/cases/kClassInstanceIsInitializedFirst.kt b/js/js.translator/testData/callableReference/property/cases/kClassInstanceIsInitializedFirst.kt new file mode 100644 index 00000000000..e36d494d7b5 --- /dev/null +++ b/js/js.translator/testData/callableReference/property/cases/kClassInstanceIsInitializedFirst.kt @@ -0,0 +1,16 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/property/. +package foo + +import kotlin.reflect.KMemberProperty + +class A { + class object { + val ref: KMemberProperty = A::foo + } + + val foo: String = "OK" +} + +fun box(): String { + return A.ref.get(A()) +} diff --git a/js/js.translator/testData/callableReference/property/cases/memberProperty.kt b/js/js.translator/testData/callableReference/property/cases/memberProperty.kt new file mode 100644 index 00000000000..baa82d4b120 --- /dev/null +++ b/js/js.translator/testData/callableReference/property/cases/memberProperty.kt @@ -0,0 +1,31 @@ +package foo + +open class A(var msg:String) { + open var prop:String = "initA" +} + +class B:A("FromB") { + override var prop:String = "initB" +} + +fun box(): String { + var refAProp = A::prop + var refBProp = B::prop + + assertEquals("prop", refAProp.name) + assertEquals("prop", refBProp.name) + + val a = A("Test") + assertEquals("initA", refAProp.get(a)) + + refAProp.set(a, "newPropA") + assertEquals("newPropA", a.prop) + + val a1 = B() + assertEquals("initB", refAProp.get(a1)) + + refAProp.set(a1, "newPropB") + assertEquals("newPropB", a1.prop) + + return "OK" +} diff --git a/js/js.translator/testData/callableReference/property/cases/overriddenInSubclass.kt b/js/js.translator/testData/callableReference/property/cases/overriddenInSubclass.kt new file mode 100644 index 00000000000..eb255bb8571 --- /dev/null +++ b/js/js.translator/testData/callableReference/property/cases/overriddenInSubclass.kt @@ -0,0 +1,12 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/property/. +package foo + +open class Base { + open val foo = "Base" +} + +class Derived : Base() { + override val foo = "OK" +} + +fun box() = (Base::foo).get(Derived()) diff --git a/js/js.translator/testData/callableReference/property/cases/simpleExtension.kt b/js/js.translator/testData/callableReference/property/cases/simpleExtension.kt new file mode 100644 index 00000000000..655a1c39653 --- /dev/null +++ b/js/js.translator/testData/callableReference/property/cases/simpleExtension.kt @@ -0,0 +1,15 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/property/. +package foo + +val String.id: String + get() = this + +fun box(): String { + val pr = String::id + + if (pr["123"] != "123") return "Fail value: ${pr["123"]}" + + if (pr.name != "id") return "Fail name: ${pr.name}" + + return pr.get("OK") +} diff --git a/js/js.translator/testData/callableReference/property/cases/simpleMember.kt b/js/js.translator/testData/callableReference/property/cases/simpleMember.kt new file mode 100644 index 00000000000..be229a7d209 --- /dev/null +++ b/js/js.translator/testData/callableReference/property/cases/simpleMember.kt @@ -0,0 +1,12 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/property/. +package foo + +class A(val x: Int) + +fun box(): String { + val p = A::x + if (p.get(A(42)) != 42) return "Fail 1" + if (p.get(A(-1)) != -1) return "Fail 2" + if (p.name != "x") return "Fail 3" + return "OK" +} diff --git a/js/js.translator/testData/callableReference/property/cases/simpleMutableExtension.kt b/js/js.translator/testData/callableReference/property/cases/simpleMutableExtension.kt new file mode 100644 index 00000000000..e83bb4de126 --- /dev/null +++ b/js/js.translator/testData/callableReference/property/cases/simpleMutableExtension.kt @@ -0,0 +1,21 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/property/. +package foo + +var storage = 0 + +var Int.foo: Int + get() { + return this + storage + } + set(value) { + storage = this + value + } + +fun box(): String { + val pr = Int::foo + if (pr.get(42) != 42) return "Fail 1: ${pr[42]}" + pr.set(200, 39) + if (pr.get(-239) != 0) return "Fail 2: ${pr[-239]}" + if (storage != 239) return "Fail 3: $storage" + return "OK" +} diff --git a/js/js.translator/testData/callableReference/property/cases/simpleMutableMember.kt b/js/js.translator/testData/callableReference/property/cases/simpleMutableMember.kt new file mode 100644 index 00000000000..5bac4db5fff --- /dev/null +++ b/js/js.translator/testData/callableReference/property/cases/simpleMutableMember.kt @@ -0,0 +1,19 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/property/. +package foo + +data class Box(var value: String) + +fun box(): String { + val o = Box("lorem") + val prop = Box::value + + if (prop.get(o) != "lorem") return "Fail 1: ${prop[o]}" + prop.set(o, "ipsum") + if (prop.get(o) != "ipsum") return "Fail 2: ${prop[o]}" + if (o.value != "ipsum") return "Fail 3: ${o.value}" + o.value = "dolor" + if (prop.get(o) != "dolor") return "Fail 4: ${prop.get(o)}" + if ("$o" != "Box(value=dolor)") return "Fail 5: $o" + + return "OK" +} diff --git a/js/js.translator/testData/callableReference/property/cases/simpleMutableTopLevel.kt b/js/js.translator/testData/callableReference/property/cases/simpleMutableTopLevel.kt new file mode 100644 index 00000000000..07f1cb948ef --- /dev/null +++ b/js/js.translator/testData/callableReference/property/cases/simpleMutableTopLevel.kt @@ -0,0 +1,15 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/property/. +package foo + +data class Box(val value: String) + +var pr = Box("first") + +fun box(): String { + val property = ::pr + if (property.get() != Box("first")) return "Fail value: ${property.get()}" + if (property.name != "pr") return "Fail name: ${property.name}" + property.set(Box("second")) + if (property.get().value != "second") return "Fail value 2: ${property.get()}" + return "OK" +} diff --git a/js/js.translator/testData/callableReference/property/cases/simpleTopLevel.kt b/js/js.translator/testData/callableReference/property/cases/simpleTopLevel.kt new file mode 100644 index 00000000000..dcd15e00518 --- /dev/null +++ b/js/js.translator/testData/callableReference/property/cases/simpleTopLevel.kt @@ -0,0 +1,13 @@ +// This test was adapted from compiler/testData/codegen/boxWithStdlib/callableReference/property/. +package foo + +data class Box(val value: String) + +val foo = Box("lol") + +fun box(): String { + val property = ::foo + if (property.get() != Box("lol")) return "Fail value: ${property.get()}" + if (property.name != "foo") return "Fail name: ${property.name}" + return "OK" +} diff --git a/js/js.translator/testData/callableReference/property/cases/topLevelVar.kt b/js/js.translator/testData/callableReference/property/cases/topLevelVar.kt new file mode 100644 index 00000000000..6a78e7db266 --- /dev/null +++ b/js/js.translator/testData/callableReference/property/cases/topLevelVar.kt @@ -0,0 +1,20 @@ +package foo + +var x = 1 + +val y = 2 + +fun box(): String { + var refX = ::x + assertEquals(1, refX.get()) + assertEquals("x", refX.name) + + refX.set(100) + assertEquals(100, x) + + var refY = ::y + assertEquals(2, refY.get()) + assertEquals("y", refY.name) + + return "OK" +} diff --git a/js/js.translator/testData/multiPackage/cases/reflectionFromOtherPackage/a.kt b/js/js.translator/testData/multiPackage/cases/reflectionFromOtherPackage/a.kt new file mode 100644 index 00000000000..bfb0ba44a41 --- /dev/null +++ b/js/js.translator/testData/multiPackage/cases/reflectionFromOtherPackage/a.kt @@ -0,0 +1,22 @@ +package bar + +fun topLevelFun(s: String) = "topLevelFun: ${s}"; + +var topLevelVar = 100 + +val topLevelVal = 200 + +class A(val v: String) { + fun memA(s: String) = "memA: ${v} ${s}" + var propVar: Int = 1000 + val propVal: Int = 2000 + var text: String = "text" +} + +fun A.ext1(s: String): String = "A.ext1: ${this.v} ${s}" + +var A.extProp: String + get() = "${this.text}" + set(value) { + this.text = value + } \ No newline at end of file diff --git a/js/js.translator/testData/multiPackage/cases/reflectionFromOtherPackage/b.kt b/js/js.translator/testData/multiPackage/cases/reflectionFromOtherPackage/b.kt new file mode 100644 index 00000000000..cbc31257a28 --- /dev/null +++ b/js/js.translator/testData/multiPackage/cases/reflectionFromOtherPackage/b.kt @@ -0,0 +1,29 @@ +package foo + +import bar.* + +fun A.ext2(s: String): String = "A.ext2: ${this.v} ${s}" + +fun box(): Boolean { + + assertEquals("topLevelFun: A", (::topLevelFun)("A")) + assertEquals("A.ext1: test B", A("test").(A::ext1)("B")) + assertEquals("A.ext2: test B", A("test").(A::ext2)("B")) + assertEquals("memA: test C", A("test").(A::memA)("C")) + + assertEquals(100, ::topLevelVar.get()) + ::topLevelVar.set(500) + assertEquals(500, ::topLevelVar.get()) + assertEquals(200, ::topLevelVal.get()) + val a = A("test") + assertEquals(1000, (A::propVar).get(a)) + A::propVar.set(a, 5000) + assertEquals(5000, (A::propVar).get(a)) + assertEquals(2000, (A::propVal).get(a)) + + assertEquals("text", (A::extProp).get(a)) + (A::extProp).set(a, "new text") + assertEquals("new text", (A::extProp).get(a)) + + return true; +} \ No newline at end of file diff --git a/js/js.translator/testData/native/cases/nativeExtensionLikeMember.kt b/js/js.translator/testData/native/cases/nativeExtensionLikeMember.kt new file mode 100644 index 00000000000..ce19f8d4d76 --- /dev/null +++ b/js/js.translator/testData/native/cases/nativeExtensionLikeMember.kt @@ -0,0 +1,40 @@ +package foo + +native +open class A(val value: String) { +} + +class B : A("B") { + fun bar(): String = "B.bar ${value}" + var prop: String = "B prop" +} + +native fun A.bar(): String = js.noImpl + +native var A.prop: String + get() = js.noImpl + set(value) = js.noImpl + +fun box(): String { + var a: A = A("A") + val b: B = B() + + assertEquals("A.bar A", a.bar()) + assertEquals("B.bar B", b.bar()) + + assertEquals("A.bar A", a.(A::bar)()) + assertEquals("B.bar B", b.(A::bar)()) + + a.prop = "prop" + assertEquals("prop", a.prop) + assertEquals("prop", (A::prop).get(a)) + + a = b + assertEquals("B.bar B", a.bar()) + assertEquals("B.bar B", a.(A::bar)()) + + assertEquals("B prop", a.prop) + assertEquals("B prop", (A::prop).get(a)) + + return "OK"; +} \ No newline at end of file diff --git a/js/js.translator/testData/native/cases/passMemberOrExtFromNative.kt b/js/js.translator/testData/native/cases/passMemberOrExtFromNative.kt new file mode 100644 index 00000000000..5620e531d50 --- /dev/null +++ b/js/js.translator/testData/native/cases/passMemberOrExtFromNative.kt @@ -0,0 +1,28 @@ +package foo + +native +class A(val v: String) { + fun m(i:Int, s:String): String = js.noImpl +} +native +fun A.nativeExt(i:Int, s:String): String = js.noImpl + +native("nativeExt2AnotherName") +fun A.nativeExt2(i:Int, s:String): String = js.noImpl + +fun bar(a: A, extLambda: A.(Int, String) -> String): String = a.(extLambda)(4, "boo") + +fun box(): String { + val a = A("test") + + assertEquals("A.m test 4 boo", a.m(4, "boo")) + assertEquals("A.m test 4 boo", bar(a, A::m)) + + assertEquals("nativeExt test 4 boo", a.nativeExt(4, "boo")) + assertEquals("nativeExt test 4 boo", bar(a, A::nativeExt)) + + assertEquals("nativeExt2 test 4 boo", a.nativeExt2(4, "boo")) + assertEquals("nativeExt2 test 4 boo", bar(a, A::nativeExt2)) + + return "OK" +} \ No newline at end of file diff --git a/js/js.translator/testData/native/cases/passMemberOrExtToNative.kt b/js/js.translator/testData/native/cases/passMemberOrExtToNative.kt new file mode 100644 index 00000000000..125a2c5eeed --- /dev/null +++ b/js/js.translator/testData/native/cases/passMemberOrExtToNative.kt @@ -0,0 +1,38 @@ +package foo + +open class A(val v: String) { + open fun m(i:Int, s:String): String = "A.m ${this.v} $i $s" +} + +class B(v: String): A(v) { + override fun m(i:Int, s:String): String = "B.m ${this.v} $i $s" +} + +native +fun bar(a: A, extLambda: A.(Int, String) -> String): String = noImpl + +fun A.topLevelExt(i:Int, s:String): String = "A::topLevelExt ${this.v} $i $s" + +fun box(): String { + val a = A("test") + + var r = bar(a) { i, s -> "${this.v} $i $s"} + if (r != "test 4 boo") return r + + fun A.LocalExt(i:Int, s:String): String = "A::LocalExt ${this.v} $i $s" + + r = bar(a, A::topLevelExt) + if (r != "A::topLevelExt test 4 boo") return r + + r = bar(a, A::LocalExt) + if (r != "A::LocalExt test 4 boo") return r + + r = bar(a, A::m) + if (r != "A.m test 4 boo") return r + + val b = B("test") + r = bar(b, A::m) + if (r != "B.m test 4 boo") return r + + return "OK" +} \ No newline at end of file diff --git a/js/js.translator/testData/native/cases/passTopLevelFunctionFromNative.kt b/js/js.translator/testData/native/cases/passTopLevelFunctionFromNative.kt new file mode 100644 index 00000000000..5bf99764694 --- /dev/null +++ b/js/js.translator/testData/native/cases/passTopLevelFunctionFromNative.kt @@ -0,0 +1,19 @@ +package foo + +native +fun nativeFun(i:Int, s:String): String = js.noImpl + +fun bar(funRef: (Int, String) -> String): String = funRef(4, "boo") + +fun box(): String { + var r = nativeFun(4, "boo") + if (r != "nativeFun 4 boo") return r + + r = bar(::nativeFun) + if (r != "nativeFun 4 boo") return r + + r = (::nativeFun)(4, "boo") + if (r != "nativeFun 4 boo") return r + + return "OK" +} \ No newline at end of file diff --git a/js/js.translator/testData/native/cases/passTopLevelOrLocalFunctionToNative.kt b/js/js.translator/testData/native/cases/passTopLevelOrLocalFunctionToNative.kt new file mode 100644 index 00000000000..f7b23bb0a5b --- /dev/null +++ b/js/js.translator/testData/native/cases/passTopLevelOrLocalFunctionToNative.kt @@ -0,0 +1,22 @@ +package foo + +native +fun run(i:Int, s:String, funRef: (Int, String) -> String): String = noImpl + +fun funTopLevel(i:Int, s:String): String = "funTopLevel $i $s" + +fun box(): String { + fun funLocal(i:Int, s:String): String = "funLocal $i $s" + + // Check for lambda + var r = run(4, "boo") { i, s -> "$i $s"} + if (r != "4 boo") return r + + r = run(4, "boo", ::funTopLevel) + if (r != "funTopLevel 4 boo") return r + + r = run(4, "boo", ::funLocal) + if (r != "funLocal 4 boo") return r + + return "OK" +} \ No newline at end of file diff --git a/js/js.translator/testData/native/native/nativeExtensionLikeMember.js b/js/js.translator/testData/native/native/nativeExtensionLikeMember.js new file mode 100644 index 00000000000..a14d72e39e1 --- /dev/null +++ b/js/js.translator/testData/native/native/nativeExtensionLikeMember.js @@ -0,0 +1,5 @@ +function A(value) { + this.value = value; +} + +A.prototype.bar = function() { return "A.bar " + this.value; }; diff --git a/js/js.translator/testData/native/native/passMemberOrExtFromNative.js b/js/js.translator/testData/native/native/passMemberOrExtFromNative.js new file mode 100644 index 00000000000..bf7ba54a6b1 --- /dev/null +++ b/js/js.translator/testData/native/native/passMemberOrExtFromNative.js @@ -0,0 +1,14 @@ +function A(v) { + this.v = v; + this.m = function (i, s) { + return "A.m " + v + " " + i + " " + s; + } +} + +A.prototype.nativeExt = function (i, s) { + return "nativeExt " + this.v + " " + i + " " + s; +}; + +A.prototype.nativeExt2AnotherName = function (i, s) { + return "nativeExt2 " + this.v + " " + i + " " + s; +}; diff --git a/js/js.translator/testData/native/native/passMemberOrExtToNative.js b/js/js.translator/testData/native/native/passMemberOrExtToNative.js new file mode 100644 index 00000000000..39df1fd518a --- /dev/null +++ b/js/js.translator/testData/native/native/passMemberOrExtToNative.js @@ -0,0 +1,3 @@ +function bar(a, extLambda) { + return extLambda.call(a, 4, "boo") +} diff --git a/js/js.translator/testData/native/native/passTopLevelFunctionFromNative.js b/js/js.translator/testData/native/native/passTopLevelFunctionFromNative.js new file mode 100644 index 00000000000..d9f68a4050f --- /dev/null +++ b/js/js.translator/testData/native/native/passTopLevelFunctionFromNative.js @@ -0,0 +1,3 @@ +function nativeFun(i, s) { + return "nativeFun " + i + " " + s; +} \ No newline at end of file diff --git a/js/js.translator/testData/native/native/passTopLevelOrLocalFunctionToNative.js b/js/js.translator/testData/native/native/passTopLevelOrLocalFunctionToNative.js new file mode 100644 index 00000000000..14c2ebd73b0 --- /dev/null +++ b/js/js.translator/testData/native/native/passTopLevelOrLocalFunctionToNative.js @@ -0,0 +1,3 @@ +function run(arg0, arg1, funRef) { + return funRef(arg0, arg1) +}