diff --git a/src/System.CommandLine/Command.cs b/src/System.CommandLine/Command.cs index be565651d2..682408088d 100644 --- a/src/System.CommandLine/Command.cs +++ b/src/System.CommandLine/Command.cs @@ -268,9 +268,10 @@ public override IEnumerable GetCompletions(CompletionContext con if (HasSubcommands) { var commands = Subcommands; + var textToMatchIsCommandName = context.ParseResult.CommandResult.Command.Name.IndexOfCaseInsensitive(textToMatch) >= 0; for (int i = 0; i < commands.Count; i++) { - AddCompletionsFor(commands[i], commands[i]._aliases); + AddCompletionsFor(commands[i], commands[i]._aliases, textToMatchIsCommandName ? null : textToMatch); } } @@ -279,7 +280,7 @@ public override IEnumerable GetCompletions(CompletionContext con var options = Options; for (int i = 0; i < options.Count; i++) { - AddCompletionsFor(options[i], options[i]._aliases); + AddCompletionsFor(options[i], options[i]._aliases, textToMatch); } } @@ -314,7 +315,7 @@ public override IEnumerable GetCompletions(CompletionContext con if (option.Recursive) { - AddCompletionsFor(option, option._aliases); + AddCompletionsFor(option, option._aliases, textToMatch); } } } @@ -331,11 +332,11 @@ public override IEnumerable GetCompletions(CompletionContext con .OrderBy(item => item.SortText.IndexOfCaseInsensitive(context.WordToComplete)) .ThenBy(symbol => symbol.Label, StringComparer.OrdinalIgnoreCase); - void AddCompletionsFor(Symbol identifier, AliasSet? aliases) + void AddCompletionsFor(Symbol identifier, AliasSet? aliases, string? textToMatch) { if (!identifier.Hidden) { - if (identifier.Name.ContainsCaseInsensitive(textToMatch)) + if (textToMatch is null || identifier.Name.ContainsCaseInsensitive(textToMatch)) { completions.Add(new CompletionItem(identifier.Name, CompletionItem.KindKeyword, detail: identifier.Description)); } @@ -344,7 +345,7 @@ void AddCompletionsFor(Symbol identifier, AliasSet? aliases) { foreach (string alias in aliases) { - if (alias.ContainsCaseInsensitive(textToMatch)) + if (textToMatch is null || alias.ContainsCaseInsensitive(textToMatch)) { completions.Add(new CompletionItem(alias, CompletionItem.KindKeyword, detail: identifier.Description)); } diff --git a/src/System.CommandLine/Completions/CompletionAction.cs b/src/System.CommandLine/Completions/CompletionAction.cs index 44cee60f58..c8337f7928 100644 --- a/src/System.CommandLine/Completions/CompletionAction.cs +++ b/src/System.CommandLine/Completions/CompletionAction.cs @@ -22,11 +22,11 @@ public override int Invoke(ParseResult parseResult) string? parsedValues = parseResult.GetResult(_directive)!.Values.SingleOrDefault(); string? rawInput = parseResult.CommandLineText; - int position = !string.IsNullOrEmpty(parsedValues) ? int.Parse(parsedValues) : rawInput?.Length ?? 0; + int? position = !string.IsNullOrEmpty(parsedValues) ? int.Parse(parsedValues) : rawInput?.Length; var commandLineToComplete = parseResult.Tokens.LastOrDefault(t => t.Type != TokenType.Directive)?.Value ?? ""; - var completionParseResult = parseResult.RootCommandResult.Command.Parse(commandLineToComplete, parseResult.Configuration); + var completionParseResult = parseResult.CommandResult.Command.Parse(commandLineToComplete, parseResult.Configuration); var completions = completionParseResult.GetCompletions(position);