Support mutable/immutable compiler arguments
This commit is contained in:
+11
-6
@@ -25,19 +25,24 @@ import org.jetbrains.kotlin.cli.common.arguments.*
|
||||
import org.jetbrains.kotlin.config.SettingConstants
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
abstract class BaseKotlinCompilerSettings<T : Any> protected constructor() : PersistentStateComponent<Element>, Cloneable {
|
||||
@Suppress("LeakingThis")
|
||||
private var _settings: T = createSettings()
|
||||
abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor() : PersistentStateComponent<Element>, Cloneable {
|
||||
@Suppress("LeakingThis", "UNCHECKED_CAST")
|
||||
private var _settings: T = createSettings().frozen() as T
|
||||
private set(value) {
|
||||
field = value.frozen() as T
|
||||
}
|
||||
|
||||
var settings: T
|
||||
get() = copyBean(_settings)
|
||||
get() = _settings
|
||||
set(value) {
|
||||
validateNewSettings(value)
|
||||
_settings = copyBean(value)
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
_settings = value
|
||||
}
|
||||
|
||||
fun update(changer: T.() -> Unit) {
|
||||
settings = settings.apply { changer() }
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
settings = (settings.unfrozen() as T).apply { changer() }
|
||||
}
|
||||
|
||||
protected fun validateInheritedFieldsUnchanged(settings: T) {
|
||||
|
||||
@@ -17,13 +17,14 @@
|
||||
package org.jetbrains.kotlin.config
|
||||
|
||||
import com.intellij.openapi.util.text.StringUtil
|
||||
import org.jetbrains.kotlin.cli.common.arguments.Freezable
|
||||
|
||||
class CompilerSettings {
|
||||
@JvmField var additionalArguments: String = DEFAULT_ADDITIONAL_ARGUMENTS
|
||||
@JvmField var scriptTemplates: String = ""
|
||||
@JvmField var scriptTemplatesClasspath: String = ""
|
||||
@JvmField var copyJsLibraryFiles: Boolean = true
|
||||
@JvmField var outputDirectoryForJsLibraryFiles: String = DEFAULT_OUTPUT_DIRECTORY
|
||||
class CompilerSettings : Freezable() {
|
||||
var additionalArguments: String by FreezableVar(DEFAULT_ADDITIONAL_ARGUMENTS)
|
||||
var scriptTemplates: String by FreezableVar("")
|
||||
var scriptTemplatesClasspath: String by FreezableVar("")
|
||||
var copyJsLibraryFiles: Boolean by FreezableVar(true)
|
||||
var outputDirectoryForJsLibraryFiles: String by FreezableVar(DEFAULT_OUTPUT_DIRECTORY)
|
||||
|
||||
companion object {
|
||||
val DEFAULT_ADDITIONAL_ARGUMENTS = "-version"
|
||||
|
||||
@@ -84,7 +84,13 @@ class KotlinFacetSettings {
|
||||
var useProjectSettings: Boolean = true
|
||||
|
||||
var compilerArguments: CommonCompilerArguments? = null
|
||||
set(value) {
|
||||
field = value?.unfrozen() as CommonCompilerArguments?
|
||||
}
|
||||
var compilerSettings: CompilerSettings? = null
|
||||
set(value) {
|
||||
field = value?.unfrozen() as CompilerSettings?
|
||||
}
|
||||
|
||||
var languageLevel: LanguageVersion?
|
||||
get() = compilerArguments?.languageVersion?.let { LanguageVersion.fromFullVersionString(it) }
|
||||
|
||||
@@ -196,7 +196,7 @@ private fun Class<*>.computeNormalPropertyOrdering(): Map<String, Int> {
|
||||
private val allNormalOrderings = HashMap<Class<*>, Map<String, Int>>()
|
||||
|
||||
private val Class<*>.normalOrdering
|
||||
get() = allNormalOrderings.getOrPut(this) { computeNormalPropertyOrdering() }
|
||||
get() = synchronized(allNormalOrderings) { allNormalOrderings.getOrPut(this) { computeNormalPropertyOrdering() } }
|
||||
|
||||
// Replacing fields with delegated properties leads to unexpected reordering of entries in facet configuration XML
|
||||
// It happens due to XmlSerializer using different orderings for field- and method-based accessors
|
||||
|
||||
@@ -588,7 +588,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() {
|
||||
Assert.assertEquals(true, sourceMap)
|
||||
Assert.assertEquals("commonjs", moduleKind)
|
||||
}
|
||||
Assert.assertEquals("-output test.js -meta-info -Xmulti-platform",
|
||||
Assert.assertEquals("-meta-info -output test.js -Xmulti-platform",
|
||||
compilerSettings!!.additionalArguments)
|
||||
}
|
||||
|
||||
@@ -1645,7 +1645,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() {
|
||||
Assert.assertEquals("1.0", apiLevel!!.description)
|
||||
Assert.assertEquals("1.8", (compilerArguments as K2JVMCompilerArguments).jvmTarget)
|
||||
Assert.assertEquals(
|
||||
listOf("-kotlin-home", "temp2", "-java-parameters", "-Xdump-declarations-to=dumpDir"),
|
||||
listOf("-Xdump-declarations-to=dumpDir", "-java-parameters", "-kotlin-home", "temp2"),
|
||||
compilerSettings!!.additionalArgumentsAsList
|
||||
)
|
||||
}
|
||||
|
||||
+15
-15
@@ -432,11 +432,11 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co
|
||||
!getSelectedLanguageVersion().equals(getLanguageVersionOrDefault(commonCompilerArguments.getLanguageVersion())) ||
|
||||
!getSelectedAPIVersion().equals(getApiVersionOrDefault(commonCompilerArguments.getApiVersion())) ||
|
||||
!coroutineSupportComboBox.getSelectedItem().equals(CoroutineSupport.byCompilerArguments(commonCompilerArguments)) ||
|
||||
ComparingUtils.isModified(additionalArgsOptionsField, compilerSettings.additionalArguments) ||
|
||||
ComparingUtils.isModified(scriptTemplatesField, compilerSettings.scriptTemplates) ||
|
||||
ComparingUtils.isModified(scriptTemplatesClasspathField, compilerSettings.scriptTemplatesClasspath) ||
|
||||
ComparingUtils.isModified(copyRuntimeFilesCheckBox, compilerSettings.copyJsLibraryFiles) ||
|
||||
isModified(outputDirectory, compilerSettings.outputDirectoryForJsLibraryFiles) ||
|
||||
ComparingUtils.isModified(additionalArgsOptionsField, compilerSettings.getAdditionalArguments()) ||
|
||||
ComparingUtils.isModified(scriptTemplatesField, compilerSettings.getScriptTemplates()) ||
|
||||
ComparingUtils.isModified(scriptTemplatesClasspathField, compilerSettings.getScriptTemplatesClasspath()) ||
|
||||
ComparingUtils.isModified(copyRuntimeFilesCheckBox, compilerSettings.getCopyJsLibraryFiles()) ||
|
||||
isModified(outputDirectory, compilerSettings.getOutputDirectoryForJsLibraryFiles()) ||
|
||||
|
||||
(compilerWorkspaceSettings != null &&
|
||||
(ComparingUtils.isModified(enablePreciseIncrementalCheckBox, compilerWorkspaceSettings.getPreciseIncrementalEnabled()) ||
|
||||
@@ -520,11 +520,11 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co
|
||||
break;
|
||||
}
|
||||
|
||||
compilerSettings.additionalArguments = additionalArgsOptionsField.getText();
|
||||
compilerSettings.scriptTemplates = scriptTemplatesField.getText();
|
||||
compilerSettings.scriptTemplatesClasspath = scriptTemplatesClasspathField.getText();
|
||||
compilerSettings.copyJsLibraryFiles = copyRuntimeFilesCheckBox.isSelected();
|
||||
compilerSettings.outputDirectoryForJsLibraryFiles = outputDirectory.getText();
|
||||
compilerSettings.setAdditionalArguments(additionalArgsOptionsField.getText());
|
||||
compilerSettings.setScriptTemplates(scriptTemplatesField.getText());
|
||||
compilerSettings.setScriptTemplatesClasspath(scriptTemplatesClasspathField.getText());
|
||||
compilerSettings.setCopyJsLibraryFiles(copyRuntimeFilesCheckBox.isSelected());
|
||||
compilerSettings.setOutputDirectoryForJsLibraryFiles(outputDirectory.getText());
|
||||
|
||||
if (compilerWorkspaceSettings != null) {
|
||||
compilerWorkspaceSettings.setPreciseIncrementalEnabled(enablePreciseIncrementalCheckBox.isSelected());
|
||||
@@ -568,11 +568,11 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co
|
||||
apiVersionComboBox.setSelectedItem(getApiVersionOrDefault(commonCompilerArguments.getApiVersion()));
|
||||
restrictAPIVersions(getSelectedLanguageVersion());
|
||||
coroutineSupportComboBox.setSelectedItem(CoroutineSupport.byCompilerArguments(commonCompilerArguments));
|
||||
additionalArgsOptionsField.setText(compilerSettings.additionalArguments);
|
||||
scriptTemplatesField.setText(compilerSettings.scriptTemplates);
|
||||
scriptTemplatesClasspathField.setText(compilerSettings.scriptTemplatesClasspath);
|
||||
copyRuntimeFilesCheckBox.setSelected(compilerSettings.copyJsLibraryFiles);
|
||||
outputDirectory.setText(compilerSettings.outputDirectoryForJsLibraryFiles);
|
||||
additionalArgsOptionsField.setText(compilerSettings.getAdditionalArguments());
|
||||
scriptTemplatesField.setText(compilerSettings.getScriptTemplates());
|
||||
scriptTemplatesClasspathField.setText(compilerSettings.getScriptTemplatesClasspath());
|
||||
copyRuntimeFilesCheckBox.setSelected(compilerSettings.getCopyJsLibraryFiles());
|
||||
outputDirectory.setText(compilerSettings.getOutputDirectoryForJsLibraryFiles());
|
||||
|
||||
if (compilerWorkspaceSettings != null) {
|
||||
enablePreciseIncrementalCheckBox.setSelected(compilerWorkspaceSettings.getPreciseIncrementalEnabled());
|
||||
|
||||
@@ -173,7 +173,7 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest {
|
||||
assertEquals("1.0", arguments.getApiVersion());
|
||||
assertEquals(LanguageFeature.State.ENABLED_WITH_WARNING, CoroutineSupport.byCompilerArguments(arguments));
|
||||
assertEquals("1.7", arguments.getJvmTarget());
|
||||
assertEquals("-version -Xallow-kotlin-package -Xskip-metadata-version-check", settings.getCompilerSettings().additionalArguments);
|
||||
assertEquals("-version -Xallow-kotlin-package -Xskip-metadata-version-check", settings.getCompilerSettings().getAdditionalArguments());
|
||||
}
|
||||
|
||||
@SuppressWarnings("ConstantConditions")
|
||||
@@ -188,7 +188,7 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest {
|
||||
assertEquals("1.0", arguments.getApiVersion());
|
||||
assertEquals(LanguageFeature.State.ENABLED_WITH_WARNING, CoroutineSupport.byCompilerArguments(arguments));
|
||||
assertEquals("amd", arguments.getModuleKind());
|
||||
assertEquals("-version -meta-info", settings.getCompilerSettings().additionalArguments);
|
||||
assertEquals("-version -meta-info", settings.getCompilerSettings().getAdditionalArguments());
|
||||
}
|
||||
|
||||
@SuppressWarnings("ConstantConditions")
|
||||
@@ -203,7 +203,7 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest {
|
||||
assertEquals("1.0", arguments.getApiVersion());
|
||||
assertEquals(LanguageFeature.State.ENABLED, CoroutineSupport.byCompilerArguments(arguments));
|
||||
assertEquals("1.7", arguments.getJvmTarget());
|
||||
assertEquals("-version -Xallow-kotlin-package -Xskip-metadata-version-check", settings.getCompilerSettings().additionalArguments);
|
||||
assertEquals("-version -Xallow-kotlin-package -Xskip-metadata-version-check", settings.getCompilerSettings().getAdditionalArguments());
|
||||
}
|
||||
|
||||
@SuppressWarnings("ConstantConditions")
|
||||
@@ -218,7 +218,7 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest {
|
||||
assertEquals("1.0", arguments.getApiVersion());
|
||||
assertEquals(LanguageFeature.State.ENABLED_WITH_ERROR, CoroutineSupport.byCompilerArguments(arguments));
|
||||
assertEquals("amd", arguments.getModuleKind());
|
||||
assertEquals("-version -meta-info", settings.getCompilerSettings().additionalArguments);
|
||||
assertEquals("-version -meta-info", settings.getCompilerSettings().getAdditionalArguments());
|
||||
}
|
||||
|
||||
@SuppressWarnings("ConstantConditions")
|
||||
@@ -233,7 +233,7 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest {
|
||||
assertEquals("1.0", arguments.getApiVersion());
|
||||
assertEquals(LanguageFeature.State.ENABLED, CoroutineSupport.byCompilerArguments(arguments));
|
||||
assertEquals("1.7", arguments.getJvmTarget());
|
||||
assertEquals("-version -Xallow-kotlin-package -Xskip-metadata-version-check", settings.getCompilerSettings().additionalArguments);
|
||||
assertEquals("-version -Xallow-kotlin-package -Xskip-metadata-version-check", settings.getCompilerSettings().getAdditionalArguments());
|
||||
}
|
||||
|
||||
private void configureFacetAndCheckJvm(JvmTarget jvmTarget) {
|
||||
|
||||
Reference in New Issue
Block a user