[CLI] create ArgumentParseErrors instances on request

spare memory for projects with big number of modules
currently 500kb for IJ monorepo of mostly empty errors
This commit is contained in:
Anna Kozlova
2023-01-31 14:38:07 +01:00
committed by Space Team
parent f7f50ca842
commit 48b1456290
3 changed files with 16 additions and 16 deletions
@@ -65,7 +65,7 @@ data class ArgumentParseErrors(
// Parses arguments into the passed [result] object. Errors related to the parsing will be collected into [CommonToolArguments.errors].
fun <A : CommonToolArguments> parseCommandLineArguments(args: List<String>, result: A, overrideArguments: Boolean = false) {
val errors = result.errors ?: ArgumentParseErrors().also { result.errors = it }
val errors = lazy { result.errors ?: ArgumentParseErrors().also { result.errors = it } }
val preprocessed = preprocessCommandLineArguments(args, errors)
parsePreprocessedCommandLineArguments(preprocessed, result, errors, overrideArguments)
}
@@ -81,7 +81,7 @@ fun <A : CommonToolArguments> parseCommandLineArgumentsFromEnvironment(arguments
private fun <A : CommonToolArguments> parsePreprocessedCommandLineArguments(
args: List<String>,
result: A,
errors: ArgumentParseErrors,
errors: Lazy<ArgumentParseErrors>,
overrideArguments: Boolean
) {
data class ArgumentField(val property: KMutableProperty1<A, Any?>, val argument: Argument)
@@ -103,13 +103,13 @@ private fun <A : CommonToolArguments> parsePreprocessedCommandLineArguments(
val deprecatedName = argument.deprecatedName
if (deprecatedName.isNotEmpty() && (deprecatedName == arg || arg.startsWith("$deprecatedName="))) {
errors.deprecatedArguments[deprecatedName] = argument.value
errors.value.deprecatedArguments[deprecatedName] = argument.value
return true
}
if (argument.value == arg) {
if (argument.isAdvanced && property.returnType.classifier != Boolean::class) {
errors.extraArgumentsPassedInObsoleteForm.add(arg)
errors.value.extraArgumentsPassedInObsoleteForm.add(arg)
}
return true
}
@@ -140,9 +140,9 @@ private fun <A : CommonToolArguments> parsePreprocessedCommandLineArguments(
val parser = matchingParsers.firstOrNull()
if (parser == null) {
errors.unknownExtraFlags += arg
errors.value.unknownExtraFlags += arg
} else {
val newInternalArgument = parser.parseInternalArgument(arg, errors) ?: continue
val newInternalArgument = parser.parseInternalArgument(arg, errors.value) ?: continue
// Manual language feature setting overrides the previous value of the same feature setting, if it exists.
internalArguments.removeIf {
(it as? ManualLanguageFeatureSetting)?.languageFeature ==
@@ -157,8 +157,8 @@ private fun <A : CommonToolArguments> parsePreprocessedCommandLineArguments(
val argumentField = properties.firstOrNull { it.matches(arg) }
if (argumentField == null) {
when {
arg.startsWith(ADVANCED_ARGUMENT_PREFIX) -> errors.unknownExtraFlags.add(arg)
arg.startsWith("-") -> errors.unknownArgs.add(arg)
arg.startsWith(ADVANCED_ARGUMENT_PREFIX) -> errors.value.unknownExtraFlags.add(arg)
arg.startsWith("-") -> errors.value.unknownArgs.add(arg)
else -> freeArgs.add(arg)
}
continue
@@ -172,7 +172,7 @@ private fun <A : CommonToolArguments> parsePreprocessedCommandLineArguments(
when (arg.substring(argument.value.length + 1)) {
"true" -> true
"false" -> false
else -> true.also { errors.booleanArgumentWithValue = arg }
else -> true.also { errors.value.booleanArgumentWithValue = arg }
}
} else true
}
@@ -183,7 +183,7 @@ private fun <A : CommonToolArguments> parsePreprocessedCommandLineArguments(
arg.substring(argument.deprecatedName.length + 1)
}
i == args.size -> {
errors.argumentWithoutValue = arg
errors.value.argumentWithoutValue = arg
break@loop
}
else -> {
@@ -194,7 +194,7 @@ private fun <A : CommonToolArguments> parsePreprocessedCommandLineArguments(
if ((argumentField.property.returnType.classifier as? KClass<*>)?.java?.isArray == false
&& !visitedArgs.add(argument.value) && value is String && property.get(result) != value
) {
errors.duplicateArguments[argument.value] = value
errors.value.duplicateArguments[argument.value] = value
}
updateField(property, result, value, argument.delimiter, overrideArguments)
@@ -23,14 +23,14 @@ private const val BACKSLASH = '\\'
* This is done prior to *any* arguments parsing, and result of preprocessing
* will be used instead of actual passed arguments.
*/
fun preprocessCommandLineArguments(args: List<String>, errors: ArgumentParseErrors): List<String> =
fun preprocessCommandLineArguments(args: List<String>, errors: Lazy<ArgumentParseErrors>): List<String> =
args.flatMap { arg ->
if (arg.isArgfileArgument) {
File(arg.argfilePath).expand(errors)
File(arg.argfilePath).expand(errors.value)
} else if (arg.isDeprecatedArgfileArgument) {
errors.deprecatedArguments[EXPERIMENTAL_ARGFILE_ARGUMENT] = ARGFILE_ARGUMENT
errors.value.deprecatedArguments[EXPERIMENTAL_ARGFILE_ARGUMENT] = ARGFILE_ARGUMENT
File(arg.deprecatedArgfilePath).expand(errors)
File(arg.deprecatedArgfilePath).expand(errors.value)
} else {
listOf(arg)
}
+1 -1
View File
@@ -39,7 +39,7 @@ fun main(args: Array<String>) {
@TestOnly
internal fun transformArgs(args: List<String>, messageCollector: MessageCollector, isTest: Boolean): List<String> {
val parseErrors = ArgumentParseErrors()
val kotlincTransformed = preprocessCommandLineArguments(args, parseErrors)
val kotlincTransformed = preprocessCommandLineArguments(args, lazy { parseErrors })
val errorMessage = validateArguments(parseErrors)
if (errorMessage != null) {