From d406b1b16de2cf109439f81d18627752e701ed60 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Wed, 12 Sep 2018 17:23:59 +0300 Subject: [PATCH] Support OptionalExpectation (#2040) --- .../org/jetbrains/kotlin/cli/bc/K2Native.kt | 6 +++- backend.native/tests/build.gradle | 9 ++++++ .../codegen/mpp/mpp_optional_expectation.kt | 10 +++++++ .../kotlin/gradle/plugin/KonanToolRunner.kt | 29 +++++++++++++++++-- .../experimental/tasks/KotlinNativeCompile.kt | 6 ++++ .../gradle/plugin/tasks/KonanCompileTask.kt | 5 +++- .../test/MultiplatformSpecification.groovy | 12 +++++++- 7 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 backend.native/tests/codegen/mpp/mpp_optional_expectation.kt diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index 4b51bd402d9..83a489f35ba 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.cli.common.CLICompiler import org.jetbrains.kotlin.cli.common.CLITool import org.jetbrains.kotlin.cli.common.CommonCompilerPerformanceManager import org.jetbrains.kotlin.cli.common.ExitCode +import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoot import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoots import org.jetbrains.kotlin.cli.common.config.kotlinSourceRoots import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.ERROR @@ -108,7 +109,10 @@ class K2Native : CLICompiler() { arguments : K2NativeCompilerArguments, services : Services) { - configuration.addKotlinSourceRoots(arguments.freeArgs) + val commonSources = arguments.commonSources?.toSet().orEmpty() + arguments.freeArgs.forEach { + configuration.addKotlinSourceRoot(it, it in commonSources) + } with(KonanConfigKeys) { with(configuration) { diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index 8687b8a5b8e..b8da0a3101a 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -2301,6 +2301,15 @@ task mpp_default_args(type: RunStandaloneKonanTest) { flags = ['-tr', '-Xmulti-platform'] } +task mpp_optional_expectation(type: RunStandaloneKonanTest) { + source = "codegen/mpp/mpp_optional_expectation.kt" + def outputRoot = project.ext."$outputSourceSetName" + flags = [ + '-Xmulti-platform', + "-Xcommon-sources=${file("$outputRoot/$name/mpp_optional_expectation.kt")}" + ] +} + task unit1(type: RunKonanTest) { goldValue = "First\nkotlin.Unit\n" source = "codegen/basics/unit1.kt" diff --git a/backend.native/tests/codegen/mpp/mpp_optional_expectation.kt b/backend.native/tests/codegen/mpp/mpp_optional_expectation.kt new file mode 100644 index 00000000000..52fd1175580 --- /dev/null +++ b/backend.native/tests/codegen/mpp/mpp_optional_expectation.kt @@ -0,0 +1,10 @@ +@file:Suppress("EXPERIMENTAL_API_USAGE_ERROR") +@OptionalExpectation +expect annotation class Optional() + +@Optional +fun foo() { println(42) } + +fun main(args: Array) { + foo() +} \ No newline at end of file diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanToolRunner.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanToolRunner.kt index edddcc84631..e1aaaa9056e 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanToolRunner.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanToolRunner.kt @@ -80,6 +80,8 @@ internal abstract class KonanCliRunner( this } + open protected fun transformArgs(args: List): List = args + override fun run(args: List) { project.logger.info("Run tool: $toolName with args: ${args.joinToString(separator = " ")}") if (classpath.isEmpty) { @@ -99,7 +101,7 @@ internal abstract class KonanCliRunner( .toMap() ) spec.systemProperties(additionalSystemProperties) - spec.args(listOf(toolName) + args) + spec.args(listOf(toolName) + transformArgs(args)) blacklistEnvironment.forEach { spec.environment.remove(it) } spec.environment(environment) } @@ -119,8 +121,29 @@ internal class KonanInteropRunner(project: Project, additionalJvmArgs: List = emptyList()) - : KonanCliRunner("konanc", "Kotlin/Native compiler", project, additionalJvmArgs) +internal class KonanCompilerRunner( + project: Project, + additionalJvmArgs: List = emptyList(), + val useArgFile: Boolean = true +) : KonanCliRunner("konanc", "Kotlin/Native compiler", project, additionalJvmArgs) +{ + override fun transformArgs(args: List): List { + if (!useArgFile) { + return args + } + + val argFile = createTempFile(prefix = "konancArgs", suffix = ".lst").apply { + deleteOnExit() + } + argFile.printWriter().use { writer -> + args.forEach { + writer.println(it) + } + } + + return listOf("@${argFile.absolutePath}") + } +} internal class KonanKlibRunner(project: Project, additionalJvmArgs: List = emptyList()) : KonanCliRunner("klib", "Klib management tool", project, additionalJvmArgs) diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/tasks/KotlinNativeCompile.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/tasks/KotlinNativeCompile.kt index bd893586ae1..10292374bc4 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/tasks/KotlinNativeCompile.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/tasks/KotlinNativeCompile.kt @@ -45,6 +45,11 @@ open class KotlinNativeCompile @Inject constructor(internal val binary: Abstract val sources: FileCollection @InputFiles get() = binary.sources + private val commonSources: FileCollection + get() = with(binary.sourceSet) { + getCommonMultiplatformSources() + getCommonNativeSources() + } + val libraries: Configuration @InputFiles get() = binary.klibraries @@ -129,6 +134,7 @@ open class KotlinNativeCompile @Inject constructor(internal val binary: Abstract addListArg("-linker-options", linkerOpts) addAll(sources.files.map { it.absolutePath }) + commonSources.files.mapTo(this) { "-Xcommon-sources=${it.absolutePath}" } } KonanCompilerRunner(project).run(args) diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanCompileTask.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanCompileTask.kt index 00a671b3a87..f2a247a8026 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanCompileTask.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanCompileTask.kt @@ -141,7 +141,10 @@ abstract class KonanCompileTask: KonanBuildingTask(), KonanCompileSpec { addAll(extraOpts) - allSourceFiles.mapTo(this) { it.canonicalPath } + allSourceFiles.mapTo(this) { it.absolutePath } + commonSrcFiles + .flatMap { it.files } + .mapTo(this) { "-Xcommon-sources=${it.absolutePath}" } } // region DSL. diff --git a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/MultiplatformSpecification.groovy b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/MultiplatformSpecification.groovy index ce2903234a6..b36f83fc62c 100644 --- a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/MultiplatformSpecification.groovy +++ b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/MultiplatformSpecification.groovy @@ -84,7 +84,17 @@ class MultiplatformSpecification extends BaseKonanSpecification { createCommonSource(commonDirectory, ["src", "main", "kotlin"], "common.kt", - "expect fun foo(): Int") + """\ + @file:Suppress("EXPERIMENTAL_API_USAGE_ERROR") + @OptionalExpectation + expect annotation class Optional() + + @Optional + fun opt() = 42 + + expect fun foo(): Int + """.stripIndent() + ) it.generateSrcFile("platform.kt", "actual fun foo() = 42") it.buildFile.append("""