Enhancements
-
Treat extensions like classes in the
prefer_self_in_static_references
rule.
itsybitsybootsy
#3993 -
Print fixed code read from stdin to stdout.
SimplyDanny
#6501 -
Add new
redundant_finalrule that detectsfinalmodifiers on declarations
where they are redundant due to the containing context, such asfinalclasses
or actors. Final actors are themselves implicitly final, so thefinalmodifier
is redundant on them as well.
william-laverty
SimplyDanny
#6407 -
Add
discouraged_default_parameteropt-in rule that flags default parameter
values in functions with configurable access levels.
William-Laverty
#6488 -
Add
ignored_literal_argument_functionsoption to theforce_unwrappingrule
to skip violations for configurable function calls when all arguments are
literal values (e.g.URL(string: "https://example.com")!). Defaults
includeURL(string:),NSURL(string:),UIImage(named:),
NSImage(named:), andData(hexString:).
claudeaceae
#6487 -
Add
rulesarray to SARIF reporter output, providing metadata for all
built-in rules in accordance with the SARIF specification.
ahmadalfy
#6499 -
Add
allow_underscore_prefixed_namesoption tounused_parameterso
underscore-prefixed parameter names can be treated as intentionally
unused when configured.
theamodhshetty
#5741 -
Add detection of cases such as
String.init(decoding: data, as: UTF8.self)and
let text: String = .init(decoding: data, as: UTF8.self)to
optional_data_string_conversionrule.
nadeemnali
#6359 -
Add new default
invisible_characterrule that detects invisible characters
like zero-width space (U+200B), zero-width non-joiner (U+200C),
and FEFF formatting character (U+FEFF) in string literals, which can cause
hard-to-debug issues.
kapitoshka438
#6045 -
Add
variable_shadowingrule that flags when a variable declaration shadows
an identifier from an outer scope.
nadeemnali
#6228 -
Add
legacy_uigraphics_functionrule to encourage the use of modern
UIGraphicsImageRendererinstead of the legacyUIGraphics{Begin|End}ImageContext.
The modern replacement is safer, cleaner, Retina-aware and more performant.
Dimitri Dupuis-Latour
#6268 -
Support access level modifiers on imports in
unused_importsrule.
SimplyDanny
#6620 -
Add
name="SwiftLint"to JUnittestsuitesandtestsuiteoutput for
better CI parser compatibility.
theamodhshetty
#6161 -
Improve the opt-in
pattern_matching_keywordsrule by extending support
beyondswitch caseand refining nested pattern handling.
GandaLF2006
Bug Fixes
-
Detect and autocorrect missing whitespace before
elseinguard
statements for thestatement_positionrule.
theamodhshetty
#6153 -
Avoid false positives from
unused_enumeratedwhen higher-order calls on
.enumerated()use result members like?.offsetafter the closure.
theamodhshetty
#5881 -
Add an
ignore_attributesoption toimplicit_optional_initializationso
wrappers/attributes that require explicit= nilcan be excluded from
style checks for bothstyle: alwaysandstyle: never.
theamodhshetty
#3998 -
Skip
@TestStateproperties inquick_discouraged_callrule, matching
existing@TestInjectedand@TestWeaklyexclusions.
William-Laverty
#5803 -
Fix
explicit_selffalse positives around string interpolation.
jffmrk
SimplyDanny
#6611 -
Properly taint variables in tuples for
unneeded_escapingrule.
SimplyDanny
#6621 -
Ensure that disable commands work for
redundant_nil_coalescingrule.
SimplyDanny
#6465 -
Take
tryexpressions in call parameters into account even if the call has
trailing closures as well, so that an outerthrowsis not considered unneeded
in theunneeded_throws_rethrowsrule.
SimplyDanny
#6491 -
Ensure that disable commands work for
prefer_key_pathrule when the trailing
closure starts on a different line than the function call as a whole.
SimplyDanny
#6466 -
Track identifiers declared in tuples to avoid false positives in the
redundant_selfrule.
SimplyDanny
#6553 -
Respect existing environment variables when setting
BUILD_WORKSPACE_DIRECTORY
in build tool plugins.
SimplyDanny
#6080 -
Fix false positives in
indentation_widthrule for continuation lines
of multi-lineguard/if/whileconditions. A new option
include_multiline_conditions(default:false) skips these lines by
default. When enabled, it validates that continuation lines are aligned
with the first condition after the keyword.
tanaev
#4961 -
multiline_call_argumentsno longer reports violations for enum-case patterns in
pattern matching (e.g. if case, switch case, for case, catch).
GandaLF2006 -
Avoid false positives in
prefer_self_in_static_referenceswhen a nested type
shadows its enclosing type name.
theamodhshetty
#5917
0.63.2: High-Speed Extraction
Enhancements
- Add
ignore_regexconfiguration option to thelarge_tuplerule to silence
violations for tuples insideRegex<...>types, which commonly have large
tuple type parameters for capture groups.
Deco354
#6340
Bug Fixes
- Use start position of closure (in addition to the containing function call) to check
if violations are disabled for it intrailing_closurerule.
SimplyDanny
#6451
0.63.1: High-Speed Extraction
Enhancements
- Add a
--disable-sourcekitflag to thelintcommand to disable SourceKit when needed.
The environment variableSWIFTLINT_DISABLE_SOURCEKITcan still be used as well.
SimplyDanny
#6282
Bug Fixes
-
Retain
asyncinitializers in actors inasync_without_awaitrule.
SimplyDanny
#6423 -
Inform users about files being skipped due to impossible file system representation
instead of crashing.
SimplyDanny
#6419 -
Ignore
overridefunctions inasync_without_awaitrule.
SimplyDanny
#6416 -
Avoid infinite recursion for deeply nested symbolic links which is usually the case
innode_modulesdirectories managed bypnpm.
SimplyDanny
#6425 -
Fix false positive in
unneeded_escapingrule when an escaping closure is used in
a nested closure preceded by another closure.
SimplyDanny
#6410 -
Fix non-excluded bool literal in
optional_enum_case_namewhen used inside a tuple.
tristan-burnside-anz
0.63.0: High-Speed Extraction
Breaking
- The
redundant_self_in_closurerule has been renamed toredundant_self(with
redundant_self_in_closureas a deprecated alias) to reflect its now broader scope,
while it still maintains the previous behavior of only checking closures by default.
To enable checking for all redundantselfusages, set the newonly_in_closures
option tofalse.
SimplyDanny
Experimental
- None.
Enhancements
-
Extend
redundant_self_in_closurerule to detect all redundant uses ofself,
not just in closures. Initializers (which commonly prefer an explicitselfprefix)
can be ignored by settingkeep_in_initializerstotrue.
SimplyDanny -
Add a
separationconfiguration option to thevertical_whitespace_between_casesrule
to allow customizing blank line separation between switch cases. The default value is
always(require at least one blank line). Setting it toneverenforces no blank
lines between cases.
SimplyDanny
#6326 -
Rewrite the following rules with SwiftSyntax:
vertical_whitespace_between_cases
-
Add new opt-in
unneeded_throws_rethrowsrule that triggers when declarations
markedthrows/rethrowsnever actually throw or call any throwing code.
Tony Ngo -
Add new
unneeded_escapingrule that detects closure parameters marked with
@escapingthat are never stored or captured escapingly.
SimplyDanny -
Add
multiline_call_argumentsopt-in rule to enforce consistent multiline
formatting for function and method call arguments.
GandaLF2006 -
Improve performance when exclude patterns resolve to a large set of files.
SimplyDanny
#5018
#5207
#5953
#6084
#6259
Bug Fixes
-
Fix
line_lengthrule incorrectly ignoring function bodies when
ignores_function_declarationsis enabled. The option should only ignore
function declarations, not their implementation.
SimplyDanny
#6347 -
Fix false positives in
vertical_whitespace_between_casesrule when cases are
interleaved with compiler directives like#if/#else/#endif.
SimplyDanny
#6332 -
override_in_extensionno longer triggers inside@objc @implementationextensions.
JaredGrubb -
Reinstate handling of access level imports in
sorted_importsrule.
Brett-Best
#6374
Using Bazel
With bzlmod:
// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.63.3", repo_name = "SwiftLint")
Without bzlmod, put this in your WORKSPACE:
WORKSPACE
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "build_bazel_rules_apple",
sha256 = "9e26307516c4d5f2ad4aee90ac01eb8cd31f9b8d6ea93619fc64b3cbc81b0944",
url = "https://github.com/bazelbuild/rules_apple/releases/download/2.2.0/rules_apple.2.2.0.tar.gz",
)
load(
"@build_bazel_rules_apple//apple:repositories.bzl",
"apple_rules_dependencies",
)
apple_rules_dependencies()
load(
"@build_bazel_rules_swift//swift:repositories.bzl",
"swift_rules_dependencies",
)
swift_rules_dependencies()
load(
"@build_bazel_rules_swift//swift:extras.bzl",
"swift_rules_extra_dependencies",
)
swift_rules_extra_dependencies()
http_archive(
name = "SwiftLint",
sha256 = "5a4a1e8395e2a6b54506ebe91fca3a6873af4a10dba3322640b5adac46fe8061",
url = "https://github.com/realm/SwiftLint/releases/download/0.63.3/bazel.tar.gz",
)
load("@SwiftLint//bazel:repos.bzl", "swiftlint_repos")
swiftlint_repos()
load("@SwiftLint//bazel:deps.bzl", "swiftlint_deps")
swiftlint_deps()
Then you can run SwiftLint in the current directory with this command:
bazel run @SwiftLint//:swiftlint -- --help