From 92d848b6e651abccc9ba0d534a758de21a3d4309 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Tue, 22 May 2018 17:58:59 +0200 Subject: [PATCH] Fix scripting plugin commandline processing --- .../compiler/plugin/ScriptingCommandLineProcessor.kt | 9 ++++++--- .../compiler/plugin/ScriptingCompilerPluginTest.kt | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCommandLineProcessor.kt b/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCommandLineProcessor.kt index c328f994769..c50805a9194 100644 --- a/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCommandLineProcessor.kt +++ b/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCommandLineProcessor.kt @@ -111,11 +111,14 @@ class ScriptingCommandLineProcessor : CommandLineProcessor { val currentEnv = configuration.getMap(ScriptingConfigurationKeys.LEGACY_SCRIPT_RESOLVER_ENVIRONMENT_OPTION).toMutableMap() // parses key/value pairs in the form =, where // - is a single word (\w+ pattern) - // - optionally quoted string with allowed escaped chars (only double-quote and backslash chars are supported) + // - optionally quoted string with allowed escaped chars (only double-quote, comma and backslash chars are supported) // TODO: implement generic unescaping + // TODO: consider switching to simple parser - current approach is too complicated already and doesn't handle quoted commas (unless they are escaped) val envParseRe = """(\w+)=(?:"([^"\\]*(\\.[^"\\]*)*)"|([^\s]*))""".toRegex() - val unescapeRe = """\\(["\\])""".toRegex() - for (envParam in value.split(',')) { + val unescapeRe = """\\(["\\,])""".toRegex() + val splitRe = """(?:\\.|[^,\\]++)*""".toRegex() + val splitMatches = splitRe.findAll(value) + for (envParam in splitMatches.map { it.value }.filter { it.isNotBlank() }) { val match = envParseRe.matchEntire(envParam) if (match == null || match.groupValues.size < 4 || match.groupValues[1].isBlank()) { throw CliOptionProcessingException("Unable to parse script-resolver-environment argument $envParam") diff --git a/plugins/scripting/scripting-cli/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerPluginTest.kt b/plugins/scripting/scripting-cli/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerPluginTest.kt index eef5fdfc811..301a125c0b5 100644 --- a/plugins/scripting/scripting-cli/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerPluginTest.kt +++ b/plugins/scripting/scripting-cli/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerPluginTest.kt @@ -61,8 +61,8 @@ class ScriptingCompilerPluginTest : TestCaseWithTmpdir() { fun testScriptResolverEnvironmentArgsParsing() { - val longStr = (1..100).joinToString { """\" $it aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \\""" } - val unescapeRe = """\\(["\\])""".toRegex() + val longStr = (1..100).joinToString("\\,") { """\" $it aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \\""" } + val unescapeRe = """\\(["\\,])""".toRegex() val cmdlineProcessor = ScriptingCommandLineProcessor() val configuration = CompilerConfiguration()