diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index 09a8d693363..3ef76a317ee 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -5603,13 +5603,13 @@ Task frameworkTest(String name, Closure configurator) { } baseDir "$testOutputFramework/${task.name}" - if (fr.library != null) { - dependsOn konanArtifacts[fr.library].getByTarget(target.name) + fr.libraries.forEach { library -> + dependsOn konanArtifacts[library].getByTarget(target.name) libraries { - file konanArtifacts[fr.library].getArtifactByTarget(target.name) + file konanArtifacts[library].getArtifactByTarget(target.name) } linkerOpts "-L$buildDir" - UtilsKt.dependsOnKonanBuildingTask(task, fr.library, target) + UtilsKt.dependsOnKonanBuildingTask(task, library, target) } extraOpts fr.bitcode ? "-Xembed-bitcode" : "-Xembed-bitcode-marker" @@ -5626,35 +5626,45 @@ Task frameworkTest(String name, Closure configurator) { } } -if (isAppleTarget(project)) { - frameworkTest('testObjCExport') { - final String frameworkName = 'Kt' - final String dir = "$testOutputFramework/testObjCExport" +Task objcExportTest( + Task allTask, + String suffix, + List frameworkOpts, + List swiftOpts, + Boolean isStaticFramework, + Boolean needLazyHeaderCheck +) { + final String name = "testObjCExport$suffix" + final String frameworkName = "Kt$suffix" + final String expectedLazyHeaderName = "expectedLazy${suffix}.h" + final Task task = frameworkTest(name) { + final String dir = "$testOutputFramework/$name" final File lazyHeader = file("$dir/$target-lazy.h") doLast { // Check lazy header. - final String expectedLazyHeaderName = "expectedLazy.h" - final String expectedLazyHeaderDir = file("objcexport/") - final File expectedLazyHeader = new File(expectedLazyHeaderDir, expectedLazyHeaderName) + if (needLazyHeaderCheck) { + final String expectedLazyHeaderDir = file("objcexport/") + final File expectedLazyHeader = new File(expectedLazyHeaderDir, expectedLazyHeaderName) - if (expectedLazyHeader.readLines() != lazyHeader.readLines()) { - exec { - commandLine 'diff', '-u', expectedLazyHeader, lazyHeader - ignoreExitValue = true + if (!expectedLazyHeader.exists() || expectedLazyHeader.readLines() != lazyHeader.readLines()) { + exec { + commandLine 'diff', '-u', expectedLazyHeader, lazyHeader + ignoreExitValue = true + } + + copy { + from(lazyHeader) + into(expectedLazyHeaderDir) + rename { expectedLazyHeaderName } + } + + throw new Error("$expectedLazyHeader file patched;\nRun gradlew ${allTask.path} --continue and don't forget to commit the patch") } - - copy { - from(lazyHeader) - into(expectedLazyHeaderDir) - rename { expectedLazyHeaderName } - } - - throw new Error("$expectedLazyHeader file patched;\nre-run the test and don't forget to commit the patch") } // Check bundle ID. - final String frameworkPath = "$dir/$target/${frameworkName}.framework" + final String frameworkPath = "$dir/$target/Kt.framework" final Pattern pattern = ~"CFBundleIdentifier\n\\s*foo.bar" final String plistPath = (target.family == Family.OSX) ? "$frameworkPath/Resources/Info.plist" : @@ -5669,7 +5679,7 @@ if (isAppleTarget(project)) { konanArtifacts { library(libraryName, targets: [target.name]) { srcDir "objcexport/library" - artifactName "test-library" + artifactName "test-$libraryName" delegate.getByTarget(target.name).configure{ UtilsKt.dependsOnDist(it) } @@ -5677,14 +5687,27 @@ if (isAppleTarget(project)) { extraOpts "-Xshort-module-name=MyLibrary" extraOpts "-module-name", "org.jetbrains.kotlin.native.test-library" } + } + codesign = !isStaticFramework framework(frameworkName) { enabled = !isK2(project) // KT-56182 sources = ['objcexport'] - library = libraryName - opts = ["-Xemit-lazy-objc-header=$lazyHeader", "-Xexport-kdoc", "-Xbinary=bundleId=foo.bar"] + libraries = [libraryName] + artifact = 'Kt' + bitcode = !isStaticFramework + isStatic = isStaticFramework + if (needLazyHeaderCheck) { + opts += "-Xemit-lazy-objc-header=$lazyHeader" + } + opts += [ + "-Xexport-kdoc", + "-Xbinary=bundleId=foo.bar", + ] + opts += frameworkOpts } swiftSources = ['objcexport'] + swiftExtraOpts = swiftOpts if (isNoopGC) { swiftExtraOpts += ["-D", "NOOP_GC"] } @@ -5692,220 +5715,63 @@ if (isAppleTarget(project)) { swiftExtraOpts += ["-D", "AGGRESSIVE_GC"] } } + allTask.dependsOn(task) + return task +} - frameworkTest('testObjCExportNoGenerics') { - final String frameworkName = 'KtNoGenerics' - final String frameworkArtifactName = 'Kt' - final String dir = "$testOutputFramework/testObjCExportNoGenerics" - final File lazyHeader = file("$dir/$target-lazy.h") - doLast { - final String expectedLazyHeaderName = "expectedLazyNoGenerics.h" - final String expectedLazyHeaderDir = file("objcexport/") - final File expectedLazyHeader = new File(expectedLazyHeaderDir, expectedLazyHeaderName) - if (expectedLazyHeader.readLines() != lazyHeader.readLines()) { - exec { - commandLine 'diff', '-u', expectedLazyHeader, lazyHeader - ignoreExitValue = true - } +if (isAppleTarget(project)) { + final Task ObjCExportAllTask = tasks.create("testObjCExportAll") + objcExportTest( + ObjCExportAllTask, + '', + [], + [], + false, + true + ) + objcExportTest( + ObjCExportAllTask, + 'NoGenerics', + ["-Xno-objc-generics"], + [ '-D', 'NO_GENERICS' ], + false, + true + ) + objcExportTest( + ObjCExportAllTask, + 'LegacySuspendUnit', + ["-Xbinary=unitSuspendFunctionObjCExport=legacy"], + [ '-D', 'LEGACY_SUSPEND_UNIT_FUNCTION_EXPORT' ], + false, + true + ) + objcExportTest( + ObjCExportAllTask, + 'NoSwiftMemberNameMangling', + ["-Xbinary=objcExportDisableSwiftMemberNameMangling=true"], + [ '-D', 'DISABLE_MEMBER_NAME_MANGLING' ], + false, + false + ) + objcExportTest( + ObjCExportAllTask, + 'NoInterfaceMemberNameMangling', + ["-Xbinary=objcExportIgnoreInterfaceMethodCollisions=true"], + [ '-D', 'DISABLE_INTERFACE_METHOD_NAME_MANGLING' ], + false, + false + ) - copy { - from(lazyHeader) - into(expectedLazyHeaderDir) - rename { expectedLazyHeaderName } - } - - throw new Error("$expectedLazyHeader file patched;\nre-run the test and don't forget to commit the patch") - } - - } - - def libraryName = frameworkName + "Library" - konanArtifacts { - library(libraryName, targets: [target.name]) { - srcDir "objcexport/library" - artifactName "test-library" - - if (!useCustomDist) { - dependsOn ":${target.name}CrossDistRuntime", ':distCompiler' - } - - extraOpts "-Xshort-module-name=MyLibrary" - extraOpts "-module-name", "org.jetbrains.kotlin.native.test-library" - } - } - framework(frameworkName) { - enabled = !isK2(project) // KT-56182 - sources = ['objcexport'] - artifact = frameworkArtifactName - library = libraryName - opts = ["-Xemit-lazy-objc-header=$lazyHeader", "-Xno-objc-generics"] - } - swiftSources = ['objcexport'] - swiftExtraOpts = [ '-D', 'NO_GENERICS' ] - if (isNoopGC) { - swiftExtraOpts += ["-D", "NOOP_GC"] - } - } - - frameworkTest('testObjCExportLegacySuspendUnit') { - final String frameworkName = 'KtLegacySuspendUnit' - final String frameworkArtifactName = 'Kt' - final String dir = "$testOutputFramework/testObjCExportLegacySuspendUnit" - final File lazyHeader = file("$dir/$target-lazy.h") - - doLast { - final String expectedLazyHeaderName = "expectedLazyLegacySuspendUnit.h" - final String expectedLazyHeaderDir = file("objcexport/") - final File expectedLazyHeader = new File(expectedLazyHeaderDir, expectedLazyHeaderName) - - if (expectedLazyHeader.readLines() != lazyHeader.readLines()) { - exec { - commandLine 'diff', '-u', expectedLazyHeader, lazyHeader - ignoreExitValue = true - } - - copy { - from(lazyHeader) - into(expectedLazyHeaderDir) - rename { expectedLazyHeaderName } - } - - throw new Error("$expectedLazyHeader file patched;\nre-run the test and don't forget to commit the patch") - } - - } - - def libraryName = frameworkName + "Library" - konanArtifacts { - library(libraryName, targets: [target.name]) { - srcDir "objcexport/library" - artifactName "test-library" - - if (!useCustomDist) { - dependsOn ":${target.name}CrossDistRuntime", ':distCompiler' - } - - extraOpts "-Xshort-module-name=MyLibrary" - extraOpts "-module-name", "org.jetbrains.kotlin.native.test-library" - } - } - framework(frameworkName) { - enabled = !isK2(project) // KT-56182 - sources = ['objcexport'] - artifact = frameworkArtifactName - library = libraryName - opts = ["-Xemit-lazy-objc-header=$lazyHeader", "-Xbinary=unitSuspendFunctionObjCExport=legacy"] - } - swiftSources = ['objcexport'] - swiftExtraOpts = [ '-D', 'LEGACY_SUSPEND_UNIT_FUNCTION_EXPORT' ] - if (isNoopGC) { - swiftExtraOpts += ["-D", "NOOP_GC"] - } - } - - frameworkTest('testObjCExportNoSwiftMemberNameMangling') { - final String frameworkName = 'KtNoSwiftMemberNameMangling' - final String frameworkArtifactName = 'Kt' - final String dir = "$testOutputFramework/testObjCExportNoSwiftMemberNameMangling" - - def libraryName = frameworkName + "Library" - konanArtifacts { - library(libraryName, targets: [target.name]) { - srcDir "objcexport/library" - artifactName "test-library" - - if (!useCustomDist) { - dependsOn ":${target.name}CrossDistRuntime", ':distCompiler' - } - - extraOpts "-Xshort-module-name=MyLibrary" - extraOpts "-module-name", "org.jetbrains.kotlin.native.test-library" - } - } - framework(frameworkName) { - enabled = !isK2(project) // KT-56182 - sources = ['objcexport'] - artifact = frameworkArtifactName - library = libraryName - opts = ["-Xbinary=objcExportDisableSwiftMemberNameMangling=true"] - } - swiftSources = ['objcexport'] - swiftExtraOpts = [ '-D', 'DISABLE_MEMBER_NAME_MANGLING' ] - if (isNoopGC) { - swiftExtraOpts += ["-D", "NOOP_GC"] - } - } - - frameworkTest('testObjCExportNoInterfaceMemberNameMangling') { - final String frameworkName = 'KtNoInterfaceMemberNameMangling' - final String frameworkArtifactName = 'Kt' - final String dir = "$testOutputFramework/testObjCExportNoInterfaceMemberNameMangling" - - def libraryName = frameworkName + "Library" - konanArtifacts { - library(libraryName, targets: [target.name]) { - srcDir "objcexport/library" - artifactName "test-library" - - if (!useCustomDist) { - dependsOn ":${target.name}CrossDistRuntime", ':distCompiler' - } - - extraOpts "-Xshort-module-name=MyLibrary" - extraOpts "-module-name", "org.jetbrains.kotlin.native.test-library" - } - } - framework(frameworkName) { - enabled = !isK2(project) // KT-56182 - sources = ['objcexport'] - artifact = frameworkArtifactName - library = libraryName - opts = ["-Xbinary=objcExportIgnoreInterfaceMethodCollisions=true"] - } - swiftSources = ['objcexport'] - swiftExtraOpts = [ '-D', 'DISABLE_INTERFACE_METHOD_NAME_MANGLING' ] - if (isNoopGC) { - swiftExtraOpts += ["-D", "NOOP_GC"] - } - } - - frameworkTest('testObjCExportStatic') { - final String frameworkName = 'KtStatic' - final String frameworkArtifactName = 'Kt' - final String libraryName = frameworkName + "Library" - - konanArtifacts { - library(libraryName, targets: [target.name]) { - srcDir "objcexport/library" - artifactName "test-library" - - delegate.getByTarget(target.name).configure{ - UtilsKt.dependsOnDist(it) - } - - extraOpts "-Xshort-module-name=MyLibrary" - extraOpts "-module-name", "org.jetbrains.kotlin.native.test-library" - } - } - - codesign = false - framework(frameworkName) { - enabled = !isK2(project) // KT-56182 - sources = ['objcexport'] - bitcode = false - artifact = frameworkArtifactName - library = libraryName - isStatic = true - opts = ["-Xbinary=objcExportSuspendFunctionLaunchThreadRestriction=none"] - } - swiftSources = ['objcexport'] - swiftExtraOpts = [ '-D', 'ALLOW_SUSPEND_ANY_THREAD' ] - if (isNoopGC) { - swiftExtraOpts += ["-D", "NOOP_GC"] - } - } + objcExportTest( + ObjCExportAllTask, + 'Static', + ["-Xbinary=objcExportSuspendFunctionLaunchThreadRestriction=none"], + [ '-D', 'ALLOW_SUSPEND_ANY_THREAD' ], + true, + false + ) frameworkTest('testValuesGenericsFramework') { framework('ValuesGenerics') { @@ -5966,7 +5832,7 @@ if (isAppleTarget(project)) { frameworkTest("testGh3343Framework") { framework('Gh3343') { sources = ['framework/gh3343'] - library = 'objcGh3343' + libraries = ['objcGh3343'] } swiftSources = ['framework/gh3343/'] } @@ -5982,7 +5848,7 @@ if (isAppleTarget(project)) { frameworkTest("testKt43517Framework") { framework('Kt43517') { sources = ['framework/kt43517'] - library = 'objcKt43517' + libraries = ['objcKt43517'] } swiftSources = ['framework/kt43517/'] } @@ -6054,7 +5920,7 @@ if (isAppleTarget(project)) { frameworkTest("testForwardDeclarationsFramework") { framework('ForwardDeclarations') { sources = ['framework/forwardDeclarations'] - library = 'frameworkForwardDeclarations' + libraries = ['frameworkForwardDeclarations'] } swiftSources = ['framework/forwardDeclarations/'] } diff --git a/kotlin-native/backend.native/tests/objcexport/expectedLazyLegacySuspendUnit.h b/kotlin-native/backend.native/tests/objcexport/expectedLazyLegacySuspendUnit.h index 8af8b31c4e9..98bcc3fddde 100644 --- a/kotlin-native/backend.native/tests/objcexport/expectedLazyLegacySuspendUnit.h +++ b/kotlin-native/backend.native/tests/objcexport/expectedLazyLegacySuspendUnit.h @@ -704,14 +704,33 @@ __attribute__((swift_name("InterfaceMethodNameManglingKt"))) + (KtInterfaceNameManglingC2 *)o2 __attribute__((swift_name("o2()"))); @end + +/** + * Summary class [KDocExport]. + * + * @property xyzzy Doc for property xyzzy + * @property zzz See below. + */ __attribute__((objc_subclassing_restricted)) __attribute__((swift_name("KDocExport"))) @interface KtKDocExport : KtBase + +/** Non-primary ctor KDoc: */ - (instancetype)initWithName:(NSString *)name __attribute__((swift_name("init(name:)"))) __attribute__((objc_designated_initializer)); - (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer)); + (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); + +/** + * @param xyzzy is documented. + * + * This is multi-line KDoc. See a blank line above. + */ @property (readonly) NSString *xyzzy __attribute__((swift_name("xyzzy"))); + +/** @property xyzzy KDoc for foo? */ @property (readonly) NSString *foo __attribute__((swift_name("foo"))); + +/** @property foo KDoc for yxxyz? */ @property int32_t yxxyz __attribute__((swift_name("yxxyz"))); @end @@ -719,6 +738,37 @@ __attribute__((swift_name("SomeClassWithProperty"))) @interface KtSomeClassWithProperty : KtBase - (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer)); + (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); + +/** + * Returns dispatcher that executes coroutines immediately when it is already in the right context + * (e.g. current looper is the same as this handler's looper) without an additional [re-dispatch][CoroutineDispatcher.dispatch]. + * + * Immediate dispatcher is safe from stack overflows and in case of nested invocations forms event-loop similar to [Dispatchers.Unconfined]. + * The event loop is an advanced topic and its implications can be found in [Dispatchers.Unconfined] documentation. + * The formed event-loop is shared with [Unconfined] and other immediate dispatchers, potentially overlapping tasks between them. + * + * Example of usage: + * ``` + * suspend fun updateUiElement(val text: String) { + * ** + * * If it is known that updateUiElement can be invoked both from the Main thread and from other threads, + * * `immediate` dispatcher is used as a performance optimization to avoid unnecessary dispatch. + * * + * * In that case, when `updateUiElement` is invoked from the Main thread, `uiElement.text` will be + * * invoked immediately without any dispatching, otherwise, the `Dispatchers.Main` dispatch cycle will be triggered. + * ** + * withContext(Dispatchers.Main.immediate) { + * uiElement.text = text + * } + * // Do context-independent logic such as logging + * } + * ``` + * + * Method may throw [UnsupportedOperationException] if immediate dispatching is not supported by current dispatcher, + * please refer to specific dispatcher documentation. + * + * [Dispatchers.Main] supports immediate execution for Android, JavaFx and Swing platforms. + */ @property (readonly) KtSomeClassWithProperty *heavyFormattedKDocFoo __attribute__((swift_name("heavyFormattedKDocFoo"))); @end @@ -727,6 +777,13 @@ __attribute__((swift_name("KdocExportKt"))) @interface KtKdocExportKt : KtBase /** + * Useless function [whatever] + * + * This kdoc has some additional formatting. + * @param a keep intact and return + * @return value of [a] + * Check for additional comment (note) below + * * @note This method converts instances of IllegalArgumentException to errors. * Other uncaught Kotlin exceptions are fatal. */ @@ -1039,16 +1096,24 @@ __attribute__((swift_name("Bar"))) + (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); /** + * My method + * @param nodocParam is one arg + * @param fooParam is second arg + * @param fooParam annotations Foo BugReport(assignedTo="me", status="fixed") + * @return their sum + * * @note annotations * Foo - * @param fooParam annotations Foo BugReport(assignedTo="me", status="fixed") * @note This method converts instances of CancellationException to errors. * Other uncaught Kotlin exceptions are fatal. * @note This method has protected visibility in Kotlin source and is intended only for use by subclasses. */ - (void)bazNodocParam:(int32_t)nodocParam fooParam:(int32_t)fooParam completionHandler:(void (^)(KtInt * _Nullable, NSError * _Nullable))completionHandler __attribute__((swift_name("baz(nodocParam:fooParam:completionHandler:)"))) __attribute__((deprecated("warning"))); -/** +/** My property + *** + * + * * @note annotations * Foo * BugReport(assignedTo="me", status="open") diff --git a/kotlin-native/backend.native/tests/objcexport/expectedLazyNoGenerics.h b/kotlin-native/backend.native/tests/objcexport/expectedLazyNoGenerics.h index 19844c5876d..9336225d7b6 100644 --- a/kotlin-native/backend.native/tests/objcexport/expectedLazyNoGenerics.h +++ b/kotlin-native/backend.native/tests/objcexport/expectedLazyNoGenerics.h @@ -704,14 +704,33 @@ __attribute__((swift_name("InterfaceMethodNameManglingKt"))) + (KtInterfaceNameManglingC2 *)o2 __attribute__((swift_name("o2()"))); @end + +/** + * Summary class [KDocExport]. + * + * @property xyzzy Doc for property xyzzy + * @property zzz See below. + */ __attribute__((objc_subclassing_restricted)) __attribute__((swift_name("KDocExport"))) @interface KtKDocExport : KtBase + +/** Non-primary ctor KDoc: */ - (instancetype)initWithName:(NSString *)name __attribute__((swift_name("init(name:)"))) __attribute__((objc_designated_initializer)); - (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer)); + (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); + +/** + * @param xyzzy is documented. + * + * This is multi-line KDoc. See a blank line above. + */ @property (readonly) NSString *xyzzy __attribute__((swift_name("xyzzy"))); + +/** @property xyzzy KDoc for foo? */ @property (readonly) NSString *foo __attribute__((swift_name("foo"))); + +/** @property foo KDoc for yxxyz? */ @property int32_t yxxyz __attribute__((swift_name("yxxyz"))); @end @@ -719,6 +738,37 @@ __attribute__((swift_name("SomeClassWithProperty"))) @interface KtSomeClassWithProperty : KtBase - (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer)); + (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); + +/** + * Returns dispatcher that executes coroutines immediately when it is already in the right context + * (e.g. current looper is the same as this handler's looper) without an additional [re-dispatch][CoroutineDispatcher.dispatch]. + * + * Immediate dispatcher is safe from stack overflows and in case of nested invocations forms event-loop similar to [Dispatchers.Unconfined]. + * The event loop is an advanced topic and its implications can be found in [Dispatchers.Unconfined] documentation. + * The formed event-loop is shared with [Unconfined] and other immediate dispatchers, potentially overlapping tasks between them. + * + * Example of usage: + * ``` + * suspend fun updateUiElement(val text: String) { + * ** + * * If it is known that updateUiElement can be invoked both from the Main thread and from other threads, + * * `immediate` dispatcher is used as a performance optimization to avoid unnecessary dispatch. + * * + * * In that case, when `updateUiElement` is invoked from the Main thread, `uiElement.text` will be + * * invoked immediately without any dispatching, otherwise, the `Dispatchers.Main` dispatch cycle will be triggered. + * ** + * withContext(Dispatchers.Main.immediate) { + * uiElement.text = text + * } + * // Do context-independent logic such as logging + * } + * ``` + * + * Method may throw [UnsupportedOperationException] if immediate dispatching is not supported by current dispatcher, + * please refer to specific dispatcher documentation. + * + * [Dispatchers.Main] supports immediate execution for Android, JavaFx and Swing platforms. + */ @property (readonly) KtSomeClassWithProperty *heavyFormattedKDocFoo __attribute__((swift_name("heavyFormattedKDocFoo"))); @end @@ -727,6 +777,13 @@ __attribute__((swift_name("KdocExportKt"))) @interface KtKdocExportKt : KtBase /** + * Useless function [whatever] + * + * This kdoc has some additional formatting. + * @param a keep intact and return + * @return value of [a] + * Check for additional comment (note) below + * * @note This method converts instances of IllegalArgumentException to errors. * Other uncaught Kotlin exceptions are fatal. */ @@ -1039,16 +1096,24 @@ __attribute__((swift_name("Bar"))) + (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); /** + * My method + * @param nodocParam is one arg + * @param fooParam is second arg + * @param fooParam annotations Foo BugReport(assignedTo="me", status="fixed") + * @return their sum + * * @note annotations * Foo - * @param fooParam annotations Foo BugReport(assignedTo="me", status="fixed") * @note This method converts instances of CancellationException to errors. * Other uncaught Kotlin exceptions are fatal. * @note This method has protected visibility in Kotlin source and is intended only for use by subclasses. */ - (void)bazNodocParam:(int32_t)nodocParam fooParam:(int32_t)fooParam completionHandler:(void (^)(KtInt * _Nullable, NSError * _Nullable))completionHandler __attribute__((swift_name("baz(nodocParam:fooParam:completionHandler:)"))) __attribute__((deprecated("warning"))); -/** +/** My property + *** + * + * * @note annotations * Foo * BugReport(assignedTo="me", status="open") diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/FrameworkTest.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/FrameworkTest.kt index 9a436b4d30a..028b0b9c5b8 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/FrameworkTest.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/FrameworkTest.kt @@ -59,7 +59,7 @@ open class FrameworkTest : DefaultTask(), KonanTestExecutable { * @param bitcode bitcode embedding in the framework, * @param isStatic determines that framework is static * @param artifact the name of the resulting artifact, - * @param library library dependency name, + * @param library list of library dependency names, * @param opts additional options for the compiler. */ class Framework( @@ -68,7 +68,7 @@ open class FrameworkTest : DefaultTask(), KonanTestExecutable { var bitcode: Boolean = false, var isStatic: Boolean = false, var artifact: String = name, - var library: String? = null, + var libraries: List = emptyList(), var opts: List = emptyList() ) : Serializable // Required for Gradle when using Framework as task input.