[Gradle] Implement CompilerArgumentAware (for compatibility) using the new KotlinCompilerArgumentsProducer

KTIJ-24976
This commit is contained in:
Sebastian Sellmair
2023-03-21 14:22:15 +01:00
committed by Space Team
parent 30a4911a51
commit d6e3b63069
13 changed files with 73 additions and 218 deletions
@@ -20,38 +20,69 @@ package org.jetbrains.kotlin.gradle.internal
import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Internal
import org.jetbrains.kotlin.cli.common.arguments.CommonToolArguments import org.jetbrains.kotlin.cli.common.arguments.CommonToolArguments
import org.jetbrains.kotlin.cli.common.arguments.copyBeanTo
import org.jetbrains.kotlin.compilerRunner.ArgumentUtils import org.jetbrains.kotlin.compilerRunner.ArgumentUtils
import org.jetbrains.kotlin.compilerRunner.ArgumentUtils.convertArgumentsToStringList
import org.jetbrains.kotlin.gradle.plugin.CreateCompilerArgumentsContext
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.ArgumentType
/**
* Only relevant for supporting older IDEs (before 2023.2)
*/
@Deprecated("Replaced by KotlinCompilerArgumentsProducer") @Deprecated("Replaced by KotlinCompilerArgumentsProducer")
interface CompilerArgumentAware<T : CommonToolArguments> { interface CompilerArgumentAware<T : CommonToolArguments> : KotlinCompilerArgumentsProducer {
@Deprecated("Replaced by KotlinCompilerArgumentsProducer", level = DeprecationLevel.ERROR) @Deprecated("Replaced by KotlinCompilerArgumentsProducer", level = DeprecationLevel.ERROR)
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
@get:Internal @get:Internal
val serializedCompilerArguments: List<String> val serializedCompilerArguments: List<String>
get() = ArgumentUtils.convertArgumentsToStringList(prepareCompilerArguments()) get() = convertArgumentsToStringList(prepareCompilerArguments())
@Deprecated("Replaced by KotlinCompilerArgumentsProducer", level = DeprecationLevel.ERROR) @Deprecated("Replaced by KotlinCompilerArgumentsProducer", level = DeprecationLevel.ERROR)
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
@get:Internal @get:Internal
val serializedCompilerArgumentsIgnoreClasspathIssues: List<String> val serializedCompilerArgumentsIgnoreClasspathIssues: List<String>
get() = ArgumentUtils.convertArgumentsToStringList(prepareCompilerArguments(ignoreClasspathResolutionErrors = true)) get() = convertArgumentsToStringList(prepareCompilerArguments(ignoreClasspathResolutionErrors = true))
@Deprecated("Replaced by KotlinCompilerArgumentsProducer", level = DeprecationLevel.ERROR) @Deprecated("Replaced by KotlinCompilerArgumentsProducer", level = DeprecationLevel.ERROR)
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
@get:Internal @get:Internal
val defaultSerializedCompilerArguments: List<String> val defaultSerializedCompilerArguments: List<String>
get() = createCompilerArgs() get() = createCompilerArguments(
.also { setupCompilerArgs(it, defaultsOnly = true) } CreateCompilerArgumentsContext(includeArgumentTypes = setOf(ArgumentType.Primitive))
.let(ArgumentUtils::convertArgumentsToStringList) ).let(ArgumentUtils::convertArgumentsToStringList)
@Deprecated("Replaced by KotlinCompilerArgumentsProducer", level = DeprecationLevel.WARNING) @Deprecated("Replaced by KotlinCompilerArgumentsProducer", level = DeprecationLevel.ERROR)
fun createCompilerArgs(): T fun createCompilerArgs(): T = createCompilerArguments(CreateCompilerArgumentsContext(includeArgumentTypes = emptySet()))
@Deprecated("Replaced by KotlinCompilerArgumentsProducer", level = DeprecationLevel.WARNING) @Deprecated("Replaced by KotlinCompilerArgumentsProducer", level = DeprecationLevel.ERROR)
fun setupCompilerArgs(args: T, defaultsOnly: Boolean = false, ignoreClasspathResolutionErrors: Boolean = false) fun setupCompilerArgs(args: T, defaultsOnly: Boolean = false, ignoreClasspathResolutionErrors: Boolean = false) {
val newArgs = createCompilerArguments(
CreateCompilerArgumentsContext(
includeArgumentTypes = if (defaultsOnly) setOf(ArgumentType.Primitive) else includedArgumentTypes,
isLenient = ignoreClasspathResolutionErrors
)
)
copyBeanTo(from = newArgs, to = args)
}
override fun createCompilerArguments(context: KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext): T
@Suppress("DEPRECATION")
private fun <T : CommonToolArguments> CompilerArgumentAware<T>.prepareCompilerArguments(
ignoreClasspathResolutionErrors: Boolean = false
): T = createCompilerArguments(
CreateCompilerArgumentsContext(
includeArgumentTypes = includedArgumentTypes,
isLenient = ignoreClasspathResolutionErrors
)
)
} }
@Deprecated("Replaced by KotlinCompilerArgumentsProducer", level = DeprecationLevel.WARNING) private val includedArgumentTypes = setOf(
@Suppress("DEPRECATION") ArgumentType.Primitive,
internal fun <T : CommonToolArguments> CompilerArgumentAware<T>.prepareCompilerArguments(ignoreClasspathResolutionErrors: Boolean = false) = ArgumentType.PluginClasspath,
createCompilerArgs().also { setupCompilerArgs(it, ignoreClasspathResolutionErrors = ignoreClasspathResolutionErrors) } ArgumentType.DependencyClasspath,
)
@@ -92,7 +92,7 @@ class KotlinModelBuilder(private val kotlinPluginVersion: String, private val an
javaSourceSet.resources.srcDirs, javaSourceSet.resources.srcDirs,
destinationDirectory.get().asFile, destinationDirectory.get().asFile,
javaSourceSet.output.resourcesDir!!, javaSourceSet.output.resourcesDir!!,
createCompilerArguments() buildCompilerArguments()
) )
} else null } else null
} }
@@ -118,12 +118,12 @@ class KotlinModelBuilder(private val kotlinPluginVersion: String, private val an
resources, resources,
destinationDirectory.get().asFile, destinationDirectory.get().asFile,
compilation.output.resourcesDir, compilation.output.resourcesDir,
createCompilerArguments() buildCompilerArguments()
) )
} }
@Suppress("DEPRECATION_ERROR") @Suppress("DEPRECATION_ERROR")
private fun AbstractKotlinCompile<*>.createCompilerArguments(): CompilerArguments { private fun AbstractKotlinCompile<*>.buildCompilerArguments(): CompilerArguments {
return CompilerArgumentsImpl( return CompilerArgumentsImpl(
serializedCompilerArguments, serializedCompilerArguments,
defaultSerializedCompilerArguments, defaultSerializedCompilerArguments,
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.gradle.plugin package org.jetbrains.kotlin.gradle.plugin
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.CommonToolArguments
import org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.ContributeCompilerArgumentsContext import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.ContributeCompilerArgumentsContext
import kotlin.reflect.KClass import kotlin.reflect.KClass
@@ -26,7 +27,7 @@ interface KotlinCompilerArgumentsProducer {
} }
interface CreateCompilerArgumentsContext { interface CreateCompilerArgumentsContext {
fun <T : CommonCompilerArguments> create(type: KClass<T>, action: ContributeCompilerArgumentsContext<T>.() -> Unit): T fun <T : CommonToolArguments> create(type: KClass<T>, action: ContributeCompilerArgumentsContext<T>.() -> Unit): T
companion object { companion object {
val default: CreateCompilerArgumentsContext = CreateCompilerArgumentsContext() val default: CreateCompilerArgumentsContext = CreateCompilerArgumentsContext()
@@ -38,14 +39,14 @@ interface KotlinCompilerArgumentsProducer {
} }
} }
interface ContributeCompilerArgumentsContext<T : CommonCompilerArguments> { interface ContributeCompilerArgumentsContext<T : CommonToolArguments> {
fun <T> tryLenient(action: () -> T): T? fun <T> tryLenient(action: () -> T): T?
fun contribute(type: ArgumentType, contribution: (T) -> Unit) fun contribute(type: ArgumentType, contribution: (T) -> Unit)
} }
fun createCompilerArguments( fun createCompilerArguments(
context: CreateCompilerArgumentsContext = CreateCompilerArgumentsContext() context: CreateCompilerArgumentsContext = CreateCompilerArgumentsContext()
): CommonCompilerArguments ): CommonToolArguments
} }
internal fun CreateCompilerArgumentsContext( internal fun CreateCompilerArgumentsContext(
@@ -60,7 +61,7 @@ private class CreateCompilerArgumentsContextImpl(
private val isLenient: Boolean private val isLenient: Boolean
) : KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext { ) : KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext {
override fun <T : CommonCompilerArguments> create( override fun <T : CommonToolArguments> create(
type: KClass<T>, action: ContributeCompilerArgumentsContext<T>.() -> Unit type: KClass<T>, action: ContributeCompilerArgumentsContext<T>.() -> Unit
): T { ): T {
val constructor = type.java.constructors.firstOrNull { it.parameters.isEmpty() } val constructor = type.java.constructors.firstOrNull { it.parameters.isEmpty() }
@@ -70,7 +71,7 @@ private class CreateCompilerArgumentsContextImpl(
return arguments return arguments
} }
private inner class ContributeCompilerArgumentsContextImpl<T : CommonCompilerArguments>( private inner class ContributeCompilerArgumentsContextImpl<T : CommonToolArguments>(
private val arguments: T private val arguments: T
) : ContributeCompilerArgumentsContext<T> { ) : ContributeCompilerArgumentsContext<T> {
@@ -270,23 +270,10 @@ abstract class AbstractKotlinNativeCompile<
@get:Nested @get:Nested
var kotlinPluginData: Provider<KotlinCompilerPluginData>? = null var kotlinPluginData: Provider<KotlinCompilerPluginData>? = null
// Used by IDE via reflection.
@get:Internal
override val serializedCompilerArguments: List<String>
get() = buildCommonArgs()
// Used by IDE via reflection.
@get:Internal
override val defaultSerializedCompilerArguments: List<String>
get() = buildCommonArgs(true)
private val languageSettingsBuilder by project.provider { private val languageSettingsBuilder by project.provider {
compilation.languageSettings compilation.languageSettings
} }
// Args used by both the compiler and IDEA.
abstract fun buildCommonArgs(defaultsOnly: Boolean = false): List<String>
@get:Input @get:Input
@get:Optional @get:Optional
internal val konanTargetsForManifest: String by project.provider { internal val konanTargetsForManifest: String by project.provider {
@@ -321,9 +308,8 @@ internal constructor(
private val objectFactory: ObjectFactory, private val objectFactory: ObjectFactory,
private val providerFactory: ProviderFactory, private val providerFactory: ProviderFactory,
private val execOperations: ExecOperations private val execOperations: ExecOperations
) : AbstractKotlinNativeCompile<KotlinCommonOptions, StubK2NativeCompilerArguments>(objectFactory), ) : AbstractKotlinNativeCompile<KotlinCommonOptions, K2NativeCompilerArguments>(objectFactory),
KotlinCompile<KotlinCommonOptions>, KotlinCompile<KotlinCommonOptions>,
KotlinCompilerArgumentsProducer,
K2MultiplatformCompilationTask, K2MultiplatformCompilationTask,
KotlinCompilationTask<KotlinNativeCompilerOptions> { KotlinCompilationTask<KotlinNativeCompilerOptions> {
@@ -434,27 +420,6 @@ internal constructor(
private val isAllowCommonizer: Boolean by lazy { project.isAllowCommonizer() } private val isAllowCommonizer: Boolean by lazy { project.isAllowCommonizer() }
// endregion. // endregion.
override fun createCompilerArgs(): StubK2NativeCompilerArguments = StubK2NativeCompilerArguments()
override fun setupCompilerArgs(
args: StubK2NativeCompilerArguments,
defaultsOnly: Boolean,
ignoreClasspathResolutionErrors: Boolean
) = Unit
override fun buildCommonArgs(defaultsOnly: Boolean): List<String> {
val plugins = listOfNotNull(
compilerPluginClasspath?.let { CompilerPluginData(it, compilerPluginOptions) },
kotlinPluginData?.orNull?.let { CompilerPluginData(it.classpath, it.options) }
)
return buildKotlinNativeCompileCommonArgs(
languageSettings,
compilerOptions,
plugins
)
}
override fun createCompilerArguments(context: CreateCompilerArgumentsContext) = context.create<K2NativeCompilerArguments> { override fun createCompilerArguments(context: CreateCompilerArgumentsContext) = context.create<K2NativeCompilerArguments> {
val sharedCompilationData = createSharedCompilationDataOrNull() val sharedCompilationData = createSharedCompilationDataOrNull()
@@ -34,24 +34,16 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinCommonCompilerOptions
import org.jetbrains.kotlin.gradle.incremental.UsesIncrementalModuleInfoBuildService import org.jetbrains.kotlin.gradle.incremental.UsesIncrementalModuleInfoBuildService
import org.jetbrains.kotlin.gradle.internal.AbstractKotlinCompileArgumentsContributor import org.jetbrains.kotlin.gradle.internal.AbstractKotlinCompileArgumentsContributor
import org.jetbrains.kotlin.gradle.internal.compilerArgumentsConfigurationFlags import org.jetbrains.kotlin.gradle.internal.compilerArgumentsConfigurationFlags
import org.jetbrains.kotlin.gradle.internal.prepareCompilerArguments
import org.jetbrains.kotlin.gradle.internal.tasks.allOutputFiles import org.jetbrains.kotlin.gradle.internal.tasks.allOutputFiles
import org.jetbrains.kotlin.gradle.logging.GradleKotlinLogger import org.jetbrains.kotlin.gradle.logging.GradleKotlinLogger
import org.jetbrains.kotlin.gradle.logging.kotlinDebug import org.jetbrains.kotlin.gradle.logging.kotlinDebug
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.default import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.default
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_SUPPRESS_EXPERIMENTAL_IC_OPTIMIZATIONS_WARNING import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_SUPPRESS_EXPERIMENTAL_IC_OPTIMIZATIONS_WARNING
import org.jetbrains.kotlin.gradle.plugin.UsesBuildFinishedListenerService import org.jetbrains.kotlin.gradle.plugin.UsesBuildFinishedListenerService
import org.jetbrains.kotlin.gradle.plugin.UsesVariantImplementationFactories import org.jetbrains.kotlin.gradle.plugin.UsesVariantImplementationFactories
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
import org.jetbrains.kotlin.gradle.report.* import org.jetbrains.kotlin.gradle.report.*
import org.jetbrains.kotlin.gradle.report.UsesBuildMetricsService
import org.jetbrains.kotlin.gradle.report.UsesBuildReportsService
import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.gradle.utils.newInstance
import org.jetbrains.kotlin.gradle.utils.property
import org.jetbrains.kotlin.gradle.utils.propertyWithConvention
import org.jetbrains.kotlin.gradle.utils.propertyWithNewInstance
import org.jetbrains.kotlin.incremental.ChangedFiles import org.jetbrains.kotlin.incremental.ChangedFiles
import org.jetbrains.kotlin.incremental.IncrementalCompilerRunner import org.jetbrains.kotlin.incremental.IncrementalCompilerRunner
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
@@ -320,10 +312,7 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments> @Inject constr
return return
} }
val args = createCompilerArguments(default)
val args = @Suppress("unchecked_cast", "deprecation")
if (this is KotlinCompilerArgumentsProducer) createCompilerArguments(default) as T
else prepareCompilerArguments()
taskBuildCacheableOutputDirectory.get().asFile.mkdirs() taskBuildCacheableOutputDirectory.get().asFile.mkdirs()
taskBuildLocalStateDirectory.get().asFile.mkdirs() taskBuildLocalStateDirectory.get().asFile.mkdirs()
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporterImpl
import org.jetbrains.kotlin.cli.common.arguments.CommonToolArguments import org.jetbrains.kotlin.cli.common.arguments.CommonToolArguments
import org.jetbrains.kotlin.gradle.internal.CompilerArgumentAware import org.jetbrains.kotlin.gradle.internal.CompilerArgumentAware
import org.jetbrains.kotlin.gradle.internal.tasks.TaskWithLocalState import org.jetbrains.kotlin.gradle.internal.tasks.TaskWithLocalState
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer
import org.jetbrains.kotlin.gradle.utils.fileExtensionCasePermutations import org.jetbrains.kotlin.gradle.utils.fileExtensionCasePermutations
import org.jetbrains.kotlin.gradle.utils.property import org.jetbrains.kotlin.gradle.utils.property
import javax.inject.Inject import javax.inject.Inject
@@ -31,6 +32,7 @@ abstract class AbstractKotlinCompileTool<T : CommonToolArguments> @Inject constr
objectFactory: ObjectFactory objectFactory: ObjectFactory
) : DefaultTask(), ) : DefaultTask(),
KotlinCompileTool, KotlinCompileTool,
KotlinCompilerArgumentsProducer,
CompilerArgumentAware<T>, CompilerArgumentAware<T>,
TaskWithLocalState { TaskWithLocalState {
@@ -58,7 +58,6 @@ abstract class Kotlin2JsCompile @Inject constructor(
workerExecutor: WorkerExecutor workerExecutor: WorkerExecutor
) : AbstractKotlinCompile<K2JSCompilerArguments>(objectFactory, workerExecutor), ) : AbstractKotlinCompile<K2JSCompilerArguments>(objectFactory, workerExecutor),
KotlinCompilationTask<KotlinJsCompilerOptions>, KotlinCompilationTask<KotlinJsCompilerOptions>,
KotlinCompilerArgumentsProducer,
UsesLibraryFilterCachingService, UsesLibraryFilterCachingService,
KotlinJsCompile, KotlinJsCompile,
K2MultiplatformCompilationTask { K2MultiplatformCompilationTask {
@@ -132,44 +131,6 @@ abstract class Kotlin2JsCompile @Inject constructor(
override fun createCompilerArgs(): K2JSCompilerArguments = override fun createCompilerArgs(): K2JSCompilerArguments =
K2JSCompilerArguments() K2JSCompilerArguments()
@Suppress("OVERRIDE_DEPRECATION")
override fun setupCompilerArgs(args: K2JSCompilerArguments, defaultsOnly: Boolean, ignoreClasspathResolutionErrors: Boolean) {
KotlinJsCompilerOptionsHelper.fillDefaultValues(args)
super.setupCompilerArgs(args, defaultsOnly = defaultsOnly, ignoreClasspathResolutionErrors = ignoreClasspathResolutionErrors)
if (defaultsOnly) return
KotlinJsCompilerOptionsHelper.fillCompilerArguments(compilerOptions, args)
if (!args.sourceMapPrefix.isNullOrEmpty()) {
args.sourceMapBaseDirs = sourceMapBaseDir.get().asFile.absolutePath
}
if (isIrBackendEnabled()) {
val outputFilePath: String? = compilerOptions.outputFile.orNull
if (outputFilePath != null) {
val outputFile = File(outputFilePath)
args.outputDir = (if (outputFile.extension == "") outputFile else outputFile.parentFile).normalize().absolutePath
args.moduleName = outputFile.nameWithoutExtension
} else {
args.outputDir = destinationDirectory.get().asFile.normalize().absolutePath
args.moduleName = compilerOptions.moduleName.get()
}
} else {
args.outputFile = outputFileProperty.get().absoluteFile.normalize().absolutePath
}
args.configureMultiplatform(
compilerOptions,
k1CommonSources = commonSourceSet.asFileTree,
k2MultiplatformFragments = multiplatformStructure
)
// Overriding freeArgs from compilerOptions with enhanced one + additional one set on execution phase
// containing additional arguments based on the js compilation configuration
val localExecutionTimeFreeCompilerArgs = executionTimeFreeCompilerArgs
args.freeArgs =
if (localExecutionTimeFreeCompilerArgs != null) localExecutionTimeFreeCompilerArgs else enhancedFreeCompilerArgs.get()
}
override fun createCompilerArguments(context: CreateCompilerArgumentsContext) = context.create<K2JSCompilerArguments> { override fun createCompilerArguments(context: CreateCompilerArgumentsContext) = context.create<K2JSCompilerArguments> {
contribute(KotlinCompilerArgumentsProducer.ArgumentType.Primitive) { args -> contribute(KotlinCompilerArgumentsProducer.ArgumentType.Primitive) { args ->
args.multiPlatform = multiPlatformEnabled.get() args.multiPlatform = multiPlatformEnabled.get()
@@ -69,7 +69,6 @@ abstract class KotlinCompile @Inject constructor(
K2MultiplatformCompilationTask, K2MultiplatformCompilationTask,
@Suppress("TYPEALIAS_EXPANSION_DEPRECATION") KotlinJvmCompileDsl, @Suppress("TYPEALIAS_EXPANSION_DEPRECATION") KotlinJvmCompileDsl,
KotlinCompilationTask<KotlinJvmCompilerOptions>, KotlinCompilationTask<KotlinJvmCompilerOptions>,
KotlinCompilerArgumentsProducer,
UsesKotlinJavaToolchain { UsesKotlinJavaToolchain {
@get:Internal // covered by compiler options @get:Internal // covered by compiler options
@@ -211,9 +210,6 @@ abstract class KotlinCompile @Inject constructor(
override fun skipCondition(): Boolean = sources.isEmpty && scriptSources.isEmpty override fun skipCondition(): Boolean = sources.isEmpty && scriptSources.isEmpty
override fun createCompilerArgs(): K2JVMCompilerArguments =
K2JVMCompilerArguments()
/** /**
* Workaround for those "nasty" plugins that are adding 'freeCompilerArgs' on task execution phase. * Workaround for those "nasty" plugins that are adding 'freeCompilerArgs' on task execution phase.
* With properties api it is not possible to update property value after task configuration is finished. * With properties api it is not possible to update property value after task configuration is finished.
@@ -224,30 +220,6 @@ abstract class KotlinCompile @Inject constructor(
@get:Internal @get:Internal
internal var executionTimeFreeCompilerArgs: List<String>? = null internal var executionTimeFreeCompilerArgs: List<String>? = null
override fun setupCompilerArgs(args: K2JVMCompilerArguments, defaultsOnly: Boolean, ignoreClasspathResolutionErrors: Boolean) {
compilerArgumentsContributor.contributeArguments(
args, compilerArgumentsConfigurationFlags(
defaultsOnly,
ignoreClasspathResolutionErrors
)
)
args.configureMultiplatform(
compilerOptions,
k1CommonSources = commonSourceSet.asFileTree,
k2MultiplatformFragments = multiplatformStructure
)
if (reportingSettings().buildReportMode == BuildReportMode.VERBOSE) {
args.reportPerf = true
}
val localExecutionTimeFreeCompilerArgs = executionTimeFreeCompilerArgs
if (localExecutionTimeFreeCompilerArgs != null) {
args.freeArgs = localExecutionTimeFreeCompilerArgs
}
}
@get:Internal @get:Internal
internal val compilerArgumentsContributor: CompilerArgumentsContributor<K2JVMCompilerArguments> by lazy { internal val compilerArgumentsContributor: CompilerArgumentsContributor<K2JVMCompilerArguments> by lazy {
KotlinJvmCompilerArgumentsContributor(KotlinJvmCompilerArgumentsProvider(this)) KotlinJvmCompilerArgumentsContributor(KotlinJvmCompilerArgumentsProvider(this))
@@ -325,7 +297,9 @@ abstract class KotlinCompile @Inject constructor(
val scriptSources = scriptSources.asFileTree.files val scriptSources = scriptSources.asFileTree.files
val javaSources = javaSources.files val javaSources = javaSources.files
val gradlePrintingMessageCollector = GradlePrintingMessageCollector(logger, args.allWarningsAsErrors) val gradlePrintingMessageCollector = GradlePrintingMessageCollector(logger, args.allWarningsAsErrors)
val gradleMessageCollector = GradleErrorMessageCollector(gradlePrintingMessageCollector, kotlinPluginVersion = getKotlinPluginVersion(logger)) val gradleMessageCollector = GradleErrorMessageCollector(
gradlePrintingMessageCollector, kotlinPluginVersion = getKotlinPluginVersion(logger)
)
val outputItemCollector = OutputItemsCollectorImpl() val outputItemCollector = OutputItemsCollectorImpl()
val compilerRunner = compilerRunner.get() val compilerRunner = compilerRunner.get()
@@ -47,7 +47,6 @@ abstract class KotlinCompileCommon @Inject constructor(
objectFactory: ObjectFactory objectFactory: ObjectFactory
) : AbstractKotlinCompile<K2MetadataCompilerArguments>(objectFactory, workerExecutor), ) : AbstractKotlinCompile<K2MetadataCompilerArguments>(objectFactory, workerExecutor),
KotlinCompilationTask<KotlinMultiplatformCommonCompilerOptions>, KotlinCompilationTask<KotlinMultiplatformCommonCompilerOptions>,
KotlinCompilerArgumentsProducer,
KotlinCommonCompile { KotlinCommonCompile {
init { init {
@@ -69,43 +68,6 @@ abstract class KotlinCompileCommon @Inject constructor(
@get:Internal @get:Internal
internal var executionTimeFreeCompilerArgs: List<String>? = null internal var executionTimeFreeCompilerArgs: List<String>? = null
override fun createCompilerArgs(): K2MetadataCompilerArguments =
K2MetadataCompilerArguments()
override fun setupCompilerArgs(args: K2MetadataCompilerArguments, defaultsOnly: Boolean, ignoreClasspathResolutionErrors: Boolean) {
KotlinMultiplatformCommonCompilerOptionsHelper.fillDefaultValues(args)
super.setupCompilerArgs(args, defaultsOnly = defaultsOnly, ignoreClasspathResolutionErrors = ignoreClasspathResolutionErrors)
args.moduleName = this@KotlinCompileCommon.moduleName.get()
if (expectActualLinker.get()) {
args.expectActualLinker = true
}
if (defaultsOnly) return
val classpathList = try {
libraries.files.filter { it.exists() }.toMutableList()
} catch (t: Throwable) {
if (ignoreClasspathResolutionErrors) null else throw t
}
with(args) {
classpath = classpathList?.joinToString(File.pathSeparator)
destination = destinationDirectory.get().asFile.normalize().absolutePath
friendPaths = this@KotlinCompileCommon.friendPaths.files.map { it.absolutePath }.toTypedArray()
refinesPaths = refinesMetadataPaths.map { it.absolutePath }.toTypedArray()
}
KotlinMultiplatformCommonCompilerOptionsHelper.fillCompilerArguments(compilerOptions, args)
val localExecutionTimeFreeCompilerArgs = executionTimeFreeCompilerArgs
if (localExecutionTimeFreeCompilerArgs != null) {
args.freeArgs = localExecutionTimeFreeCompilerArgs
}
}
override fun createCompilerArguments(context: CreateCompilerArgumentsContext) = context.create<K2MetadataCompilerArguments> { override fun createCompilerArguments(context: CreateCompilerArgumentsContext) = context.create<K2MetadataCompilerArguments> {
contribute(KotlinCompilerArgumentsProducer.ArgumentType.Primitive) { args -> contribute(KotlinCompilerArgumentsProducer.ArgumentType.Primitive) { args ->
args.multiPlatform = multiPlatformEnabled.get() args.multiPlatform = multiPlatformEnabled.get()
@@ -10,19 +10,18 @@ package org.jetbrains.kotlin.gradle.unitTests
import org.gradle.kotlin.dsl.newInstance import org.gradle.kotlin.dsl.newInstance
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2NativeCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.parseCommandLineArguments import org.jetbrains.kotlin.cli.common.arguments.parseCommandLineArguments
import org.jetbrains.kotlin.compilerRunner.ArgumentUtils import org.jetbrains.kotlin.compilerRunner.ArgumentUtils
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.internal.CompilerArgumentAware import org.jetbrains.kotlin.gradle.internal.CompilerArgumentAware
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.lenient
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType.IR import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType.IR
import org.jetbrains.kotlin.gradle.tasks.K2MultiplatformCompilationTask import org.jetbrains.kotlin.gradle.tasks.K2MultiplatformCompilationTask
import org.jetbrains.kotlin.gradle.tasks.K2MultiplatformStructure import org.jetbrains.kotlin.gradle.tasks.K2MultiplatformStructure
import org.jetbrains.kotlin.gradle.tasks.K2MultiplatformStructure.RefinesEdge
import org.jetbrains.kotlin.gradle.tasks.K2MultiplatformStructure.Fragment import org.jetbrains.kotlin.gradle.tasks.K2MultiplatformStructure.Fragment
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile import org.jetbrains.kotlin.gradle.tasks.K2MultiplatformStructure.RefinesEdge
import org.jetbrains.kotlin.gradle.tasks.configureK2Multiplatform import org.jetbrains.kotlin.gradle.tasks.configureK2Multiplatform
import org.jetbrains.kotlin.gradle.util.applyMultiplatformPlugin import org.jetbrains.kotlin.gradle.util.applyMultiplatformPlugin
import org.jetbrains.kotlin.gradle.util.buildProject import org.jetbrains.kotlin.gradle.util.buildProject
@@ -156,16 +155,7 @@ class K2MultiplatformStructureTest {
private fun K2MultiplatformCompilationTask.buildCompilerArguments(): CommonCompilerArguments { private fun K2MultiplatformCompilationTask.buildCompilerArguments(): CommonCompilerArguments {
/* KotlinNative implements CompilerArgumentAware, but does not adhere to its contract */ /* KotlinNative implements CompilerArgumentAware, but does not adhere to its contract */
if (this is KotlinNativeCompile) {
val arguments = K2NativeCompilerArguments()
val argsList = this.buildCompilerArgs()
parseCommandLineArguments(argsList, arguments)
return arguments
}
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
this as CompilerArgumentAware<CommonCompilerArguments> this as CompilerArgumentAware<CommonCompilerArguments>
val args = createCompilerArgs() return this.createCompilerArguments(lenient)
setupCompilerArgs(args)
return args
} }
@@ -7,14 +7,8 @@
package org.jetbrains.kotlin.gradle.unitTests.compilerArgumetns package org.jetbrains.kotlin.gradle.unitTests.compilerArgumetns
import org.gradle.kotlin.dsl.repositories
import org.jetbrains.kotlin.compilerRunner.ArgumentUtils import org.jetbrains.kotlin.compilerRunner.ArgumentUtils
import org.jetbrains.kotlin.gradle.dependencyResolutionTests.mavenCentralCacheRedirector
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.internal.prepareCompilerArguments
import org.jetbrains.kotlin.gradle.plugin.CreateCompilerArgumentsContext
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.ArgumentType
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.default import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.default
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.lenient import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.lenient
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType
@@ -26,15 +20,10 @@ import kotlin.test.assertFails
import kotlin.test.assertNull import kotlin.test.assertNull
class Kotlin2JsCompileArgumentsTest { class Kotlin2JsCompileArgumentsTest {
@Suppress("DEPRECATION")
@Test @Test
fun `test - simple project - old CompilerArgumentsAware and new CompilerArgumentsProducer - return same arguments`() { fun `test - simple project - old CompilerArgumentsAware and new CompilerArgumentsProducer - return same arguments`() {
val project = buildProjectWithMPP { val project = buildProjectWithMPP()
repositories { project.repositories.mavenLocal()
mavenLocal()
mavenCentralCacheRedirector()
}
}
val kotlin = project.multiplatformExtension val kotlin = project.multiplatformExtension
val jsTarget = kotlin.js(KotlinJsCompilerType.IR) val jsTarget = kotlin.js(KotlinJsCompilerType.IR)
@@ -42,16 +31,11 @@ class Kotlin2JsCompileArgumentsTest {
project.evaluate() project.evaluate()
val jsMainCompileTask = jsMainCompilation.compileTaskProvider.get() val jsMainCompileTask = jsMainCompilation.compileTaskProvider.get()
val argumentsFromCompilerArgumentsProducer = jsMainCompileTask.createCompilerArguments( val argumentsFromCompilerArgumentsProducer = jsMainCompileTask.createCompilerArguments(lenient)
CreateCompilerArgumentsContext(
isLenient = true,
includeArgumentTypes = ArgumentType.all - ArgumentType.DependencyClasspath
)
)
val argumentsFromCompilerArgumentsAware = jsMainCompileTask.prepareCompilerArguments(true)
@Suppress("DEPRECATION_ERROR")
assertEquals( assertEquals(
ArgumentUtils.convertArgumentsToStringList(argumentsFromCompilerArgumentsAware), jsMainCompileTask.serializedCompilerArgumentsIgnoreClasspathIssues,
ArgumentUtils.convertArgumentsToStringList(argumentsFromCompilerArgumentsProducer), ArgumentUtils.convertArgumentsToStringList(argumentsFromCompilerArgumentsProducer),
) )
} }
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.gradle.dependencyResolutionTests.mavenCentralCacheRe
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.dsl.kotlinJvmExtension import org.jetbrains.kotlin.gradle.dsl.kotlinJvmExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.internal.prepareCompilerArguments
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.lenient import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.lenient
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.gradle.util.assertNotNull import org.jetbrains.kotlin.gradle.util.assertNotNull
@@ -30,7 +29,6 @@ import kotlin.test.*
class KotlinCompileArgumentsTest { class KotlinCompileArgumentsTest {
@Suppress("DEPRECATION")
@Test @Test
fun `test - simple project - compare CompilerArgumentsAware with KotlinCompilerArgumentsAware implementations`() { fun `test - simple project - compare CompilerArgumentsAware with KotlinCompilerArgumentsAware implementations`() {
val project = buildProjectWithJvm() val project = buildProjectWithJvm()
@@ -45,11 +43,11 @@ class KotlinCompileArgumentsTest {
val mainCompilation = kotlin.target.compilations.getByName("main") val mainCompilation = kotlin.target.compilations.getByName("main")
val mainCompilationTask = mainCompilation.compileTaskProvider.get() as KotlinCompile val mainCompilationTask = mainCompilation.compileTaskProvider.get() as KotlinCompile
val argumentsFromCompilerArgumentsAware = mainCompilationTask.prepareCompilerArguments(true)
val argumentsFromKotlinCompilerArgumentsAware = mainCompilationTask.createCompilerArguments(lenient) val argumentsFromKotlinCompilerArgumentsAware = mainCompilationTask.createCompilerArguments(lenient)
@Suppress("DEPRECATION_ERROR")
assertEquals( assertEquals(
ArgumentUtils.convertArgumentsToStringList(argumentsFromCompilerArgumentsAware), mainCompilationTask.serializedCompilerArgumentsIgnoreClasspathIssues,
ArgumentUtils.convertArgumentsToStringList(argumentsFromKotlinCompilerArgumentsAware) ArgumentUtils.convertArgumentsToStringList(argumentsFromKotlinCompilerArgumentsAware)
) )
} }
@@ -9,7 +9,6 @@ package org.jetbrains.kotlin.gradle.unitTests.compilerArgumetns
import org.jetbrains.kotlin.compilerRunner.ArgumentUtils import org.jetbrains.kotlin.compilerRunner.ArgumentUtils
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.internal.prepareCompilerArguments
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.lenient import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.lenient
import org.jetbrains.kotlin.gradle.tasks.KotlinCompileCommon import org.jetbrains.kotlin.gradle.tasks.KotlinCompileCommon
@@ -21,7 +20,6 @@ import kotlin.test.assertNull
class KotlinCompileCommonArgumentsTest { class KotlinCompileCommonArgumentsTest {
@Test @Test
@Suppress("DEPRECATION")
fun `test - simple project - old CompilerArgumentsAware and new CompilerArgumentsProducer - return same arguments`() { fun `test - simple project - old CompilerArgumentsAware and new CompilerArgumentsProducer - return same arguments`() {
val project = buildProjectWithMPP() val project = buildProjectWithMPP()
project.repositories.mavenLocal() project.repositories.mavenLocal()
@@ -34,10 +32,10 @@ class KotlinCompileCommonArgumentsTest {
val commonMainCompileTask = commonMainCompilation.compileTaskProvider.get() as KotlinCompileCommon val commonMainCompileTask = commonMainCompilation.compileTaskProvider.get() as KotlinCompileCommon
val argumentsFromCompilerArgumentsProducer = commonMainCompileTask.createCompilerArguments(lenient) val argumentsFromCompilerArgumentsProducer = commonMainCompileTask.createCompilerArguments(lenient)
val argumentsFromCompilerArgumentsAware = commonMainCompileTask.prepareCompilerArguments(true)
@Suppress("DEPRECATION_ERROR")
assertEquals( assertEquals(
ArgumentUtils.convertArgumentsToStringList(argumentsFromCompilerArgumentsAware), commonMainCompileTask.serializedCompilerArgumentsIgnoreClasspathIssues,
ArgumentUtils.convertArgumentsToStringList(argumentsFromCompilerArgumentsProducer) ArgumentUtils.convertArgumentsToStringList(argumentsFromCompilerArgumentsProducer)
) )
} }