[BTA] WIP: future-api setup
diff --git a/compiler/build-tools/kotlin-build-tools-impl/src/main/kotlin/org/jetbrains/kotlin/buildtools/internal/jvm/JvmSnapshotBasedIncrementalCompilationConfigurationImpl.kt b/compiler/build-tools/kotlin-build-tools-impl/src/main/kotlin/org/jetbrains/kotlin/buildtools/internal/jvm/JvmSnapshotBasedIncrementalCompilationConfigurationImpl.kt deleted file mode 100644 index d05f608..0000000 --- a/compiler/build-tools/kotlin-build-tools-impl/src/main/kotlin/org/jetbrains/kotlin/buildtools/internal/jvm/JvmSnapshotBasedIncrementalCompilationConfigurationImpl.kt +++ /dev/null
@@ -1,154 +0,0 @@ -/* - * Copyright 2010-2025 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. - */ - -@file:Suppress("DEPRECATION") - -package org.jetbrains.kotlin.buildtools.internal.jvm - -import org.jetbrains.kotlin.buildtools.api.BaseIncrementalCompilationConfiguration -import org.jetbrains.kotlin.buildtools.api.SourcesChanges -import org.jetbrains.kotlin.buildtools.api.jvm.JvmSnapshotBasedIncrementalCompilationConfiguration -import org.jetbrains.kotlin.buildtools.internal.* -import java.nio.file.Path - -@Suppress("DEPRECATION_ERROR") -internal class JvmSnapshotBasedIncrementalCompilationConfigurationImpl private constructor( - workingDirectory: Path, - sourcesChanges: SourcesChanges, - dependenciesSnapshotFiles: List<Path>, - shrunkClasspathSnapshot: Path, - private val options2: Options = Options(JvmSnapshotBasedIncrementalCompilationConfiguration::class), -) : JvmSnapshotBasedIncrementalCompilationConfiguration( - workingDirectory, - sourcesChanges, - dependenciesSnapshotFiles, - shrunkClasspathSnapshot, -), JvmSnapshotBasedIncrementalCompilationConfiguration.Builder, - DeepCopyable<JvmSnapshotBasedIncrementalCompilationConfigurationImpl>, - HasSnapshotBasedIcOptionsAccessor { - - constructor( - workingDirectory: Path, - sourcesChanges: SourcesChanges, - dependenciesSnapshotFiles: List<Path>, - shrunkClasspathSnapshot: Path, - ) : this( - workingDirectory, - sourcesChanges, - dependenciesSnapshotFiles, - shrunkClasspathSnapshot, - Options( - JvmSnapshotBasedIncrementalCompilationConfiguration::class, - ) - ) { - initializeOptions(this::class, options2) - } - - override fun build(): JvmSnapshotBasedIncrementalCompilationConfiguration = deepCopy() - - override fun toBuilder(): Builder = deepCopy() - - override fun deepCopy(): JvmSnapshotBasedIncrementalCompilationConfigurationImpl = - JvmSnapshotBasedIncrementalCompilationConfigurationImpl( - workingDirectory, - sourcesChanges, - dependenciesSnapshotFiles, - shrunkClasspathSnapshot, - options2.deepCopy() - ) - - - @UseFromImplModuleRestricted - override fun <V> get(key: JvmSnapshotBasedIncrementalCompilationConfiguration.Option<V>): V { - return options2[key] - } - - @UseFromImplModuleRestricted - override fun <V> set(key: JvmSnapshotBasedIncrementalCompilationConfiguration.Option<V>, value: V) { - options2[key] = value - } - - operator fun <V> get(key: Option<V>): V { - return options2[key] - } - - operator fun <V> set(key: Option<V>, value: V) { - options2[key] = value - } - - @UseFromImplModuleRestricted - override fun <V> get(key: BaseIncrementalCompilationConfiguration.Option<V>): V = options2[key] - - @UseFromImplModuleRestricted - override fun <V> set(key: BaseIncrementalCompilationConfiguration.Option<V>, value: V) { - options2[key] = value - } - - operator fun <V> get(key: BaseIncrementalCompilationConfigurationImpl.Option<V>): V = options2[key] - override fun <V> get(key: BaseOptionWithDefault<V>): V { - return options2[key] - } - - @OptIn(UseFromImplModuleRestricted::class) - operator fun <V> set(key: BaseIncrementalCompilationConfigurationImpl.Option<V>, value: V) { - options2[key] = value - } - - open class Option<V> : BaseOptionWithDefault<V> { - constructor(id: String) : super(id) - constructor(id: String, default: V) : super(id, default = default) - } - - companion object { - - val PRECISE_JAVA_TRACKING: Option<Boolean> = Option("PRECISE_JAVA_TRACKING", false) - - val ASSURED_NO_CLASSPATH_SNAPSHOT_CHANGES: Option<Boolean> = - Option("ASSURED_NO_CLASSPATH_SNAPSHOT_CHANGES", false) - - val USE_FIR_RUNNER: Option<Boolean> = Option("USE_FIR_RUNNER", false) - - // copied from BaseCompilationConfigurationImpl so initializeOptions works - - val ROOT_PROJECT_DIR: Option<Path?> = Option("ROOT_PROJECT_DIR", null) - - val MODULE_BUILD_DIR: Option<Path?> = Option("MODULE_BUILD_DIR", null) - - val BACKUP_CLASSES: Option<Boolean> = Option("BACKUP_CLASSES", false) - - val KEEP_IC_CACHES_IN_MEMORY: Option<Boolean> = Option("KEEP_IC_CACHES_IN_MEMORY", false) - - val FORCE_RECOMPILATION: Option<Boolean> = Option("FORCE_RECOMPILATION", false) - - val OUTPUT_DIRS: Option<Set<Path>?> = Option("OUTPUT_DIRS", null) - - val UNSAFE_INCREMENTAL_COMPILATION_FOR_MULTIPLATFORM: Option<Boolean> = - Option("UNSAFE_INCREMENTAL_COMPILATION_FOR_MULTIPLATFORM", false) - - val MONOTONOUS_INCREMENTAL_COMPILE_SET_EXPANSION: Option<Boolean> = Option("MONOTONOUS_INCREMENTAL_COMPILE_SET_EXPANSION", true) - - val TRACK_CONFIGURATION_INPUTS: Option<Boolean> = Option("TRACK_CONFIGURATION_INPUTS", false) - } -} - -// Remove in 2.7 -internal interface HasSnapshotBasedIcOptionsAccessor { - operator fun <V> get(key: BaseOptionWithDefault<V>): V -} - -// Remove in 2.7 -@Suppress("DEPRECATION_ERROR") -internal fun JvmSnapshotBasedIncrementalCompilationConfiguration.toOptions(): HasSnapshotBasedIcOptionsAccessor { - // In older BTA-APIs JvmSnapshotBasedIncrementalCompilationConfiguration is final, - // so we have to avoid loading JvmSnapshotBasedIncrementalCompilationConfigurationImpl, or we'd get a verification error - - return if (JvmSnapshotBasedIncrementalCompilationConfiguration::class.isFinal || this !is JvmSnapshotBasedIncrementalCompilationConfigurationImpl) { - // we're on an older BTA-API or user created JvmSnapshotBasedIncrementalCompilationConfiguration through the deprecated constructor directly - this::class.java.getMethod("getOptions").invoke(this) as JvmSnapshotBasedIncrementalCompilationOptionsImpl - } else { - // we're on a newer BTA-API and user created JvmSnapshotBasedIncrementalCompilationConfiguration through the factory method - this - } -}
diff --git a/compiler/build-tools/kotlin-build-tools-impl/src/main/kotlin/org/jetbrains/kotlin/buildtools/internal/jvm/JvmSnapshotBasedIncrementalCompilationConfigurationImpl2.kt b/compiler/build-tools/kotlin-build-tools-impl/src/main/kotlin/org/jetbrains/kotlin/buildtools/internal/jvm/JvmSnapshotBasedIncrementalCompilationConfigurationImpl2.kt new file mode 100644 index 0000000..e850f99 --- /dev/null +++ b/compiler/build-tools/kotlin-build-tools-impl/src/main/kotlin/org/jetbrains/kotlin/buildtools/internal/jvm/JvmSnapshotBasedIncrementalCompilationConfigurationImpl2.kt
@@ -0,0 +1,127 @@ +/* + * Copyright 2010-2025 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. + */ + +@file:Suppress("DEPRECATION") + +package org.jetbrains.kotlin.buildtools.internal.jvm + +import org.jetbrains.kotlin.buildtools.api.SourcesChanges +import org.jetbrains.kotlin.buildtools.api.jvm.JvmSnapshotBasedIncrementalCompilationConfiguration +import org.jetbrains.kotlin.buildtools.internal.* +import java.nio.file.Path + +@Suppress("DEPRECATION_ERROR") +internal class JvmSnapshotBasedIncrementalCompilationConfigurationImpl2 private constructor( + override val workingDirectory: Path, + override val sourcesChanges: SourcesChanges, + override val dependenciesSnapshotFiles: List<Path>, + override val options: Options = Options(JvmSnapshotBasedIncrementalCompilationConfiguration::class), +) : BaseIncrementalCompilationConfigurationImpl(), JvmSnapshotBasedIncrementalCompilationConfiguration, + JvmSnapshotBasedIncrementalCompilationConfiguration.Builder, + DeepCopyable<JvmSnapshotBasedIncrementalCompilationConfigurationImpl2>, + HasSnapshotBasedIcOptionsAccessor { + + constructor( + workingDirectory: Path, + sourcesChanges: SourcesChanges, + dependenciesSnapshotFiles: List<Path>, + ) : this( + workingDirectory, + sourcesChanges, + dependenciesSnapshotFiles, + Options( + JvmSnapshotBasedIncrementalCompilationConfiguration::class, + ) + ) { + initializeOptions(this::class, options) + } + + override fun build(): JvmSnapshotBasedIncrementalCompilationConfiguration = deepCopy() + + override fun toBuilder(): JvmSnapshotBasedIncrementalCompilationConfiguration.Builder = deepCopy() + + override fun deepCopy(): JvmSnapshotBasedIncrementalCompilationConfigurationImpl2 = + JvmSnapshotBasedIncrementalCompilationConfigurationImpl2( + workingDirectory, + sourcesChanges, + dependenciesSnapshotFiles, + options.deepCopy() + ) + + + @UseFromImplModuleRestricted + override fun <V> get(key: JvmSnapshotBasedIncrementalCompilationConfiguration.Option<V>): V { + return options[key] + } + + @UseFromImplModuleRestricted + override fun <V> set(key: JvmSnapshotBasedIncrementalCompilationConfiguration.Option<V>, value: V) { + options[key] = value + } + + operator fun <V> get(key: Option<V>): V { + return options[key] + } + + operator fun <V> set(key: Option<V>, value: V) { + options[key] = value + } + + override fun <V> get(key: BaseOptionWithDefault<V>): V { + return options[key] + } + + open class Option<V> : BaseOptionWithDefault<V> { + constructor(id: String) : super(id) + constructor(id: String, default: V) : super(id, default = default) + } + + companion object { + + val PRECISE_JAVA_TRACKING: Option<Boolean> = Option("PRECISE_JAVA_TRACKING", false) + + val ASSURED_NO_CLASSPATH_SNAPSHOT_CHANGES: Option<Boolean> = + Option("ASSURED_NO_CLASSPATH_SNAPSHOT_CHANGES", false) + + val USE_FIR_RUNNER: Option<Boolean> = Option("USE_FIR_RUNNER", false) + } +} + +// Remove in 2.7 +internal interface HasSnapshotBasedIcOptionsAccessor { + val workingDirectory: Path + val sourcesChanges: SourcesChanges + val dependenciesSnapshotFiles: List<Path> + operator fun <V> get(key: BaseOptionWithDefault<V>): V +} + +// Remove in 2.7 +@Suppress("DEPRECATION_ERROR") +internal fun JvmSnapshotBasedIncrementalCompilationConfiguration.toOptions(): HasSnapshotBasedIcOptionsAccessor { + // In older BTA-APIs JvmSnapshotBasedIncrementalCompilationConfiguration is final, + // so we have to avoid loading JvmSnapshotBasedIncrementalCompilationConfigurationImpl, or we'd get a verification error + +// return if (!JvmSnapshotBasedIncrementalCompilationConfiguration::class.java.isInterface || this !is JvmSnapshotBasedIncrementalCompilationConfigurationImpl2) { +// // we're on an older BTA-API or user created JvmSnapshotBasedIncrementalCompilationConfiguration through the deprecated constructor directly +// object : HasSnapshotBasedIcOptionsAccessor { +// override val workingDirectory: Path +// get() = this@toOptions.workingDirectory +// override val sourcesChanges: SourcesChanges +// get() = this@toOptions.sourcesChanges +// override val dependenciesSnapshotFiles: List<Path> +// get() = this@toOptions.dependenciesSnapshotFiles +// +// override fun <V> get(key: BaseOptionWithDefault<V>): V { +// return (this::class.java.getMethod("getOptions").invoke(this) as JvmSnapshotBasedIncrementalCompilationOptionsImpl)[key] +// } +// +// } +// +// } else { +// // we're on a newer BTA-API and user created JvmSnapshotBasedIncrementalCompilationConfiguration through the factory method +// this +// } + return this as HasSnapshotBasedIcOptionsAccessor +}