Skip to content

Commit 33f5798

Browse files
authored
Minor perf tweaks (#1185)
1 parent 16e687b commit 33f5798

File tree

2 files changed

+32
-12
lines changed

2 files changed

+32
-12
lines changed

src/System.CommandLine.Tests/OptionTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,7 @@ public void When_aliases_overlap_the_longer_alias_is_chosen(string parseInput)
502502
var option = new Option<string>(new[] { "-o", "-option" });
503503

504504
var parseResult = option.Parse(parseInput);
505+
505506
parseResult.ValueForOption(option).Should().Be("value");
506507
}
507508

src/System.CommandLine/Parsing/StringExtensions.cs

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,18 @@ bool CanBeUnbundled(string arg, out IReadOnlyList<string>? replacement)
190190
{
191191
replacement = null;
192192

193-
if (arg.Length > 0 && arg[0] != '-')
193+
if (arg.Length < 2)
194+
{
195+
return false;
196+
}
197+
198+
if (arg[0] != '-')
199+
{
200+
return false;
201+
}
202+
203+
// don't unbundle if this is a known token
204+
if (knownTokens.ContainsKey(arg))
194205
{
195206
return false;
196207
}
@@ -201,22 +212,30 @@ bool CanBeUnbundled(string arg, out IReadOnlyList<string>? replacement)
201212
currentCommand?.Children.GetByAlias(lastToken.Value) is IOption option &&
202213
option.Argument.Arity.MinimumNumberOfValues > 0)
203214
{
204-
return false;
215+
return false;
205216
}
206217

207-
// don't unbundle if this is a known option
208-
if (knownTokens.ContainsKey(arg) ||
209-
knownTokens
210-
.SelectMany(token => _argumentDelimiters.Select(delimiter => token.Key + delimiter))
211-
.Any(token => arg.Contains(token)))
218+
// don't unbundle if arg contains an argument token, e.g. "value" in "-abc:value"
219+
for (var i = 0; i < _argumentDelimiters.Length; i++)
212220
{
213-
return false;
214-
}
221+
var delimiter = _argumentDelimiters[i];
222+
223+
if (arg.Contains(delimiter))
224+
{
225+
foreach (var knownToken in knownTokens.Keys)
226+
{
227+
if (arg.StartsWith(knownToken + delimiter))
228+
{
229+
return false;
230+
}
231+
}
232+
}
233+
}
215234

216-
var (prefix, alias) = arg.SplitPrefix();
235+
// remove the leading "-"
236+
var alias = arg.Substring(1);
217237

218-
return prefix == "-" &&
219-
TryUnbundle(out replacement);
238+
return TryUnbundle(out replacement);
220239

221240
Token? TokenForOptionAlias(char c)
222241
{

0 commit comments

Comments
 (0)