diff --git a/native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/global1.kt b/native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/global1.kt new file mode 100644 index 00000000000..6d260e29308 --- /dev/null +++ b/native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/global1.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +// MODULE: lib +// FILE: lib.kt +var z1 = false +var z2 = false + +// MODULE: lib2(lib) +// FILE: lib2.kt +import kotlin.test.* + +@OptIn(kotlin.ExperimentalStdlibApi::class) +@EagerInitialization +val x = foo() + +private fun foo(): Int { + z1 = true + return 42 +} + +// Will be initialized since [x]'s initializer calls a function from the file. +val y = run { z2 = true; 117 } + +// MODULE: main(lib, lib2) +// FILE: main.kt +import kotlin.test.* + +fun box(): String { + assertTrue(z1) + assertTrue(z2) + + return "OK" +} diff --git a/native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/global2.kt b/native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/global2.kt new file mode 100644 index 00000000000..e89359e130d --- /dev/null +++ b/native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/global2.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +// MODULE: lib +// FILE: lib.kt +var z1 = false +var z2 = false + +// MODULE: lib2(lib) +// FILE: lib2.kt +import kotlin.test.* + +@OptIn(kotlin.ExperimentalStdlibApi::class) +@EagerInitialization +val x = run { z1 = true; 42 } + +// Won't be initialized (cause no function from the file will be called during [x] initialization). +val y = run { z2 = true; 117 } + +// MODULE: main(lib, lib2) +// FILE: main.kt +import kotlin.test.* + +fun box(): String { + assertTrue(z1) + assertFalse(z2) + + return "OK" +} diff --git a/native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/threadLocal1.kt b/native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/threadLocal1.kt new file mode 100644 index 00000000000..06f8e634547 --- /dev/null +++ b/native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/threadLocal1.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +// MODULE: lib +// FILE: lib.kt +@ThreadLocal +var z1 = false +var z2 = false +@ThreadLocal +var z3 = false + +// MODULE: lib2(lib) +// FILE: lib2.kt +import kotlin.test.* + +@OptIn(kotlin.ExperimentalStdlibApi::class) +@EagerInitialization +@ThreadLocal +val x = foo() + +private fun foo(): Int { + z1 = true + return 42 +} + +// Both will be initialized since [x]'s initializer calls a function from the file. +val y1 = run { z2 = true; 117 } + +@ThreadLocal +val y2 = run { z3 = true; 117 } + +// MODULE: main(lib, lib2) +// FILE: main.kt +import kotlin.test.* + +fun box(): String { + assertTrue(z1) + assertTrue(z2) + assertTrue(z3) + + return "OK" +} diff --git a/native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/threadLocal2.kt b/native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/threadLocal2.kt new file mode 100644 index 00000000000..8010a9994bf --- /dev/null +++ b/native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/threadLocal2.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +// MODULE: lib +// FILE: lib.kt +@ThreadLocal +var z1 = false +var z2 = false +@ThreadLocal +var z3 = false + +// MODULE: lib2(lib) +// FILE: lib2.kt +import kotlin.test.* + +@OptIn(kotlin.ExperimentalStdlibApi::class) +@EagerInitialization +@ThreadLocal +val x = run { z1 = true; 42 } + +// Won't be initialized (cause no function from the file will be called during [x] initialization). +val y1 = run { z2 = true; 117 } + +@ThreadLocal +val y2 = run { z3 = true; 117 } + +// MODULE: main(lib, lib2) +// FILE: main.kt +import kotlin.test.* + +fun box(): String { + assertTrue(z1) + assertFalse(z2) + assertFalse(z3) + + return "OK" +} diff --git a/native/native.tests/testData/codegen/initializers/files/simpleMultiModule.kt b/native/native.tests/testData/codegen/initializers/files/simpleMultiModule.kt new file mode 100644 index 00000000000..5d17e1f775e --- /dev/null +++ b/native/native.tests/testData/codegen/initializers/files/simpleMultiModule.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the LICENSE file. + */ + +// MODULE: lib +// FILE: lib.kt +class X(val s: String) + +val x = X("zzz") + +// MODULE: lib2(lib) +// FILE: lib2.kt +class Z(val x: Int) + +val z2 = Z(x.s.length) + +// MODULE: main(lib2) +// FILE: main.kt +import kotlin.test.* + +fun box(): String { + assertEquals(3, z2.x) + return "OK" +} \ No newline at end of file diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/FirNativeCodegenLocalTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/FirNativeCodegenLocalTestGenerated.java index 95b80ce5056..abd05472175 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/FirNativeCodegenLocalTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/FirNativeCodegenLocalTestGenerated.java @@ -2097,6 +2097,12 @@ public class FirNativeCodegenLocalTestGenerated extends AbstractNativeCodegenBox runTest("native/native.tests/testData/codegen/initializers/files/simple.kt"); } + @Test + @TestMetadata("simpleMultiModule.kt") + public void testSimpleMultiModule() throws Exception { + runTest("native/native.tests/testData/codegen/initializers/files/simpleMultiModule.kt"); + } + @Test @TestMetadata("workers1.kt") public void testWorkers1() throws Exception { @@ -2144,6 +2150,43 @@ public class FirNativeCodegenLocalTestGenerated extends AbstractNativeCodegenBox public void testThreadLocal2() throws Exception { runTest("native/native.tests/testData/codegen/initializers/files/eagerInitialization/threadLocal2.kt"); } + + @Nested + @TestMetadata("native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule") + @TestDataPath("$PROJECT_ROOT") + @Tag("frontend-fir") + @FirPipeline() + @UseExtTestCaseGroupProvider() + public class MultiModule { + @Test + public void testAllFilesPresentInMultiModule() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.NATIVE, true); + } + + @Test + @TestMetadata("global1.kt") + public void testGlobal1() throws Exception { + runTest("native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/global1.kt"); + } + + @Test + @TestMetadata("global2.kt") + public void testGlobal2() throws Exception { + runTest("native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/global2.kt"); + } + + @Test + @TestMetadata("threadLocal1.kt") + public void testThreadLocal1() throws Exception { + runTest("native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/threadLocal1.kt"); + } + + @Test + @TestMetadata("threadLocal2.kt") + public void testThreadLocal2() throws Exception { + runTest("native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/threadLocal2.kt"); + } + } } } } diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/NativeCodegenLocalTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/NativeCodegenLocalTestGenerated.java index cb4bcb9953d..ffd7b161b95 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/NativeCodegenLocalTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/NativeCodegenLocalTestGenerated.java @@ -2049,6 +2049,12 @@ public class NativeCodegenLocalTestGenerated extends AbstractNativeCodegenBoxTes runTest("native/native.tests/testData/codegen/initializers/files/simple.kt"); } + @Test + @TestMetadata("simpleMultiModule.kt") + public void testSimpleMultiModule() throws Exception { + runTest("native/native.tests/testData/codegen/initializers/files/simpleMultiModule.kt"); + } + @Test @TestMetadata("workers1.kt") public void testWorkers1() throws Exception { @@ -2094,6 +2100,41 @@ public class NativeCodegenLocalTestGenerated extends AbstractNativeCodegenBoxTes public void testThreadLocal2() throws Exception { runTest("native/native.tests/testData/codegen/initializers/files/eagerInitialization/threadLocal2.kt"); } + + @Nested + @TestMetadata("native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule") + @TestDataPath("$PROJECT_ROOT") + @UseExtTestCaseGroupProvider() + public class MultiModule { + @Test + public void testAllFilesPresentInMultiModule() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.NATIVE, true); + } + + @Test + @TestMetadata("global1.kt") + public void testGlobal1() throws Exception { + runTest("native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/global1.kt"); + } + + @Test + @TestMetadata("global2.kt") + public void testGlobal2() throws Exception { + runTest("native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/global2.kt"); + } + + @Test + @TestMetadata("threadLocal1.kt") + public void testThreadLocal1() throws Exception { + runTest("native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/threadLocal1.kt"); + } + + @Test + @TestMetadata("threadLocal2.kt") + public void testThreadLocal2() throws Exception { + runTest("native/native.tests/testData/codegen/initializers/files/eagerInitialization/multiModule/threadLocal2.kt"); + } + } } } }