Kotlin Facet: Escape additional compiler arguments when converting them to string and unescape before parsing
#KT-16700 Fixed
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user