Kotlin Facet: Escape additional compiler arguments when converting them to string and unescape before parsing

#KT-16700 Fixed
This commit is contained in:
Alexey Sedunov
2017-03-07 21:21:51 +03:00
parent c5ee28da05
commit 811b8978c2
5 changed files with 58 additions and 6 deletions
@@ -16,6 +16,8 @@
package org.jetbrains.kotlin.config
import com.intellij.openapi.util.text.StringUtil
class CompilerSettings {
@JvmField var additionalArguments: String = DEFAULT_ADDITIONAL_ARGUMENTS
@JvmField var scriptTemplates: String = ""
@@ -28,3 +30,8 @@ class CompilerSettings {
private val DEFAULT_OUTPUT_DIRECTORY = "lib"
}
}
val CompilerSettings.additionalArgumentsAsList: List<String>
get() = StringUtil.splitHonorQuotes(additionalArguments, ' ').map {
if (it.startsWith('"')) StringUtil.unescapeChar(StringUtil.unquoteString(it), '"') else it
}
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.config.KotlinFacetSettings
import org.jetbrains.kotlin.config.TargetPlatformKind
import org.jetbrains.kotlin.config.additionalArgumentsAsList
import org.jetbrains.kotlin.idea.facet.KotlinFacet
import org.junit.Assert
import java.io.File
@@ -635,6 +636,8 @@ class KotlinMavenImporterTest : MavenImportingTestCase() {
<arg>-jvm-target</arg>
<arg>1.8</arg>
<arg>-Xcoroutines=enable</arg>
<arg>-jdk-home</arg>
<arg>c:\program files\jdk1.8</arg>
</args>
</configuration>
</plugin>
@@ -649,6 +652,10 @@ class KotlinMavenImporterTest : MavenImportingTestCase() {
Assert.assertEquals("JVM 1.8", targetPlatformKind!!.description)
Assert.assertEquals("1.8", (compilerArguments as K2JVMCompilerArguments).jvmTarget)
Assert.assertEquals("enable", coroutineSupport.compilerArgument)
Assert.assertEquals(
listOf("-jdk-home", "c:\\program files\\jdk1.8"),
compilerSettings!!.additionalArgumentsAsList
)
}
}
@@ -23,6 +23,7 @@ import com.intellij.openapi.projectRoots.JavaSdk
import com.intellij.openapi.projectRoots.JavaSdkVersion
import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.roots.ModuleRootModel
import com.intellij.openapi.util.text.StringUtil
import org.jetbrains.kotlin.cli.common.arguments.*
import org.jetbrains.kotlin.compilerRunner.ArgumentUtils
import org.jetbrains.kotlin.config.*
@@ -180,7 +181,11 @@ fun parseCompilerArgumentsToFacet(arguments: List<String>, defaultArguments: Lis
val additionalArgumentsString = with(compilerArguments.javaClass.newInstance()) {
copyFieldsSatisfying(compilerArguments, this, ::exposeAsAdditionalArgument)
ArgumentUtils.convertArgumentsToStringList(this).joinToString(separator = " ")
ArgumentUtils.convertArgumentsToStringList(this).joinToString(separator = " ") {
if (StringUtil.containsWhitespaces(it) || it.startsWith('"')) {
StringUtil.wrapWithDoubleQuote(StringUtil.escapeQuotes(it))
} else it
}
}
compilerSettings?.additionalArguments =
if (additionalArgumentsString.isNotEmpty()) additionalArgumentsString else CompilerSettings.DEFAULT_ADDITIONAL_ARGUMENTS
@@ -18,10 +18,7 @@ package org.jetbrains.kotlin.idea.codeInsight.gradle
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.config.CoroutineSupport
import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.config.KotlinFacetSettings
import org.jetbrains.kotlin.config.TargetPlatformKind
import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.idea.facet.KotlinFacet
import org.junit.Assert
import org.junit.Test
@@ -571,4 +568,39 @@ class GradleFacetImportTest : GradleImportingTestCase() {
Assert.assertEquals(TargetPlatformKind.Common, targetPlatformKind)
}
}
@Test
fun testArgumentEscaping() {
createProjectSubFile("build.gradle", """
group 'Again'
version '1.0-SNAPSHOT'
buildscript {
repositories {
mavenCentral()
maven {
url 'http://dl.bintray.com/kotlin/kotlin-eap-1.1'
}
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.0")
}
}
apply plugin: 'kotlin-platform-jvm'
compileKotlin {
kotlinOptions.jdkHome = "c:\\program files\\jdk1.8"
}
""")
importProject()
with (facetSettings) {
Assert.assertEquals(
listOf("-jdk-home", "c:\\program files\\jdk1.8", "-Xmulti-platform"),
compilerSettings!!.additionalArgumentsAsList
)
}
}
}
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.cli.common.arguments.mergeBeans
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.config.CompilerSettings
import org.jetbrains.kotlin.config.additionalArgumentsAsList
import org.jetbrains.kotlin.daemon.common.*
import org.jetbrains.kotlin.jps.build.KotlinBuilder
import java.io.ByteArrayOutputStream
@@ -129,7 +130,7 @@ class JpsKotlinCompilerRunner : KotlinCompilerRunner<JpsCompilerEnvironment>() {
private fun withAdditionalCompilerArgs(compilerArgs: CommonCompilerArguments): Array<String> {
val allArgs = ArgumentUtils.convertArgumentsToStringList(compilerArgs) +
(compilerSettings?.additionalArguments?.split(" ") ?: emptyList())
(compilerSettings?.additionalArgumentsAsList ?: emptyList())
return allArgs.toTypedArray()
}