Skip to content

Commit 811b897

Browse files
committed
Kotlin Facet: Escape additional compiler arguments when converting them to string and unescape before parsing
#KT-16700 Fixed
1 parent c5ee28d commit 811b897

File tree

5 files changed

+58
-6
lines changed

5 files changed

+58
-6
lines changed

idea/idea-jps-common/src/org/jetbrains/kotlin/config/CompilerSettings.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.jetbrains.kotlin.config
1818

19+
import com.intellij.openapi.util.text.StringUtil
20+
1921
class CompilerSettings {
2022
@JvmField var additionalArguments: String = DEFAULT_ADDITIONAL_ARGUMENTS
2123
@JvmField var scriptTemplates: String = ""
@@ -28,3 +30,8 @@ class CompilerSettings {
2830
private val DEFAULT_OUTPUT_DIRECTORY = "lib"
2931
}
3032
}
33+
34+
val CompilerSettings.additionalArgumentsAsList: List<String>
35+
get() = StringUtil.splitHonorQuotes(additionalArguments, ' ').map {
36+
if (it.startsWith('"')) StringUtil.unescapeChar(StringUtil.unquoteString(it), '"') else it
37+
}

idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
2020
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
2121
import org.jetbrains.kotlin.config.KotlinFacetSettings
2222
import org.jetbrains.kotlin.config.TargetPlatformKind
23+
import org.jetbrains.kotlin.config.additionalArgumentsAsList
2324
import org.jetbrains.kotlin.idea.facet.KotlinFacet
2425
import org.junit.Assert
2526
import java.io.File
@@ -635,6 +636,8 @@ class KotlinMavenImporterTest : MavenImportingTestCase() {
635636
<arg>-jvm-target</arg>
636637
<arg>1.8</arg>
637638
<arg>-Xcoroutines=enable</arg>
639+
<arg>-jdk-home</arg>
640+
<arg>c:\program files\jdk1.8</arg>
638641
</args>
639642
</configuration>
640643
</plugin>
@@ -649,6 +652,10 @@ class KotlinMavenImporterTest : MavenImportingTestCase() {
649652
Assert.assertEquals("JVM 1.8", targetPlatformKind!!.description)
650653
Assert.assertEquals("1.8", (compilerArguments as K2JVMCompilerArguments).jvmTarget)
651654
Assert.assertEquals("enable", coroutineSupport.compilerArgument)
655+
Assert.assertEquals(
656+
listOf("-jdk-home", "c:\\program files\\jdk1.8"),
657+
compilerSettings!!.additionalArgumentsAsList
658+
)
652659
}
653660
}
654661

idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import com.intellij.openapi.projectRoots.JavaSdk
2323
import com.intellij.openapi.projectRoots.JavaSdkVersion
2424
import com.intellij.openapi.roots.ModuleRootManager
2525
import com.intellij.openapi.roots.ModuleRootModel
26+
import com.intellij.openapi.util.text.StringUtil
2627
import org.jetbrains.kotlin.cli.common.arguments.*
2728
import org.jetbrains.kotlin.compilerRunner.ArgumentUtils
2829
import org.jetbrains.kotlin.config.*
@@ -180,7 +181,11 @@ fun parseCompilerArgumentsToFacet(arguments: List<String>, defaultArguments: Lis
180181

181182
val additionalArgumentsString = with(compilerArguments.javaClass.newInstance()) {
182183
copyFieldsSatisfying(compilerArguments, this, ::exposeAsAdditionalArgument)
183-
ArgumentUtils.convertArgumentsToStringList(this).joinToString(separator = " ")
184+
ArgumentUtils.convertArgumentsToStringList(this).joinToString(separator = " ") {
185+
if (StringUtil.containsWhitespaces(it) || it.startsWith('"')) {
186+
StringUtil.wrapWithDoubleQuote(StringUtil.escapeQuotes(it))
187+
} else it
188+
}
184189
}
185190
compilerSettings?.additionalArguments =
186191
if (additionalArgumentsString.isNotEmpty()) additionalArgumentsString else CompilerSettings.DEFAULT_ADDITIONAL_ARGUMENTS

idea/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,7 @@ package org.jetbrains.kotlin.idea.codeInsight.gradle
1818

1919
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
2020
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
21-
import org.jetbrains.kotlin.config.CoroutineSupport
22-
import org.jetbrains.kotlin.config.JvmTarget
23-
import org.jetbrains.kotlin.config.KotlinFacetSettings
24-
import org.jetbrains.kotlin.config.TargetPlatformKind
21+
import org.jetbrains.kotlin.config.*
2522
import org.jetbrains.kotlin.idea.facet.KotlinFacet
2623
import org.junit.Assert
2724
import org.junit.Test
@@ -571,4 +568,39 @@ class GradleFacetImportTest : GradleImportingTestCase() {
571568
Assert.assertEquals(TargetPlatformKind.Common, targetPlatformKind)
572569
}
573570
}
571+
572+
@Test
573+
fun testArgumentEscaping() {
574+
createProjectSubFile("build.gradle", """
575+
group 'Again'
576+
version '1.0-SNAPSHOT'
577+
578+
buildscript {
579+
repositories {
580+
mavenCentral()
581+
maven {
582+
url 'http://dl.bintray.com/kotlin/kotlin-eap-1.1'
583+
}
584+
}
585+
586+
dependencies {
587+
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.0")
588+
}
589+
}
590+
591+
apply plugin: 'kotlin-platform-jvm'
592+
593+
compileKotlin {
594+
kotlinOptions.jdkHome = "c:\\program files\\jdk1.8"
595+
}
596+
""")
597+
importProject()
598+
599+
with (facetSettings) {
600+
Assert.assertEquals(
601+
listOf("-jdk-home", "c:\\program files\\jdk1.8", "-Xmulti-platform"),
602+
compilerSettings!!.additionalArgumentsAsList
603+
)
604+
}
605+
}
574606
}

jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsKotlinCompilerRunner.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.cli.common.arguments.mergeBeans
2626
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
2727
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
2828
import org.jetbrains.kotlin.config.CompilerSettings
29+
import org.jetbrains.kotlin.config.additionalArgumentsAsList
2930
import org.jetbrains.kotlin.daemon.common.*
3031
import org.jetbrains.kotlin.jps.build.KotlinBuilder
3132
import java.io.ByteArrayOutputStream
@@ -129,7 +130,7 @@ class JpsKotlinCompilerRunner : KotlinCompilerRunner<JpsCompilerEnvironment>() {
129130

130131
private fun withAdditionalCompilerArgs(compilerArgs: CommonCompilerArguments): Array<String> {
131132
val allArgs = ArgumentUtils.convertArgumentsToStringList(compilerArgs) +
132-
(compilerSettings?.additionalArguments?.split(" ") ?: emptyList())
133+
(compilerSettings?.additionalArgumentsAsList ?: emptyList())
133134
return allArgs.toTypedArray()
134135
}
135136

0 commit comments

Comments
 (0)