From cfad305826f3e50ebcb547aba0f4762317b53ac6 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 25 Oct 2017 12:30:11 +0300 Subject: [PATCH] Misc: Fix deserialization of CommonCompilerArguments.freeArgs #KT-20938 Fixed --- .../BaseKotlinCompilerSettings.kt | 8 +++- .../kotlin/config/facetSerialization.kt | 5 +- .../projectWithFreeArgs/module.iml | 12 +++++ .../projectWithFreeArgs/projectFile.ipr | 48 +++++++++++++++++++ .../projectWithFreeArgs/src/foo.kt | 0 .../configuration/ConfigureKotlinTest.java | 9 ++++ 6 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 idea/testData/configuration/projectWithFreeArgs/module.iml create mode 100644 idea/testData/configuration/projectWithFreeArgs/projectFile.ipr create mode 100644 idea/testData/configuration/projectWithFreeArgs/src/foo.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt index 28498bd4a0f..a25f53fb2e3 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.compiler.configuration import com.intellij.openapi.components.PersistentStateComponent import com.intellij.openapi.components.StoragePathMacros.PROJECT_CONFIG_DIR +import com.intellij.util.ReflectionUtil import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters import com.intellij.util.xmlb.XmlSerializer import org.jdom.Element @@ -64,7 +65,12 @@ abstract class BaseKotlinCompilerSettings protected constructor() override fun getState() = XmlSerializer.serialize(_settings, SKIP_DEFAULT_VALUES) override fun loadState(state: Element) { - _settings = XmlSerializer.deserialize(state, _settings.javaClass) + _settings = ReflectionUtil.newInstance(_settings.javaClass).apply { + if (this is CommonCompilerArguments) { + freeArgs = ArrayList() + } + XmlSerializer.deserializeInto(this, state) + } } public override fun clone(): Any = super.clone() diff --git a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt index 167bb61393c..61636b121d1 100644 --- a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt +++ b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt @@ -58,8 +58,7 @@ private fun readV1Config(element: Element): KotlinFacetSettings { val jvmArgumentsElement = compilerInfoElement?.getOptionBody("k2jvmCompilerArguments") val jsArgumentsElement = compilerInfoElement?.getOptionBody("k2jsCompilerArguments") - val compilerArguments = targetPlatform.createCompilerArguments() - compilerArguments.freeArgs = ArrayList() + val compilerArguments = targetPlatform.createCompilerArguments { freeArgs = ArrayList() } commonArgumentsElement?.let { XmlSerializer.deserializeInto(compilerArguments, it) } when (compilerArguments) { @@ -105,7 +104,7 @@ private fun readV2AndLaterConfig(element: Element): KotlinFacetSettings { XmlSerializer.deserializeInto(compilerSettings!!, it) } element.getChild("compilerArguments")?.let { - compilerArguments = platformKind.createCompilerArguments() + compilerArguments = platformKind.createCompilerArguments { freeArgs = ArrayList() } XmlSerializer.deserializeInto(compilerArguments!!, it) } testOutputPath = element.getChild("testOutputPath")?.let { diff --git a/idea/testData/configuration/projectWithFreeArgs/module.iml b/idea/testData/configuration/projectWithFreeArgs/module.iml new file mode 100644 index 00000000000..4a3ded12725 --- /dev/null +++ b/idea/testData/configuration/projectWithFreeArgs/module.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/projectWithFreeArgs/projectFile.ipr b/idea/testData/configuration/projectWithFreeArgs/projectFile.ipr new file mode 100644 index 00000000000..91a5b5d923d --- /dev/null +++ b/idea/testData/configuration/projectWithFreeArgs/projectFile.ipr @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/projectWithFreeArgs/src/foo.kt b/idea/testData/configuration/projectWithFreeArgs/src/foo.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java index ce782e00879..6347d51a8cb 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java @@ -30,6 +30,7 @@ import com.intellij.psi.PsiRequiresStatement; import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments; import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments; import org.jetbrains.kotlin.config.*; +import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder; import org.jetbrains.kotlin.idea.facet.FacetUtilsKt; import org.jetbrains.kotlin.idea.facet.KotlinFacet; import org.jetbrains.kotlin.idea.framework.JsLibraryStdDetectionUtil; @@ -40,6 +41,7 @@ import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleKt; import java.io.File; import java.io.IOException; +import java.util.Arrays; import java.util.Collections; import java.util.stream.StreamSupport; @@ -264,6 +266,13 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest { checkAddStdlibModule(); } + public void testProjectWithFreeArgs() { + assertEquals( + Collections.singletonList("true"), + KotlinCommonCompilerArgumentsHolder.Companion.getInstance(myProject).getSettings().getFreeArgs() + ); + } + private void checkAddStdlibModule() { doTestOneJavaModule(KotlinWithLibraryConfigurator.FileState.COPY);