diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt index 9dc44f27ab8..ab086e7ae32 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt @@ -304,6 +304,7 @@ abstract class CommonCompilerArguments : CommonToolArguments() { ) var checkStickyPhaseConditions: Boolean by FreezableVar(false) + @GradleOption(DefaultValues.BooleanFalseDefault::class) @Argument( value = "-Xuse-fir", description = "Compile using Front-end IR. Warning: this feature is far from being production-ready" diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinCommonOptions.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinCommonOptions.kt index 4d083a238d5..82ce1e649bc 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinCommonOptions.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinCommonOptions.kt @@ -17,4 +17,10 @@ interface KotlinCommonOptions : org.jetbrains.kotlin.gradle.dsl.KotlinCommonToo * Default value: null */ var languageVersion: kotlin.String? + + /** + * Compile using Front-end IR. Warning: this feature is far from being production-ready + * Default value: false + */ + var useFir: kotlin.Boolean } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt index b21fdd3adc5..2647ac27785 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt @@ -231,7 +231,8 @@ abstract class BaseGradleIT { val jsCompilerType: KotlinJsCompilerType? = null, val configurationCache: Boolean = false, val configurationCacheProblems: ConfigurationCacheProblems = ConfigurationCacheProblems.FAIL, - val warningMode: WarningMode = WarningMode.Fail + val warningMode: WarningMode = WarningMode.Fail, + val useFir: Boolean = false ) enum class ConfigurationCacheProblems { @@ -907,6 +908,10 @@ Finished executing task ':$taskName'| add("-Pkotlin.js.compiler=$it") } + if (options.useFir) { + add("-Pkotlin.useFir=true") + } + add("-Dorg.gradle.unsafe.configuration-cache=${options.configurationCache}") add("-Dorg.gradle.unsafe.configuration-cache-problems=${options.configurationCacheProblems.name.toLowerCase()}") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJsOptionsBase.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJsOptionsBase.kt index 1b97ed95ca4..add992b1db5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJsOptionsBase.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJsOptionsBase.kt @@ -39,6 +39,13 @@ internal abstract class KotlinJsOptionsBase : org.jetbrains.kotlin.gradle.dsl.Ko languageVersionField = value } + private var useFirField: kotlin.Boolean? = null + override var useFir: kotlin.Boolean + get() = useFirField ?: false + set(value) { + useFirField = value + } + private var friendModulesDisabledField: kotlin.Boolean? = null override var friendModulesDisabled: kotlin.Boolean get() = friendModulesDisabledField ?: false @@ -122,6 +129,7 @@ internal abstract class KotlinJsOptionsBase : org.jetbrains.kotlin.gradle.dsl.Ko verboseField?.let { args.verbose = it } apiVersionField?.let { args.apiVersion = it } languageVersionField?.let { args.languageVersion = it } + useFirField?.let { args.useFir = it } friendModulesDisabledField?.let { args.friendModulesDisabled = it } mainField?.let { args.main = it } metaInfoField?.let { args.metaInfo = it } @@ -142,6 +150,7 @@ internal fun org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments.fil verbose = false apiVersion = null languageVersion = null + useFir = false friendModulesDisabled = false main = "call" metaInfo = true diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJvmOptionsBase.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJvmOptionsBase.kt index b0d0f1263d2..839ea28be67 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJvmOptionsBase.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJvmOptionsBase.kt @@ -39,6 +39,13 @@ internal abstract class KotlinJvmOptionsBase : org.jetbrains.kotlin.gradle.dsl.K languageVersionField = value } + private var useFirField: kotlin.Boolean? = null + override var useFir: kotlin.Boolean + get() = useFirField ?: false + set(value) { + useFirField = value + } + private var includeRuntimeField: kotlin.Boolean? = null override var includeRuntime: kotlin.Boolean get() = includeRuntimeField ?: false @@ -115,6 +122,7 @@ internal abstract class KotlinJvmOptionsBase : org.jetbrains.kotlin.gradle.dsl.K verboseField?.let { args.verbose = it } apiVersionField?.let { args.apiVersion = it } languageVersionField?.let { args.languageVersion = it } + useFirField?.let { args.useFir = it } includeRuntimeField?.let { args.includeRuntime = it } javaParametersField?.let { args.javaParameters = it } jdkHomeField?.let { args.jdkHome = it } @@ -134,6 +142,7 @@ internal fun org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments.fi verbose = false apiVersion = null languageVersion = null + useFir = false includeRuntime = false javaParameters = false jdkHome = null diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformCommonOptionsBase.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformCommonOptionsBase.kt index 78e1050ec03..b9e7a969e38 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformCommonOptionsBase.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformCommonOptionsBase.kt @@ -39,12 +39,20 @@ internal abstract class KotlinMultiplatformCommonOptionsBase : org.jetbrains.kot languageVersionField = value } + private var useFirField: kotlin.Boolean? = null + override var useFir: kotlin.Boolean + get() = useFirField ?: false + set(value) { + useFirField = value + } + internal open fun updateArguments(args: org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments) { allWarningsAsErrorsField?.let { args.allWarningsAsErrors = it } suppressWarningsField?.let { args.suppressWarnings = it } verboseField?.let { args.verbose = it } apiVersionField?.let { args.apiVersion = it } languageVersionField?.let { args.languageVersion = it } + useFirField?.let { args.useFir = it } } } @@ -54,4 +62,5 @@ internal fun org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArgumen verbose = false apiVersion = null languageVersion = null + useFir = false } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt index a6aae5eb0fb..d24d378bbc1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.targets.js.dukat.ExternalsOutputFormat import org.jetbrains.kotlin.gradle.targets.js.dukat.ExternalsOutputFormat.Companion.externalsOutputFormatProperty import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackMajorVersion -import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackMajorVersion.Companion.warningMessage import org.jetbrains.kotlin.gradle.targets.native.DisabledNativeTargetsReporter import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile @@ -37,6 +36,11 @@ internal fun PropertiesProvider.mapKotlinTaskProperties(task: AbstractKotlinComp usePreciseJavaTracking?.let { task.usePreciseJavaTracking = it } + useFir?.let { + if (it == true) { + task.kotlinOptions.useFir = true + } + } } if (task is Kotlin2JsCompile) { @@ -90,6 +94,9 @@ internal class PropertiesProvider private constructor(private val project: Proje val usePreciseJavaTracking: Boolean? get() = booleanProperty("kotlin.incremental.usePreciseJavaTracking") + val useFir: Boolean? + get() = booleanProperty("kotlin.useFir") + private val useFallbackCompilerSearchPropName = "kotlin.useFallbackCompilerSearch" @Deprecated("Unsupported and will be removed in next major releases") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt index be8032d369c..06bcc36f6e1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt @@ -42,6 +42,10 @@ abstract class AbstractKotlinNativeCompilation( get() = languageSettings.languageVersion set(value) { languageSettings.languageVersion = value } + override var useFir: Boolean + get() = false + set(@Suppress("UNUSED_PARAMETER") value) {} + override var allWarningsAsErrors: Boolean = false override var suppressWarnings: Boolean = false override var verbose: Boolean = false