From dc31c76ad28856378d5576e112d8dfb67f31ff8c Mon Sep 17 00:00:00 2001 From: cpendery Date: Mon, 18 Sep 2023 02:18:00 -0400 Subject: [PATCH] fix: bad variadic handling with options after variadic arg used Signed-off-by: cpendery --- autocomplete/completion.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/autocomplete/completion.go b/autocomplete/completion.go index 64c833e..98c35b3 100644 --- a/autocomplete/completion.go +++ b/autocomplete/completion.go @@ -137,7 +137,7 @@ func getSubcommandDrivenRecommendation(spec model.Subcommand, persistentOptions } } -func getArgDrivenRecommendation(args []model.Arg, spec model.Subcommand, persistentOptions []model.Option, partialCmd *commandToken, acceptedTokens []model.ProcessedToken) model.TermSuggestions { +func getArgDrivenRecommendation(args []model.Arg, spec model.Subcommand, persistentOptions []model.Option, partialCmd *commandToken, acceptedTokens []model.ProcessedToken, variadicArgIsBound bool) model.TermSuggestions { suggestions := []model.TermSuggestion{} activeArg := args[0] allOptions := append(spec.Options, persistentOptions...) @@ -150,7 +150,7 @@ func getArgDrivenRecommendation(args []model.Arg, spec model.Subcommand, persist getSuggestionDrivenRecommendations(activeArg.Suggestions, &suggestions, partialToken, activeArg.FilterStrategy) getTemplateDrivenRecommendations(activeArg.Templates, &suggestions, partialToken, activeArg.FilterStrategy) - if activeArg.IsOptional { + if (activeArg.IsOptional && !activeArg.IsVariadic) || (activeArg.IsVariadic && activeArg.IsOptional && !variadicArgIsBound) { getSubcommandDrivenRecommendations(spec, &suggestions, partialToken, activeArg.FilterStrategy) getOptionDrivenRecommendations(allOptions, &suggestions, acceptedTokens, partialToken, activeArg.FilterStrategy) } @@ -186,7 +186,7 @@ func handleSubcommand(tokens []commandToken, spec model.Subcommand, persistentOp return handleSubcommand(tokens[1:], *subcommand, persistentOptions, false, false, getPersistentTokens(acceptedTokens)) } - return handleArg(tokens, spec.Args, spec, persistentOptions, acceptedTokens, false) + return handleArg(tokens, spec.Args, spec, persistentOptions, acceptedTokens, false, false) } func handleOption(tokens []commandToken, option model.Option, spec model.Subcommand, persistentOptions []model.Option, acceptedTokens []model.ProcessedToken) (suggestions model.TermSuggestions) { @@ -209,16 +209,16 @@ persistenceDetermined: if len(option.Args) == 0 { return handleSubcommand(tokens[1:], spec, persistentOptions, false, false, acceptedTokens) } - return handleArg(tokens[1:], option.Args, spec, persistentOptions, acceptedTokens, true) + return handleArg(tokens[1:], option.Args, spec, persistentOptions, acceptedTokens, true, false) } -func handleArg(tokens []commandToken, args []model.Arg, spec model.Subcommand, persistentOptions []model.Option, acceptedTokens []model.ProcessedToken, fromOption bool) (suggestions model.TermSuggestions) { +func handleArg(tokens []commandToken, args []model.Arg, spec model.Subcommand, persistentOptions []model.Option, acceptedTokens []model.ProcessedToken, fromOption, fromVariadic bool) (suggestions model.TermSuggestions) { if len(args) == 0 { return handleSubcommand(tokens, spec, persistentOptions, true, !fromOption, acceptedTokens) } else if len(tokens) == 0 { - return getArgDrivenRecommendation(args, spec, persistentOptions, nil, acceptedTokens) + return getArgDrivenRecommendation(args, spec, persistentOptions, nil, acceptedTokens, fromVariadic) } else if !tokens[0].complete { - return getArgDrivenRecommendation(args, spec, persistentOptions, &tokens[0], acceptedTokens) + return getArgDrivenRecommendation(args, spec, persistentOptions, &tokens[0], acceptedTokens, fromVariadic) } activeCmd := tokens[0] @@ -238,7 +238,7 @@ func handleArg(tokens []commandToken, args []model.Arg, spec model.Subcommand, p activeArg := args[0] acceptedTokens = append(acceptedTokens, model.ProcessedToken{Token: activeCmd.token, Persist: false}) if activeArg.IsVariadic { - return handleArg(tokens[1:], args, spec, persistentOptions, acceptedTokens, fromOption) + return handleArg(tokens[1:], args, spec, persistentOptions, acceptedTokens, fromOption, true) } else if activeArg.IsCommand { if len(tokens) <= 1 { return @@ -249,7 +249,7 @@ func handleArg(tokens []commandToken, args []model.Arg, spec model.Subcommand, p } return } - return handleArg(tokens[1:], args[1:], spec, persistentOptions, acceptedTokens, fromOption) + return handleArg(tokens[1:], args[1:], spec, persistentOptions, acceptedTokens, fromOption, false) } func loadSuggestions(cmd string) (suggestions model.TermSuggestions, charsInLastCmd int) {