Warning, file /frameworks/syntax-highlighting/autotests/html/test.swift.html was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 <!DOCTYPE html>
0002 <html><head>
0003 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
0004 <title>test.swift</title>
0005 <meta name="generator" content="KF5::SyntaxHighlighting - Definition (Swift) - Theme (Breeze Light)"/>
0006 </head><body style="background-color:#ffffff;color:#1f1c1b"><pre>
0007 <span style="color:#898887;">//</span>
0008 <span style="color:#898887;">//  Arguments.swift</span>
0009 <span style="color:#898887;">//  SwiftFormat</span>
0010 <span style="color:#898887;">//</span>
0011 <span style="color:#898887;">//  Created by Nick Lockwood on 07/08/2018.</span>
0012 <span style="color:#898887;">//  Copyright © 2018 Nick Lockwood.</span>
0013 <span style="color:#898887;">//</span>
0014 <span style="color:#898887;">//  Distributed under the permissive MIT license</span>
0015 <span style="color:#898887;">//  Get the latest version from here:</span>
0016 <span style="color:#898887;">//</span>
0017 <span style="color:#898887;">//  https://github.com/nicklockwood/SwiftFormat</span>
0018 <span style="color:#898887;">//</span>
0019 <span style="color:#898887;">//  Permission is hereby granted, free of charge, to any person obtaining a copy</span>
0020 <span style="color:#898887;">//  of this software and associated documentation files (the &quot;Software&quot;), to deal</span>
0021 <span style="color:#898887;">//  in the Software without restriction, including without limitation the rights</span>
0022 <span style="color:#898887;">//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span>
0023 <span style="color:#898887;">//  copies of the Software, and to permit persons to whom the Software is</span>
0024 <span style="color:#898887;">//  furnished to do so, subject to the following conditions:</span>
0025 <span style="color:#898887;">//</span>
0026 <span style="color:#898887;">//  The above copyright notice and this permission notice shall be included in all</span>
0027 <span style="color:#898887;">//  copies or substantial portions of the Software.</span>
0028 <span style="color:#898887;">//</span>
0029 <span style="color:#898887;">//  THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
0030 <span style="color:#898887;">//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
0031 <span style="color:#898887;">//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span>
0032 <span style="color:#898887;">//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
0033 <span style="color:#898887;">//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span>
0034 <span style="color:#898887;">//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE</span>
0035 <span style="color:#898887;">//  SOFTWARE.</span>
0036 <span style="color:#898887;">//</span>
0037 
0038 <span style="font-weight:bold;">import</span> <span style="color:#ff5500;">Foundation</span>
0039 
0040 <span style="font-weight:bold;">extension</span> Options <span style="color:#ca60ca;">{</span>
0041     <span style="font-weight:bold;">static</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">maxArgumentNameLength</span> <span style="color:#ca60ca;">=</span> <span style="color:#b08000;">16</span>
0042 
0043     <span style="font-weight:bold;">init</span><span style="color:#ca60ca;">(</span>_ args<span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">[</span>String<span style="color:#ca60ca;">:</span> String<span style="color:#ca60ca;">],</span> <span style="font-weight:bold;">in</span> directory<span style="color:#ca60ca;">:</span> String<span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">throws</span> <span style="color:#ca60ca;">{</span>
0044         fileOptions <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> fileOptionsFor<span style="color:#ca60ca;">(</span>args<span style="color:#ca60ca;">,</span> <span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> directory<span style="color:#ca60ca;">)</span>
0045         formatOptions <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> formatOptionsFor<span style="color:#ca60ca;">(</span>args<span style="color:#ca60ca;">)</span>
0046         <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">lint</span> <span style="color:#ca60ca;">=</span> args<span style="color:#ca60ca;">.</span>keys<span style="color:#ca60ca;">.</span>contains<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;lint&quot;</span><span style="color:#ca60ca;">)</span>
0047         <span style="font-weight:bold;">self</span><span style="color:#ca60ca;">.</span>lint <span style="color:#ca60ca;">=</span> lint
0048         rules <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> rulesFor<span style="color:#ca60ca;">(</span>args<span style="color:#ca60ca;">,</span> lint<span style="color:#ca60ca;">:</span> lint<span style="color:#ca60ca;">)</span>
0049     <span style="color:#ca60ca;">}</span>
0050 
0051     <span style="font-weight:bold;">mutating</span> <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">addArguments</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">_</span> <span style="color:#0057ae;">args</span><span style="color:#ca60ca;">:</span> [<span style="color:#0057ae;">String</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span>]<span style="color:#ca60ca;">,</span> <span style="color:#0057ae;">in</span> <span style="color:#0057ae;">directory</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span><span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">throws</span> <span style="color:#ca60ca;">{</span>
0052         <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">oldArguments</span> <span style="color:#ca60ca;">=</span> argumentsFor<span style="color:#ca60ca;">(</span><span style="font-weight:bold;">self</span><span style="color:#ca60ca;">)</span>
0053         <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">newArguments</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> mergeArguments<span style="color:#ca60ca;">(</span>args<span style="color:#ca60ca;">,</span> into<span style="color:#ca60ca;">:</span> oldArguments<span style="color:#ca60ca;">)</span>
0054         <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">newOptions</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> Options<span style="color:#ca60ca;">(</span>newArguments<span style="color:#ca60ca;">,</span> <span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> directory<span style="color:#ca60ca;">)</span>
0055         <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">fileInfo</span> <span style="color:#ca60ca;">=</span> formatOptions<span style="color:#ca60ca;">?.</span>fileInfo <span style="color:#ca60ca;">{</span>
0056             newOptions<span style="color:#ca60ca;">.</span>formatOptions<span style="color:#ca60ca;">?.</span>fileInfo <span style="color:#ca60ca;">=</span> fileInfo
0057         <span style="color:#ca60ca;">}</span>
0058         <span style="font-weight:bold;">self</span> <span style="color:#ca60ca;">=</span> newOptions
0059     <span style="color:#ca60ca;">}</span>
0060 <span style="color:#ca60ca;">}</span>
0061 
0062 <span style="color:#898887;">// Parse a space-delimited string into an array of command-line arguments</span>
0063 <span style="color:#898887;">// Replicates the behavior implemented by the console when parsing input</span>
0064 <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">parseArguments</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">_</span> <span style="color:#0057ae;">argumentString</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span><span style="color:#ca60ca;">,</span> <span style="color:#0057ae;">ignoreComments</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">Bool</span> <span style="color:#ca60ca;">=</span> true<span style="color:#ca60ca;">)</span> -&gt; [<span style="color:#644a9b;">String</span>] <span style="color:#ca60ca;">{</span>
0065     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">arguments</span> <span style="color:#ca60ca;">=</span> <span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#898887;">// Arguments always begin with script path</span>
0066     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">characters</span> <span style="color:#ca60ca;">=</span> String<span style="color:#ca60ca;">.</span>UnicodeScalarView<span style="color:#ca60ca;">.</span>SubSequence<span style="color:#ca60ca;">(</span>argumentString<span style="color:#ca60ca;">.</span>unicodeScalars<span style="color:#ca60ca;">)</span>
0067     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">string</span> <span style="color:#ca60ca;">=</span> <span style="color:#bf0303;">&quot;&quot;</span>
0068     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">escaped</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">false</span>
0069     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">quoted</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">false</span>
0070     loop<span style="color:#ca60ca;">:</span> <span style="font-weight:bold;">while</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">char</span> <span style="color:#ca60ca;">=</span> characters<span style="color:#ca60ca;">.</span>popFirst<span style="color:#ca60ca;">()</span> <span style="color:#ca60ca;">{</span>
0071         <span style="font-weight:bold;">switch</span> char <span style="color:#ca60ca;">{</span>
0072         <span style="font-weight:bold;">case</span> <span style="color:#bf0303;">&quot;#&quot;</span> <span style="font-weight:bold;">where</span> <span style="color:#ca60ca;">!</span>ignoreComments <span style="color:#ca60ca;">&amp;&amp;</span> <span style="color:#ca60ca;">!</span>escaped <span style="color:#ca60ca;">&amp;&amp;</span> <span style="color:#ca60ca;">!</span>quoted<span style="color:#ca60ca;">:</span>
0073             <span style="font-weight:bold;">break</span> loop <span style="color:#898887;">// comment</span>
0074         <span style="font-weight:bold;">case</span> <span style="color:#bf0303;">&quot;</span><span style="color:#3daee9;">\\</span><span style="color:#bf0303;">&quot;</span> <span style="font-weight:bold;">where</span> <span style="color:#ca60ca;">!</span>escaped<span style="color:#ca60ca;">:</span>
0075             escaped <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">true</span>
0076         <span style="font-weight:bold;">case</span> <span style="color:#bf0303;">&quot;</span><span style="color:#3daee9;">\&quot;</span><span style="color:#bf0303;">&quot;</span> <span style="font-weight:bold;">where</span> <span style="color:#ca60ca;">!</span>escaped <span style="color:#ca60ca;">&amp;&amp;</span> <span style="color:#ca60ca;">!</span>quoted<span style="color:#ca60ca;">:</span>
0077             quoted <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">true</span>
0078         <span style="font-weight:bold;">case</span> <span style="color:#bf0303;">&quot;</span><span style="color:#3daee9;">\&quot;</span><span style="color:#bf0303;">&quot;</span> <span style="font-weight:bold;">where</span> <span style="color:#ca60ca;">!</span>escaped <span style="color:#ca60ca;">&amp;&amp;</span> quoted<span style="color:#ca60ca;">:</span>
0079             quoted <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">false</span>
0080             <span style="font-weight:bold;">fallthrough</span>
0081         <span style="font-weight:bold;">case</span> <span style="color:#bf0303;">&quot; &quot;</span> <span style="font-weight:bold;">where</span> <span style="color:#ca60ca;">!</span>escaped <span style="color:#ca60ca;">&amp;&amp;</span> <span style="color:#ca60ca;">!</span>quoted<span style="color:#ca60ca;">:</span>
0082             <span style="font-weight:bold;">if</span> <span style="color:#ca60ca;">!</span>string<span style="color:#ca60ca;">.</span>isEmpty <span style="color:#ca60ca;">{</span>
0083                 arguments<span style="color:#ca60ca;">.</span>append<span style="color:#ca60ca;">(</span>string<span style="color:#ca60ca;">)</span>
0084             <span style="color:#ca60ca;">}</span>
0085             string<span style="color:#ca60ca;">.</span>removeAll<span style="color:#ca60ca;">()</span>
0086         <span style="font-weight:bold;">case</span> <span style="color:#bf0303;">&quot;</span><span style="color:#3daee9;">\&quot;</span><span style="color:#bf0303;">&quot;</span> <span style="font-weight:bold;">where</span> escaped<span style="color:#ca60ca;">:</span>
0087             escaped <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">false</span>
0088             string<span style="color:#ca60ca;">.</span>append<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;</span><span style="color:#3daee9;">\&quot;</span><span style="color:#bf0303;">&quot;</span><span style="color:#ca60ca;">)</span>
0089         <span style="font-weight:bold;">case</span> _ <span style="font-weight:bold;">where</span> escaped <span style="color:#ca60ca;">&amp;&amp;</span> quoted<span style="color:#ca60ca;">:</span>
0090             string<span style="color:#ca60ca;">.</span>append<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;</span><span style="color:#3daee9;">\\</span><span style="color:#bf0303;">&quot;</span><span style="color:#ca60ca;">)</span>
0091             <span style="font-weight:bold;">fallthrough</span>
0092         <span style="font-weight:bold;">default</span><span style="color:#ca60ca;">:</span>
0093             escaped <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">false</span>
0094             string<span style="color:#ca60ca;">.</span>append<span style="color:#ca60ca;">(</span>Character<span style="color:#ca60ca;">(</span>char<span style="color:#ca60ca;">))</span>
0095         <span style="color:#ca60ca;">}</span>
0096     <span style="color:#ca60ca;">}</span>
0097     <span style="font-weight:bold;">if</span> <span style="color:#ca60ca;">!</span>string<span style="color:#ca60ca;">.</span>isEmpty <span style="color:#ca60ca;">{</span>
0098         arguments<span style="color:#ca60ca;">.</span>append<span style="color:#ca60ca;">(</span>string<span style="color:#ca60ca;">)</span>
0099     <span style="color:#ca60ca;">}</span>
0100     <span style="font-weight:bold;">return</span> arguments
0101 <span style="color:#ca60ca;">}</span>
0102 
0103 <span style="color:#898887;">// Parse a flat array of command-line arguments into a dictionary of flags and values</span>
0104 <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">preprocessArguments</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">_</span> <span style="color:#0057ae;">args</span><span style="color:#ca60ca;">:</span> [<span style="color:#0057ae;">String</span>]<span style="color:#ca60ca;">,</span> <span style="color:#0057ae;">_</span> <span style="color:#0057ae;">names</span><span style="color:#ca60ca;">:</span> [<span style="color:#0057ae;">String</span>]<span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">throws</span> -&gt; [<span style="color:#644a9b;">String</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span>] <span style="color:#ca60ca;">{</span>
0105     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">anonymousArgs</span> <span style="color:#ca60ca;">=</span> <span style="color:#b08000;">0</span>
0106     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">namedArgs</span><span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">[</span>String<span style="color:#ca60ca;">:</span> String<span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> <span style="color:#ca60ca;">[:]</span>
0107     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">name</span> <span style="color:#ca60ca;">=</span> <span style="color:#bf0303;">&quot;&quot;</span>
0108     <span style="font-weight:bold;">for</span> arg <span style="font-weight:bold;">in</span> args <span style="color:#ca60ca;">{</span>
0109         <span style="font-weight:bold;">if</span> arg<span style="color:#ca60ca;">.</span>hasPrefix<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;--&quot;</span><span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0110             <span style="color:#898887;">// Long argument names</span>
0111             <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">key</span> <span style="color:#ca60ca;">=</span> String<span style="color:#ca60ca;">(</span>arg<span style="color:#ca60ca;">.</span>unicodeScalars<span style="color:#ca60ca;">.</span>dropFirst<span style="color:#ca60ca;">(</span><span style="color:#b08000;">2</span><span style="color:#ca60ca;">))</span>
0112             <span style="font-weight:bold;">guard</span> names<span style="color:#ca60ca;">.</span>contains<span style="color:#ca60ca;">(</span>key<span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0113                 <span style="font-weight:bold;">guard</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">match</span> <span style="color:#ca60ca;">=</span> bestMatches<span style="color:#ca60ca;">(</span><span style="font-weight:bold;">for</span><span style="color:#ca60ca;">:</span> key<span style="color:#ca60ca;">,</span> <span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> names<span style="color:#ca60ca;">).</span>first <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0114                     <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;Unknown option --</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">key)&quot;</span><span style="color:#ca60ca;">)</span>
0115                 <span style="color:#ca60ca;">}</span>
0116                 <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;Unknown option --</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">key). Did you mean --</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">match)?&quot;</span><span style="color:#ca60ca;">)</span>
0117             <span style="color:#ca60ca;">}</span>
0118             name <span style="color:#ca60ca;">=</span> key
0119             namedArgs<span style="color:#ca60ca;">[</span>name<span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> namedArgs<span style="color:#ca60ca;">[</span>name<span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">??</span> <span style="color:#bf0303;">&quot;&quot;</span>
0120             <span style="font-weight:bold;">continue</span>
0121         <span style="color:#ca60ca;">}</span> <span style="font-weight:bold;">else</span> <span style="font-weight:bold;">if</span> arg<span style="color:#ca60ca;">.</span>hasPrefix<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;-&quot;</span><span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0122             <span style="color:#898887;">// Short argument names</span>
0123             <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">flag</span> <span style="color:#ca60ca;">=</span> String<span style="color:#ca60ca;">(</span>arg<span style="color:#ca60ca;">.</span>unicodeScalars<span style="color:#ca60ca;">.</span>dropFirst<span style="color:#ca60ca;">())</span>
0124             <span style="font-weight:bold;">guard</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">match</span> <span style="color:#ca60ca;">=</span> names<span style="color:#ca60ca;">.</span>first<span style="color:#ca60ca;">(</span><span style="font-weight:bold;">where</span><span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">{</span> $<span style="color:#b08000;">0.</span>hasPrefix<span style="color:#ca60ca;">(</span>flag<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">})</span> <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0125                 <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;Unknown flag -</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">flag)&quot;</span><span style="color:#ca60ca;">)</span>
0126             <span style="color:#ca60ca;">}</span>
0127             name <span style="color:#ca60ca;">=</span> match
0128             namedArgs<span style="color:#ca60ca;">[</span>name<span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> namedArgs<span style="color:#ca60ca;">[</span>name<span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">??</span> <span style="color:#bf0303;">&quot;&quot;</span>
0129             <span style="font-weight:bold;">continue</span>
0130         <span style="color:#ca60ca;">}</span>
0131         <span style="font-weight:bold;">if</span> name <span style="color:#ca60ca;">==</span> <span style="color:#bf0303;">&quot;&quot;</span> <span style="color:#ca60ca;">{</span>
0132             <span style="color:#898887;">// Argument is anonymous</span>
0133             name <span style="color:#ca60ca;">=</span> String<span style="color:#ca60ca;">(</span>anonymousArgs<span style="color:#ca60ca;">)</span>
0134             anonymousArgs <span style="color:#ca60ca;">+=</span> <span style="color:#b08000;">1</span>
0135         <span style="color:#ca60ca;">}</span>
0136         <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">arg</span> <span style="color:#ca60ca;">=</span> arg
0137         <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">hasTrailingComma</span> <span style="color:#ca60ca;">=</span> arg<span style="color:#ca60ca;">.</span>hasSuffix<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">&amp;&amp;</span> arg <span style="color:#ca60ca;">!=</span> <span style="color:#bf0303;">&quot;,&quot;</span>
0138         <span style="font-weight:bold;">if</span> hasTrailingComma <span style="color:#ca60ca;">{</span>
0139             arg <span style="color:#ca60ca;">=</span> String<span style="color:#ca60ca;">(</span>arg<span style="color:#ca60ca;">.</span>dropLast<span style="color:#ca60ca;">())</span>
0140         <span style="color:#ca60ca;">}</span>
0141         <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">existing</span> <span style="color:#ca60ca;">=</span> namedArgs<span style="color:#ca60ca;">[</span>name<span style="color:#ca60ca;">],</span> <span style="color:#ca60ca;">!</span>existing<span style="color:#ca60ca;">.</span>isEmpty<span style="color:#ca60ca;">,</span>
0142            <span style="color:#898887;">// </span><span style="color:#ca9219;background-color:#451e1a;font-weight:bold;">TODO</span><span style="color:#898887;">: find a more general way to represent merge-able options</span>
0143            <span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;exclude&quot;</span><span style="color:#ca60ca;">,</span> <span style="color:#bf0303;">&quot;unexclude&quot;</span><span style="color:#ca60ca;">,</span> <span style="color:#bf0303;">&quot;disable&quot;</span><span style="color:#ca60ca;">,</span> <span style="color:#bf0303;">&quot;enable&quot;</span><span style="color:#ca60ca;">,</span> <span style="color:#bf0303;">&quot;lintonly&quot;</span><span style="color:#ca60ca;">,</span> <span style="color:#bf0303;">&quot;rules&quot;</span><span style="color:#ca60ca;">].</span>contains<span style="color:#ca60ca;">(</span>name<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">||</span>
0144            Descriptors<span style="color:#ca60ca;">.</span>all<span style="color:#ca60ca;">.</span>contains<span style="color:#ca60ca;">(</span><span style="font-weight:bold;">where</span><span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">{</span>
0145                $<span style="color:#b08000;">0.</span>argumentName <span style="color:#ca60ca;">==</span> name <span style="color:#ca60ca;">&amp;&amp;</span> $<span style="color:#b08000;">0.</span>isSetType
0146            <span style="color:#ca60ca;">})</span>
0147         <span style="color:#ca60ca;">{</span>
0148             namedArgs<span style="color:#ca60ca;">[</span>name<span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> existing <span style="color:#ca60ca;">+</span> <span style="color:#bf0303;">&quot;,&quot;</span> <span style="color:#ca60ca;">+</span> arg
0149         <span style="color:#ca60ca;">}</span> <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0150             namedArgs<span style="color:#ca60ca;">[</span>name<span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> arg
0151         <span style="color:#ca60ca;">}</span>
0152         <span style="font-weight:bold;">if</span> <span style="color:#ca60ca;">!</span>hasTrailingComma <span style="color:#ca60ca;">{</span>
0153             name <span style="color:#ca60ca;">=</span> <span style="color:#bf0303;">&quot;&quot;</span>
0154         <span style="color:#ca60ca;">}</span>
0155     <span style="color:#ca60ca;">}</span>
0156     <span style="font-weight:bold;">return</span> namedArgs
0157 <span style="color:#ca60ca;">}</span>
0158 
0159 <span style="color:#898887;">// Find best match for a given string in a list of options</span>
0160 <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">bestMatches</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">for</span> <span style="color:#0057ae;">query</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span><span style="color:#ca60ca;">,</span> <span style="color:#0057ae;">in</span> <span style="color:#0057ae;">options</span><span style="color:#ca60ca;">:</span> [<span style="color:#0057ae;">String</span>]<span style="color:#ca60ca;">)</span> -&gt; [<span style="color:#644a9b;">String</span>] <span style="color:#ca60ca;">{</span>
0161     <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">lowercaseQuery</span> <span style="color:#ca60ca;">=</span> query<span style="color:#ca60ca;">.</span>lowercased<span style="color:#ca60ca;">()</span>
0162     <span style="color:#898887;">// Sort matches by Levenshtein edit distance</span>
0163     <span style="font-weight:bold;">return</span> options
0164         <span style="color:#ca60ca;">.</span>compactMap <span style="color:#ca60ca;">{</span> option <span style="color:#ca60ca;">-&gt;</span> <span style="color:#ca60ca;">(</span>String<span style="color:#ca60ca;">,</span> distance<span style="color:#ca60ca;">:</span> Int<span style="color:#ca60ca;">,</span> commonPrefix<span style="color:#ca60ca;">:</span> Int<span style="color:#ca60ca;">)?</span> <span style="font-weight:bold;">in</span>
0165             <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">lowercaseOption</span> <span style="color:#ca60ca;">=</span> option<span style="color:#ca60ca;">.</span>lowercased<span style="color:#ca60ca;">()</span>
0166             <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">distance</span> <span style="color:#ca60ca;">=</span> editDistance<span style="color:#ca60ca;">(</span>lowercaseOption<span style="color:#ca60ca;">,</span> lowercaseQuery<span style="color:#ca60ca;">)</span>
0167             <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">commonPrefix</span> <span style="color:#ca60ca;">=</span> lowercaseOption<span style="color:#ca60ca;">.</span>commonPrefix<span style="color:#ca60ca;">(</span>with<span style="color:#ca60ca;">:</span> lowercaseQuery<span style="color:#ca60ca;">)</span>
0168             <span style="font-weight:bold;">if</span> commonPrefix<span style="color:#ca60ca;">.</span>isEmpty<span style="color:#ca60ca;">,</span> distance <span style="color:#ca60ca;">&gt;</span> lowercaseQuery<span style="color:#ca60ca;">.</span>count <span style="color:#ca60ca;">/</span> <span style="color:#b08000;">2</span> <span style="color:#ca60ca;">{</span>
0169                 <span style="font-weight:bold;">return</span> <span style="font-weight:bold;">nil</span>
0170             <span style="color:#ca60ca;">}</span>
0171             <span style="font-weight:bold;">return</span> <span style="color:#ca60ca;">(</span>option<span style="color:#ca60ca;">,</span> distance<span style="color:#ca60ca;">,</span> commonPrefix<span style="color:#ca60ca;">.</span>count<span style="color:#ca60ca;">)</span>
0172         <span style="color:#ca60ca;">}</span>
0173         <span style="color:#ca60ca;">.</span>sorted <span style="color:#ca60ca;">{</span>
0174             <span style="font-weight:bold;">if</span> $<span style="color:#b08000;">0.</span>distance <span style="color:#ca60ca;">==</span> $<span style="color:#b08000;">1.</span>distance <span style="color:#ca60ca;">{</span>
0175                 <span style="font-weight:bold;">return</span> $<span style="color:#b08000;">0.</span>commonPrefix <span style="color:#ca60ca;">&gt;</span> $<span style="color:#b08000;">1.</span>commonPrefix
0176             <span style="color:#ca60ca;">}</span>
0177             <span style="font-weight:bold;">return</span> $<span style="color:#b08000;">0.</span>distance <span style="color:#ca60ca;">&lt;</span> $<span style="color:#b08000;">1.</span>distance
0178         <span style="color:#ca60ca;">}</span>
0179         <span style="color:#ca60ca;">.</span>map <span style="color:#ca60ca;">{</span> $<span style="color:#b08000;">0.0</span> <span style="color:#ca60ca;">}</span>
0180 <span style="color:#ca60ca;">}</span>
0181 
0182 <span style="color:#898887;">/// The Damerau-Levenshtein edit-distance between two strings</span>
0183 <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">editDistance</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">_</span> <span style="color:#0057ae;">lhs</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span><span style="color:#ca60ca;">,</span> <span style="color:#0057ae;">_</span> <span style="color:#0057ae;">rhs</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span><span style="color:#ca60ca;">)</span> -&gt; <span style="color:#644a9b;">Int</span> <span style="color:#ca60ca;">{</span>
0184     <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">lhs</span> <span style="color:#ca60ca;">=</span> Array<span style="color:#ca60ca;">(</span>lhs<span style="color:#ca60ca;">)</span>
0185     <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">rhs</span> <span style="color:#ca60ca;">=</span> Array<span style="color:#ca60ca;">(</span>rhs<span style="color:#ca60ca;">)</span>
0186     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">dist</span> <span style="color:#ca60ca;">=</span> <span style="color:#ca60ca;">[[</span>Int<span style="color:#ca60ca;">]]()</span>
0187     <span style="font-weight:bold;">for</span> i <span style="font-weight:bold;">in</span> <span style="color:#b08000;">0</span> <span style="color:#ca60ca;">...</span> lhs<span style="color:#ca60ca;">.</span>count <span style="color:#ca60ca;">{</span>
0188         dist<span style="color:#ca60ca;">.</span>append<span style="color:#ca60ca;">([</span>i<span style="color:#ca60ca;">])</span>
0189     <span style="color:#ca60ca;">}</span>
0190     <span style="font-weight:bold;">for</span> j <span style="font-weight:bold;">in</span> <span style="color:#b08000;">1</span> <span style="color:#ca60ca;">...</span> rhs<span style="color:#ca60ca;">.</span>count <span style="color:#ca60ca;">{</span>
0191         dist<span style="color:#ca60ca;">[</span><span style="color:#b08000;">0</span><span style="color:#ca60ca;">].</span>append<span style="color:#ca60ca;">(</span>j<span style="color:#ca60ca;">)</span>
0192     <span style="color:#ca60ca;">}</span>
0193     <span style="font-weight:bold;">for</span> i <span style="font-weight:bold;">in</span> <span style="color:#b08000;">1</span> <span style="color:#ca60ca;">...</span> lhs<span style="color:#ca60ca;">.</span>count <span style="color:#ca60ca;">{</span>
0194         <span style="font-weight:bold;">for</span> j <span style="font-weight:bold;">in</span> <span style="color:#b08000;">1</span> <span style="color:#ca60ca;">...</span> rhs<span style="color:#ca60ca;">.</span>count <span style="color:#ca60ca;">{</span>
0195             <span style="font-weight:bold;">if</span> lhs<span style="color:#ca60ca;">[</span>i <span style="color:#ca60ca;">-</span> <span style="color:#b08000;">1</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">==</span> rhs<span style="color:#ca60ca;">[</span>j <span style="color:#ca60ca;">-</span> <span style="color:#b08000;">1</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">{</span>
0196                 dist<span style="color:#ca60ca;">[</span>i<span style="color:#ca60ca;">].</span>append<span style="color:#ca60ca;">(</span>dist<span style="color:#ca60ca;">[</span>i <span style="color:#ca60ca;">-</span> <span style="color:#b08000;">1</span><span style="color:#ca60ca;">][</span>j <span style="color:#ca60ca;">-</span> <span style="color:#b08000;">1</span><span style="color:#ca60ca;">])</span>
0197             <span style="color:#ca60ca;">}</span> <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0198                 dist<span style="color:#ca60ca;">[</span>i<span style="color:#ca60ca;">].</span>append<span style="color:#ca60ca;">(</span>min<span style="color:#ca60ca;">(</span>dist<span style="color:#ca60ca;">[</span>i <span style="color:#ca60ca;">-</span> <span style="color:#b08000;">1</span><span style="color:#ca60ca;">][</span>j<span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">+</span> <span style="color:#b08000;">1</span><span style="color:#ca60ca;">,</span>
0199                                    dist<span style="color:#ca60ca;">[</span>i<span style="color:#ca60ca;">][</span>j <span style="color:#ca60ca;">-</span> <span style="color:#b08000;">1</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">+</span> <span style="color:#b08000;">1</span><span style="color:#ca60ca;">,</span>
0200                                    dist<span style="color:#ca60ca;">[</span>i <span style="color:#ca60ca;">-</span> <span style="color:#b08000;">1</span><span style="color:#ca60ca;">][</span>j <span style="color:#ca60ca;">-</span> <span style="color:#b08000;">1</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">+</span> <span style="color:#b08000;">1</span><span style="color:#ca60ca;">))</span>
0201             <span style="color:#ca60ca;">}</span>
0202             <span style="font-weight:bold;">if</span> i <span style="color:#ca60ca;">&gt;</span> <span style="color:#b08000;">1</span><span style="color:#ca60ca;">,</span> j <span style="color:#ca60ca;">&gt;</span> <span style="color:#b08000;">1</span><span style="color:#ca60ca;">,</span> lhs<span style="color:#ca60ca;">[</span>i <span style="color:#ca60ca;">-</span> <span style="color:#b08000;">1</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">==</span> rhs<span style="color:#ca60ca;">[</span>j <span style="color:#ca60ca;">-</span> <span style="color:#b08000;">2</span><span style="color:#ca60ca;">],</span> lhs<span style="color:#ca60ca;">[</span>i <span style="color:#ca60ca;">-</span> <span style="color:#b08000;">2</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">==</span> rhs<span style="color:#ca60ca;">[</span>j <span style="color:#ca60ca;">-</span> <span style="color:#b08000;">1</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">{</span>
0203                 dist<span style="color:#ca60ca;">[</span>i<span style="color:#ca60ca;">][</span>j<span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> min<span style="color:#ca60ca;">(</span>dist<span style="color:#ca60ca;">[</span>i<span style="color:#ca60ca;">][</span>j<span style="color:#ca60ca;">],</span> dist<span style="color:#ca60ca;">[</span>i <span style="color:#ca60ca;">-</span> <span style="color:#b08000;">2</span><span style="color:#ca60ca;">][</span>j <span style="color:#ca60ca;">-</span> <span style="color:#b08000;">2</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">+</span> <span style="color:#b08000;">1</span><span style="color:#ca60ca;">)</span>
0204             <span style="color:#ca60ca;">}</span>
0205         <span style="color:#ca60ca;">}</span>
0206     <span style="color:#ca60ca;">}</span>
0207     <span style="font-weight:bold;">return</span> dist<span style="color:#ca60ca;">[</span>lhs<span style="color:#ca60ca;">.</span>count<span style="color:#ca60ca;">][</span>rhs<span style="color:#ca60ca;">.</span>count<span style="color:#ca60ca;">]</span>
0208 <span style="color:#ca60ca;">}</span>
0209 
0210 <span style="color:#898887;">// Parse a comma-delimited list of items</span>
0211 <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">parseCommaDelimitedList</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">_</span> <span style="color:#0057ae;">string</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span><span style="color:#ca60ca;">)</span> -&gt; [<span style="color:#644a9b;">String</span>] <span style="color:#ca60ca;">{</span>
0212     <span style="font-weight:bold;">return</span> string<span style="color:#ca60ca;">.</span>components<span style="color:#ca60ca;">(</span>separatedBy<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">).</span>compactMap <span style="color:#ca60ca;">{</span>
0213         <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">item</span> <span style="color:#ca60ca;">=</span> $<span style="color:#b08000;">0.</span>trimmingCharacters<span style="color:#ca60ca;">(</span><span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">.</span>whitespacesAndNewlines<span style="color:#ca60ca;">)</span>
0214         <span style="font-weight:bold;">return</span> item<span style="color:#ca60ca;">.</span>isEmpty <span style="color:#ca60ca;">?</span> <span style="font-weight:bold;">nil</span> <span style="color:#ca60ca;">:</span> item
0215     <span style="color:#ca60ca;">}</span>
0216 <span style="color:#ca60ca;">}</span>
0217 
0218 <span style="color:#898887;">// Parse a comma-delimited string into an array of rules</span>
0219 <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">allRules</span> <span style="color:#ca60ca;">=</span> Set<span style="color:#ca60ca;">(</span>FormatRules<span style="color:#ca60ca;">.</span>byName<span style="color:#ca60ca;">.</span>keys<span style="color:#ca60ca;">)</span>
0220 <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">parseRules</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">_</span> <span style="color:#0057ae;">rules</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span><span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">throws</span> -&gt; [<span style="color:#644a9b;">String</span>] <span style="color:#ca60ca;">{</span>
0221     <span style="font-weight:bold;">return</span> <span style="font-weight:bold;">try</span> parseCommaDelimitedList<span style="color:#ca60ca;">(</span>rules<span style="color:#ca60ca;">).</span>map <span style="color:#ca60ca;">{</span> proposedName <span style="font-weight:bold;">in</span>
0222         <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">name</span> <span style="color:#ca60ca;">=</span> allRules<span style="color:#ca60ca;">.</span>first<span style="color:#ca60ca;">(</span><span style="font-weight:bold;">where</span><span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">{</span>
0223             $<span style="color:#b08000;">0.</span>lowercased<span style="color:#ca60ca;">()</span> <span style="color:#ca60ca;">==</span> proposedName<span style="color:#ca60ca;">.</span>lowercased<span style="color:#ca60ca;">()</span>
0224         <span style="color:#ca60ca;">})</span> <span style="color:#ca60ca;">{</span>
0225             <span style="font-weight:bold;">return</span> name
0226         <span style="color:#ca60ca;">}</span>
0227         <span style="font-weight:bold;">if</span> Descriptors<span style="color:#ca60ca;">.</span>all<span style="color:#ca60ca;">.</span>contains<span style="color:#ca60ca;">(</span><span style="font-weight:bold;">where</span><span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">{</span>
0228             $<span style="color:#b08000;">0.</span>argumentName <span style="color:#ca60ca;">==</span> proposedName
0229         <span style="color:#ca60ca;">})</span> <span style="color:#ca60ca;">{</span>
0230             <span style="font-weight:bold;">for</span> rule <span style="font-weight:bold;">in</span> FormatRules<span style="color:#ca60ca;">.</span>all <span style="font-weight:bold;">where</span> rule<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">.</span>contains<span style="color:#ca60ca;">(</span>proposedName<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0231                 <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span>
0232                     <span style="color:#bf0303;">&quot;'</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">proposedName)' is not a formatting rule. Did you mean '</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">rule.name)'?&quot;</span>
0233                 <span style="color:#ca60ca;">)</span>
0234             <span style="color:#ca60ca;">}</span>
0235             <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;'</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">proposedName)' is not a formatting rule&quot;</span><span style="color:#ca60ca;">)</span>
0236         <span style="color:#ca60ca;">}</span>
0237         <span style="font-weight:bold;">guard</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">match</span> <span style="color:#ca60ca;">=</span> bestMatches<span style="color:#ca60ca;">(</span><span style="font-weight:bold;">for</span><span style="color:#ca60ca;">:</span> proposedName<span style="color:#ca60ca;">,</span> <span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> Array<span style="color:#ca60ca;">(</span>allRules<span style="color:#ca60ca;">)).</span>first <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0238             <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;Unknown rule '</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">proposedName)'&quot;</span><span style="color:#ca60ca;">)</span>
0239         <span style="color:#ca60ca;">}</span>
0240         <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;Unknown rule '</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">proposedName)'. Did you mean '</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">match)'?&quot;</span><span style="color:#ca60ca;">)</span>
0241     <span style="color:#ca60ca;">}</span>
0242 <span style="color:#ca60ca;">}</span>
0243 
0244 <span style="color:#898887;">// Parse single file path, disallowing globs or commas</span>
0245 <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">parsePath</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">_</span> <span style="color:#0057ae;">path</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span><span style="color:#ca60ca;">,</span> <span style="color:#0057ae;">for</span> <span style="color:#0057ae;">argument</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span><span style="color:#ca60ca;">,</span> <span style="color:#0057ae;">in</span> <span style="color:#0057ae;">directory</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span><span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">throws</span> -&gt; <span style="color:#644a9b;">URL</span> <span style="color:#ca60ca;">{</span>
0246     <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">expandedPath</span> <span style="color:#ca60ca;">=</span> expandPath<span style="color:#ca60ca;">(</span>path<span style="color:#ca60ca;">,</span> <span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> directory<span style="color:#ca60ca;">)</span>
0247     <span style="font-weight:bold;">if</span> <span style="color:#ca60ca;">!</span>FileManager<span style="color:#ca60ca;">.</span><span style="font-weight:bold;">default</span><span style="color:#ca60ca;">.</span>fileExists<span style="color:#ca60ca;">(</span>atPath<span style="color:#ca60ca;">:</span> expandedPath<span style="color:#ca60ca;">.</span>path<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0248         <span style="font-weight:bold;">if</span> path<span style="color:#ca60ca;">.</span>contains<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0249             <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">argument) argument does not support multiple paths&quot;</span><span style="color:#ca60ca;">)</span>
0250         <span style="color:#ca60ca;">}</span>
0251         <span style="font-weight:bold;">if</span> pathContainsGlobSyntax<span style="color:#ca60ca;">(</span>path<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0252             <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">argument) path cannot contain wildcards&quot;</span><span style="color:#ca60ca;">)</span>
0253         <span style="color:#ca60ca;">}</span>
0254     <span style="color:#ca60ca;">}</span>
0255     <span style="font-weight:bold;">return</span> expandedPath
0256 <span style="color:#ca60ca;">}</span>
0257 
0258 <span style="color:#898887;">// Parse one or more comma-delimited file paths, expanding globs as required</span>
0259 <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">parsePaths</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">_</span> <span style="color:#0057ae;">paths</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span><span style="color:#ca60ca;">,</span> <span style="color:#0057ae;">in</span> <span style="color:#0057ae;">directory</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span><span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">throws</span> -&gt; [<span style="color:#644a9b;">URL</span>] <span style="color:#ca60ca;">{</span>
0260     <span style="font-weight:bold;">return</span> <span style="font-weight:bold;">try</span> matchGlobs<span style="color:#ca60ca;">(</span>expandGlobs<span style="color:#ca60ca;">(</span>paths<span style="color:#ca60ca;">,</span> <span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> directory<span style="color:#ca60ca;">),</span> <span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> directory<span style="color:#ca60ca;">)</span>
0261 <span style="color:#ca60ca;">}</span>
0262 
0263 <span style="color:#898887;">// Merge two dictionaries of arguments</span>
0264 <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">mergeArguments</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">_</span> <span style="color:#0057ae;">args</span><span style="color:#ca60ca;">:</span> [<span style="color:#0057ae;">String</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span>]<span style="color:#ca60ca;">,</span> <span style="color:#0057ae;">into</span> <span style="color:#0057ae;">config</span><span style="color:#ca60ca;">:</span> [<span style="color:#0057ae;">String</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span>]<span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">throws</span> -&gt; [<span style="color:#644a9b;">String</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span>] <span style="color:#ca60ca;">{</span>
0265     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">input</span> <span style="color:#ca60ca;">=</span> config
0266     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">output</span> <span style="color:#ca60ca;">=</span> args
0267     <span style="color:#898887;">// Merge excluded urls</span>
0268     <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">exclude</span> <span style="color:#ca60ca;">=</span> output<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;exclude&quot;</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">(</span>parseCommaDelimitedList<span style="color:#ca60ca;">),</span>
0269        <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">excluded</span> <span style="color:#ca60ca;">=</span> input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;exclude&quot;</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">({</span> Set<span style="color:#ca60ca;">(</span>parseCommaDelimitedList<span style="color:#ca60ca;">(</span>$<span style="color:#b08000;">0</span><span style="color:#ca60ca;">))</span> <span style="color:#ca60ca;">})</span>
0270     <span style="color:#ca60ca;">{</span>
0271         excluded<span style="color:#ca60ca;">.</span>formUnion<span style="color:#ca60ca;">(</span>exclude<span style="color:#ca60ca;">)</span>
0272         output<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;exclude&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> Array<span style="color:#ca60ca;">(</span>excluded<span style="color:#ca60ca;">).</span>sorted<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span>
0273     <span style="color:#ca60ca;">}</span>
0274     <span style="color:#898887;">// Merge unexcluded urls</span>
0275     <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">unexclude</span> <span style="color:#ca60ca;">=</span> output<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;unexclude&quot;</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">(</span>parseCommaDelimitedList<span style="color:#ca60ca;">),</span>
0276        <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">unexcluded</span> <span style="color:#ca60ca;">=</span> input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;unexclude&quot;</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">({</span> Set<span style="color:#ca60ca;">(</span>parseCommaDelimitedList<span style="color:#ca60ca;">(</span>$<span style="color:#b08000;">0</span><span style="color:#ca60ca;">))</span> <span style="color:#ca60ca;">})</span>
0277     <span style="color:#ca60ca;">{</span>
0278         unexcluded<span style="color:#ca60ca;">.</span>formUnion<span style="color:#ca60ca;">(</span>unexclude<span style="color:#ca60ca;">)</span>
0279         output<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;unexclude&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> Array<span style="color:#ca60ca;">(</span>unexcluded<span style="color:#ca60ca;">).</span>sorted<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span>
0280     <span style="color:#ca60ca;">}</span>
0281     <span style="color:#898887;">// Merge rules</span>
0282     <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">rules</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> output<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;rules&quot;</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0283         <span style="font-weight:bold;">if</span> rules<span style="color:#ca60ca;">.</span>isEmpty <span style="color:#ca60ca;">{</span>
0284             output<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;rules&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">nil</span>
0285         <span style="color:#ca60ca;">}</span> <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0286             input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;rules&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">nil</span>
0287             input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;enable&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">nil</span>
0288             input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;disable&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">nil</span>
0289             input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;lintonly&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">nil</span>
0290         <span style="color:#ca60ca;">}</span>
0291     <span style="color:#ca60ca;">}</span> <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0292         <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">_disable</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> output<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;disable&quot;</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0293             <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">rules</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;rules&quot;</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0294                 input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;rules&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> Set<span style="color:#ca60ca;">(</span>rules<span style="color:#ca60ca;">).</span>subtracting<span style="color:#ca60ca;">(</span>_disable<span style="color:#ca60ca;">).</span>sorted<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span>
0295             <span style="color:#ca60ca;">}</span>
0296             <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">enable</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;enable&quot;</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0297                 input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;enable&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> Set<span style="color:#ca60ca;">(</span>enable<span style="color:#ca60ca;">).</span>subtracting<span style="color:#ca60ca;">(</span>_disable<span style="color:#ca60ca;">).</span>sorted<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span>
0298             <span style="color:#ca60ca;">}</span>
0299             <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">lintonly</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;lintonly&quot;</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0300                 input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;lintonly&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> Set<span style="color:#ca60ca;">(</span>lintonly<span style="color:#ca60ca;">).</span>subtracting<span style="color:#ca60ca;">(</span>_disable<span style="color:#ca60ca;">).</span>sorted<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span>
0301             <span style="color:#ca60ca;">}</span>
0302             <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">disable</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;disable&quot;</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0303                 input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;disable&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> Set<span style="color:#ca60ca;">(</span>disable<span style="color:#ca60ca;">).</span>union<span style="color:#ca60ca;">(</span>_disable<span style="color:#ca60ca;">).</span>sorted<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span>
0304                 output<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;disable&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">nil</span>
0305             <span style="color:#ca60ca;">}</span>
0306         <span style="color:#ca60ca;">}</span>
0307         <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">_enable</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> output<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;enable&quot;</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0308             <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">enable</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;enable&quot;</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0309                 input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;enable&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> Set<span style="color:#ca60ca;">(</span>enable<span style="color:#ca60ca;">).</span>union<span style="color:#ca60ca;">(</span>_enable<span style="color:#ca60ca;">).</span>sorted<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span>
0310                 output<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;enable&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">nil</span>
0311             <span style="color:#ca60ca;">}</span>
0312             <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">lintonly</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;lintonly&quot;</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0313                 input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;lintonly&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> Set<span style="color:#ca60ca;">(</span>lintonly<span style="color:#ca60ca;">).</span>subtracting<span style="color:#ca60ca;">(</span>_enable<span style="color:#ca60ca;">).</span>sorted<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span>
0314             <span style="color:#ca60ca;">}</span>
0315             <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">disable</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;disable&quot;</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0316                 input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;disable&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> Set<span style="color:#ca60ca;">(</span>disable<span style="color:#ca60ca;">).</span>subtracting<span style="color:#ca60ca;">(</span>_enable<span style="color:#ca60ca;">).</span>sorted<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span>
0317             <span style="color:#ca60ca;">}</span>
0318         <span style="color:#ca60ca;">}</span>
0319         <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">_lintonly</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> output<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;lintonly&quot;</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0320             <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">lintonly</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;lintonly&quot;</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0321                 input<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;lintonly&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> Set<span style="color:#ca60ca;">(</span>lintonly<span style="color:#ca60ca;">).</span>union<span style="color:#ca60ca;">(</span>_lintonly<span style="color:#ca60ca;">).</span>sorted<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span>
0322                 output<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;lintonly&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">nil</span>
0323             <span style="color:#ca60ca;">}</span>
0324         <span style="color:#ca60ca;">}</span>
0325     <span style="color:#ca60ca;">}</span>
0326     <span style="color:#898887;">// Merge other arguments</span>
0327     <span style="font-weight:bold;">for</span> <span style="color:#ca60ca;">(</span>key<span style="color:#ca60ca;">,</span> inValue<span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">in</span> input <span style="color:#ca60ca;">{</span>
0328         <span style="font-weight:bold;">guard</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">outValue</span> <span style="color:#ca60ca;">=</span> output<span style="color:#ca60ca;">[</span>key<span style="color:#ca60ca;">]</span> <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0329             output<span style="color:#ca60ca;">[</span>key<span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> inValue
0330             <span style="font-weight:bold;">continue</span>
0331         <span style="color:#ca60ca;">}</span>
0332         <span style="font-weight:bold;">if</span> Descriptors<span style="color:#ca60ca;">.</span>all<span style="color:#ca60ca;">.</span>contains<span style="color:#ca60ca;">(</span><span style="font-weight:bold;">where</span><span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">{</span> $<span style="color:#b08000;">0.</span>argumentName <span style="color:#ca60ca;">==</span> key <span style="color:#ca60ca;">&amp;&amp;</span> $<span style="color:#b08000;">0.</span>isSetType <span style="color:#ca60ca;">})</span> <span style="color:#ca60ca;">{</span>
0333             <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">inOptions</span> <span style="color:#ca60ca;">=</span> parseCommaDelimitedList<span style="color:#ca60ca;">(</span>inValue<span style="color:#ca60ca;">)</span>
0334             <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">outOptions</span> <span style="color:#ca60ca;">=</span> parseCommaDelimitedList<span style="color:#ca60ca;">(</span>outValue<span style="color:#ca60ca;">)</span>
0335             output<span style="color:#ca60ca;">[</span>key<span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> Set<span style="color:#ca60ca;">(</span>inOptions<span style="color:#ca60ca;">).</span>union<span style="color:#ca60ca;">(</span>outOptions<span style="color:#ca60ca;">).</span>sorted<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span>
0336         <span style="color:#ca60ca;">}</span>
0337     <span style="color:#ca60ca;">}</span>
0338     <span style="font-weight:bold;">return</span> output
0339 <span style="color:#ca60ca;">}</span>
0340 
0341 <span style="color:#898887;">// Parse a configuration file into a dictionary of arguments</span>
0342 <span style="font-weight:bold;">public</span> <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">parseConfigFile</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">_</span> <span style="color:#0057ae;">data</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">Data</span><span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">throws</span> -&gt; [<span style="color:#644a9b;">String</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span>] <span style="color:#ca60ca;">{</span>
0343     <span style="font-weight:bold;">guard</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">input</span> <span style="color:#ca60ca;">=</span> String<span style="color:#ca60ca;">(</span>data<span style="color:#ca60ca;">:</span> data<span style="color:#ca60ca;">,</span> encoding<span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">.</span>utf8<span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0344         <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>reading<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;Unable to read data for configuration file&quot;</span><span style="color:#ca60ca;">)</span>
0345     <span style="color:#ca60ca;">}</span>
0346     <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">lines</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> cumulate<span style="color:#ca60ca;">(</span>successiveLines<span style="color:#ca60ca;">:</span> input<span style="color:#ca60ca;">.</span>components<span style="color:#ca60ca;">(</span>separatedBy<span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">.</span>newlines<span style="color:#ca60ca;">))</span>
0347     <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">arguments</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> lines<span style="color:#ca60ca;">.</span>flatMap <span style="color:#ca60ca;">{</span> line <span style="color:#ca60ca;">-&gt;</span> <span style="color:#ca60ca;">[</span>String<span style="color:#ca60ca;">]</span> <span style="font-weight:bold;">in</span>
0348         <span style="color:#898887;">// </span><span style="color:#ca9219;background-color:#451e1a;font-weight:bold;">TODO</span><span style="color:#898887;">: parseArguments isn't a perfect fit here - should we use a different approach?</span>
0349         <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">line</span> <span style="color:#ca60ca;">=</span> line<span style="color:#ca60ca;">.</span>replacingOccurrences<span style="color:#ca60ca;">(</span>of<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;</span><span style="color:#3daee9;">\\</span><span style="color:#bf0303;">n&quot;</span><span style="color:#ca60ca;">,</span> with<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;</span><span style="color:#3daee9;">\n</span><span style="color:#bf0303;">&quot;</span><span style="color:#ca60ca;">)</span>
0350         <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">parts</span> <span style="color:#ca60ca;">=</span> parseArguments<span style="color:#ca60ca;">(</span>line<span style="color:#ca60ca;">,</span> ignoreComments<span style="color:#ca60ca;">:</span> <span style="font-weight:bold;">false</span><span style="color:#ca60ca;">).</span>dropFirst<span style="color:#ca60ca;">().</span>map <span style="color:#ca60ca;">{</span>
0351             $<span style="color:#b08000;">0.</span>replacingOccurrences<span style="color:#ca60ca;">(</span>of<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;</span><span style="color:#3daee9;">\n</span><span style="color:#bf0303;">&quot;</span><span style="color:#ca60ca;">,</span> with<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;</span><span style="color:#3daee9;">\\</span><span style="color:#bf0303;">n&quot;</span><span style="color:#ca60ca;">)</span>
0352         <span style="color:#ca60ca;">}</span>
0353         <span style="font-weight:bold;">guard</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">key</span> <span style="color:#ca60ca;">=</span> parts<span style="color:#ca60ca;">.</span>first <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0354             <span style="font-weight:bold;">return</span> <span style="color:#ca60ca;">[]</span>
0355         <span style="color:#ca60ca;">}</span>
0356         <span style="font-weight:bold;">if</span> <span style="color:#ca60ca;">!</span>key<span style="color:#ca60ca;">.</span>hasPrefix<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;-&quot;</span><span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0357             <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;Unknown option '</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">key)' in configuration file&quot;</span><span style="color:#ca60ca;">)</span>
0358         <span style="color:#ca60ca;">}</span>
0359         <span style="font-weight:bold;">return</span> <span style="color:#ca60ca;">[</span>key<span style="color:#ca60ca;">,</span> parts<span style="color:#ca60ca;">.</span>dropFirst<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot; &quot;</span><span style="color:#ca60ca;">)]</span>
0360     <span style="color:#ca60ca;">}</span>
0361     <span style="font-weight:bold;">do</span> <span style="color:#ca60ca;">{</span>
0362         <span style="font-weight:bold;">return</span> <span style="font-weight:bold;">try</span> preprocessArguments<span style="color:#ca60ca;">(</span>arguments<span style="color:#ca60ca;">,</span> optionsArguments<span style="color:#ca60ca;">)</span>
0363     <span style="color:#ca60ca;">}</span> <span style="font-weight:bold;">catch</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">FormatError</span><span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span>message<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0364         <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">message) in configuration file&quot;</span><span style="color:#ca60ca;">)</span>
0365     <span style="color:#ca60ca;">}</span>
0366 <span style="color:#ca60ca;">}</span>
0367 
0368 <span style="font-weight:bold;">private</span> <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">cumulate</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">successiveLines</span><span style="color:#ca60ca;">:</span> [<span style="color:#0057ae;">String</span>]<span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">throws</span> -&gt; [<span style="color:#644a9b;">String</span>] <span style="color:#ca60ca;">{</span>
0369     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">cumulatedLines</span> <span style="color:#ca60ca;">=</span> <span style="color:#ca60ca;">[</span>String<span style="color:#ca60ca;">]()</span>
0370     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">iterator</span> <span style="color:#ca60ca;">=</span> successiveLines<span style="color:#ca60ca;">.</span>makeIterator<span style="color:#ca60ca;">()</span>
0371     <span style="font-weight:bold;">while</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">currentLine</span> <span style="color:#ca60ca;">=</span> iterator<span style="color:#ca60ca;">.</span>next<span style="color:#ca60ca;">()</span> <span style="color:#ca60ca;">{</span>
0372         <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">cumulatedLine</span> <span style="color:#ca60ca;">=</span> effectiveContent<span style="color:#ca60ca;">(</span>of<span style="color:#ca60ca;">:</span> currentLine<span style="color:#ca60ca;">)</span>
0373         <span style="font-weight:bold;">while</span> cumulatedLine<span style="color:#ca60ca;">.</span>hasSuffix<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;</span><span style="color:#3daee9;">\\</span><span style="color:#bf0303;">&quot;</span><span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0374             <span style="font-weight:bold;">guard</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">nextLine</span> <span style="color:#ca60ca;">=</span> iterator<span style="color:#ca60ca;">.</span>next<span style="color:#ca60ca;">()</span> <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0375                 <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>reading<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;Configuration file ends with an illegal line continuation character '</span><span style="color:#3daee9;">\'</span><span style="color:#bf0303;">&quot;</span><span style="color:#ca60ca;">)</span>
0376             <span style="color:#ca60ca;">}</span>
0377             <span style="font-weight:bold;">if</span> <span style="color:#ca60ca;">!</span>nextLine<span style="color:#ca60ca;">.</span>trimmingCharacters<span style="color:#ca60ca;">(</span><span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">.</span>whitespaces<span style="color:#ca60ca;">).</span>starts<span style="color:#ca60ca;">(</span>with<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;#&quot;</span><span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0378                 cumulatedLine <span style="color:#ca60ca;">=</span> cumulatedLine<span style="color:#ca60ca;">.</span>dropLast<span style="color:#ca60ca;">()</span> <span style="color:#ca60ca;">+</span> effectiveContent<span style="color:#ca60ca;">(</span>of<span style="color:#ca60ca;">:</span> nextLine<span style="color:#ca60ca;">)</span>
0379             <span style="color:#ca60ca;">}</span>
0380         <span style="color:#ca60ca;">}</span>
0381         cumulatedLines<span style="color:#ca60ca;">.</span>append<span style="color:#ca60ca;">(</span>String<span style="color:#ca60ca;">(</span>cumulatedLine<span style="color:#ca60ca;">))</span>
0382     <span style="color:#ca60ca;">}</span>
0383     <span style="font-weight:bold;">return</span> cumulatedLines
0384 <span style="color:#ca60ca;">}</span>
0385 
0386 <span style="font-weight:bold;">private</span> <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">effectiveContent</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">of</span> <span style="color:#0057ae;">line</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span><span style="color:#ca60ca;">)</span> -&gt; <span style="color:#644a9b;">String</span> <span style="color:#ca60ca;">{</span>
0387     <span style="font-weight:bold;">return</span> line
0388         <span style="color:#ca60ca;">.</span>prefix <span style="color:#ca60ca;">{</span> $<span style="color:#b08000;">0</span> <span style="color:#ca60ca;">!=</span> <span style="color:#bf0303;">&quot;#&quot;</span> <span style="color:#ca60ca;">}</span>
0389         <span style="color:#ca60ca;">.</span>trimmingCharacters<span style="color:#ca60ca;">(</span><span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">.</span>whitespaces<span style="color:#ca60ca;">)</span>
0390 <span style="color:#ca60ca;">}</span>
0391 
0392 <span style="color:#898887;">// Serialize a set of options into either an arguments string or a file</span>
0393 <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">serialize</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">options</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">Options</span><span style="color:#ca60ca;">,</span>
0394                <span style="color:#0057ae;">swiftVersion</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">Version</span> <span style="color:#ca60ca;">=</span> <span style="color:#ca60ca;">.</span>undefined<span style="color:#ca60ca;">,</span>
0395                <span style="color:#0057ae;">excludingDefaults</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">Bool</span> <span style="color:#ca60ca;">=</span> false<span style="color:#ca60ca;">,</span>
0396                <span style="color:#0057ae;">separator</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span> <span style="color:#ca60ca;">=</span> <span style="color:#bf0303;">&quot;</span><span style="color:#3daee9;">\n</span><span style="color:#bf0303;">&quot;</span><span style="color:#ca60ca;">)</span> -&gt; <span style="color:#644a9b;">String</span>
0397 <span style="color:#ca60ca;">{</span>
0398     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">arguments</span> <span style="color:#ca60ca;">=</span> <span style="color:#ca60ca;">[[</span>String<span style="color:#ca60ca;">:</span> String<span style="color:#ca60ca;">]]()</span>
0399     <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">fileOptions</span> <span style="color:#ca60ca;">=</span> options<span style="color:#ca60ca;">.</span>fileOptions <span style="color:#ca60ca;">{</span>
0400         arguments<span style="color:#ca60ca;">.</span>append<span style="color:#ca60ca;">(</span>argumentsFor<span style="color:#ca60ca;">(</span>
0401             Options<span style="color:#ca60ca;">(</span>fileOptions<span style="color:#ca60ca;">:</span> fileOptions<span style="color:#ca60ca;">),</span>
0402             excludingDefaults<span style="color:#ca60ca;">:</span> excludingDefaults
0403         <span style="color:#ca60ca;">))</span>
0404     <span style="color:#ca60ca;">}</span>
0405     <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">formatOptions</span> <span style="color:#ca60ca;">=</span> options<span style="color:#ca60ca;">.</span>formatOptions <span style="color:#ca60ca;">{</span>
0406         arguments<span style="color:#ca60ca;">.</span>append<span style="color:#ca60ca;">(</span>argumentsFor<span style="color:#ca60ca;">(</span>
0407             Options<span style="color:#ca60ca;">(</span>formatOptions<span style="color:#ca60ca;">:</span> formatOptions<span style="color:#ca60ca;">),</span>
0408             excludingDefaults<span style="color:#ca60ca;">:</span> excludingDefaults
0409         <span style="color:#ca60ca;">))</span>
0410     <span style="color:#ca60ca;">}</span> <span style="font-weight:bold;">else</span> <span style="font-weight:bold;">if</span> swiftVersion <span style="color:#ca60ca;">!=</span> <span style="color:#ca60ca;">.</span>undefined <span style="color:#ca60ca;">{</span>
0411         <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">descriptor</span> <span style="color:#ca60ca;">=</span> Descriptors<span style="color:#ca60ca;">.</span>swiftVersion
0412         arguments<span style="color:#ca60ca;">.</span>append<span style="color:#ca60ca;">([</span>descriptor<span style="color:#ca60ca;">.</span>argumentName<span style="color:#ca60ca;">:</span> swiftVersion<span style="color:#ca60ca;">.</span>rawValue<span style="color:#ca60ca;">])</span>
0413     <span style="color:#ca60ca;">}</span>
0414     <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">rules</span> <span style="color:#ca60ca;">=</span> options<span style="color:#ca60ca;">.</span>rules <span style="color:#ca60ca;">{</span>
0415         arguments<span style="color:#ca60ca;">.</span>append<span style="color:#ca60ca;">(</span>argumentsFor<span style="color:#ca60ca;">(</span>
0416             Options<span style="color:#ca60ca;">(</span>rules<span style="color:#ca60ca;">:</span> rules<span style="color:#ca60ca;">),</span>
0417             excludingDefaults<span style="color:#ca60ca;">:</span> excludingDefaults
0418         <span style="color:#ca60ca;">))</span>
0419     <span style="color:#ca60ca;">}</span>
0420     <span style="font-weight:bold;">return</span> arguments
0421         <span style="color:#ca60ca;">.</span>map <span style="color:#ca60ca;">{</span> serialize<span style="color:#ca60ca;">(</span>arguments<span style="color:#ca60ca;">:</span> $<span style="color:#b08000;">0</span><span style="color:#ca60ca;">,</span> separator<span style="color:#ca60ca;">:</span> separator<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">}</span>
0422         <span style="color:#ca60ca;">.</span>filter <span style="color:#ca60ca;">{</span> <span style="color:#ca60ca;">!</span>$<span style="color:#b08000;">0.</span>isEmpty <span style="color:#ca60ca;">}</span>
0423         <span style="color:#ca60ca;">.</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> separator<span style="color:#ca60ca;">)</span>
0424 <span style="color:#ca60ca;">}</span>
0425 
0426 <span style="color:#898887;">// Serialize arguments</span>
0427 <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">serialize</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">arguments</span><span style="color:#ca60ca;">:</span> [<span style="color:#0057ae;">String</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span>]<span style="color:#ca60ca;">,</span>
0428                <span style="color:#0057ae;">separator</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span> <span style="color:#ca60ca;">=</span> <span style="color:#bf0303;">&quot;</span><span style="color:#3daee9;">\n</span><span style="color:#bf0303;">&quot;</span><span style="color:#ca60ca;">)</span> -&gt; <span style="color:#644a9b;">String</span>
0429 <span style="color:#ca60ca;">{</span>
0430     <span style="font-weight:bold;">return</span> arguments<span style="color:#ca60ca;">.</span>map <span style="color:#ca60ca;">{</span>
0431         <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">value</span> <span style="color:#ca60ca;">=</span> $<span style="color:#b08000;">1</span>
0432         <span style="font-weight:bold;">if</span> value<span style="color:#ca60ca;">.</span>contains<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot; &quot;</span><span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0433             value <span style="color:#ca60ca;">=</span> <span style="color:#bf0303;">&quot;</span><span style="color:#3daee9;">\&quot;</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">value.replacingOccurrences(of: &quot;</span>\<span style="color:#bf0303;">&quot;&quot;</span><span style="color:#ca60ca;">,</span> with<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;</span><span style="color:#3daee9;">\\\&quot;</span><span style="color:#bf0303;">&quot;</span><span style="color:#ca60ca;">))</span>\<span style="color:#bf0303;">&quot;&quot;</span>
0434         <span style="color:#ca60ca;">}</span>
0435         <span style="font-weight:bold;">return</span> <span style="color:#bf0303;">&quot;--</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#ff5500;">$</span><span style="color:#bf0303;">0) </span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">value)&quot;</span>
0436     <span style="color:#ca60ca;">}.</span>sorted<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> separator<span style="color:#ca60ca;">)</span>
0437 <span style="color:#ca60ca;">}</span>
0438 
0439 <span style="color:#898887;">// Get command line arguments from options</span>
0440 <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">argumentsFor</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">_</span> <span style="color:#0057ae;">options</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">Options</span><span style="color:#ca60ca;">,</span> <span style="color:#0057ae;">excludingDefaults</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">Bool</span> <span style="color:#ca60ca;">=</span> false<span style="color:#ca60ca;">)</span> -&gt; [<span style="color:#644a9b;">String</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span>] <span style="color:#ca60ca;">{</span>
0441     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">args</span> <span style="color:#ca60ca;">=</span> <span style="color:#ca60ca;">[</span>String<span style="color:#ca60ca;">:</span> String<span style="color:#ca60ca;">]()</span>
0442     <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">fileOptions</span> <span style="color:#ca60ca;">=</span> options<span style="color:#ca60ca;">.</span>fileOptions <span style="color:#ca60ca;">{</span>
0443         <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">arguments</span> <span style="color:#ca60ca;">=</span> Set<span style="color:#ca60ca;">(</span>fileArguments<span style="color:#ca60ca;">)</span>
0444         <span style="font-weight:bold;">do</span> <span style="color:#ca60ca;">{</span>
0445             <span style="font-weight:bold;">if</span> <span style="color:#ca60ca;">!</span>excludingDefaults <span style="color:#ca60ca;">||</span> fileOptions<span style="color:#ca60ca;">.</span>followSymlinks <span style="color:#ca60ca;">!=</span> FileOptions<span style="color:#ca60ca;">.</span><span style="font-weight:bold;">default</span><span style="color:#ca60ca;">.</span>followSymlinks <span style="color:#ca60ca;">{</span>
0446                 args<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;symlinks&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> fileOptions<span style="color:#ca60ca;">.</span>followSymlinks <span style="color:#ca60ca;">?</span> <span style="color:#bf0303;">&quot;follow&quot;</span> <span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;ignore&quot;</span>
0447             <span style="color:#ca60ca;">}</span>
0448             arguments<span style="color:#ca60ca;">.</span>remove<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;symlinks&quot;</span><span style="color:#ca60ca;">)</span>
0449         <span style="color:#ca60ca;">}</span>
0450         <span style="font-weight:bold;">do</span> <span style="color:#ca60ca;">{</span>
0451             <span style="font-weight:bold;">if</span> <span style="color:#ca60ca;">!</span>fileOptions<span style="color:#ca60ca;">.</span>excludedGlobs<span style="color:#ca60ca;">.</span>isEmpty <span style="color:#ca60ca;">{</span>
0452                 <span style="color:#898887;">// </span><span style="color:#ca9219;background-color:#451e1a;font-weight:bold;">TODO</span><span style="color:#898887;">: find a better alternative to stringifying url</span>
0453                 args<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;exclude&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> fileOptions<span style="color:#ca60ca;">.</span>excludedGlobs<span style="color:#ca60ca;">.</span>map <span style="color:#ca60ca;">{</span> $<span style="color:#b08000;">0.</span>description <span style="color:#ca60ca;">}.</span>sorted<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span>
0454             <span style="color:#ca60ca;">}</span>
0455             arguments<span style="color:#ca60ca;">.</span>remove<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;exclude&quot;</span><span style="color:#ca60ca;">)</span>
0456         <span style="color:#ca60ca;">}</span>
0457         <span style="font-weight:bold;">do</span> <span style="color:#ca60ca;">{</span>
0458             <span style="font-weight:bold;">if</span> <span style="color:#ca60ca;">!</span>fileOptions<span style="color:#ca60ca;">.</span>unexcludedGlobs<span style="color:#ca60ca;">.</span>isEmpty <span style="color:#ca60ca;">{</span>
0459                 <span style="color:#898887;">// </span><span style="color:#ca9219;background-color:#451e1a;font-weight:bold;">TODO</span><span style="color:#898887;">: find a better alternative to stringifying url</span>
0460                 args<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;unexclude&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> fileOptions<span style="color:#ca60ca;">.</span>unexcludedGlobs<span style="color:#ca60ca;">.</span>map <span style="color:#ca60ca;">{</span> $<span style="color:#b08000;">0.</span>description <span style="color:#ca60ca;">}.</span>sorted<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span>
0461             <span style="color:#ca60ca;">}</span>
0462             arguments<span style="color:#ca60ca;">.</span>remove<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;unexclude&quot;</span><span style="color:#ca60ca;">)</span>
0463         <span style="color:#ca60ca;">}</span>
0464         <span style="font-weight:bold;">do</span> <span style="color:#ca60ca;">{</span>
0465             <span style="font-weight:bold;">if</span> <span style="color:#ca60ca;">!</span>excludingDefaults <span style="color:#ca60ca;">||</span> fileOptions<span style="color:#ca60ca;">.</span>minVersion <span style="color:#ca60ca;">!=</span> FileOptions<span style="color:#ca60ca;">.</span><span style="font-weight:bold;">default</span><span style="color:#ca60ca;">.</span>minVersion <span style="color:#ca60ca;">{</span>
0466                 args<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;minversion&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> fileOptions<span style="color:#ca60ca;">.</span>minVersion<span style="color:#ca60ca;">.</span>description
0467             <span style="color:#ca60ca;">}</span>
0468             arguments<span style="color:#ca60ca;">.</span>remove<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;minversion&quot;</span><span style="color:#ca60ca;">)</span>
0469         <span style="color:#ca60ca;">}</span>
0470         assert<span style="color:#ca60ca;">(</span>arguments<span style="color:#ca60ca;">.</span>isEmpty<span style="color:#ca60ca;">)</span>
0471     <span style="color:#ca60ca;">}</span>
0472     <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">formatOptions</span> <span style="color:#ca60ca;">=</span> options<span style="color:#ca60ca;">.</span>formatOptions <span style="color:#ca60ca;">{</span>
0473         <span style="font-weight:bold;">for</span> descriptor <span style="font-weight:bold;">in</span> Descriptors<span style="color:#ca60ca;">.</span>all <span style="font-weight:bold;">where</span> <span style="color:#ca60ca;">!</span>descriptor<span style="color:#ca60ca;">.</span>isRenamed <span style="color:#ca60ca;">{</span>
0474             <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">value</span> <span style="color:#ca60ca;">=</span> descriptor<span style="color:#ca60ca;">.</span>fromOptions<span style="color:#ca60ca;">(</span>formatOptions<span style="color:#ca60ca;">)</span>
0475             <span style="font-weight:bold;">guard</span> value <span style="color:#ca60ca;">!=</span> descriptor<span style="color:#ca60ca;">.</span>fromOptions<span style="color:#ca60ca;">(.</span><span style="font-weight:bold;">default</span><span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">||</span>
0476                 <span style="color:#ca60ca;">(!</span>excludingDefaults <span style="color:#ca60ca;">&amp;&amp;</span> <span style="color:#ca60ca;">!</span>descriptor<span style="color:#ca60ca;">.</span>isDeprecated<span style="color:#ca60ca;">)</span>
0477             <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0478                 <span style="font-weight:bold;">continue</span>
0479             <span style="color:#ca60ca;">}</span>
0480             <span style="color:#898887;">// Special case for swiftVersion</span>
0481             <span style="color:#898887;">// </span><span style="color:#ca9219;background-color:#451e1a;font-weight:bold;">TODO</span><span style="color:#898887;">: find a better solution for this</span>
0482             <span style="font-weight:bold;">if</span> descriptor<span style="color:#ca60ca;">.</span>argumentName <span style="color:#ca60ca;">==</span> Descriptors<span style="color:#ca60ca;">.</span>swiftVersion<span style="color:#ca60ca;">.</span>argumentName<span style="color:#ca60ca;">,</span>
0483                value <span style="color:#ca60ca;">==</span> Version<span style="color:#ca60ca;">.</span>undefined<span style="color:#ca60ca;">.</span>rawValue
0484             <span style="color:#ca60ca;">{</span>
0485                 <span style="font-weight:bold;">continue</span>
0486             <span style="color:#ca60ca;">}</span>
0487             args<span style="color:#ca60ca;">[</span>descriptor<span style="color:#ca60ca;">.</span>argumentName<span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> value
0488         <span style="color:#ca60ca;">}</span>
0489         <span style="color:#898887;">// Special case for wrapParameters</span>
0490         <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">argumentName</span> <span style="color:#ca60ca;">=</span> Descriptors<span style="color:#ca60ca;">.</span>wrapParameters<span style="color:#ca60ca;">.</span>argumentName
0491         <span style="font-weight:bold;">if</span> args<span style="color:#ca60ca;">[</span>argumentName<span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">==</span> WrapMode<span style="color:#ca60ca;">.</span><span style="font-weight:bold;">default</span><span style="color:#ca60ca;">.</span>rawValue <span style="color:#ca60ca;">{</span>
0492             args<span style="color:#ca60ca;">[</span>argumentName<span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> args<span style="color:#ca60ca;">[</span>Descriptors<span style="color:#ca60ca;">.</span>wrapArguments<span style="color:#ca60ca;">.</span>argumentName<span style="color:#ca60ca;">]</span>
0493         <span style="color:#ca60ca;">}</span>
0494     <span style="color:#ca60ca;">}</span>
0495     <span style="font-weight:bold;">if</span> options<span style="color:#ca60ca;">.</span>lint <span style="color:#ca60ca;">{</span>
0496         args<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;lint&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> <span style="color:#bf0303;">&quot;&quot;</span>
0497     <span style="color:#ca60ca;">}</span>
0498     <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">rules</span> <span style="color:#ca60ca;">=</span> options<span style="color:#ca60ca;">.</span>rules <span style="color:#ca60ca;">{</span>
0499         <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">defaultRules</span> <span style="color:#ca60ca;">=</span> allRules<span style="color:#ca60ca;">.</span>subtracting<span style="color:#ca60ca;">(</span>FormatRules<span style="color:#ca60ca;">.</span>disabledByDefault<span style="color:#ca60ca;">)</span>
0500 
0501         <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">enabled</span> <span style="color:#ca60ca;">=</span> rules<span style="color:#ca60ca;">.</span>subtracting<span style="color:#ca60ca;">(</span>defaultRules<span style="color:#ca60ca;">)</span>
0502         <span style="font-weight:bold;">if</span> <span style="color:#ca60ca;">!</span>enabled<span style="color:#ca60ca;">.</span>isEmpty <span style="color:#ca60ca;">{</span>
0503             args<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;enable&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> enabled<span style="color:#ca60ca;">.</span>sorted<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span>
0504         <span style="color:#ca60ca;">}</span>
0505 
0506         <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">disabled</span> <span style="color:#ca60ca;">=</span> defaultRules<span style="color:#ca60ca;">.</span>subtracting<span style="color:#ca60ca;">(</span>rules<span style="color:#ca60ca;">)</span>
0507         <span style="font-weight:bold;">if</span> <span style="color:#ca60ca;">!</span>disabled<span style="color:#ca60ca;">.</span>isEmpty <span style="color:#ca60ca;">{</span>
0508             args<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;disable&quot;</span><span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">=</span> disabled<span style="color:#ca60ca;">.</span>sorted<span style="color:#ca60ca;">().</span>joined<span style="color:#ca60ca;">(</span>separator<span style="color:#ca60ca;">:</span> <span style="color:#bf0303;">&quot;,&quot;</span><span style="color:#ca60ca;">)</span>
0509         <span style="color:#ca60ca;">}</span>
0510     <span style="color:#ca60ca;">}</span>
0511     <span style="font-weight:bold;">return</span> args
0512 <span style="color:#ca60ca;">}</span>
0513 
0514 <span style="font-weight:bold;">private</span> <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">processOption</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">_</span> <span style="color:#0057ae;">key</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span><span style="color:#ca60ca;">,</span>
0515                            <span style="color:#0057ae;">in</span> <span style="color:#0057ae;">args</span><span style="color:#ca60ca;">:</span> [<span style="color:#0057ae;">String</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span>]<span style="color:#ca60ca;">,</span>
0516                            <span style="color:#0057ae;">from</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">inout</span> <span style="color:#0057ae;">Set</span>&lt;<span style="color:#0057ae;">String</span>&gt;<span style="color:#ca60ca;">,</span>
0517                            <span style="color:#0057ae;">handler</span><span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">(</span><span style="color:#0057ae;">String</span><span style="color:#ca60ca;">)</span> <span style="color:#0057ae;">throws</span> -&gt; <span style="color:#0057ae;">Void</span><span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">throws</span>
0518 <span style="color:#ca60ca;">{</span>
0519     precondition<span style="color:#ca60ca;">(</span>optionsArguments<span style="color:#ca60ca;">.</span>contains<span style="color:#ca60ca;">(</span>key<span style="color:#ca60ca;">),</span> <span style="color:#bf0303;">&quot;</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">key) not in optionsArguments&quot;</span><span style="color:#ca60ca;">)</span>
0520     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">arguments</span> <span style="color:#ca60ca;">=</span> from
0521     arguments<span style="color:#ca60ca;">.</span>remove<span style="color:#ca60ca;">(</span>key<span style="color:#ca60ca;">)</span>
0522     from <span style="color:#ca60ca;">=</span> arguments
0523     <span style="font-weight:bold;">guard</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">value</span> <span style="color:#ca60ca;">=</span> args<span style="color:#ca60ca;">[</span>key<span style="color:#ca60ca;">]</span> <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0524         <span style="font-weight:bold;">return</span>
0525     <span style="color:#ca60ca;">}</span>
0526     <span style="font-weight:bold;">do</span> <span style="color:#ca60ca;">{</span>
0527         <span style="font-weight:bold;">try</span> handler<span style="color:#ca60ca;">(</span>value<span style="color:#ca60ca;">)</span>
0528     <span style="color:#ca60ca;">}</span> <span style="font-weight:bold;">catch</span> <span style="color:#ca60ca;">{</span>
0529         <span style="font-weight:bold;">guard</span> <span style="color:#ca60ca;">!</span>value<span style="color:#ca60ca;">.</span>isEmpty <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0530             <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;--</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">key) option expects a value&quot;</span><span style="color:#ca60ca;">)</span>
0531         <span style="color:#ca60ca;">}</span>
0532         <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">case</span> <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">FormatError</span><span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span>string<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">=</span> error<span style="color:#ca60ca;">,</span> <span style="color:#ca60ca;">!</span>string<span style="color:#ca60ca;">.</span>isEmpty <span style="color:#ca60ca;">{</span>
0533             <span style="font-weight:bold;">if</span> <span style="color:#ca60ca;">!</span>string<span style="color:#ca60ca;">.</span>contains<span style="color:#ca60ca;">(</span>key<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0534                 string <span style="color:#ca60ca;">+=</span> <span style="color:#bf0303;">&quot; in --</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">key)&quot;</span>
0535             <span style="color:#ca60ca;">}</span>
0536             <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span>string<span style="color:#ca60ca;">)</span>
0537         <span style="color:#ca60ca;">}</span>
0538         <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;Unsupported --</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">key) value '</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">value)'&quot;</span><span style="color:#ca60ca;">)</span>
0539     <span style="color:#ca60ca;">}</span>
0540 <span style="color:#ca60ca;">}</span>
0541 
0542 <span style="color:#898887;">// Parse rule names from arguments</span>
0543 <span style="font-weight:bold;">public</span> <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">rulesFor</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">_</span> <span style="color:#0057ae;">args</span><span style="color:#ca60ca;">:</span> [<span style="color:#0057ae;">String</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span>]<span style="color:#ca60ca;">,</span> <span style="color:#0057ae;">lint</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">Bool</span><span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">throws</span> -&gt; <span style="color:#644a9b;">Set</span><span style="color:#ca60ca;">&lt;</span><span style="color:#0057ae;">String</span><span style="color:#ca60ca;">&gt;</span> <span style="color:#ca60ca;">{</span>
0544     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">rules</span> <span style="color:#ca60ca;">=</span> allRules
0545     rules <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span> args<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;rules&quot;</span><span style="color:#ca60ca;">].</span>map <span style="color:#ca60ca;">{</span>
0546         <span style="font-weight:bold;">try</span> Set<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">(</span>$<span style="color:#b08000;">0</span><span style="color:#ca60ca;">))</span>
0547     <span style="color:#ca60ca;">}</span> <span style="color:#ca60ca;">??</span> rules<span style="color:#ca60ca;">.</span>subtracting<span style="color:#ca60ca;">(</span>FormatRules<span style="color:#ca60ca;">.</span>disabledByDefault<span style="color:#ca60ca;">)</span>
0548     <span style="font-weight:bold;">try</span> args<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;enable&quot;</span><span style="color:#ca60ca;">].</span>map <span style="color:#ca60ca;">{</span>
0549         <span style="font-weight:bold;">try</span> rules<span style="color:#ca60ca;">.</span>formUnion<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">(</span>$<span style="color:#b08000;">0</span><span style="color:#ca60ca;">))</span>
0550     <span style="color:#ca60ca;">}</span>
0551     <span style="font-weight:bold;">try</span> args<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;disable&quot;</span><span style="color:#ca60ca;">].</span>map <span style="color:#ca60ca;">{</span>
0552         <span style="font-weight:bold;">try</span> rules<span style="color:#ca60ca;">.</span>subtract<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">(</span>$<span style="color:#b08000;">0</span><span style="color:#ca60ca;">))</span>
0553     <span style="color:#ca60ca;">}</span>
0554     <span style="font-weight:bold;">try</span> args<span style="color:#ca60ca;">[</span><span style="color:#bf0303;">&quot;lintonly&quot;</span><span style="color:#ca60ca;">].</span>map <span style="color:#ca60ca;">{</span> rulesString <span style="font-weight:bold;">in</span>
0555         <span style="font-weight:bold;">if</span> lint <span style="color:#ca60ca;">{</span>
0556             <span style="font-weight:bold;">try</span> rules<span style="color:#ca60ca;">.</span>formUnion<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">(</span>rulesString<span style="color:#ca60ca;">))</span>
0557         <span style="color:#ca60ca;">}</span> <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0558             <span style="font-weight:bold;">try</span> rules<span style="color:#ca60ca;">.</span>subtract<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">(</span>rulesString<span style="color:#ca60ca;">))</span>
0559         <span style="color:#ca60ca;">}</span>
0560     <span style="color:#ca60ca;">}</span>
0561     <span style="font-weight:bold;">return</span> rules
0562 <span style="color:#ca60ca;">}</span>
0563 
0564 <span style="color:#898887;">// Parse FileOptions from arguments</span>
0565 <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">fileOptionsFor</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">_</span> <span style="color:#0057ae;">args</span><span style="color:#ca60ca;">:</span> [<span style="color:#0057ae;">String</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span>]<span style="color:#ca60ca;">,</span> <span style="color:#0057ae;">in</span> <span style="color:#0057ae;">directory</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span><span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">throws</span> -&gt; <span style="color:#644a9b;">FileOptions</span>? <span style="color:#ca60ca;">{</span>
0566     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">options</span> <span style="color:#ca60ca;">=</span> FileOptions<span style="color:#ca60ca;">()</span>
0567     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">arguments</span> <span style="color:#ca60ca;">=</span> Set<span style="color:#ca60ca;">(</span>fileArguments<span style="color:#ca60ca;">)</span>
0568 
0569     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">containsFileOption</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">false</span>
0570     <span style="font-weight:bold;">try</span> processOption<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;symlinks&quot;</span><span style="color:#ca60ca;">,</span> <span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> args<span style="color:#ca60ca;">,</span> from<span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">&amp;</span>arguments<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0571         containsFileOption <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">true</span>
0572         <span style="font-weight:bold;">switch</span> $<span style="color:#b08000;">0.</span>lowercased<span style="color:#ca60ca;">()</span> <span style="color:#ca60ca;">{</span>
0573         <span style="font-weight:bold;">case</span> <span style="color:#bf0303;">&quot;follow&quot;</span><span style="color:#ca60ca;">:</span>
0574             options<span style="color:#ca60ca;">.</span>followSymlinks <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">true</span>
0575         <span style="font-weight:bold;">case</span> <span style="color:#bf0303;">&quot;ignore&quot;</span><span style="color:#ca60ca;">:</span>
0576             options<span style="color:#ca60ca;">.</span>followSymlinks <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">false</span>
0577         <span style="font-weight:bold;">default</span><span style="color:#ca60ca;">:</span>
0578             <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;&quot;</span><span style="color:#ca60ca;">)</span>
0579         <span style="color:#ca60ca;">}</span>
0580     <span style="color:#ca60ca;">}</span>
0581     <span style="font-weight:bold;">try</span> processOption<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;exclude&quot;</span><span style="color:#ca60ca;">,</span> <span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> args<span style="color:#ca60ca;">,</span> from<span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">&amp;</span>arguments<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0582         containsFileOption <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">true</span>
0583         options<span style="color:#ca60ca;">.</span>excludedGlobs <span style="color:#ca60ca;">+=</span> expandGlobs<span style="color:#ca60ca;">(</span>$<span style="color:#b08000;">0</span><span style="color:#ca60ca;">,</span> <span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> directory<span style="color:#ca60ca;">)</span>
0584     <span style="color:#ca60ca;">}</span>
0585     <span style="font-weight:bold;">try</span> processOption<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;unexclude&quot;</span><span style="color:#ca60ca;">,</span> <span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> args<span style="color:#ca60ca;">,</span> from<span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">&amp;</span>arguments<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0586         containsFileOption <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">true</span>
0587         options<span style="color:#ca60ca;">.</span>unexcludedGlobs <span style="color:#ca60ca;">+=</span> expandGlobs<span style="color:#ca60ca;">(</span>$<span style="color:#b08000;">0</span><span style="color:#ca60ca;">,</span> <span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> directory<span style="color:#ca60ca;">)</span>
0588     <span style="color:#ca60ca;">}</span>
0589     <span style="font-weight:bold;">try</span> processOption<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;minversion&quot;</span><span style="color:#ca60ca;">,</span> <span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> args<span style="color:#ca60ca;">,</span> from<span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">&amp;</span>arguments<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0590         containsFileOption <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">true</span>
0591         <span style="font-weight:bold;">guard</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">minVersion</span> <span style="color:#ca60ca;">=</span> Version<span style="color:#ca60ca;">(</span>rawValue<span style="color:#ca60ca;">:</span> $<span style="color:#b08000;">0</span><span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0592             <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;Unsupported --minversion value '</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#ff5500;">$</span><span style="color:#bf0303;">0)'&quot;</span><span style="color:#ca60ca;">)</span>
0593         <span style="color:#ca60ca;">}</span>
0594         <span style="font-weight:bold;">guard</span> minVersion <span style="color:#ca60ca;">&lt;=</span> Version<span style="color:#ca60ca;">(</span>stringLiteral<span style="color:#ca60ca;">:</span> swiftFormatVersion<span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0595             <span style="font-weight:bold;">throw</span> FormatError<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;Project specifies SwiftFormat --minversion of </span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">minVersion)&quot;</span><span style="color:#ca60ca;">)</span>
0596         <span style="color:#ca60ca;">}</span>
0597         options<span style="color:#ca60ca;">.</span>minVersion <span style="color:#ca60ca;">=</span> minVersion
0598     <span style="color:#ca60ca;">}</span>
0599     assert<span style="color:#ca60ca;">(</span>arguments<span style="color:#ca60ca;">.</span>isEmpty<span style="color:#ca60ca;">,</span> <span style="color:#bf0303;">&quot;</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">arguments.joined(separator: &quot;</span><span style="color:#ca60ca;">,</span><span style="color:#bf0303;">&quot;))&quot;</span><span style="color:#ca60ca;">)</span>
0600     <span style="font-weight:bold;">return</span> containsFileOption <span style="color:#ca60ca;">?</span> options <span style="color:#ca60ca;">:</span> <span style="font-weight:bold;">nil</span>
0601 <span style="color:#ca60ca;">}</span>
0602 
0603 <span style="color:#898887;">// Parse FormatOptions from arguments</span>
0604 <span style="color:#898887;">// Returns nil if the arguments dictionary does not contain any formatting arguments</span>
0605 <span style="font-weight:bold;">public</span> <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">formatOptionsFor</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">_</span> <span style="color:#0057ae;">args</span><span style="color:#ca60ca;">:</span> [<span style="color:#0057ae;">String</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span>]<span style="color:#ca60ca;">)</span> <span style="font-weight:bold;">throws</span> -&gt; <span style="color:#644a9b;">FormatOptions</span>? <span style="color:#ca60ca;">{</span>
0606     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">options</span> <span style="color:#ca60ca;">=</span> FormatOptions<span style="color:#ca60ca;">.</span><span style="font-weight:bold;">default</span>
0607     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">arguments</span> <span style="color:#ca60ca;">=</span> Set<span style="color:#ca60ca;">(</span>formattingArguments<span style="color:#ca60ca;">)</span>
0608 
0609     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">containsFormatOption</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">false</span>
0610     <span style="font-weight:bold;">for</span> option <span style="font-weight:bold;">in</span> Descriptors<span style="color:#ca60ca;">.</span>all <span style="color:#ca60ca;">{</span>
0611         <span style="font-weight:bold;">try</span> processOption<span style="color:#ca60ca;">(</span>option<span style="color:#ca60ca;">.</span>argumentName<span style="color:#ca60ca;">,</span> <span style="font-weight:bold;">in</span><span style="color:#ca60ca;">:</span> args<span style="color:#ca60ca;">,</span> from<span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">&amp;</span>arguments<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0612             containsFormatOption <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">true</span>
0613             <span style="font-weight:bold;">try</span> option<span style="color:#ca60ca;">.</span>toOptions<span style="color:#ca60ca;">(</span>$<span style="color:#b08000;">0</span><span style="color:#ca60ca;">,</span> <span style="color:#ca60ca;">&amp;</span>options<span style="color:#ca60ca;">)</span>
0614         <span style="color:#ca60ca;">}</span>
0615     <span style="color:#ca60ca;">}</span>
0616     assert<span style="color:#ca60ca;">(</span>arguments<span style="color:#ca60ca;">.</span>isEmpty<span style="color:#ca60ca;">,</span> <span style="color:#bf0303;">&quot;</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">arguments.joined(separator: &quot;</span><span style="color:#ca60ca;">,</span><span style="color:#bf0303;">&quot;))&quot;</span><span style="color:#ca60ca;">)</span>
0617     <span style="font-weight:bold;">return</span> containsFormatOption <span style="color:#ca60ca;">?</span> options <span style="color:#ca60ca;">:</span> <span style="font-weight:bold;">nil</span>
0618 <span style="color:#ca60ca;">}</span>
0619 
0620 <span style="color:#898887;">// Get deprecation warnings from a set of arguments</span>
0621 <span style="font-weight:bold;">func</span> <span style="color:#644a9b;">warningsForArguments</span><span style="color:#ca60ca;">(</span><span style="color:#0057ae;">_</span> <span style="color:#0057ae;">args</span><span style="color:#ca60ca;">:</span> [<span style="color:#0057ae;">String</span><span style="color:#ca60ca;">:</span> <span style="color:#0057ae;">String</span>]<span style="color:#ca60ca;">)</span> -&gt; [<span style="color:#644a9b;">String</span>] <span style="color:#ca60ca;">{</span>
0622     <span style="font-weight:bold;">var</span> <span style="color:#0057ae;">warnings</span> <span style="color:#ca60ca;">=</span> <span style="color:#ca60ca;">[</span>String<span style="color:#ca60ca;">]()</span>
0623     <span style="font-weight:bold;">for</span> option <span style="font-weight:bold;">in</span> Descriptors<span style="color:#ca60ca;">.</span>all <span style="color:#ca60ca;">{</span>
0624         <span style="font-weight:bold;">if</span> args<span style="color:#ca60ca;">[</span>option<span style="color:#ca60ca;">.</span>argumentName<span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">!=</span> <span style="font-weight:bold;">nil</span><span style="color:#ca60ca;">,</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">message</span> <span style="color:#ca60ca;">=</span> option<span style="color:#ca60ca;">.</span>deprecationMessage <span style="color:#ca60ca;">{</span>
0625             warnings<span style="color:#ca60ca;">.</span>append<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;--</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">option.argumentName) option is deprecated. </span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">message)&quot;</span><span style="color:#ca60ca;">)</span>
0626         <span style="color:#ca60ca;">}</span>
0627     <span style="color:#ca60ca;">}</span>
0628     <span style="font-weight:bold;">for</span> name <span style="font-weight:bold;">in</span> Set<span style="color:#ca60ca;">(</span>rulesArguments<span style="color:#ca60ca;">.</span>flatMap <span style="color:#ca60ca;">{</span> <span style="color:#ca60ca;">(</span><span style="font-weight:bold;">try</span><span style="color:#ca60ca;">?</span> args<span style="color:#ca60ca;">[</span>$<span style="color:#b08000;">0</span><span style="color:#ca60ca;">].</span>map<span style="color:#ca60ca;">(</span>parseRules<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">??</span> <span style="color:#ca60ca;">[])</span> <span style="color:#ca60ca;">??</span> <span style="color:#ca60ca;">[]</span> <span style="color:#ca60ca;">})</span> <span style="color:#ca60ca;">{</span>
0629         <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">message</span> <span style="color:#ca60ca;">=</span> FormatRules<span style="color:#ca60ca;">.</span>byName<span style="color:#ca60ca;">[</span>name<span style="color:#ca60ca;">]?.</span>deprecationMessage <span style="color:#ca60ca;">{</span>
0630             warnings<span style="color:#ca60ca;">.</span>append<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">name) rule is deprecated. </span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">message)&quot;</span><span style="color:#ca60ca;">)</span>
0631         <span style="color:#ca60ca;">}</span>
0632     <span style="color:#ca60ca;">}</span>
0633     <span style="font-weight:bold;">if</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">rules</span> <span style="color:#ca60ca;">=</span> <span style="font-weight:bold;">try</span><span style="color:#ca60ca;">?</span> rulesFor<span style="color:#ca60ca;">(</span>args<span style="color:#ca60ca;">,</span> lint<span style="color:#ca60ca;">:</span> <span style="font-weight:bold;">true</span><span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0634         <span style="font-weight:bold;">for</span> arg <span style="font-weight:bold;">in</span> args<span style="color:#ca60ca;">.</span>keys <span style="font-weight:bold;">where</span> formattingArguments<span style="color:#ca60ca;">.</span>contains<span style="color:#ca60ca;">(</span>arg<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">{</span>
0635             <span style="font-weight:bold;">if</span> <span style="color:#ca60ca;">!</span>rules<span style="color:#ca60ca;">.</span>contains<span style="color:#ca60ca;">(</span><span style="font-weight:bold;">where</span><span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">{</span>
0636                 <span style="font-weight:bold;">guard</span> <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">rule</span> <span style="color:#ca60ca;">=</span> FormatRules<span style="color:#ca60ca;">.</span>byName<span style="color:#ca60ca;">[</span>$<span style="color:#b08000;">0</span><span style="color:#ca60ca;">]</span> <span style="font-weight:bold;">else</span> <span style="color:#ca60ca;">{</span>
0637                     <span style="font-weight:bold;">return</span> <span style="font-weight:bold;">false</span>
0638                 <span style="color:#ca60ca;">}</span>
0639                 <span style="font-weight:bold;">return</span> rule<span style="color:#ca60ca;">.</span>options<span style="color:#ca60ca;">.</span>contains<span style="color:#ca60ca;">(</span>arg<span style="color:#ca60ca;">)</span> <span style="color:#ca60ca;">||</span> rule<span style="color:#ca60ca;">.</span>sharedOptions<span style="color:#ca60ca;">.</span>contains<span style="color:#ca60ca;">(</span>arg<span style="color:#ca60ca;">)</span>
0640             <span style="color:#ca60ca;">})</span> <span style="color:#ca60ca;">{</span>
0641                 <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">expected</span> <span style="color:#ca60ca;">=</span> FormatRules<span style="color:#ca60ca;">.</span>all<span style="color:#ca60ca;">.</span>first<span style="color:#ca60ca;">(</span><span style="font-weight:bold;">where</span><span style="color:#ca60ca;">:</span> <span style="color:#ca60ca;">{</span>
0642                     $<span style="color:#b08000;">0.</span>options<span style="color:#ca60ca;">.</span>contains<span style="color:#ca60ca;">(</span>arg<span style="color:#ca60ca;">)</span>
0643                 <span style="color:#ca60ca;">})?.</span>name <span style="color:#ca60ca;">??</span> <span style="color:#bf0303;">&quot;associated&quot;</span>
0644                 warnings<span style="color:#ca60ca;">.</span>append<span style="color:#ca60ca;">(</span><span style="color:#bf0303;">&quot;--</span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">arg) option has no effect when </span><span style="color:#bf0303;text-decoration:underline;">\(</span><span style="color:#bf0303;">expected) rule is disabled&quot;</span><span style="color:#ca60ca;">)</span>
0645             <span style="color:#ca60ca;">}</span>
0646         <span style="color:#ca60ca;">}</span>
0647     <span style="color:#ca60ca;">}</span>
0648     <span style="font-weight:bold;">return</span> warnings
0649 <span style="color:#ca60ca;">}</span>
0650 
0651 <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">fileArguments</span> <span style="color:#ca60ca;">=</span> <span style="color:#ca60ca;">[</span>
0652     <span style="color:#bf0303;">&quot;symlinks&quot;</span><span style="color:#ca60ca;">,</span>
0653     <span style="color:#bf0303;">&quot;exclude&quot;</span><span style="color:#ca60ca;">,</span>
0654     <span style="color:#bf0303;">&quot;unexclude&quot;</span><span style="color:#ca60ca;">,</span>
0655     <span style="color:#bf0303;">&quot;minversion&quot;</span><span style="color:#ca60ca;">,</span>
0656 <span style="color:#ca60ca;">]</span>
0657 
0658 <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">rulesArguments</span> <span style="color:#ca60ca;">=</span> <span style="color:#ca60ca;">[</span>
0659     <span style="color:#bf0303;">&quot;disable&quot;</span><span style="color:#ca60ca;">,</span>
0660     <span style="color:#bf0303;">&quot;enable&quot;</span><span style="color:#ca60ca;">,</span>
0661     <span style="color:#bf0303;">&quot;lintonly&quot;</span><span style="color:#ca60ca;">,</span>
0662     <span style="color:#bf0303;">&quot;rules&quot;</span><span style="color:#ca60ca;">,</span>
0663 <span style="color:#ca60ca;">]</span>
0664 
0665 <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">formattingArguments</span> <span style="color:#ca60ca;">=</span> Descriptors<span style="color:#ca60ca;">.</span>formatting<span style="color:#ca60ca;">.</span>map <span style="color:#ca60ca;">{</span> $<span style="color:#b08000;">0.</span>argumentName <span style="color:#ca60ca;">}</span>
0666 <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">internalArguments</span> <span style="color:#ca60ca;">=</span> Descriptors<span style="color:#ca60ca;">.</span><span style="font-weight:bold;">internal</span><span style="color:#ca60ca;">.</span>map <span style="color:#ca60ca;">{</span> $<span style="color:#b08000;">0.</span>argumentName <span style="color:#ca60ca;">}</span>
0667 <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">optionsArguments</span> <span style="color:#ca60ca;">=</span> fileArguments <span style="color:#ca60ca;">+</span> rulesArguments <span style="color:#ca60ca;">+</span> formattingArguments <span style="color:#ca60ca;">+</span> internalArguments
0668 
0669 <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">commandLineArguments</span> <span style="color:#ca60ca;">=</span> <span style="color:#ca60ca;">[</span>
0670     <span style="color:#898887;">// Input options</span>
0671     <span style="color:#bf0303;">&quot;filelist&quot;</span><span style="color:#ca60ca;">,</span>
0672     <span style="color:#bf0303;">&quot;stdinpath&quot;</span><span style="color:#ca60ca;">,</span>
0673     <span style="color:#bf0303;">&quot;config&quot;</span><span style="color:#ca60ca;">,</span>
0674     <span style="color:#bf0303;">&quot;inferoptions&quot;</span><span style="color:#ca60ca;">,</span>
0675     <span style="color:#bf0303;">&quot;linerange&quot;</span><span style="color:#ca60ca;">,</span>
0676     <span style="color:#bf0303;">&quot;output&quot;</span><span style="color:#ca60ca;">,</span>
0677     <span style="color:#bf0303;">&quot;cache&quot;</span><span style="color:#ca60ca;">,</span>
0678     <span style="color:#bf0303;">&quot;dryrun&quot;</span><span style="color:#ca60ca;">,</span>
0679     <span style="color:#bf0303;">&quot;lint&quot;</span><span style="color:#ca60ca;">,</span>
0680     <span style="color:#bf0303;">&quot;lenient&quot;</span><span style="color:#ca60ca;">,</span>
0681     <span style="color:#bf0303;">&quot;verbose&quot;</span><span style="color:#ca60ca;">,</span>
0682     <span style="color:#bf0303;">&quot;quiet&quot;</span><span style="color:#ca60ca;">,</span>
0683     <span style="color:#bf0303;">&quot;report&quot;</span><span style="color:#ca60ca;">,</span>
0684     <span style="color:#898887;">// Misc</span>
0685     <span style="color:#bf0303;">&quot;help&quot;</span><span style="color:#ca60ca;">,</span>
0686     <span style="color:#bf0303;">&quot;version&quot;</span><span style="color:#ca60ca;">,</span>
0687     <span style="color:#bf0303;">&quot;options&quot;</span><span style="color:#ca60ca;">,</span>
0688     <span style="color:#bf0303;">&quot;ruleinfo&quot;</span><span style="color:#ca60ca;">,</span>
0689 <span style="color:#ca60ca;">]</span> <span style="color:#ca60ca;">+</span> optionsArguments
0690 
0691 <span style="font-weight:bold;">let</span> <span style="color:#0057ae;">deprecatedArguments</span> <span style="color:#ca60ca;">=</span> Descriptors<span style="color:#ca60ca;">.</span>all<span style="color:#ca60ca;">.</span>compactMap <span style="color:#ca60ca;">{</span>
0692     $<span style="color:#b08000;">0.</span>isDeprecated <span style="color:#ca60ca;">?</span> $<span style="color:#b08000;">0.</span>argumentName <span style="color:#ca60ca;">:</span> <span style="font-weight:bold;">nil</span>
0693 <span style="color:#ca60ca;">}</span>
0694 </pre></body></html>