-
Notifications
You must be signed in to change notification settings - Fork 34
Closed
Description
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?