in jvm-agent/src/main/org/jetbrains/lincheck/jvm/agent/TraceAgentParameters.kt [114:160]
fun parseArgs(args: String?, validAdditionalArgs: List<String>) {
if (args == null) {
error("Please provide class and method names as arguments")
}
// Store for metainformation
rawArgs = args
// Try to parse key=value format
val kvArguments = parseKVArgs(args)
if (kvArguments == null) {
Logger.warn { "Looks like old-style arguments found, consider migrate to key-value arguments" }
val actualArguments = splitArgs(args)
classUnderTraceDebugging = actualArguments.getOrNull(0) ?: error("Class name was not provided")
namedArgs[ARGUMENT_CLASS] = classUnderTraceDebugging
methodUnderTraceDebugging = actualArguments.getOrNull(1) ?: error("Method name was not provided")
namedArgs[ARGUMENT_METHOD] = methodUnderTraceDebugging
setClassUnderTraceDebuggingToMethodOwner()
traceDumpFilePath = actualArguments.getOrNull(2)
namedArgs[ARGUMENT_OUTPUT] = traceDumpFilePath
for (idx in 3 ..< actualArguments.size) {
if (idx - 3 == validAdditionalArgs.size) {
// Allows unused arguments for backward compatibility
break
}
namedArgs[validAdditionalArgs[idx - 3]] = actualArguments[idx]
}
} else {
classUnderTraceDebugging = kvArguments[ARGUMENT_CLASS]
?: error("Class name argument \"$ARGUMENT_CLASS\" was not provided")
methodUnderTraceDebugging = kvArguments[ARGUMENT_METHOD]
?: error("Method name argument \"$ARGUMENT_METHOD\" was not provided")
setClassUnderTraceDebuggingToMethodOwner()
traceDumpFilePath = kvArguments[ARGUMENT_OUTPUT]
val allowedKeys = mutableSetOf(ARGUMENT_CLASS, ARGUMENT_METHOD, ARGUMENT_OUTPUT)
allowedKeys.addAll(validAdditionalArgs)
val unsupportedKeys = kvArguments.keys - allowedKeys
unsupportedKeys.forEach {
Logger.warn { "Unknown agent argument \"$it\"" }
}
namedArgs.putAll(kvArguments)
}
}