From e74469fdfc035042a2a1b647a1eedb4c65229a16 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Mon, 1 Oct 2018 14:54:11 +0300 Subject: [PATCH] Use mutable lists before deserialization of project structure The problem is that we perform xml deserialization using intellij mechanism which tries to clear target object if it isn't unmodifiable (see CollectionBinding.isMutableCollection). This check fails for kotlin.EmptyList (emptyList()) which then cause exception #KT-27321 Fixed --- .../BaseKotlinCompilerSettings.kt | 3 +- .../BaseKotlinCompilerSettings.kt.181 | 3 +- .../kotlin/config/facetSerialization.kt | 5 +- .../projectWithInternalArgs/module.iml | 12 +++++ .../projectWithInternalArgs/projectFile.ipr | 47 +++++++++++++++++++ .../projectWithInternalArgs/src/foo.kt | 0 .../configuration/ConfigureKotlinTest.java | 11 +++++ .../ConfigureKotlinTest.java.181 | 11 +++++ 8 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 idea/testData/configuration/projectWithInternalArgs/module.iml create mode 100644 idea/testData/configuration/projectWithInternalArgs/projectFile.ipr create mode 100644 idea/testData/configuration/projectWithInternalArgs/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 6666c64abee..325b1370396 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 @@ -105,7 +105,8 @@ abstract class BaseKotlinCompilerSettings protected constructor(p override fun loadState(state: Element) { _settings = ReflectionUtil.newInstance(_settings.javaClass).apply { if (this is CommonCompilerArguments) { - freeArgs = ArrayList() + freeArgs = mutableListOf() + internalArguments = mutableListOf() } XmlSerializer.deserializeInto(this, state) } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt.181 b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt.181 index 4de48ddbe6c..bdf8f796e92 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt.181 +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt.181 @@ -107,7 +107,8 @@ abstract class BaseKotlinCompilerSettings protected constructor(p override fun loadState(state: Element) { _settings = ReflectionUtil.newInstance(_settings.javaClass).apply { if (this is CommonCompilerArguments) { - freeArgs = ArrayList() + freeArgs = mutableListOf() + internalArguments = mutableListOf() } XmlSerializer.deserializeInto(this, state) } 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 d0480dfbcc5..6350b21a315 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 @@ -138,7 +138,10 @@ private fun readV2AndLaterConfig(element: Element): KotlinFacetSettings { XmlSerializer.deserializeInto(compilerSettings!!, it) } element.getChild("compilerArguments")?.let { - compilerArguments = targetPlatform.createArguments { freeArgs = ArrayList() } + compilerArguments = targetPlatform.createArguments { + freeArgs = mutableListOf() + internalArguments = mutableListOf() + } XmlSerializer.deserializeInto(compilerArguments!!, it) compilerArguments!!.detectVersionAutoAdvance() } diff --git a/idea/testData/configuration/projectWithInternalArgs/module.iml b/idea/testData/configuration/projectWithInternalArgs/module.iml new file mode 100644 index 00000000000..4a3ded12725 --- /dev/null +++ b/idea/testData/configuration/projectWithInternalArgs/module.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/projectWithInternalArgs/projectFile.ipr b/idea/testData/configuration/projectWithInternalArgs/projectFile.ipr new file mode 100644 index 00000000000..41210cdee21 --- /dev/null +++ b/idea/testData/configuration/projectWithInternalArgs/projectFile.ipr @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/projectWithInternalArgs/src/foo.kt b/idea/testData/configuration/projectWithInternalArgs/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 233ced43cee..e323d73d0ad 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java @@ -32,6 +32,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiJavaModule; import com.intellij.psi.PsiRequiresStatement; import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.kotlin.cli.common.arguments.InternalArgument; import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments; import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments; import org.jetbrains.kotlin.config.*; @@ -53,6 +54,7 @@ import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Collections; +import java.util.List; import java.util.stream.StreamSupport; import static java.util.Collections.emptyList; @@ -308,6 +310,15 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest { ); } + public void testProjectWithInternalArgs() { + List internalArguments = + KotlinCommonCompilerArgumentsHolder.Companion.getInstance(myProject).getSettings().getInternalArguments(); + assertEquals( + 0, + internalArguments.size() + ); + } + private void checkAddStdlibModule() { doTestOneJavaModule(KotlinWithLibraryConfigurator.FileState.COPY); diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java.181 b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java.181 index 91a8843eda0..fd84eb3ffaa 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java.181 +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java.181 @@ -32,6 +32,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiJavaModule; import com.intellij.psi.PsiRequiresStatement; import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.kotlin.cli.common.arguments.InternalArgument; import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments; import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments; import org.jetbrains.kotlin.config.*; @@ -53,6 +54,7 @@ import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Collections; +import java.util.List; import java.util.stream.StreamSupport; import static java.util.Collections.emptyList; @@ -308,6 +310,15 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest { ); } + public void testProjectWithInternalArgs() { + List internalArguments = + KotlinCommonCompilerArgumentsHolder.Companion.getInstance(myProject).getSettings().getInternalArguments(); + assertEquals( + 0, + internalArguments.size() + ); + } + private void checkAddStdlibModule() { doTestOneJavaModule(KotlinWithLibraryConfigurator.FileState.COPY);