feat: add missing KF6 framework recipes
This commit is contained in:
@@ -0,0 +1,703 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
||||
<title>test.swift</title>
|
||||
<meta name="generator" content="KF5::SyntaxHighlighting - Definition (Swift) - Theme (Breeze Dark)"/>
|
||||
</head><body style="background-color:#232629;color:#cfcfc2"><pre>
|
||||
<span style="color:#7a7c7d">//</span>
|
||||
<span style="color:#7a7c7d">// Arguments.swift</span>
|
||||
<span style="color:#7a7c7d">// SwiftFormat</span>
|
||||
<span style="color:#7a7c7d">//</span>
|
||||
<span style="color:#7a7c7d">// Created by Nick Lockwood on 07/08/2018.</span>
|
||||
<span style="color:#7a7c7d">// Copyright © 2018 Nick Lockwood.</span>
|
||||
<span style="color:#7a7c7d">//</span>
|
||||
<span style="color:#7a7c7d">// Distributed under the permissive MIT license</span>
|
||||
<span style="color:#7a7c7d">// Get the latest version from here:</span>
|
||||
<span style="color:#7a7c7d">//</span>
|
||||
<span style="color:#7a7c7d">// https://github.com/nicklockwood/SwiftFormat</span>
|
||||
<span style="color:#7a7c7d">//</span>
|
||||
<span style="color:#7a7c7d">// Permission is hereby granted, free of charge, to any person obtaining a copy</span>
|
||||
<span style="color:#7a7c7d">// of this software and associated documentation files (the "Software"), to deal</span>
|
||||
<span style="color:#7a7c7d">// in the Software without restriction, including without limitation the rights</span>
|
||||
<span style="color:#7a7c7d">// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span>
|
||||
<span style="color:#7a7c7d">// copies of the Software, and to permit persons to whom the Software is</span>
|
||||
<span style="color:#7a7c7d">// furnished to do so, subject to the following conditions:</span>
|
||||
<span style="color:#7a7c7d">//</span>
|
||||
<span style="color:#7a7c7d">// The above copyright notice and this permission notice shall be included in all</span>
|
||||
<span style="color:#7a7c7d">// copies or substantial portions of the Software.</span>
|
||||
<span style="color:#7a7c7d">//</span>
|
||||
<span style="color:#7a7c7d">// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
|
||||
<span style="color:#7a7c7d">// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
|
||||
<span style="color:#7a7c7d">// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span>
|
||||
<span style="color:#7a7c7d">// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
|
||||
<span style="color:#7a7c7d">// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span>
|
||||
<span style="color:#7a7c7d">// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE</span>
|
||||
<span style="color:#7a7c7d">// SOFTWARE.</span>
|
||||
<span style="color:#7a7c7d">//</span>
|
||||
|
||||
<span style="font-weight:bold">import</span> <span style="color:#27ae60">Foundation</span>
|
||||
|
||||
<span style="font-weight:bold">extension</span> Options <span style="color:#3f8058">{</span>
|
||||
<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>
|
||||
|
||||
<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>
|
||||
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>
|
||||
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>
|
||||
<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>
|
||||
<span style="font-weight:bold">self</span><span style="color:#3f8058">.</span>lint <span style="color:#3f8058">=</span> lint
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
newOptions<span style="color:#3f8058">.</span>formatOptions<span style="color:#3f8058">?.</span>fileInfo <span style="color:#3f8058">=</span> fileInfo
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="font-weight:bold">self</span> <span style="color:#3f8058">=</span> newOptions
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// Parse a space-delimited string into an array of command-line arguments</span>
|
||||
<span style="color:#7a7c7d">// Replicates the behavior implemented by the console when parsing input</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span style="font-weight:bold">var</span> <span style="color:#27aeae">string</span> <span style="color:#3f8058">=</span> <span style="color:#f44f4f">""</span>
|
||||
<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>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#fdbc4b;font-weight:bold">switch</span> char <span style="color:#3f8058">{</span>
|
||||
<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>
|
||||
<span style="color:#fdbc4b;font-weight:bold">break</span> loop <span style="color:#7a7c7d">// comment</span>
|
||||
<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>
|
||||
escaped <span style="color:#3f8058">=</span> <span style="font-weight:bold">true</span>
|
||||
<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>
|
||||
quoted <span style="color:#3f8058">=</span> <span style="font-weight:bold">true</span>
|
||||
<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>
|
||||
quoted <span style="color:#3f8058">=</span> <span style="font-weight:bold">false</span>
|
||||
<span style="color:#fdbc4b;font-weight:bold">fallthrough</span>
|
||||
<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>
|
||||
<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>
|
||||
arguments<span style="color:#3f8058">.</span>append<span style="color:#3f8058">(</span>string<span style="color:#3f8058">)</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
string<span style="color:#3f8058">.</span>removeAll<span style="color:#3f8058">()</span>
|
||||
<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>
|
||||
escaped <span style="color:#3f8058">=</span> <span style="font-weight:bold">false</span>
|
||||
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>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#fdbc4b;font-weight:bold">fallthrough</span>
|
||||
<span style="font-weight:bold">default</span><span style="color:#3f8058">:</span>
|
||||
escaped <span style="color:#3f8058">=</span> <span style="font-weight:bold">false</span>
|
||||
string<span style="color:#3f8058">.</span>append<span style="color:#3f8058">(</span>Character<span style="color:#3f8058">(</span>char<span style="color:#3f8058">))</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
arguments<span style="color:#3f8058">.</span>append<span style="color:#3f8058">(</span>string<span style="color:#3f8058">)</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="font-weight:bold">return</span> arguments
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// Parse a flat array of command-line arguments into a dictionary of flags and values</span>
|
||||
<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>
|
||||
<span style="font-weight:bold">var</span> <span style="color:#27aeae">anonymousArgs</span> <span style="color:#3f8058">=</span> <span style="color:#f67400">0</span>
|
||||
<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>
|
||||
<span style="font-weight:bold">var</span> <span style="color:#27aeae">name</span> <span style="color:#3f8058">=</span> <span style="color:#f44f4f">""</span>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#7a7c7d">// Long argument names</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
name <span style="color:#3f8058">=</span> key
|
||||
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>
|
||||
<span style="color:#fdbc4b;font-weight:bold">continue</span>
|
||||
<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>
|
||||
<span style="color:#7a7c7d">// Short argument names</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
name <span style="color:#3f8058">=</span> match
|
||||
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>
|
||||
<span style="color:#fdbc4b;font-weight:bold">continue</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<span style="color:#7a7c7d">// Argument is anonymous</span>
|
||||
name <span style="color:#3f8058">=</span> String<span style="color:#3f8058">(</span>anonymousArgs<span style="color:#3f8058">)</span>
|
||||
anonymousArgs <span style="color:#3f8058">+=</span> <span style="color:#f67400">1</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="font-weight:bold">var</span> <span style="color:#27aeae">arg</span> <span style="color:#3f8058">=</span> arg
|
||||
<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>
|
||||
<span style="color:#fdbc4b;font-weight:bold">if</span> hasTrailingComma <span style="color:#3f8058">{</span>
|
||||
arg <span style="color:#3f8058">=</span> String<span style="color:#3f8058">(</span>arg<span style="color:#3f8058">.</span>dropLast<span style="color:#3f8058">())</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
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> name <span style="color:#3f8058">&&</span> $<span style="color:#f67400">0.</span>isSetType
|
||||
<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> existing <span style="color:#3f8058">+</span> <span style="color:#f44f4f">","</span> <span style="color:#3f8058">+</span> arg
|
||||
<span style="color:#3f8058">}</span> <span style="color:#fdbc4b;font-weight:bold">else</span> <span style="color:#3f8058">{</span>
|
||||
namedArgs<span style="color:#3f8058">[</span>name<span style="color:#3f8058">]</span> <span style="color:#3f8058">=</span> arg
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#fdbc4b;font-weight:bold">if</span> <span style="color:#3f8058">!</span>hasTrailingComma <span style="color:#3f8058">{</span>
|
||||
name <span style="color:#3f8058">=</span> <span style="color:#f44f4f">""</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="font-weight:bold">return</span> namedArgs
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// Find best match for a given string in a list of options</span>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#7a7c7d">// Sort matches by Levenshtein edit distance</span>
|
||||
<span style="font-weight:bold">return</span> options
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span style="font-weight:bold">return</span> <span style="font-weight:bold">nil</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">.</span>sorted <span style="color:#3f8058">{</span>
|
||||
<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>
|
||||
<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
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">.</span>map <span style="color:#3f8058">{</span> $<span style="color:#f67400">0.0</span> <span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">/// The Damerau-Levenshtein edit-distance between two strings</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
dist<span style="color:#3f8058">.</span>append<span style="color:#3f8058">([</span>i<span style="color:#3f8058">])</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span> <span style="color:#fdbc4b;font-weight:bold">else</span> <span style="color:#3f8058">{</span>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// Parse a comma-delimited list of items</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// Parse a comma-delimited string into an array of rules</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
$<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>
|
||||
<span style="color:#3f8058">})</span> <span style="color:#3f8058">{</span>
|
||||
<span style="font-weight:bold">return</span> name
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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> proposedName
|
||||
<span style="color:#3f8058">})</span> <span style="color:#3f8058">{</span>
|
||||
<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>
|
||||
<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. Did you mean '</span><span style="color:#da4453;text-decoration:underline">\(</span><span style="color:#f44f4f">rule.name)'?"</span>
|
||||
<span style="color:#3f8058">)</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// Parse single file path, disallowing globs or commas</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="font-weight:bold">return</span> expandedPath
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// Parse one or more comma-delimited file paths, expanding globs as required</span>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// Merge two dictionaries of arguments</span>
|
||||
<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>
|
||||
<span style="font-weight:bold">var</span> <span style="color:#27aeae">input</span> <span style="color:#3f8058">=</span> config
|
||||
<span style="font-weight:bold">var</span> <span style="color:#27aeae">output</span> <span style="color:#3f8058">=</span> args
|
||||
<span style="color:#7a7c7d">// Merge excluded urls</span>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">{</span>
|
||||
excluded<span style="color:#3f8058">.</span>formUnion<span style="color:#3f8058">(</span>exclude<span style="color:#3f8058">)</span>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#7a7c7d">// Merge unexcluded urls</span>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">{</span>
|
||||
unexcluded<span style="color:#3f8058">.</span>formUnion<span style="color:#3f8058">(</span>unexclude<span style="color:#3f8058">)</span>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#7a7c7d">// Merge rules</span>
|
||||
<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>
|
||||
<span style="color:#fdbc4b;font-weight:bold">if</span> rules<span style="color:#3f8058">.</span>isEmpty <span style="color:#3f8058">{</span>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span> <span style="color:#fdbc4b;font-weight:bold">else</span> <span style="color:#3f8058">{</span>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span> <span style="color:#fdbc4b;font-weight:bold">else</span> <span style="color:#3f8058">{</span>
|
||||
<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>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#7a7c7d">// Merge other arguments</span>
|
||||
<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>
|
||||
<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>
|
||||
output<span style="color:#3f8058">[</span>key<span style="color:#3f8058">]</span> <span style="color:#3f8058">=</span> inValue
|
||||
<span style="color:#fdbc4b;font-weight:bold">continue</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="font-weight:bold">return</span> output
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// Parse a configuration file into a dictionary of arguments</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
$<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<span style="font-weight:bold">return</span> <span style="color:#3f8058">[]</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#fdbc4b;font-weight:bold">do</span> <span style="color:#3f8058">{</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
cumulatedLines<span style="color:#3f8058">.</span>append<span style="color:#3f8058">(</span>String<span style="color:#3f8058">(</span>cumulatedLine<span style="color:#3f8058">))</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="font-weight:bold">return</span> cumulatedLines
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<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>
|
||||
<span style="font-weight:bold">return</span> line
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// Serialize a set of options into either an arguments string or a file</span>
|
||||
<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>
|
||||
<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>
|
||||
<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:#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>
|
||||
<span style="color:#3f8058">{</span>
|
||||
<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>
|
||||
<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>
|
||||
arguments<span style="color:#3f8058">.</span>append<span style="color:#3f8058">(</span>argumentsFor<span style="color:#3f8058">(</span>
|
||||
Options<span style="color:#3f8058">(</span>fileOptions<span style="color:#3f8058">:</span> fileOptions<span style="color:#3f8058">),</span>
|
||||
excludingDefaults<span style="color:#3f8058">:</span> excludingDefaults
|
||||
<span style="color:#3f8058">))</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
arguments<span style="color:#3f8058">.</span>append<span style="color:#3f8058">(</span>argumentsFor<span style="color:#3f8058">(</span>
|
||||
Options<span style="color:#3f8058">(</span>formatOptions<span style="color:#3f8058">:</span> formatOptions<span style="color:#3f8058">),</span>
|
||||
excludingDefaults<span style="color:#3f8058">:</span> excludingDefaults
|
||||
<span style="color:#3f8058">))</span>
|
||||
<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>
|
||||
<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
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
arguments<span style="color:#3f8058">.</span>append<span style="color:#3f8058">(</span>argumentsFor<span style="color:#3f8058">(</span>
|
||||
Options<span style="color:#3f8058">(</span>rules<span style="color:#3f8058">:</span> rules<span style="color:#3f8058">),</span>
|
||||
excludingDefaults<span style="color:#3f8058">:</span> excludingDefaults
|
||||
<span style="color:#3f8058">))</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="font-weight:bold">return</span> arguments
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">.</span>joined<span style="color:#3f8058">(</span>separator<span style="color:#3f8058">:</span> separator<span style="color:#3f8058">)</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// Serialize arguments</span>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">{</span>
|
||||
<span style="font-weight:bold">return</span> arguments<span style="color:#3f8058">.</span>map <span style="color:#3f8058">{</span>
|
||||
<span style="font-weight:bold">var</span> <span style="color:#27aeae">value</span> <span style="color:#3f8058">=</span> $<span style="color:#f67400">1</span>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// Get command line arguments from options</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#fdbc4b;font-weight:bold">do</span> <span style="color:#3f8058">{</span>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
arguments<span style="color:#3f8058">.</span>remove<span style="color:#3f8058">(</span><span style="color:#f44f4f">"symlinks"</span><span style="color:#3f8058">)</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#fdbc4b;font-weight:bold">do</span> <span style="color:#3f8058">{</span>
|
||||
<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>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
arguments<span style="color:#3f8058">.</span>remove<span style="color:#3f8058">(</span><span style="color:#f44f4f">"exclude"</span><span style="color:#3f8058">)</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#fdbc4b;font-weight:bold">do</span> <span style="color:#3f8058">{</span>
|
||||
<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>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
arguments<span style="color:#3f8058">.</span>remove<span style="color:#3f8058">(</span><span style="color:#f44f4f">"unexclude"</span><span style="color:#3f8058">)</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#fdbc4b;font-weight:bold">do</span> <span style="color:#3f8058">{</span>
|
||||
<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>
|
||||
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
|
||||
<span style="color:#3f8058">}</span>
|
||||
arguments<span style="color:#3f8058">.</span>remove<span style="color:#3f8058">(</span><span style="color:#f44f4f">"minversion"</span><span style="color:#3f8058">)</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
assert<span style="color:#3f8058">(</span>arguments<span style="color:#3f8058">.</span>isEmpty<span style="color:#3f8058">)</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#fdbc4b;font-weight:bold">else</span> <span style="color:#3f8058">{</span>
|
||||
<span style="color:#fdbc4b;font-weight:bold">continue</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#7a7c7d">// Special case for swiftVersion</span>
|
||||
<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>
|
||||
<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>
|
||||
value <span style="color:#3f8058">==</span> Version<span style="color:#3f8058">.</span>undefined<span style="color:#3f8058">.</span>rawValue
|
||||
<span style="color:#3f8058">{</span>
|
||||
<span style="color:#fdbc4b;font-weight:bold">continue</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
args<span style="color:#3f8058">[</span>descriptor<span style="color:#3f8058">.</span>argumentName<span style="color:#3f8058">]</span> <span style="color:#3f8058">=</span> value
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#7a7c7d">// Special case for wrapParameters</span>
|
||||
<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
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#fdbc4b;font-weight:bold">if</span> options<span style="color:#3f8058">.</span>lint <span style="color:#3f8058">{</span>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
|
||||
<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>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<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>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="font-weight:bold">return</span> args
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">{</span>
|
||||
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>
|
||||
<span style="font-weight:bold">var</span> <span style="color:#27aeae">arguments</span> <span style="color:#3f8058">=</span> from
|
||||
arguments<span style="color:#3f8058">.</span>remove<span style="color:#3f8058">(</span>key<span style="color:#3f8058">)</span>
|
||||
from <span style="color:#3f8058">=</span> arguments
|
||||
<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>
|
||||
<span style="font-weight:bold">return</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#fdbc4b;font-weight:bold">do</span> <span style="color:#3f8058">{</span>
|
||||
<span style="color:#fdbc4b;font-weight:bold">try</span> handler<span style="color:#3f8058">(</span>value<span style="color:#3f8058">)</span>
|
||||
<span style="color:#3f8058">}</span> <span style="color:#fdbc4b;font-weight:bold">catch</span> <span style="color:#3f8058">{</span>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// Parse rule names from arguments</span>
|
||||
<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>
|
||||
<span style="font-weight:bold">var</span> <span style="color:#27aeae">rules</span> <span style="color:#3f8058">=</span> allRules
|
||||
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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<span style="color:#fdbc4b;font-weight:bold">if</span> lint <span style="color:#3f8058">{</span>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span> <span style="color:#fdbc4b;font-weight:bold">else</span> <span style="color:#3f8058">{</span>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="font-weight:bold">return</span> rules
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// Parse FileOptions from arguments</span>
|
||||
<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>
|
||||
<span style="font-weight:bold">var</span> <span style="color:#27aeae">options</span> <span style="color:#3f8058">=</span> FileOptions<span style="color:#3f8058">()</span>
|
||||
<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>
|
||||
|
||||
<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>
|
||||
<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>
|
||||
containsFileOption <span style="color:#3f8058">=</span> <span style="font-weight:bold">true</span>
|
||||
<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>
|
||||
<span style="color:#fdbc4b;font-weight:bold">case</span> <span style="color:#f44f4f">"follow"</span><span style="color:#3f8058">:</span>
|
||||
options<span style="color:#3f8058">.</span>followSymlinks <span style="color:#3f8058">=</span> <span style="font-weight:bold">true</span>
|
||||
<span style="color:#fdbc4b;font-weight:bold">case</span> <span style="color:#f44f4f">"ignore"</span><span style="color:#3f8058">:</span>
|
||||
options<span style="color:#3f8058">.</span>followSymlinks <span style="color:#3f8058">=</span> <span style="font-weight:bold">false</span>
|
||||
<span style="font-weight:bold">default</span><span style="color:#3f8058">:</span>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
containsFileOption <span style="color:#3f8058">=</span> <span style="font-weight:bold">true</span>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
containsFileOption <span style="color:#3f8058">=</span> <span style="font-weight:bold">true</span>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
containsFileOption <span style="color:#3f8058">=</span> <span style="font-weight:bold">true</span>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
options<span style="color:#3f8058">.</span>minVersion <span style="color:#3f8058">=</span> minVersion
|
||||
<span style="color:#3f8058">}</span>
|
||||
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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// Parse FormatOptions from arguments</span>
|
||||
<span style="color:#7a7c7d">// Returns nil if the arguments dictionary does not contain any formatting arguments</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
containsFormatOption <span style="color:#3f8058">=</span> <span style="font-weight:bold">true</span>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
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>
|
||||
<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// Get deprecation warnings from a set of arguments</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<span style="font-weight:bold">return</span> <span style="font-weight:bold">false</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<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>
|
||||
<span style="color:#3f8058">})</span> <span style="color:#3f8058">{</span>
|
||||
<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>
|
||||
$<span style="color:#f67400">0.</span>options<span style="color:#3f8058">.</span>contains<span style="color:#3f8058">(</span>arg<span style="color:#3f8058">)</span>
|
||||
<span style="color:#3f8058">})?.</span>name <span style="color:#3f8058">??</span> <span style="color:#f44f4f">"associated"</span>
|
||||
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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
<span style="font-weight:bold">return</span> warnings
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="font-weight:bold">let</span> <span style="color:#27aeae">fileArguments</span> <span style="color:#3f8058">=</span> <span style="color:#3f8058">[</span>
|
||||
<span style="color:#f44f4f">"symlinks"</span><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">"minversion"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#3f8058">]</span>
|
||||
|
||||
<span style="font-weight:bold">let</span> <span style="color:#27aeae">rulesArguments</span> <span style="color:#3f8058">=</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>
|
||||
<span style="color:#3f8058">]</span>
|
||||
|
||||
<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>
|
||||
<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>
|
||||
<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
|
||||
|
||||
<span style="font-weight:bold">let</span> <span style="color:#27aeae">commandLineArguments</span> <span style="color:#3f8058">=</span> <span style="color:#3f8058">[</span>
|
||||
<span style="color:#7a7c7d">// Input options</span>
|
||||
<span style="color:#f44f4f">"filelist"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#f44f4f">"stdinpath"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#f44f4f">"config"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#f44f4f">"inferoptions"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#f44f4f">"linerange"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#f44f4f">"output"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#f44f4f">"cache"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#f44f4f">"dryrun"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#f44f4f">"lint"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#f44f4f">"lenient"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#f44f4f">"verbose"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#f44f4f">"quiet"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#f44f4f">"report"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#7a7c7d">// Misc</span>
|
||||
<span style="color:#f44f4f">"help"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#f44f4f">"version"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#f44f4f">"options"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#f44f4f">"ruleinfo"</span><span style="color:#3f8058">,</span>
|
||||
<span style="color:#3f8058">]</span> <span style="color:#3f8058">+</span> optionsArguments
|
||||
|
||||
<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>
|
||||
$<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>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="font-weight:bold">protocol</span> Foo <span style="color:#3f8058">{</span>
|
||||
<span style="font-weight:bold">func</span> <span style="color:#8e44ad">foo</span><span style="color:#3f8058">()</span>
|
||||
<span style="font-weight:bold">func</span> <span style="color:#8e44ad">bar</span><span style="color:#3f8058">()</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
|
||||
<span style="color:#7a7c7d">// something</span>
|
||||
<span style="font-weight:bold">class</span> FooImpl<span style="color:#3f8058">:</span> <span style="color:#2980b9">Foo</span> <span style="color:#3f8058">{</span>
|
||||
<span style="color:#3f8058">}</span>
|
||||
</pre></body></html>
|
||||
Reference in New Issue
Block a user