Releases: realm/SwiftLint
0.63.2: High-Speed Extraction
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.2", 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 = "e3da0cfecc1ae663338b0c54cc45869834cd436b539e0d30816dd44b0e369d28",
url = "https://github.com/realm/SwiftLint/releases/download/0.63.2/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 -- --help0.64.0-rc.1: All Windows Opened
Breaking
- None.
Experimental
- SwiftLint can now be built and run on Windows. It is expected to work in the same way as
on other platforms. The only restrictions are missing support for?[]glob patterns in
include/exclude patterns and the requirement for\nas line ending in all linted files.
SimplyDanny
compnerd
roman-bcny
#6351
#6352
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
Using Bazel
With bzlmod:
// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.64.0-rc.1", 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 = "18e10629d70461a7b287f01e61cb82181ddfe081e3ce9aea5655027287146ce6",
url = "https://github.com/realm/SwiftLint/releases/download/0.64.0-rc.1/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 -- --help0.63.1: High-Speed Extraction
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.1", 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 = "bbdde20024722af8813af317d2af051fd4b430b61332072bbccf7ab53825bb2a",
url = "https://github.com/realm/SwiftLint/releases/download/0.63.1/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 -- --help0.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.0", 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 = "efd4d25d65857d56b2531ef88ac2d705457e3b861893bbd6bc46d55bbf6b5528",
url = "https://github.com/realm/SwiftLint/releases/download/0.63.0/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 -- --help0.63.0-rc.2: 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.
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.0-rc.2", 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 = "b87c861c7ea2d838e3a6725978f39edf94b1fb3ca5f478fa32dd96f360b9d076",
url = "https://github.com/realm/SwiftLint/releases/download/0.63.0-rc.2/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 -- --help0.62.2: Generous Drum Volume
0.62.2: Generous Drum Volume
Enhancements
-
Add new
incompatible_concurrency_annotationrule that triggers when a declaration
isolated to a global actor,@Sendableclosure arguments and/or generic sendable
constraints is not annotated with@preconcurrencyin order to maintain compatibility
with Swift 5.
mattmassicotte
SimplyDanny
#5987 -
Add
isolationmodifier group tomodifier_orderrule configuration.
This allows configuring the position ofnonisolatedmodifiers.
nandhinisubbu
#6164 -
Add test count to JUnit reporter.
nandhinisubbu
#6161 -
Adopt mimalloc for static Linux binary
to improve performance.
ainame
#6298
Bug Fixes
-
Fix false positive with
#Previewmacro inclosure_end_indentationrule.
gibachan -
Fix correction of
sorted_importsrule when comments (with a distance) are present before
the first import.
SimplyDanny
#6317
0.62.1: Generous Drum Volume
Bug Fixes
- Remove trailing comma making the code base again compilable with at least Swift 6.0.
SimplyDanny
0.62.0: Generous Drum Volume
Breaking
-
The structure of
SwiftLintBinary.artifactbundle.zipis now simpler. Internal paths no
longer contain version numbers, especially. So in an Xcode Run Script build phase,
you can refer to theswiftlintbinary like this:SWIFT_PACKAGE_DIR="${BUILD_DIR%Build/*}SourcePackages/artifacts" SWIFTLINT_CMD="$SWIFT_PACKAGE_DIR/swiftlintplugins/SwiftLintBinary/SwiftLintBinary.artifactbundle/macos/swiftlint"
All other consumers of the artifact bundle do not need to change anything. Swift Package
Manager resolves the new paths automatically.
SimplyDanny -
SwiftLint now requires a Swift 6 or higher compiler to build. The
Swift Package Manager plugins continue
to work with all versions down to Swift 5.9.
SimplyDanny -
sorted_importsrule's behavior changed in that it now treats imports directly adjacent
to each other as a group that is sorted together. Imports separated by at least one
non-import statement or empty line(s) are treated as separate groups. Comments are
considered part of the import group they are attached to and do not break it.
SimplyDanny
Experimental
- None.
Enhancements
-
Rewrite the following rules with SwiftSyntax:
modifier_ordersorted_imports
-
Add new
prefer_asset_symbolsrule that suggests using asset symbols over
string-based image initialization to avoid typos and enable compile-time
checking. This rule detectsUIImage(named:)andSwiftUI.Image(_:)calls
with string literals and suggests using asset symbols instead.
danglingP0inter
#5939 -
Exclude integer generic parameters from
generic_type_namerule.
Include integer generic parameters in theidentifier_namerule for validation.
nandhinisubbu
#6213
Bug Fixes
-
Ignore function, initializer and subscript declarations alike when the
ignores_function_declarationsoption is enabled in theline_lengthrule.
SimplyDanny
#6241 -
Individual
custom_rulescan now be specified in theonly_ruleconfiguration
setting and the--only-rulecommand line option without having to specify
custom_rulesas well. Additionally, violations of custom rules are now reported
in a deterministic order, sorted by the rule's identifier.
Martin Redington
#6029
#6058 -
Ignore
redundant_discardable_letrule violations in nested SwiftUI scopes as well
whenignore_swiftui_view_bodiesis enabled.
SimplyDanny
#3855
#6255 -
Exclude function types from
async_without_awaitrule analysis. Higher-order function
objects can beasyncwithout containing anawaitwhen assigning to them.
SimplyDanny
#6253 -
Exclude
@concurrentfunctions fromasync_without_awaitrule analysis.
@concurrentfunctions requiresaysncin any case.
nandhinisubbu
#6283 -
swiftlint-static, the experimental fully-static Linux binary, now uses 512 KiB
as thread stack size matching Darwinβs size to prevent stack exhaustion.
ainame
#6287
Using Bazel
With bzlmod:
// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.62.2", 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 = "9e729406b1ba9a94bb3a3367ff81dc53465d6231dd83e728ebac3d1391ad19e2",
url = "https://github.com/realm/SwiftLint/releases/download/0.62.2/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 -- --help0.62.1: Generous Drum Volume
0.62.1: Generous Drum Volume
Bug Fixes
- Remove trailing comma making the code base again compilable with at least Swift 6.0.
SimplyDanny
0.62.0: Generous Drum Volume
Breaking
-
The structure of
SwiftLintBinary.artifactbundle.zipis now simpler. Internal paths no
longer contain version numbers, especially. So in an Xcode Run Script build phase,
you can refer to theswiftlintbinary like this:SWIFT_PACKAGE_DIR="${BUILD_DIR%Build/*}SourcePackages/artifacts" SWIFTLINT_CMD="$SWIFT_PACKAGE_DIR/swiftlintplugins/SwiftLintBinary/SwiftLintBinary.artifactbundle/macos/swiftlint"
All other consumers of the artifact bundle do not need to change anything. Swift Package
Manager resolves the new paths automatically.
SimplyDanny -
SwiftLint now requires a Swift 6 or higher compiler to build. The
Swift Package Manager plugins continue
to work with all versions down to Swift 5.9.
SimplyDanny -
sorted_importsrule's behavior changed in that it now treats imports directly adjacent
to each other as a group that is sorted together. Imports separated by at least one
non-import statement or empty line(s) are treated as separate groups. Comments are
considered part of the import group they are attached to and do not break it.
SimplyDanny
Experimental
- None.
Enhancements
-
Rewrite the following rules with SwiftSyntax:
modifier_ordersorted_imports
-
Add new
prefer_asset_symbolsrule that suggests using asset symbols over
string-based image initialization to avoid typos and enable compile-time
checking. This rule detectsUIImage(named:)andSwiftUI.Image(_:)calls
with string literals and suggests using asset symbols instead.
danglingP0inter
#5939 -
Exclude integer generic parameters from
generic_type_namerule.
Include integer generic parameters in theidentifier_namerule for validation.
nandhinisubbu
#6213
Bug Fixes
-
Ignore function, initializer and subscript declarations alike when the
ignores_function_declarationsoption is enabled in theline_lengthrule.
SimplyDanny
#6241 -
Individual
custom_rulescan now be specified in theonly_ruleconfiguration
setting and the--only-rulecommand line option without having to specify
custom_rulesas well. Additionally, violations of custom rules are now reported
in a deterministic order, sorted by the rule's identifier.
Martin Redington
#6029
#6058 -
Ignore
redundant_discardable_letrule violations in nested SwiftUI scopes as well
whenignore_swiftui_view_bodiesis enabled.
SimplyDanny
#3855
#6255 -
Exclude function types from
async_without_awaitrule analysis. Higher-order function
objects can beasyncwithout containing anawaitwhen assigning to them.
SimplyDanny
#6253 -
Exclude
@concurrentfunctions fromasync_without_awaitrule analysis.
@concurrentfunctions requiresaysncin any case.
nandhinisubbu
#6283 -
swiftlint-static, the experimental fully-static Linux binary, now uses 512 KiB
as thread stack size matching Darwinβs size to prevent stack exhaustion.
ainame
#6287
Using Bazel
With bzlmod:
// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.62.1", 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 = "34bfe2982ee913d9d1f698f0ea84615536f3ee8f19d43e6bdb19c676fa8647a3",
url = "https://github.com/realm/SwiftLint/releases/download/0.62.1/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 -- --help0.62.0: Generous Drum Volume
Breaking
-
The structure of
SwiftLintBinary.artifactbundle.zipis now simpler. Internal paths no
longer contain version numbers, especially. So in an Xcode Run Script build phase,
you can refer to theswiftlintbinary like this:SWIFT_PACKAGE_DIR="${BUILD_DIR%Build/*}SourcePackages/artifacts" SWIFTLINT_CMD="$SWIFT_PACKAGE_DIR/swiftlintplugins/SwiftLintBinary/SwiftLintBinary.artifactbundle/macos/swiftlint"
All other consumers of the artifact bundle do not need to change anything. Swift Package
Manager resolves the new paths automatically.
SimplyDanny -
SwiftLint now requires a Swift 6 or higher compiler to build. The
Swift Package Manager plugins continue
to work with all versions down to Swift 5.9.
SimplyDanny -
sorted_importsrule's behavior changed in that it now treats imports directly adjacent
to each other as a group that is sorted together. Imports separated by at least one
non-import statement or empty line(s) are treated as separate groups. Comments are
considered part of the import group they are attached to and do not break it.
SimplyDanny
Experimental
- None.
Enhancements
-
Rewrite the following rules with SwiftSyntax:
modifier_ordersorted_imports
-
Add new
prefer_asset_symbolsrule that suggests using asset symbols over
string-based image initialization to avoid typos and enable compile-time
checking. This rule detectsUIImage(named:)andSwiftUI.Image(_:)calls
with string literals and suggests using asset symbols instead.
danglingP0inter
#5939 -
Exclude integer generic parameters from
generic_type_namerule.
Include integer generic parameters in theidentifier_namerule for validation.
nandhinisubbu
#6213
Bug Fixes
-
Ignore function, initializer and subscript declarations alike when the
ignores_function_declarationsoption is enabled in theline_lengthrule.
SimplyDanny
#6241 -
Individual
custom_rulescan now be specified in theonly_ruleconfiguration
setting and the--only-rulecommand line option without having to specify
custom_rulesas well. Additionally, violations of custom rules are now reported
in a deterministic order, sorted by the rule's identifier.
Martin Redington
#6029
#6058 -
Ignore
redundant_discardable_letrule violations in nested SwiftUI scopes as well
whenignore_swiftui_view_bodiesis enabled.
SimplyDanny
#3855
#6255 -
Exclude function types from
async_without_awaitrule analysis. Higher-order function
objects can beasyncwithout containing anawaitwhen assigning to them.
SimplyDanny
#6253 -
Exclude
@concurrentfunctions fromasync_without_awaitrule analysis.
@concurrentfunctions requiresaysncin any case.
nandhinisubbu
#6283 -
swiftlint-static, the experimental fully-static Linux binary, now uses 512 KiB
as thread stack size matching Darwinβs size to prevent stack exhaustion.
ainame
#6287
Using Bazel
With bzlmod:
// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.62.0", 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 = "de95fe7a9cebdeb1620b860b965b9cb60db4db4282d1efe4c1e26614beb599e3",
url = "https://github.com/realm/SwiftLint/releases/download/0.62.0/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 -- --help0.61.0: Even Fresher Breeze
Breaking
-
If
SWIFTLINT_DISABLE_SOURCEKITis set to prohibit loadinglibsourcekitdInProcat runtime,
rules requiring SourceKit will be disabled and a warning will be printed once per rule.
SimplyDanny -
The
operator_whitespacerule has been removed and its functionality merged into the
function_name_whitespacerule. The latter now also checks spacing around thefunc
keyword, the function name/operator and its generic parameters while respecting comments.
On top of that, it supports autocorrection.
SimplyDanny -
Expose only
TestHelpersandExtraRulesTestsas part of Bazel releases.
SimplyDanny
Experimental
- Both Linux release archives (for AMD64 and ARM64) now contain two binaries:
- A dynamically linked binary that requires
libsourcekitdInProc.sotogether with its
transitive dependencies to be present on the system at runtime. It is namedswiftlint
and the same binary as before. It supports all built-in rules. - A fully statically linked binary named
swiftlint-staticthat does not require
any dynamic libraries at runtime. Rules requiring SourceKit will be disabled and
reported to the console when running this binary.
- A dynamically linked binary that requires
Enhancements
-
A fully statically linked Linux binary can now be built with the Swift SDK and
the compiler options-Xswiftc -DSWIFTLINT_DISABLE_SOURCEKIT. This binary does not
requirelibsourcekitdInProc.soor any other dynamic libraries to be present on the
system at runtime. Rules requiring SourceKit will be disabled and reported to the console
when running this binary.
SimplyDanny -
Add
function_name_whitespacerule to enforce consistent spacing between thefunc
keyword, function name, and its generic parameters. Ensures exactly one space between
funcand the function name, and configurable spacing around generics via
generic_spacing:no_space(default):func name<T>()leading_space:func name <T>()trailing_space:func name<T> ()leading_trailing_space:func name <T> ()
Supports autocorrection.
GandaLF2006 -
The
operator_whitespacerule now supports autocorrection and better respects comments in
function declarations. The rule has been deprecated in favor of the newfunction_name_whitespace
rule. You can still refer to it by its identifier, but get checking for normal function names
on top.
SimplyDanny -
In
line_lengthrule, treat strings with opening and closing quotes in the same line as
single-line strings no matter if they are enclosed by triple quotes or not. Furthermore,
improve detection of comment-only lines.
SimplyDanny
#6220
#6219 -
Improve detection of comment-only lines in
file_lengthrule.
SimplyDanny
#6219 -
Rewrite
quick_discouraged_callrule with SwiftSyntax.
SimplyDanny
Bug Fixes
-
Ensure that header matched against always end in a newline in
file_headerrule.
SimplyDanny
#6227 -
Fix
closure_end_indentationrule reporting violations when the called base
involves chained optional expressions.
SimplyDanny
#6216
Using Bazel
With bzlmod:
// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.61.0", 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 = "ee8ca2eeb93b8f294a8ca2d76fead1a6510b4d40421b39b0bf88b73f7182c313",
url = "https://github.com/realm/SwiftLint/releases/download/0.61.0/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 -- --help0.60.0: Fresh Breeze
Breaking
-
Remove support for boolean values in the
validates_start_with_lowercaseoption entirely.
Use the severity levelsoff,warningorerrorinstead.
kaseken -
SwiftLint now requires macOS 13 or higher to run.
JP Simard -
In
SwiftLintBuildToolPlugin, print the content of theBUILD_WORKSPACE_DIRECTORY
environment variable only in debug builds.
SimplyDanny
#6135 -
The
redundant_optional_initializationrule has been replaced by the
implicit_optional_initializationrule that enforces implicit or explicit initialization
of optional variables. Its default stylealwaysmimics the behavior of the
redundant_optional_initializationrule by default.redundant_optional_initialization
is now an alias forimplicit_optional_initialization.
leo-lem
#1940 -
The
swiftlint_linux.ziprelease archive has been renamed toswiftlint_linux_amd64.zip
to avoid confusion with the newswiftlint_linux_arm64.ziparchive.
Bradley Mackey
SimplyDanny
Experimental
- None.
Enhancements
-
Linting got up to 30% faster due to the praiseworthy performance
improvements done in the SwiftSyntax library. -
Ignore locally defined
countidentifiers inempty_countrule.
SimplyDanny
#5326 -
The
private_swiftui_staterule now applies toViewModifiertypes.
mt00chikin -
Support for ARM64 Linux binaries has been added. The
swiftlint_linux.ziprelease archive
has been renamed toswiftlint_linux_amd64.zip. Next to it, a newswiftlint_linux_arm64.zip
archive has been added. TheSwiftLintBinary.artifactbundle.zipnow contains both versions
of the Linux binary, so that the binary plugins
can now be used on Linux and macOS running both AMD64 and ARM64 architectures.
Bradley Mackey
SimplyDanny -
Add
include_variablesconfiguration option tonon_optional_string_data_conversionrule.
When enabled, the rule will trigger on variables, properties, and function calls in addition
to string literals. Defaults tofalsefor backward compatibility.
SimplyDanny
#6094 -
Add Sendable conformance to Rule.Type for building with Swift 6.
erikkerber -
Fix false positives for
Actor-conforming delegate protocols in the
class_delegate_protocolrule.
imsonalbajaj
#6054 -
Support extensions and protocols in
type_body_lengthrule. They can be configured using the
newexcluded_typesoption which by default excludesextensionandprotocoltypes.
This means the rule now checksstruct,class,actorandenumby default. To enable
checking of extensions and protocols, setexcluded_typesto an empty array or exclude other
types as needed.
SimplyDanny -
Exclude explicit system modules from
duplicate_importsanalysis, that is, modules
that are part of the system frameworks but need to be imported explicitly due to being
declared asexplicit modulein their module map.
SimplyDanny
#6098 -
Ignore various assignment operators like
=,+=,&=, etc. with right-hand side
ternary expressions otherwise violating thevoid_function_in_ternaryrule.
SimplyDanny
#5611 -
Rewrite the following rules with SwiftSyntax:
accessibility_label_for_imageaccessibility_trait_for_buttonclosure_end_indentationexpiring_todofile_headerfile_lengthline_lengthtrailing_whitespacevertical_whitespace
-
Add
excluded_pathsoption to thefile_namerule. It allows to exclude complete file
paths from analysis. All entries are treated as regular expressions. A single match in
its full path is enough to ignore a file. This is different from theexcludedoption
that only accepts and checks against file names.
Ueeek
#6066 -
Fix false positives of
redundant_discardable_letrule in@ViewBuilderfunctions,
#Previewmacro bodies and preview providers whenignore_swiftui_view_bodiesis
enabled.
kaseken
#6063 -
Improve
multiline_parametersrule to correctly support
max_number_of_single_line_parametersand detect mixed formatting.
GandaLF2006 -
Add new
prefer_condition_listrule that triggers when aguard/if/while
condition is composed of multiple expressions connected by the&&operator.
It suggests to use a condition list instead, which is more idiomatic.
SimplyDanny -
Add
ignore_coding_keysparameter tonestingrule. Setting this to true prevents
CodingKeyenums from violating the rule.
braker1nine
#5641 -
Support deinitializers and subscripts in
function_body_lengthrule.
SimplyDanny -
Extend the
xct_specific_matcherrule to support identity operators (===and!==)
in addition to the existing equality operators (==and!=).
SimplyDanny
#5849 -
Add new
implicit_optional_initializationrule to enforce implicit or explicit
initialization of optional variables, configurable viastyle: always | never.
It replaces theredundant_optional_initializationrule mimicking it with the
style: alwaysoption which is the default.
leo-lem
#1940 -
Add new
ignore_identity_closuresparameter toprefer_key_pathsrule to skip
conversion of identity closures ({ $0 }) to identity key paths (\.self).
Note that identity key paths are only supported from Swift 6 on, hence this option
will be implicitly ignored/set totruewhen SwiftLint detects a Swift <6 compiler
to avoid causing compilation errors.
p4checo
#5965
Bug Fixes
-
Fix
no_extension_access_modifierrule incorrectly triggering fornonisolated extension.
The rule now only flags actual access control modifiers (private,public,open,
internal,fileprivate) and ignores isolation modifiers likenonisolated.
copilot
#6168 -
Improved error reporting when SwiftLint exits, because of an invalid configuration file
or other error.
Martin Redington
#6052 -
Keep the default severity levels when neither
warningnorerrorvalues are configured.
Ensure especially that theerrorlevel is not set tonilwhen thewarninglevel
isn't set either.
SimplyDanny
Using Bazel
With bzlmod:
// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.60.0", 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 = "639a2d1719dc3bf63cacf298ac936aece542343155e7847adff5384d4c3807fd",
url = "https://github.com/realm/SwiftLint/releases/download/0.60.0/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