Support argfiles in CLI with "@argfile"
#KT-24613 Fixed
This commit is contained in:
+21
-11
@@ -10,7 +10,8 @@ import java.io.FileNotFoundException
|
||||
import java.io.IOException
|
||||
import java.io.Reader
|
||||
|
||||
private const val EXPERIMENTAL_ARGFILE_ARGUMENT = "-Xargfile"
|
||||
const val ARGFILE_ARGUMENT = "@"
|
||||
private const val EXPERIMENTAL_ARGFILE_ARGUMENT = "-Xargfile="
|
||||
|
||||
private const val SINGLE_QUOTE = '\''
|
||||
private const val DOUBLE_QUOTE = '"'
|
||||
@@ -24,11 +25,16 @@ private const val NEWLINE = '\n'
|
||||
* will be used instead of actual passed arguments.
|
||||
*/
|
||||
internal fun preprocessCommandLineArguments(args: List<String>, errors: ArgumentParseErrors): List<String> =
|
||||
args.flatMap {
|
||||
if (it.isArgumentForArgfile)
|
||||
File(it.argfilePath).expand(errors)
|
||||
else
|
||||
listOf(it)
|
||||
args.flatMap { arg ->
|
||||
if (arg.isArgfileArgument) {
|
||||
File(arg.argfilePath).expand(errors)
|
||||
} else if (arg.isDeprecatedArgfileArgument) {
|
||||
errors.deprecatedArguments[EXPERIMENTAL_ARGFILE_ARGUMENT] = ARGFILE_ARGUMENT
|
||||
|
||||
File(arg.deprecatedArgfilePath).expand(errors)
|
||||
} else {
|
||||
listOf(arg)
|
||||
}
|
||||
}
|
||||
|
||||
private fun File.expand(errors: ArgumentParseErrors): List<String> {
|
||||
@@ -80,9 +86,13 @@ private fun Reader.nextChar(): Char? =
|
||||
read().takeUnless { it == -1 }?.toChar()
|
||||
|
||||
private val String.argfilePath: String
|
||||
get() = removePrefix("$EXPERIMENTAL_ARGFILE_ARGUMENT=")
|
||||
get() = removePrefix(ARGFILE_ARGUMENT)
|
||||
|
||||
// Note that currently we use only experimental syntax for passing argfiles
|
||||
// In 1.3 we can support also javac-like syntax `@argfile`
|
||||
private val String.isArgumentForArgfile: Boolean
|
||||
get() = startsWith("$EXPERIMENTAL_ARGFILE_ARGUMENT=")
|
||||
private val String.isArgfileArgument: Boolean
|
||||
get() = startsWith(ARGFILE_ARGUMENT)
|
||||
|
||||
private val String.deprecatedArgfilePath: String
|
||||
get() = removePrefix(EXPERIMENTAL_ARGFILE_ARGUMENT)
|
||||
|
||||
private val String.isDeprecatedArgfileArgument: Boolean
|
||||
get() = startsWith(EXPERIMENTAL_ARGFILE_ARGUMENT)
|
||||
|
||||
Reference in New Issue
Block a user