Skip to content

Commit 71d51af

Browse files
committed
Complete repeatable positional instances after the first in fish.
Signed-off-by: Ross Goldberg <484615+rgoldberg@users.noreply.github.com>
1 parent a2eadfb commit 71d51af

File tree

3 files changed

+41
-18
lines changed

3 files changed

+41
-18
lines changed

Sources/ArgumentParser/Completions/FishCompletionsGenerator.swift

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,20 @@ extension ToolInfoV0 {
2424
extension CommandInfoV0 {
2525
fileprivate var fishCompletionScript: String {
2626
"""
27-
function \(shouldOfferCompletionsForFunctionName) -a expected_commands -a expected_positional_index
27+
function \(shouldOfferCompletionsForFunctionName) -a expected_commands expected_positional_index positional_index_comparison
2828
set -l unparsed_tokens (\(tokensFunctionName) -pc)
2929
set -l positional_index 0
3030
set -l commands
3131
32+
if test -z $positional_index_comparison
33+
set positional_index_comparison -eq
34+
end
35+
3236
switch $unparsed_tokens[1]
3337
\(commandCases)
3438
end
3539
36-
test "$commands" = "$expected_commands" -a \\( -z "$expected_positional_index" -o "$expected_positional_index" -eq "$positional_index" \\)
40+
test "$commands" = "$expected_commands" -a \\( -z "$expected_positional_index" -o "$positional_index" "$positional_index_comparison" "$expected_positional_index" \\)
3741
end
3842
3943
function \(tokensFunctionName)
@@ -123,21 +127,32 @@ extension CommandInfoV0 {
123127

124128
var positionalIndex = 0
125129

130+
var repeatingPositionalComparison = ""
126131
let argumentCompletions =
127132
completableArguments
128-
.map { arg in
129-
"""
130-
\(prefix)\(
131-
arg.kind == .positional
132-
? """
133-
\({
134-
positionalIndex += 1
135-
return " \(positionalIndex)"
136-
}())
133+
.compactMap { arg in
134+
if arg.kind == .positional {
135+
guard repeatingPositionalComparison.isEmpty else {
136+
return nil as String?
137+
}
138+
139+
if arg.isRepeating {
140+
repeatingPositionalComparison = " -ge"
141+
}
142+
}
143+
144+
return """
145+
\(prefix)\(
146+
arg.kind == .positional
147+
? """
148+
\({
149+
positionalIndex += 1
150+
return " \(positionalIndex)\(repeatingPositionalComparison)"
151+
}())
152+
"""
153+
: ""
154+
)' \(argumentSegments(arg).joined(separator: separator))
137155
"""
138-
: ""
139-
)' \(argumentSegments(arg).joined(separator: separator))
140-
"""
141156
}
142157

143158
positionalIndex += 1

Tests/ArgumentParserExampleTests/Snapshots/testMathFishCompletionScript().fish

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
function __math_should_offer_completions_for -a expected_commands -a expected_positional_index
1+
function __math_should_offer_completions_for -a expected_commands expected_positional_index positional_index_comparison
22
set -l unparsed_tokens (__math_tokens -pc)
33
set -l positional_index 0
44
set -l commands
55

6+
if test -z $positional_index_comparison
7+
set positional_index_comparison -eq
8+
end
9+
610
switch $unparsed_tokens[1]
711
case 'math'
812
__math_parse_subcommand 0 'version' 'h/help'
@@ -26,7 +30,7 @@ function __math_should_offer_completions_for -a expected_commands -a expected_po
2630
end
2731
end
2832

29-
test "$commands" = "$expected_commands" -a \( -z "$expected_positional_index" -o "$expected_positional_index" -eq "$positional_index" \)
33+
test "$commands" = "$expected_commands" -a \( -z "$expected_positional_index" -o "$positional_index" "$positional_index_comparison" "$expected_positional_index" \)
3034
end
3135

3236
function __math_tokens

Tests/ArgumentParserUnitTests/Snapshots/testBase_Fish().fish

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
function __base-test_should_offer_completions_for -a expected_commands -a expected_positional_index
1+
function __base-test_should_offer_completions_for -a expected_commands expected_positional_index positional_index_comparison
22
set -l unparsed_tokens (__base-test_tokens -pc)
33
set -l positional_index 0
44
set -l commands
55

6+
if test -z $positional_index_comparison
7+
set positional_index_comparison -eq
8+
end
9+
610
switch $unparsed_tokens[1]
711
case 'base-test'
812
__base-test_parse_subcommand 2 'name=' 'kind=' 'other-kind=' 'path1=' 'path2=' 'path3=' 'one' 'two' 'custom-three' 'kind-counter' 'rep1=' 'r/rep2=' 'h/help'
@@ -16,7 +20,7 @@ function __base-test_should_offer_completions_for -a expected_commands -a expect
1620
end
1721
end
1822

19-
test "$commands" = "$expected_commands" -a \( -z "$expected_positional_index" -o "$expected_positional_index" -eq "$positional_index" \)
23+
test "$commands" = "$expected_commands" -a \( -z "$expected_positional_index" -o "$positional_index" "$positional_index_comparison" "$expected_positional_index" \)
2024
end
2125

2226
function __base-test_tokens

0 commit comments

Comments
 (0)