Support argfiles in CLI with "@argfile"

#KT-24613 Fixed
This commit is contained in:
Alexander Udalov
2018-09-07 15:14:39 +03:00
parent e996513044
commit c4be039cd1
11 changed files with 52 additions and 24 deletions
@@ -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)