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