Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cross referencing arguments cause StackOverflowError #47

Closed
pcoltau opened this issue Jan 28, 2018 · 1 comment
Closed

Cross referencing arguments cause StackOverflowError #47

pcoltau opened this issue Jan 28, 2018 · 1 comment
Labels
Milestone

Comments

@pcoltau
Copy link

pcoltau commented Jan 28, 2018

When cross referencing arguments, it will cause a StackOverflowError.

I have the following Args class:

class Args(parser: ArgParser) {
    val caseInsensitive by parser.flagging("-c", "--case_insensitive",
            help = "Help")

    val includedExtensions by parser.adding("-e", "--include_ext",
            help = "Help")
        { extensionCheckCaseInsensitive() }.default(Collections.emptyList())

    private fun String.extensionCheckCaseInsensitive() =
            if (caseInsensitive) this.toLowerCase() else this
}

The includedExtensions needs to check the other argument caseInsensitive in order to format the extensions. This could be done after the parsing is done, but it is more convenient to do as part of the parser's formatting.

The parser is called like this in the main function:

val parsedArgs: Args
try {
    parsedArgs = ArgParser(args).parseInto(::Args)
} catch (e: SystemExitException) {
    e.printAndExit()
}

When running the above code, it will produce a StackOverflowError, which I did not expect:

Exception in thread "main" java.lang.StackOverflowError
	at java.lang.String.<init>(String.java:207)
	at java.lang.StringBuilder.toString(StringBuilder.java:407)
	at com.xenomachina.argparser.ArgParser.parseShortOpts(ArgParser.kt:579)
	at com.xenomachina.argparser.ArgParser.access$parseShortOpts(ArgParser.kt:38)
	at com.xenomachina.argparser.ArgParser$parseOptions$2.invoke(ArgParser.kt:492)
	at com.xenomachina.argparser.ArgParser$parseOptions$2.invoke(ArgParser.kt:38)
	at kotlin.SynchronizedLazyImpl.getValue(Lazy.kt:131)
	at com.xenomachina.argparser.ArgParser.getParseOptions(ArgParser.kt)
	at com.xenomachina.argparser.ArgParser.force(ArgParser.kt:446)
	at com.xenomachina.argparser.DefaultKt$default$3.getValue(Default.kt:73)
	at com.xenomachina.argparser.ArgParser$Delegate.getValue(ArgParser.kt:340)
	at com.myPackage.Args.getCaseInsensitive(Args.kt)
	at com.myPackage.Args.extensionCheckCaseInsensitive(Args.kt:55)
	at com.myPackage.Args.access$extensionCheckCaseInsensitive(Args.kt:46)
	at com.myPackage.Args$includedExtensions$2.invoke(Args.kt:52)
	at com.myPackage.Args$includedExtensions$2.invoke(Args.kt:46)
	at com.xenomachina.argparser.ArgParser$adding$1.invoke(ArgParser.kt:135)
	at com.xenomachina.argparser.ArgParser$adding$1.invoke(ArgParser.kt:38)
	at com.xenomachina.argparser.OptionDelegate.parseOption(OptionDelegate.kt:60)
	at com.xenomachina.argparser.ArgParser.parseShortOpts(ArgParser.kt:587)
	at com.xenomachina.argparser.ArgParser.access$parseShortOpts(ArgParser.kt:38)
	at com.xenomachina.argparser.ArgParser$parseOptions$2.invoke(ArgParser.kt:492)
	at com.xenomachina.argparser.ArgParser$parseOptions$2.invoke(ArgParser.kt:38)
	at kotlin.SynchronizedLazyImpl.getValue(Lazy.kt:131)
	at com.xenomachina.argparser.ArgParser.getParseOptions(ArgParser.kt)
	at com.xenomachina.argparser.ArgParser.force(ArgParser.kt:446)
	at com.xenomachina.argparser.DefaultKt$default$3.getValue(Default.kt:73)
	at com.xenomachina.argparser.ArgParser$Delegate.getValue(ArgParser.kt:340)
	at com.myPackage.Args.getCaseInsensitive(Args.kt)
	at com.myPackage.Args.extensionCheckCaseInsensitive(Args.kt:55)
	at com.myPackage.Args.access$extensionCheckCaseInsensitive(Args.kt:46)
	at com.myPackage.Args$includedExtensions$2.invoke(Args.kt:52)
	at com.myPackage.Args$includedExtensions$2.invoke(Args.kt:46)
...

Am I doing something wrong, or is this a bug?

xenomachina added a commit that referenced this issue Mar 26, 2018
If an option looks at the value of another option it can see the current
value. If no value has been set a MissingValueException is thrown.
@xenomachina xenomachina added this to the 2.0.7 milestone Mar 26, 2018
@xenomachina
Copy link
Owner

This will be fixed in 2.0.7

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants