Skip to content

Commit 3a2c435

Browse files
committed
Revert "Merge branch 'rmunn-feature/multi-instance-args' by @tydunkel, @rmunn into develop"
This reverts commit 6caf728, reversing changes made to 4c2a115.
1 parent c52e8fb commit 3a2c435

16 files changed

+89
-526
lines changed

src/CommandLine/Core/InstanceBuilder.cs

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -23,31 +23,6 @@ public static ParserResult<T> Build<T>(
2323
bool autoHelp,
2424
bool autoVersion,
2525
IEnumerable<ErrorType> nonFatalErrors)
26-
{
27-
return Build(
28-
factory,
29-
tokenizer,
30-
arguments,
31-
nameComparer,
32-
ignoreValueCase,
33-
parsingCulture,
34-
autoHelp,
35-
autoVersion,
36-
false,
37-
nonFatalErrors);
38-
}
39-
40-
public static ParserResult<T> Build<T>(
41-
Maybe<Func<T>> factory,
42-
Func<IEnumerable<string>, IEnumerable<OptionSpecification>, Result<IEnumerable<Token>, Error>> tokenizer,
43-
IEnumerable<string> arguments,
44-
StringComparer nameComparer,
45-
bool ignoreValueCase,
46-
CultureInfo parsingCulture,
47-
bool autoHelp,
48-
bool autoVersion,
49-
bool allowMultiInstance,
50-
IEnumerable<ErrorType> nonFatalErrors)
5126
{
5227
var typeInfo = factory.MapValueOrDefault(f => f().GetType(), typeof(T));
5328

@@ -95,7 +70,7 @@ public static ParserResult<T> Build<T>(
9570
var valueSpecPropsResult =
9671
ValueMapper.MapValues(
9772
(from pt in specProps where pt.Specification.IsValue() orderby ((ValueSpecification)pt.Specification).Index select pt),
98-
valuesPartition,
73+
valuesPartition,
9974
(vals, type, isScalar) => TypeConverter.ChangeType(vals, type, isScalar, parsingCulture, ignoreValueCase));
10075

10176
var missingValueErrors = from token in errorsPartition
@@ -111,7 +86,7 @@ public static ParserResult<T> Build<T>(
11186

11287
//build the instance, determining if the type is mutable or not.
11388
T instance;
114-
if (typeInfo.IsMutable() == true)
89+
if(typeInfo.IsMutable() == true)
11590
{
11691
instance = BuildMutable(factory, specPropsWithValue, setPropertyErrors);
11792
}
@@ -120,7 +95,7 @@ public static ParserResult<T> Build<T>(
12095
instance = BuildImmutable(typeInfo, factory, specProps, specPropsWithValue, setPropertyErrors);
12196
}
12297

123-
var validationErrors = specPropsWithValue.Validate(SpecificationPropertyRules.Lookup(tokens, allowMultiInstance));
98+
var validationErrors = specPropsWithValue.Validate(SpecificationPropertyRules.Lookup(tokens));
12499

125100
var allErrors =
126101
tokenizerResult.SuccessMessages()

src/CommandLine/Core/InstanceChooser.cs

Lines changed: 18 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -22,31 +22,6 @@ public static ParserResult<object> Choose(
2222
bool autoHelp,
2323
bool autoVersion,
2424
IEnumerable<ErrorType> nonFatalErrors)
25-
{
26-
return Choose(
27-
tokenizer,
28-
types,
29-
arguments,
30-
nameComparer,
31-
ignoreValueCase,
32-
parsingCulture,
33-
autoHelp,
34-
autoVersion,
35-
false,
36-
nonFatalErrors);
37-
}
38-
39-
public static ParserResult<object> Choose(
40-
Func<IEnumerable<string>, IEnumerable<OptionSpecification>, Result<IEnumerable<Token>, Error>> tokenizer,
41-
IEnumerable<Type> types,
42-
IEnumerable<string> arguments,
43-
StringComparer nameComparer,
44-
bool ignoreValueCase,
45-
CultureInfo parsingCulture,
46-
bool autoHelp,
47-
bool autoVersion,
48-
bool allowMultiInstance,
49-
IEnumerable<ErrorType> nonFatalErrors)
5025
{
5126
var verbs = Verb.SelectFromTypes(types);
5227
var defaultVerbs = verbs.Where(t => t.Item1.IsDefault);
@@ -71,8 +46,10 @@ bool preprocCompare(string command) =>
7146
arguments.Skip(1).FirstOrDefault() ?? string.Empty, nameComparer))
7247
: (autoVersion && preprocCompare("version"))
7348
? MakeNotParsed(types, new VersionRequestedError())
74-
: MatchVerb(tokenizer, verbs, defaultVerb, arguments, nameComparer, ignoreValueCase, parsingCulture, autoHelp, autoVersion, allowMultiInstance, nonFatalErrors);
75-
}
49+
50+
: MatchVerb(tokenizer, verbs, defaultVerb, arguments, nameComparer, ignoreValueCase, parsingCulture, autoHelp, autoVersion, nonFatalErrors);
51+
};
52+
7653

7754
return arguments.Any()
7855
? choose()
@@ -117,32 +94,24 @@ private static ParserResult<object> MatchVerb(
11794
CultureInfo parsingCulture,
11895
bool autoHelp,
11996
bool autoVersion,
120-
bool allowMultiInstance,
12197
IEnumerable<ErrorType> nonFatalErrors)
12298
{
123-
string firstArg = arguments.First();
12499

125-
var verbUsed = verbs.FirstOrDefault(vt =>
126-
nameComparer.Equals(vt.Item1.Name, firstArg)
127-
|| vt.Item1.Aliases.Any(alias => nameComparer.Equals(alias, firstArg))
128-
);
100+
return verbs.Any(a => nameComparer.Equals(a.Item1.Name, arguments.First()))
101+
? InstanceBuilder.Build(
102+
Maybe.Just<Func<object>>(
103+
() =>
104+
verbs.Single(v => nameComparer.Equals(v.Item1.Name, arguments.First())).Item2.AutoDefault()),
105+
tokenizer,
106+
arguments.Skip(1),
107+
nameComparer,
108+
ignoreValueCase,
109+
parsingCulture,
110+
autoHelp,
111+
autoVersion,
112+
nonFatalErrors)
113+
: MatchDefaultVerb(tokenizer, verbs, defaultVerb, arguments, nameComparer, ignoreValueCase, parsingCulture, autoHelp, autoVersion, nonFatalErrors);
129114

130-
if (verbUsed == default)
131-
{
132-
return MatchDefaultVerb(tokenizer, verbs, defaultVerb, arguments, nameComparer, ignoreValueCase, parsingCulture, autoHelp, autoVersion, nonFatalErrors);
133-
}
134-
return InstanceBuilder.Build(
135-
Maybe.Just<Func<object>>(
136-
() => verbUsed.Item2.AutoDefault()),
137-
tokenizer,
138-
arguments.Skip(1),
139-
nameComparer,
140-
ignoreValueCase,
141-
parsingCulture,
142-
autoHelp,
143-
autoVersion,
144-
allowMultiInstance,
145-
nonFatalErrors);
146115
}
147116

148117
private static HelpVerbRequestedError MakeHelpVerbRequestedError(

src/CommandLine/Core/OptionMapper.cs

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,32 +22,26 @@ public static Result<
2222
.Select(
2323
pt =>
2424
{
25-
var matched = options.Where(s =>
25+
var matched = options.FirstOrDefault(s =>
2626
s.Key.MatchName(((OptionSpecification)pt.Specification).ShortName, ((OptionSpecification)pt.Specification).LongName, comparer)).ToMaybe();
27-
28-
if (matched.IsJust())
29-
{
30-
var matches = matched.GetValueOrDefault(Enumerable.Empty<KeyValuePair<string, IEnumerable<string>>>());
31-
var values = new HashSet<string>();
32-
foreach (var kvp in matches)
33-
{
34-
foreach (var value in kvp.Value)
35-
{
36-
values.Add(value);
37-
}
38-
}
39-
40-
return converter(values, pt.Property.PropertyType, pt.Specification.TargetType != TargetType.Sequence)
41-
.Select(value => Tuple.Create(pt.WithValue(Maybe.Just(value)), Maybe.Nothing<Error>()))
27+
return matched.IsJust()
28+
? (
29+
from sequence in matched
30+
from converted in
31+
converter(
32+
sequence.Value,
33+
pt.Property.PropertyType,
34+
pt.Specification.TargetType != TargetType.Sequence)
35+
select Tuple.Create(
36+
pt.WithValue(Maybe.Just(converted)), Maybe.Nothing<Error>())
37+
)
4238
.GetValueOrDefault(
4339
Tuple.Create<SpecificationProperty, Maybe<Error>>(
4440
pt,
4541
Maybe.Just<Error>(
4642
new BadFormatConversionError(
47-
((OptionSpecification)pt.Specification).FromOptionSpecification()))));
48-
}
49-
50-
return Tuple.Create(pt, Maybe.Nothing<Error>());
43+
((OptionSpecification)pt.Specification).FromOptionSpecification()))))
44+
: Tuple.Create(pt, Maybe.Nothing<Error>());
5145
}
5246
).Memoize();
5347
return Result.Succeed(

src/CommandLine/Core/Sequence.cs

Lines changed: 21 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -14,141 +14,30 @@ public static IEnumerable<Token> Partition(
1414
IEnumerable<Token> tokens,
1515
Func<string, Maybe<TypeDescriptor>> typeLookup)
1616
{
17-
var sequences = new Dictionary<Token, IList<Token>>();
18-
var state = SequenceState.TokenSearch;
19-
Token nameToken = default;
20-
foreach (var token in tokens)
21-
{
22-
switch (state)
23-
{
24-
case SequenceState.TokenSearch:
25-
if (token.IsName())
26-
{
27-
if (typeLookup(token.Text).MatchJust(out var info) && info.TargetType == TargetType.Sequence)
28-
{
29-
nameToken = token;
30-
state = SequenceState.TokenFound;
31-
}
32-
}
33-
break;
34-
35-
case SequenceState.TokenFound:
36-
if (token.IsValue())
37-
{
38-
if (sequences.TryGetValue(nameToken, out var sequence))
39-
{
40-
sequence.Add(token);
41-
}
42-
else
43-
{
44-
sequences[nameToken] = new List<Token>(new[] { token });
45-
}
46-
}
47-
else if (token.IsName())
48-
{
49-
if (typeLookup(token.Text).MatchJust(out var info) && info.TargetType == TargetType.Sequence)
50-
{
51-
nameToken = token;
52-
state = SequenceState.TokenFound;
53-
}
54-
else
55-
{
56-
state = SequenceState.TokenSearch;
57-
}
58-
}
59-
else
60-
{
61-
state = SequenceState.TokenSearch;
62-
}
63-
break;
64-
}
65-
}
66-
67-
foreach (var kvp in sequences)
68-
{
69-
yield return kvp.Key;
70-
foreach (var value in kvp.Value)
71-
{
72-
yield return value;
73-
}
74-
}
75-
76-
//return from tseq in tokens.Pairwise(
77-
//(f, s) =>
78-
// f.IsName() && s.IsValue()
79-
// ? typeLookup(f.Text).MapValueOrDefault(info =>
80-
// info.TargetType == TargetType.Sequence
81-
// ? new[] { f }.Concat(tokens.OfSequence(f, info))
82-
// : new Token[] { }, new Token[] { })
83-
// : new Token[] { })
84-
// from t in tseq
85-
// select t;
17+
return from tseq in tokens.Pairwise(
18+
(f, s) =>
19+
f.IsName() && s.IsValue()
20+
? typeLookup(f.Text).MapValueOrDefault(info =>
21+
info.TargetType == TargetType.Sequence
22+
? new[] { f }.Concat(tokens.OfSequence(f, info))
23+
: new Token[] { }, new Token[] { })
24+
: new Token[] { })
25+
from t in tseq
26+
select t;
8627
}
8728

88-
//private static IEnumerable<Token> OfSequence(this IEnumerable<Token> tokens, Token nameToken, TypeDescriptor info)
89-
//{
90-
// var state = SequenceState.TokenSearch;
91-
// var count = 0;
92-
// var max = info.MaxItems.GetValueOrDefault(int.MaxValue);
93-
// var values = max != int.MaxValue
94-
// ? new List<Token>(max)
95-
// : new List<Token>();
96-
97-
// foreach (var token in tokens)
98-
// {
99-
// if (count == max)
100-
// {
101-
// break;
102-
// }
103-
104-
// switch (state)
105-
// {
106-
// case SequenceState.TokenSearch:
107-
// if (token.IsName() && token.Text.Equals(nameToken.Text))
108-
// {
109-
// state = SequenceState.TokenFound;
110-
// }
111-
// break;
112-
113-
// case SequenceState.TokenFound:
114-
// if (token.IsValue())
115-
// {
116-
// state = SequenceState.ValueFound;
117-
// count++;
118-
// values.Add(token);
119-
// }
120-
// else
121-
// {
122-
// // Invalid to provide option without value
123-
// return Enumerable.Empty<Token>();
124-
// }
125-
// break;
126-
127-
// case SequenceState.ValueFound:
128-
// if (token.IsValue())
129-
// {
130-
// count++;
131-
// values.Add(token);
132-
// }
133-
// else if (token.IsName() && token.Text.Equals(nameToken.Text))
134-
// {
135-
// state = SequenceState.TokenFound;
136-
// }
137-
// else
138-
// {
139-
// state = SequenceState.TokenSearch;
140-
// }
141-
// break;
142-
// }
143-
// }
144-
145-
// return values;
146-
//}
147-
148-
private enum SequenceState
29+
private static IEnumerable<Token> OfSequence(this IEnumerable<Token> tokens, Token nameToken, TypeDescriptor info)
14930
{
150-
TokenSearch,
151-
TokenFound,
31+
var nameIndex = tokens.IndexOf(t => t.Equals(nameToken));
32+
if (nameIndex >= 0)
33+
{
34+
return info.NextValue.MapValueOrDefault(
35+
_ => info.MaxItems.MapValueOrDefault(
36+
n => tokens.Skip(nameIndex + 1).Take(n),
37+
tokens.Skip(nameIndex + 1).TakeWhile(v => v.IsValue())),
38+
tokens.Skip(nameIndex + 1).TakeWhile(v => v.IsValue()));
39+
}
40+
return new Token[] { };
15241
}
15342
}
15443
}

0 commit comments

Comments
 (0)