fun parseArgs()

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)
        }
    }