@@ -160,6 +160,61 @@ let forParensUpdate =
160160 }
161161 }
162162
163+ /// <summary>
164+ /// Make sure that a <see cref="SequenceItem"/> contains a comma.
165+ /// </summary>
166+ let ensureComma ( item : 'a SequenceItem ) =
167+ match item.Comma with
168+ | None -> { Item = item.Item; Comma = { Prefix = []; Text = " ," } |> Some }
169+ | Some _ -> item
170+
171+ /// <summary>
172+ /// Prepends the <paramref name="parameters"/> with an ellipsis <see cref="Terminal"/> item if it does not already contain one.
173+ /// </summary>
174+ let ensureEllipsis ( parameters : Terminal Tuple ) =
175+ let ellipsis nspace =
176+ { Prefix = [ spaces nspace ]; Text = " ..." }
177+
178+ let ellipsisItem nspace =
179+ { Item = ellipsis nspace |> Some; Comma = None }
180+
181+ { parameters with
182+ Items =
183+ match parameters.Items with
184+ // Replace, e.g., `body ()` with `body (...)`
185+ | [] -> [ ellipsisItem 0 ]
186+ // Replace, e.g., `controlled (q)` with `controlled (q, ...)`
187+ | [ x ] ->
188+ match Option.get( x.Item). Text with
189+ | " ..." -> [ x ]
190+ | _ -> [ ensureComma x; ellipsisItem 1 ]
191+ | _ -> parameters.Items
192+ }
193+
194+ let specializationUpdate =
195+ { new Rewriter<_>() with
196+ override _.SpecializationGenerator ((), generator ) =
197+ let emptyTuple =
198+ {
199+ OpenParen = { Prefix = [ spaces 1 ]; Text = " (" }
200+ Items = []
201+ CloseParen = { Prefix = []; Text = " )" }
202+ }
203+
204+ match generator with
205+ | Provided ( parameters, statements) ->
206+ Provided(
207+ parameters =
208+ ( match parameters with
209+ // Replace, e.g., `body` with `body (...)`
210+ | None -> ensureEllipsis emptyTuple |> Some
211+ // Replace, e.g., `body ()` with `body (...)`
212+ | Some par -> ensureEllipsis par |> Some),
213+ statements = statements
214+ )
215+ | _ -> generator
216+ }
217+
163218let arraySyntaxUpdate =
164219
165220 let getBuiltInDefault builtIn =
0 commit comments