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 609e9a5f98a..c56e9a795d1 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 @@ -29,7 +29,11 @@ abstract class CommonCompilerArguments : CommonToolArguments() { } @get:Transient - var autoAdvanceLanguageVersion: Boolean by FreezableVar(true) + var autoAdvanceLanguageVersion = true + set(value) { + checkFrozen() + field = value + } @GradleOption( value = DefaultValue.LANGUAGE_VERSIONS, @@ -41,10 +45,18 @@ abstract class CommonCompilerArguments : CommonToolArguments() { valueDescription = "", description = "Provide source compatibility with the specified version of Kotlin" ) - var languageVersion: String? by NullableStringFreezableVar(null) + var languageVersion: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @get:Transient - var autoAdvanceApiVersion: Boolean by FreezableVar(true) + var autoAdvanceApiVersion = true + set(value) { + checkFrozen() + field = value + } @GradleOption( value = DefaultValue.API_VERSIONS, @@ -56,14 +68,22 @@ abstract class CommonCompilerArguments : CommonToolArguments() { valueDescription = "", description = "Allow using declarations only from the specified version of bundled libraries" ) - var apiVersion: String? by NullableStringFreezableVar(null) + var apiVersion: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument( value = "-kotlin-home", valueDescription = "", description = "Path to the home directory of Kotlin compiler used for discovery of runtime libraries" ) - var kotlinHome: String? by NullableStringFreezableVar(null) + var kotlinHome: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument( value = "-progressive", @@ -74,10 +94,18 @@ abstract class CommonCompilerArguments : CommonToolArguments() { "Code written in the progressive mode is backward compatible; however, code written in\n" + "non-progressive mode may cause compilation errors in the progressive mode." ) - var progressiveMode by FreezableVar(false) + var progressiveMode = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-script", description = "Evaluate the given Kotlin script (*.kts) file") - var script: Boolean by FreezableVar(false) + var script = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-opt-in", @@ -85,82 +113,155 @@ abstract class CommonCompilerArguments : CommonToolArguments() { valueDescription = "", description = "Enable usages of API that requires opt-in with an opt-in requirement marker with the given fully qualified name" ) - var optIn: Array? by FreezableVar(null) + var optIn: Array? = null + set(value) { + checkFrozen() + field = value + } // Advanced options @Argument(value = "-Xno-inline", description = "Disable method inlining") - var noInline: Boolean by FreezableVar(false) + var noInline = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xskip-metadata-version-check", description = "Allow to load classes with bad metadata version and pre-release classes" ) - var skipMetadataVersionCheck: Boolean by FreezableVar(false) + var skipMetadataVersionCheck = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xskip-prerelease-check", description = "Allow to load pre-release classes") - var skipPrereleaseCheck: Boolean by FreezableVar(false) + var skipPrereleaseCheck = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xallow-kotlin-package", description = "Allow compiling code in package 'kotlin' and allow not requiring kotlin.stdlib in module-info" ) - var allowKotlinPackage: Boolean by FreezableVar(false) + var allowKotlinPackage = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xreport-output-files", description = "Report source to output files mapping") - var reportOutputFiles: Boolean by FreezableVar(false) + var reportOutputFiles = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xplugin", valueDescription = "", description = "Load plugins from the given classpath") - var pluginClasspaths: Array? by FreezableVar(null) + var pluginClasspaths: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument(value = "-P", valueDescription = PLUGIN_OPTION_FORMAT, description = "Pass an option to a plugin") - var pluginOptions: Array? by FreezableVar(null) + var pluginOptions: Array? = null + set(value) { + checkFrozen() + field = value + } - @Argument(value = "-Xcompiler-plugin", valueDescription = ",:=,=", description = "Register compiler plugin", delimiter = "") - var pluginConfigurations: Array? by FreezableVar(null) + @Argument( + value = "-Xcompiler-plugin", + valueDescription = ",:=,=", + description = "Register compiler plugin", + delimiter = "" + ) + var pluginConfigurations: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xmulti-platform", description = "Enable experimental language support for multi-platform projects") - var multiPlatform: Boolean by FreezableVar(false) + var multiPlatform = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xno-check-actual", description = "Do not check presence of 'actual' modifier in multi-platform projects") - var noCheckActual: Boolean by FreezableVar(false) + var noCheckActual = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xintellij-plugin-root", valueDescription = "", description = "Path to the kotlin-compiler.jar or directory where IntelliJ configuration files can be found" ) - var intellijPluginRoot: String? by NullableStringFreezableVar(null) + var intellijPluginRoot: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument( value = "-Xnew-inference", description = "Enable new experimental generic type inference algorithm" ) - var newInference: Boolean by FreezableVar(false) + var newInference = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xinline-classes", description = "Enable experimental inline classes" ) - var inlineClasses: Boolean by FreezableVar(false) + var inlineClasses = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xlegacy-smart-cast-after-try", description = "Allow var smart casts despite assignment in try block" ) - var legacySmartCastAfterTry: Boolean by FreezableVar(false) + var legacySmartCastAfterTry = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xeffect-system", description = "Enable experimental language feature: effect system" ) - var effectSystem: Boolean by FreezableVar(false) + var effectSystem = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xread-deserialized-contracts", description = "Enable reading of contracts from metadata" ) - var readDeserializedContracts: Boolean by FreezableVar(false) + var readDeserializedContracts = false + set(value) { + checkFrozen() + field = value + } @IDEAPluginsCompatibilityAPI( IDEAPlatforms._212, // maybe 211 AS used it too @@ -176,29 +277,49 @@ abstract class CommonCompilerArguments : CommonToolArguments() { message = "Please migrate to -opt-in", plugins = "Android" ) - var useExperimental: Array? by FreezableVar(null) + var useExperimental: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xproper-ieee754-comparisons", description = "Generate proper IEEE 754 comparisons in all cases if values are statically known to be of primitive numeric types" ) - var properIeee754Comparisons by FreezableVar(false) + var properIeee754Comparisons = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xreport-perf", description = "Report detailed performance statistics") - var reportPerf: Boolean by FreezableVar(false) + var reportPerf = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xdump-perf", valueDescription = "", description = "Dump detailed performance statistics to the specified file" ) - var dumpPerf: String? by NullableStringFreezableVar(null) + var dumpPerf: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument( value = "-Xmetadata-version", description = "Change metadata version of the generated binary files" ) - var metadataVersion: String? by FreezableVar(null) + var metadataVersion: String? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xcommon-sources", @@ -206,97 +327,161 @@ abstract class CommonCompilerArguments : CommonToolArguments() { description = "Sources of the common module that need to be compiled together with this module in the multi-platform mode.\n" + "Should be a subset of sources passed as free arguments" ) - var commonSources: Array? by FreezableVar(null) + var commonSources: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xallow-result-return-type", description = "Allow compiling code when `kotlin.Result` is used as a return type" ) - var allowResultReturnType: Boolean by FreezableVar(false) + var allowResultReturnType = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xlist-phases", description = "List backend phases" ) - var listPhases: Boolean by FreezableVar(false) + var listPhases = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xdisable-phases", description = "Disable backend phases" ) - var disablePhases: Array? by FreezableVar(null) + var disablePhases: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xverbose-phases", description = "Be verbose while performing these backend phases" ) - var verbosePhases: Array? by FreezableVar(null) + var verbosePhases: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xphases-to-dump-before", description = "Dump backend state before these phases" ) - var phasesToDumpBefore: Array? by FreezableVar(null) + var phasesToDumpBefore: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xphases-to-dump-after", description = "Dump backend state after these phases" ) - var phasesToDumpAfter: Array? by FreezableVar(null) + var phasesToDumpAfter: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xphases-to-dump", description = "Dump backend state both before and after these phases" ) - var phasesToDump: Array? by FreezableVar(null) + var phasesToDump: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xdump-directory", description = "Dump backend state into directory" ) - var dumpDirectory: String? by FreezableVar(null) + var dumpDirectory: String? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xdump-fqname", description = "FqName of declaration that should be dumped" ) - var dumpOnlyFqName: String? by FreezableVar(null) + var dumpOnlyFqName: String? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xphases-to-validate-before", description = "Validate backend state before these phases" ) - var phasesToValidateBefore: Array? by FreezableVar(null) + var phasesToValidateBefore: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xphases-to-validate-after", description = "Validate backend state after these phases" ) - var phasesToValidateAfter: Array? by FreezableVar(null) + var phasesToValidateAfter: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xphases-to-validate", description = "Validate backend state both before and after these phases" ) - var phasesToValidate: Array? by FreezableVar(null) + var phasesToValidate: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xprofile-phases", description = "Profile backend phases" ) - var profilePhases: Boolean by FreezableVar(false) + var profilePhases = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xcheck-phase-conditions", description = "Check pre- and postconditions on phases" ) - var checkPhaseConditions: Boolean by FreezableVar(false) + var checkPhaseConditions = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xcheck-sticky-phase-conditions", description = "Run sticky condition checks on subsequent phases as well. Implies -Xcheck-phase-conditions" ) - var checkStickyPhaseConditions: Boolean by FreezableVar(false) + var checkStickyPhaseConditions = false + set(value) { + checkFrozen() + field = value + } @GradleDeprecatedOption( message = "Compiler flag -Xuse-k2 is deprecated; please use language version 2.0 instead", @@ -313,46 +498,78 @@ abstract class CommonCompilerArguments : CommonToolArguments() { deprecatedName = "-Xuse-fir", description = "Compile using experimental K2. K2 is a new compiler pipeline, no compatibility guarantees are yet provided" ) - var useK2: Boolean by FreezableVar(false) + var useK2 = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xuse-fir-extended-checkers", description = "Use extended analysis mode based on Front-end IR. Warning: this feature is far from being production-ready" ) - var useFirExtendedCheckers: Boolean by FreezableVar(false) + var useFirExtendedCheckers = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xuse-fir-ic", description = "Compile using Front-end IR internal incremental compilation cycle. Warning: this feature is far from being production-ready" ) - var useFirIC: Boolean by FreezableVar(false) + var useFirIC = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xuse-fir-lt", description = "Compile using LightTree parser with Front-end IR. Warning: this feature is far from being production-ready" ) - var useFirLT: Boolean by FreezableVar(true) + var useFirLT = true + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xdisable-ultra-light-classes", description = "Do not use the ultra light classes implementation" ) - var disableUltraLightClasses: Boolean by FreezableVar(false) + var disableUltraLightClasses = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xuse-mixed-named-arguments", description = "Enable Support named arguments in their own position even if the result appears as mixed" ) - var useMixedNamedArguments: Boolean by FreezableVar(false) + var useMixedNamedArguments = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xexpect-actual-linker", description = "Enable experimental expect/actual linker" ) - var expectActualLinker: Boolean by FreezableVar(false) + var expectActualLinker = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xdisable-default-scripting-plugin", description = "Do not enable scripting plugin by default") - var disableDefaultScriptingPlugin: Boolean by FreezableVar(false) + var disableDefaultScriptingPlugin = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xexplicit-api", @@ -360,84 +577,144 @@ abstract class CommonCompilerArguments : CommonToolArguments() { description = "Force compiler to report errors on all public API declarations without explicit visibility or return type.\n" + "Use 'warning' level to issue warnings instead of errors." ) - var explicitApi: String by FreezableVar(ExplicitApiMode.DISABLED.state) + var explicitApi: String = ExplicitApiMode.DISABLED.state + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xinference-compatibility", description = "Enable compatibility changes for generic type inference algorithm" ) - var inferenceCompatibility: Boolean by FreezableVar(false) + var inferenceCompatibility = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xsuppress-version-warnings", description = "Suppress warnings about outdated, inconsistent or experimental language or API versions" ) - var suppressVersionWarnings: Boolean by FreezableVar(false) + var suppressVersionWarnings = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xextended-compiler-checks", description = "Enable additional compiler checks that might provide verbose diagnostic information for certain errors.\n" + "Warning: this mode is not backward-compatible and might cause compilation errors in previously compiled code." ) - var extendedCompilerChecks: Boolean by FreezableVar(false) + var extendedCompilerChecks = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xbuiltins-from-sources", description = "Compile builtIns from sources" ) - var builtInsFromSources: Boolean by FreezableVar(false) + var builtInsFromSources = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xunrestricted-builder-inference", description = "Eliminate builder inference restrictions like allowance of returning type variables of a builder inference call" ) - var unrestrictedBuilderInference: Boolean by FreezableVar(false) + var unrestrictedBuilderInference = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xenable-builder-inference", description = "Use the builder inference by default, for all calls with lambdas which can't be resolved without it.\n" + "The corresponding calls' declarations may not be marked with @BuilderInference." ) - var enableBuilderInference: Boolean by FreezableVar(false) + var enableBuilderInference = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xself-upper-bound-inference", description = "Support inferring type arguments based on only self upper bounds of the corresponding type parameters" ) - var selfUpperBoundInference: Boolean by FreezableVar(false) + var selfUpperBoundInference = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xcontext-receivers", description = "Enable experimental context receivers" ) - var contextReceivers: Boolean by FreezableVar(false) + var contextReceivers = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xklib-relative-path-base", description = "Provide a base paths to compute source's relative paths in klib (default is empty)" ) - var relativePathBases: Array? by FreezableVar(null) + var relativePathBases: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xklib-normalize-absolute-path", description = "Normalize absolute paths in klibs" ) - var normalizeAbsolutePath: Boolean by FreezableVar(false) + var normalizeAbsolutePath = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xklib-enable-signature-clash-checks", description = "Enable the checks on uniqueness of signatures" ) - var enableSignatureClashChecks: Boolean by FreezableVar(true) + var enableSignatureClashChecks = true + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xenable-incremental-compilation", description = "Enable incremental compilation") - var incrementalCompilation: Boolean? by FreezableVar(null) + var incrementalCompilation: Boolean? = null + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xrender-internal-diagnostic-names", description = "Render internal names of warnings and errors") - var renderInternalDiagnosticNames: Boolean by FreezableVar(false) + var renderInternalDiagnosticNames = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xallow-any-scripts-in-source-roots", description = "Allow to compile any scripts along with regular Kotlin sources") - var allowAnyScriptsInSourceRoots: Boolean by FreezableVar(false) + var allowAnyScriptsInSourceRoots = false + set(value) { + checkFrozen() + field = value + } @OptIn(IDEAPluginsCompatibilityAPI::class) open fun configureAnalysisFlags(collector: MessageCollector, languageVersion: LanguageVersion): MutableMap, Any> { @@ -675,7 +952,10 @@ abstract class CommonCompilerArguments : CommonToolArguments() { } } - private fun findOutdatedVersion(language: LanguageVersion, api: ApiVersion): Triple? { + private fun findOutdatedVersion( + language: LanguageVersion, + api: ApiVersion + ): Triple? { return when { language.isUnsupported -> Triple(language, LanguageVersion.FIRST_SUPPORTED, VersionKind.LANGUAGE) api.isUnsupported -> Triple(api, ApiVersion.FIRST_SUPPORTED, VersionKind.API) diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonToolArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonToolArguments.kt index ec5cbdcba20..4cb09088147 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonToolArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonToolArguments.kt @@ -24,19 +24,35 @@ abstract class CommonToolArguments : Freezable(), Serializable { private val serialVersionUID = 0L } - var freeArgs: List by FreezableVar(emptyList()) + var freeArgs: List = emptyList() + set(value) { + checkFrozen() + field = value + } @Transient var errors: ArgumentParseErrors? = null @Argument(value = "-help", shortName = "-h", description = "Print a synopsis of standard options") - var help: Boolean by FreezableVar(false) + var help = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-X", description = "Print a synopsis of advanced options") - var extraHelp: Boolean by FreezableVar(false) + var extraHelp = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-version", description = "Display compiler version") - var version: Boolean by FreezableVar(false) + var version = false + set(value) { + checkFrozen() + field = value + } @GradleOption( value = DefaultValue.BOOLEAN_FALSE_DEFAULT, @@ -44,7 +60,11 @@ abstract class CommonToolArguments : Freezable(), Serializable { shouldGenerateDeprecatedKotlinOptions = true, ) @Argument(value = "-verbose", description = "Enable verbose logging output") - var verbose: Boolean by FreezableVar(false) + var verbose = false + set(value) { + checkFrozen() + field = value + } @GradleOption( value = DefaultValue.BOOLEAN_FALSE_DEFAULT, @@ -52,7 +72,11 @@ abstract class CommonToolArguments : Freezable(), Serializable { shouldGenerateDeprecatedKotlinOptions = true, ) @Argument(value = "-nowarn", description = "Generate no warnings") - var suppressWarnings: Boolean by FreezableVar(false) + var suppressWarnings = false + set(value) { + checkFrozen() + field = value + } @GradleOption( value = DefaultValue.BOOLEAN_FALSE_DEFAULT, @@ -60,7 +84,15 @@ abstract class CommonToolArguments : Freezable(), Serializable { shouldGenerateDeprecatedKotlinOptions = true, ) @Argument(value = "-Werror", description = "Report an error if there are any warnings") - var allWarningsAsErrors: Boolean by FreezableVar(false) + var allWarningsAsErrors = false + set(value) { + checkFrozen() + field = value + } - var internalArguments: List by FreezableVar(emptyList()) + var internalArguments: List = emptyList() + set(value) { + checkFrozen() + field = value + } } diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/Freezable.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/Freezable.kt index b339b577f50..d47615190cd 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/Freezable.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/Freezable.kt @@ -16,26 +16,9 @@ package org.jetbrains.kotlin.cli.common.arguments -import java.io.Serializable -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - abstract class Freezable { - protected open inner class FreezableVar(private var value: T) : ReadWriteProperty, Serializable { - override fun getValue(thisRef: Any, property: KProperty<*>) = value - - override fun setValue(thisRef: Any, property: KProperty<*>, value: T) { - if (frozen) throw IllegalStateException("Instance of ${this::class} is frozen") - this.value = value - } - } - - protected inner class NullableStringFreezableVar(value: String?) : FreezableVar(value) { - private val defaultValue = value - - override fun setValue(thisRef: Any, property: KProperty<*>, value: String?) { - super.setValue(thisRef, property, if (value.isNullOrEmpty()) defaultValue else value) - } + protected fun checkFrozen() { + if (frozen) throw IllegalStateException("Instance of ${this::class} is frozen") } private var frozen: Boolean = false @@ -51,7 +34,8 @@ abstract class Freezable { @Suppress( "UNCHECKED_CAST", - "EXTENSION_SHADOWED_BY_MEMBER" // It's false positive shadowed warning KT-21598 + "EXTENSION_SHADOWED_BY_MEMBER", // It's false positive shadowed warning KT-21598 + "unused" //used from kotlin plugin ) fun T.frozen(): T = getInstanceWithFreezeStatus(true) as T @Suppress( diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt index 11b35860f30..ff609e0dfcf 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt @@ -28,10 +28,18 @@ class K2JSCompilerArguments : CommonCompilerArguments() { removeAfter = "1.9.0" ) @Argument(value = "-output", valueDescription = "", description = "Destination *.js file for the compilation result") - var outputFile: String? by NullableStringFreezableVar(null) + var outputFile: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument(value = "-ir-output-dir", valueDescription = "", description = "Destination for generated files") - var outputDir: String? by NullableStringFreezableVar(null) + var outputDir: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @GradleOption( value = DefaultValue.STRING_NULL_DEFAULT, @@ -39,7 +47,11 @@ class K2JSCompilerArguments : CommonCompilerArguments() { shouldGenerateDeprecatedKotlinOptions = true, ) @Argument(value = "-ir-output-name", description = "Base name of generated files") - var moduleName: String? by NullableStringFreezableVar(null) + var moduleName: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @GradleOption( value = DefaultValue.BOOLEAN_TRUE_DEFAULT, @@ -47,14 +59,22 @@ class K2JSCompilerArguments : CommonCompilerArguments() { shouldGenerateDeprecatedKotlinOptions = true, ) @Argument(value = "-no-stdlib", description = "Don't automatically include the default Kotlin/JS stdlib into compilation dependencies") - var noStdlib: Boolean by FreezableVar(false) + var noStdlib = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-libraries", valueDescription = "", description = "Paths to Kotlin libraries with .meta.js and .kjsm files, separated by system path separator" ) - var libraries: String? by NullableStringFreezableVar(null) + var libraries: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @GradleOption( value = DefaultValue.BOOLEAN_FALSE_DEFAULT, @@ -62,7 +82,11 @@ class K2JSCompilerArguments : CommonCompilerArguments() { shouldGenerateDeprecatedKotlinOptions = true, ) @Argument(value = "-source-map", description = "Generate source map") - var sourceMap: Boolean by FreezableVar(false) + var sourceMap = false + set(value) { + checkFrozen() + field = value + } @GradleOption( value = DefaultValue.STRING_NULL_DEFAULT, @@ -70,7 +94,11 @@ class K2JSCompilerArguments : CommonCompilerArguments() { shouldGenerateDeprecatedKotlinOptions = true, ) @Argument(value = "-source-map-prefix", description = "Add the specified prefix to paths in the source map") - var sourceMapPrefix: String? by NullableStringFreezableVar(null) + var sourceMapPrefix: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument( value = "-source-map-base-dirs", @@ -78,7 +106,11 @@ class K2JSCompilerArguments : CommonCompilerArguments() { valueDescription = "", description = "Base directories for calculating relative paths to source files in source map" ) - var sourceMapBaseDirs: String? by NullableStringFreezableVar(null) + var sourceMapBaseDirs: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } /** * SourceMapEmbedSources should be null by default, since it has effect only when source maps are enabled. @@ -94,7 +126,11 @@ class K2JSCompilerArguments : CommonCompilerArguments() { valueDescription = "{always|never|inlining}", description = "Embed source files into source map" ) - var sourceMapEmbedSources: String? by NullableStringFreezableVar(null) + var sourceMapEmbedSources: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @GradleOption( value = DefaultValue.JS_SOURCE_MAP_NAMES_POLICY, @@ -106,7 +142,11 @@ class K2JSCompilerArguments : CommonCompilerArguments() { valueDescription = "{no|simple-names|fully-qualified-names}", description = "How to map generated names to original names (IR backend only)" ) - var sourceMapNamesPolicy: String? by NullableStringFreezableVar(null) + var sourceMapNamesPolicy: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @GradleOption( value = DefaultValue.BOOLEAN_TRUE_DEFAULT, @@ -114,7 +154,11 @@ class K2JSCompilerArguments : CommonCompilerArguments() { shouldGenerateDeprecatedKotlinOptions = true, ) @Argument(value = "-meta-info", description = "Generate .meta.js and .kjsm files with metadata. Use to create a library") - var metaInfo: Boolean by FreezableVar(false) + var metaInfo = false + set(value) { + checkFrozen() + field = value + } @GradleOption( value = DefaultValue.JS_ECMA_VERSIONS, @@ -122,14 +166,22 @@ class K2JSCompilerArguments : CommonCompilerArguments() { shouldGenerateDeprecatedKotlinOptions = true, ) @Argument(value = "-target", valueDescription = "{ v5 }", description = "Generate JS files for specific ECMA version") - var target: String? by NullableStringFreezableVar(null) + var target: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument( value = "-Xir-keep", description = "Comma-separated list of fully-qualified names to not be eliminated by DCE (if it can be reached), " + "and for which to keep non-minified names." ) - var irKeep: String? by NullableStringFreezableVar(null) + var irKeep: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @GradleOption( value = DefaultValue.JS_MODULE_KINDS, @@ -141,7 +193,11 @@ class K2JSCompilerArguments : CommonCompilerArguments() { valueDescription = "{plain|amd|commonjs|umd|es}", description = "Kind of the JS module generated by the compiler" ) - var moduleKind: String? by NullableStringFreezableVar(K2JsArgumentConstants.MODULE_PLAIN) + var moduleKind: String? = MODULE_PLAIN + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) MODULE_PLAIN else value + } @GradleOption( value = DefaultValue.JS_MAIN, @@ -151,22 +207,35 @@ class K2JSCompilerArguments : CommonCompilerArguments() { @Argument( value = "-main", valueDescription = "{$CALL|$NO_CALL}", - description = "Define whether the `main` function should be called upon execution") - var main: String? by NullableStringFreezableVar(null) + description = "Define whether the `main` function should be called upon execution" + ) + var main: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument( value = "-output-prefix", valueDescription = "", description = "Add the content of the specified file to the beginning of output file" ) - var outputPrefix: String? by NullableStringFreezableVar(null) + var outputPrefix: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument( value = "-output-postfix", valueDescription = "", description = "Add the content of the specified file to the end of output file" ) - var outputPostfix: String? by NullableStringFreezableVar(null) + var outputPostfix: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } // Advanced options @@ -175,114 +244,213 @@ class K2JSCompilerArguments : CommonCompilerArguments() { description = "Generate unpacked KLIB into parent directory of output JS file.\n" + "In combination with -meta-info generates both IR and pre-IR versions of library." ) - var irProduceKlibDir: Boolean by FreezableVar(false) + var irProduceKlibDir = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xir-produce-klib-file", description = "Generate packed klib into file specified by -output. Disables pre-IR backend" ) - var irProduceKlibFile: Boolean by FreezableVar(false) + var irProduceKlibFile = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xir-produce-js", description = "Generates JS file using IR backend. Also disables pre-IR backend") - var irProduceJs: Boolean by FreezableVar(false) + var irProduceJs = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xir-dce", description = "Perform experimental dead code elimination") - var irDce: Boolean by FreezableVar(false) + var irDce = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xir-dce-runtime-diagnostic", valueDescription = "{$RUNTIME_DIAGNOSTIC_LOG|$RUNTIME_DIAGNOSTIC_EXCEPTION}", description = "Enable runtime diagnostics when performing DCE instead of removing declarations" ) - var irDceRuntimeDiagnostic: String? by NullableStringFreezableVar(null) + var irDceRuntimeDiagnostic: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } - @Argument(value = "-Xir-dce-print-reachability-info", description = "Print declarations' reachability info to stdout during performing DCE") - var irDcePrintReachabilityInfo: Boolean by FreezableVar(false) + @Argument( + value = "-Xir-dce-print-reachability-info", + description = "Print declarations' reachability info to stdout during performing DCE" + ) + var irDcePrintReachabilityInfo = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xir-property-lazy-initialization", description = "Perform lazy initialization for properties") - var irPropertyLazyInitialization: Boolean by FreezableVar(true) + var irPropertyLazyInitialization = true + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xir-minimized-member-names", description = "Perform minimization for names of members") - var irMinimizedMemberNames: Boolean by FreezableVar(false) + var irMinimizedMemberNames = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xir-only", description = "Disables pre-IR backend") - var irOnly: Boolean by FreezableVar(false) + var irOnly = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xir-module-name", valueDescription = "", description = "Specify a compilation module name for IR backend" ) - var irModuleName: String? by NullableStringFreezableVar(null) + var irModuleName: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument(value = "-Xir-base-class-in-metadata", description = "Write base class into metadata") - var irBaseClassInMetadata: Boolean by FreezableVar(false) + var irBaseClassInMetadata = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xir-safe-external-boolean", description = "Safe access via Boolean() to Boolean properties in externals to safely cast falsy values." ) - var irSafeExternalBoolean: Boolean by FreezableVar(false) + var irSafeExternalBoolean = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xir-safe-external-boolean-diagnostic", valueDescription = "{$RUNTIME_DIAGNOSTIC_LOG|$RUNTIME_DIAGNOSTIC_EXCEPTION}", description = "Enable runtime diagnostics when access safely to boolean in external declarations" ) - var irSafeExternalBooleanDiagnostic: String? by NullableStringFreezableVar(null) + var irSafeExternalBooleanDiagnostic: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument(value = "-Xir-per-module", description = "Splits generated .js per-module") - var irPerModule: Boolean by FreezableVar(false) + var irPerModule = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xir-per-module-output-name", description = "Adds a custom output name to the splitted js files") - var irPerModuleOutputName: String? by NullableStringFreezableVar(null) + var irPerModuleOutputName: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument(value = "-Xir-per-file", description = "Splits generated .js per-file") - var irPerFile: Boolean by FreezableVar(false) + var irPerFile = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xir-new-ir2js", description = "New fragment-based ir2js") - var irNewIr2Js: Boolean by FreezableVar(true) + var irNewIr2Js = true + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xir-generate-inline-anonymous-functions", description = "Lambda expressions that capture values are translated into in-line anonymous JavaScript functions" ) - var irGenerateInlineAnonymousFunctions: Boolean by FreezableVar(false) + var irGenerateInlineAnonymousFunctions = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xinclude", valueDescription = "", description = "A path to an intermediate library that should be processed in the same manner as source files." ) - var includes: String? by NullableStringFreezableVar(null) + var includes: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument( value = "-Xcache-directory", valueDescription = "", description = "A path to cache directory" ) - var cacheDirectory: String? by NullableStringFreezableVar(null) + var cacheDirectory: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument(value = "-Xir-build-cache", description = "Use compiler to build cache") - var irBuildCache: Boolean by FreezableVar(false) + var irBuildCache = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xgenerate-dts", description = "Generate TypeScript declarations .d.ts file alongside JS file. Available in IR backend only." ) - var generateDts: Boolean by FreezableVar(false) + var generateDts = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xgenerate-polyfills", description = "Generate polyfills for features from the ES6+ standards." ) - var generatePolyfills: Boolean by FreezableVar(true) + var generatePolyfills = true + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xstrict-implicit-export-types", description = "Generate strict types for implicitly exported entities inside d.ts files. Available in IR backend only." ) - var strictImplicitExportType: Boolean by FreezableVar(false) + var strictImplicitExportType = false + set(value) { + checkFrozen() + field = value + } @GradleOption( value = DefaultValue.BOOLEAN_FALSE_DEFAULT, @@ -293,7 +461,11 @@ class K2JSCompilerArguments : CommonCompilerArguments() { value = "-Xes-classes", description = "Generated JavaScript will use ES2015 classes." ) - var useEsClasses: Boolean by FreezableVar(false) + var useEsClasses = false + set(value) { + checkFrozen() + field = value + } @GradleOption( value = DefaultValue.BOOLEAN_TRUE_DEFAULT, @@ -301,7 +473,11 @@ class K2JSCompilerArguments : CommonCompilerArguments() { shouldGenerateDeprecatedKotlinOptions = true, ) @Argument(value = "-Xtyped-arrays", description = "Translate primitive arrays to JS typed arrays") - var typedArrays: Boolean by FreezableVar(true) + var typedArrays = true + set(value) { + checkFrozen() + field = value + } @GradleOption( value = DefaultValue.BOOLEAN_FALSE_DEFAULT, @@ -309,65 +485,129 @@ class K2JSCompilerArguments : CommonCompilerArguments() { shouldGenerateDeprecatedKotlinOptions = true, ) @Argument(value = "-Xfriend-modules-disabled", description = "Disable internal declaration export") - var friendModulesDisabled: Boolean by FreezableVar(false) + var friendModulesDisabled = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xfriend-modules", valueDescription = "", description = "Paths to friend modules" ) - var friendModules: String? by NullableStringFreezableVar(null) + var friendModules: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument( value = "-Xenable-extension-functions-in-externals", description = "Enable extensions functions members in external interfaces" ) - var extensionFunctionsInExternals: Boolean by FreezableVar(false) + var extensionFunctionsInExternals = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xmetadata-only", description = "Generate *.meta.js and *.kjsm files only") - var metadataOnly: Boolean by FreezableVar(false) + var metadataOnly = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xenable-js-scripting", description = "Enable experimental support of .kts files using K/JS (with -Xir only)") - var enableJsScripting: Boolean by FreezableVar(false) + var enableJsScripting = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xfake-override-validator", description = "Enable IR fake override validator") - var fakeOverrideValidator: Boolean by FreezableVar(false) + var fakeOverrideValidator = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xerror-tolerance-policy", description = "Set up error tolerance policy (NONE, SEMANTIC, SYNTAX, ALL)") - var errorTolerancePolicy: String? by NullableStringFreezableVar(null) + var errorTolerancePolicy: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument(value = "-Xpartial-linkage", description = "Allow unlinked symbols") - var partialLinkage: Boolean by FreezableVar(false) + var partialLinkage = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xwasm", description = "Use experimental WebAssembly compiler backend") - var wasm: Boolean by FreezableVar(false) + var wasm = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xwasm-debug-info", description = "Add debug info to WebAssembly compiled module") - var wasmDebug: Boolean by FreezableVar(true) + var wasmDebug = true + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xwasm-kclass-fqn", description = "Enable support for FQ names in KClass") - var wasmKClassFqn: Boolean by FreezableVar(false) + var wasmKClassFqn = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xwasm-enable-array-range-checks", description = "Turn on range checks for the array access functions") - var wasmEnableArrayRangeChecks: Boolean by FreezableVar(false) + var wasmEnableArrayRangeChecks = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xwasm-enable-asserts", description = "Turn on asserts") - var wasmEnableAsserts: Boolean by FreezableVar(false) + var wasmEnableAsserts = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xwasm-generate-wat", description = "Generate wat file") - var wasmGenerateWat: Boolean by FreezableVar(false) + var wasmGenerateWat = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xuse-deprecated-legacy-compiler", description = "Use deprecated legacy compiler without error" ) - var useDeprecatedLegacyCompiler: Boolean by FreezableVar(false) + var useDeprecatedLegacyCompiler = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xlegacy-deprecated-no-warn", description = "Disable warnings of deprecation of legacy compiler" ) - var legacyDeprecatedNoWarn: Boolean by FreezableVar(false) + var legacyDeprecatedNoWarn = false + set(value) { + checkFrozen() + field = value + } private fun MessageCollector.deprecationWarn(value: Boolean, defaultValue: Boolean, name: String) { if (value != defaultValue) { diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSDceArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSDceArguments.kt index 6adf00de347..5cf7271f9d2 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSDceArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSDceArguments.kt @@ -28,20 +28,32 @@ class K2JSDceArguments : CommonToolArguments() { valueDescription = "", description = "Output directory" ) - var outputDirectory: String? by NullableStringFreezableVar(null) + var outputDirectory: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument( value = "-keep", valueDescription = "", description = "List of fully-qualified names of declarations that shouldn't be eliminated" ) - var declarationsToKeep: Array? by FreezableVar(null) + var declarationsToKeep: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xprint-reachability-info", description = "Print declarations marked as reachable" ) - var printReachabilityInfo: Boolean by FreezableVar(false) + var printReachabilityInfo = false + set(value) { + checkFrozen() + field = value + } @GradleOption( value = DefaultValue.BOOLEAN_FALSE_DEFAULT, @@ -52,14 +64,22 @@ class K2JSDceArguments : CommonToolArguments() { value = "-dev-mode", description = "Development mode: don't strip out any code, just copy dependencies" ) - var devMode: Boolean by FreezableVar(false) + var devMode = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xdev-mode-overwriting-strategy", valueDescription = "{$OLDER|$ALL}", description = "Overwriting strategy during copy dependencies in development mode" ) - var devModeOverwritingStrategy: String? by NullableStringFreezableVar(null) + var devModeOverwritingStrategy: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } } object DevModeOverwritingStrategies { diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt index 7c1a737e532..9f69fb73352 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt @@ -16,7 +16,11 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { } @Argument(value = "-d", valueDescription = "", description = "Destination for generated class files") - var destination: String? by NullableStringFreezableVar(null) + var destination: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument( value = "-classpath", @@ -24,17 +28,29 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { valueDescription = "", description = "List of directories and JAR/ZIP archives to search for user class files" ) - var classpath: String? by NullableStringFreezableVar(null) + var classpath: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument(value = "-include-runtime", description = "Include Kotlin runtime into the resulting JAR") - var includeRuntime: Boolean by FreezableVar(false) + var includeRuntime = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-jdk-home", valueDescription = "", description = "Include a custom JDK from the specified location into the classpath instead of the default JAVA_HOME" ) - var jdkHome: String? by NullableStringFreezableVar(null) + var jdkHome: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @GradleOption( value = DefaultValue.BOOLEAN_FALSE_DEFAULT, @@ -42,30 +58,50 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { shouldGenerateDeprecatedKotlinOptions = true, ) @Argument(value = "-no-jdk", description = "Don't automatically include the Java runtime into the classpath") - var noJdk: Boolean by FreezableVar(false) + var noJdk = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-no-stdlib", description = "Don't automatically include the Kotlin/JVM stdlib and Kotlin reflection into the classpath" ) - var noStdlib: Boolean by FreezableVar(false) + var noStdlib = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-no-reflect", description = "Don't automatically include Kotlin reflection into the classpath") - var noReflect: Boolean by FreezableVar(false) + var noReflect = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-expression", shortName = "-e", description = "Evaluate the given string as a Kotlin script" ) - var expression: String? by FreezableVar(null) + var expression: String? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-script-templates", valueDescription = "", description = "Script definition template classes" ) - var scriptTemplates: Array? by FreezableVar(null) + var scriptTemplates: Array? = null + set(value) { + checkFrozen() + field = value + } @GradleOption( value = DefaultValue.STRING_NULL_DEFAULT, @@ -73,7 +109,11 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { shouldGenerateDeprecatedKotlinOptions = true, ) @Argument(value = "-module-name", valueDescription = "", description = "Name of the generated .kotlin_module file") - var moduleName: String? by NullableStringFreezableVar(null) + var moduleName: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @GradleOption( value = DefaultValue.JVM_TARGET_VERSIONS, @@ -85,7 +125,11 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { valueDescription = "", description = "Target version of the generated JVM bytecode (${JvmTarget.SUPPORTED_VERSIONS_DESCRIPTION}), default is 1.8" ) - var jvmTarget: String? by NullableStringFreezableVar(null) + var jvmTarget: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @GradleOption( value = DefaultValue.BOOLEAN_FALSE_DEFAULT, @@ -93,7 +137,11 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { shouldGenerateDeprecatedKotlinOptions = true, ) @Argument(value = "-java-parameters", description = "Generate metadata for Java 1.8 reflection on method parameters") - var javaParameters: Boolean by FreezableVar(false) + var javaParameters = false + set(value) { + checkFrozen() + field = value + } // Advanced options @@ -101,16 +149,28 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { value = "-Xuse-ir", description = "Use the IR backend. This option has no effect unless the language version less than 1.5 is used" ) - var useIR: Boolean by FreezableVar(false) + var useIR = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xuse-old-backend", description = "Use the old JVM backend") - var useOldBackend: Boolean by FreezableVar(false) + var useOldBackend = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xallow-unstable-dependencies", description = "Do not report errors on classes in dependencies, which were compiled by an unstable version of the Kotlin compiler" ) - var allowUnstableDependencies: Boolean by FreezableVar(false) + var allowUnstableDependencies = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xabi-stability", @@ -120,13 +180,21 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { "When using the JVM IR backend, conversely, use 'unstable' to mark generated class files as unstable\n" + "to force diagnostics to be reported." ) - var abiStability: String? by FreezableVar(null) + var abiStability: String? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xir-do-not-clear-binding-context", description = "When using the IR backend, do not clear BindingContext between psi2ir and lowerings" ) - var doNotClearBindingContext: Boolean by FreezableVar(false) + var doNotClearBindingContext = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xbackend-threads", @@ -135,10 +203,18 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { "0 means use a thread per processor core.\n" + "Default value is 1" ) - var backendThreads: String by FreezableVar("1") + var backendThreads: String = "1" + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xmodule-path", valueDescription = "", description = "Paths where to find Java 9+ modules") - var javaModulePath: String? by NullableStringFreezableVar(null) + var javaModulePath: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument( value = "-Xadd-modules", @@ -146,25 +222,45 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { description = "Root modules to resolve in addition to the initial modules,\n" + "or all modules on the module path if is ALL-MODULE-PATH" ) - var additionalJavaModules: Array? by FreezableVar(null) + var additionalJavaModules: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xno-call-assertions", description = "Don't generate not-null assertions for arguments of platform types") - var noCallAssertions: Boolean by FreezableVar(false) + var noCallAssertions = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xno-receiver-assertions", description = "Don't generate not-null assertion for extension receiver arguments of platform types" ) - var noReceiverAssertions: Boolean by FreezableVar(false) + var noReceiverAssertions = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xno-param-assertions", description = "Don't generate not-null assertions on parameters of methods accessible from Java" ) - var noParamAssertions: Boolean by FreezableVar(false) + var noParamAssertions = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xno-optimize", description = "Disable optimizations") - var noOptimize: Boolean by FreezableVar(false) + var noOptimize = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xassertions", valueDescription = "{always-enable|always-disable|jvm|legacy}", @@ -175,7 +271,11 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { "-Xassertions=legacy: calculate condition on each call, check depends on jvm assertion settings in the kotlin package;\n" + "default: legacy" ) - var assertionsMode: String? by NullableStringFreezableVar(JVMAssertionsMode.DEFAULT.description) + var assertionsMode: String? = JVMAssertionsMode.DEFAULT.description + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) JVMAssertionsMode.DEFAULT.description else value + } @Argument( value = "-Xbuild-file", @@ -183,60 +283,104 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { valueDescription = "", description = "Path to the .xml build file to compile" ) - var buildFile: String? by NullableStringFreezableVar(null) + var buildFile: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument(value = "-Xmultifile-parts-inherit", description = "Compile multifile classes as a hierarchy of parts and facade") - var inheritMultifileParts: Boolean by FreezableVar(false) + var inheritMultifileParts = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xuse-type-table", description = "Use type table in metadata serialization") - var useTypeTable: Boolean by FreezableVar(false) + var useTypeTable = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xuse-old-class-files-reading", description = "Use old class files reading implementation. This may slow down the build and cause problems with Groovy interop.\n" + "Should be used in case of problems with the new implementation" ) - var useOldClassFilesReading: Boolean by FreezableVar(false) + var useOldClassFilesReading = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xuse-fast-jar-file-system", description = "Use fast implementation on Jar FS. This may speed up compilation time, but currently it's an experimental mode" ) - var useFastJarFileSystem: Boolean by FreezableVar(false) + var useFastJarFileSystem = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xdump-declarations-to", valueDescription = "", description = "Path to JSON file to dump Java to Kotlin declaration mappings" ) - var declarationsOutputPath: String? by NullableStringFreezableVar(null) + var declarationsOutputPath: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument( value = "-Xsuppress-missing-builtins-error", description = "Suppress the \"cannot access built-in declaration\" error (useful with -no-stdlib)" ) - var suppressMissingBuiltinsError: Boolean by FreezableVar(false) + var suppressMissingBuiltinsError = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xscript-resolver-environment", valueDescription = "", description = "Script resolver environment in key-value pairs (the value could be quoted and escaped)" ) - var scriptResolverEnvironment: Array? by FreezableVar(null) + var scriptResolverEnvironment: Array? = null + set(value) { + checkFrozen() + field = value + } // Javac options @Argument(value = "-Xuse-javac", description = "Use javac for Java source and class files analysis") - var useJavac: Boolean by FreezableVar(false) + var useJavac = false + set(value) { + checkFrozen() + field = value + } @Argument(value = "-Xcompile-java", description = "Reuse javac analysis and compile Java source files") - var compileJava by FreezableVar(false) + var compileJava = false + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xjavac-arguments", valueDescription = "", description = "Java compiler arguments" ) - var javacArguments: Array? by FreezableVar(null) + var javacArguments: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument( @@ -244,13 +388,21 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { valueDescription = "", description = "Paths to directories with Java source files" ) - var javaSourceRoots: Array? by FreezableVar(null) + var javaSourceRoots: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xjava-package-prefix", description = "Package prefix for Java files" ) - var javaPackagePrefix: String? by FreezableVar(null) + var javaPackagePrefix: String? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xjsr305", @@ -267,7 +419,11 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { " * strict (experimental; treat as other supported nullability annotations)\n" + " * warn (report a warning)" ) - var jsr305: Array? by FreezableVar(null) + var jsr305: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xnullability-annotations", @@ -278,7 +434,11 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { " * strict\n" + " * warn (report a warning)" ) - var nullabilityAnnotations: Array? by FreezableVar(null) + var nullabilityAnnotations: Array? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xsupport-compatqual-checker-framework-annotations", @@ -286,7 +446,11 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { description = "Specify behavior for Checker Framework compatqual annotations (NullableDecl/NonNullDecl).\n" + "Default value is 'enable'" ) - var supportCompatqualCheckerFrameworkAnnotations: String? by NullableStringFreezableVar(null) + var supportCompatqualCheckerFrameworkAnnotations: String? = null + set(value) { + checkFrozen() + field = if (value.isNullOrEmpty()) null else value + } @Argument( value = "-Xjspecify-annotations", @@ -294,7 +458,11 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { description = "Specify behavior for jspecify annotations.\n" + "Default value is 'warn'" ) - var jspecifyAnnotations: String? by FreezableVar(null) + var jspecifyAnnotations: String? = null + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xjvm-default", @@ -325,23 +493,39 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { -Xjvm-default=compatibility Deprecated. Allow usages of @JvmDefault; generate a compatibility accessor in the DefaultImpls class in addition to the default interface method.""" ) - var jvmDefault: String by FreezableVar(JvmDefaultMode.DEFAULT.description) + var jvmDefault: String = JvmDefaultMode.DEFAULT.description + set(value) { + checkFrozen() + field = value + } @Argument( value = "-Xdefault-script-extension", valueDescription = "