Releases: realm/SwiftLint
Release list
0.65.0: Fresh Folded Fixtures
Breaking
- SwiftLint now requires Swift 6.1 or higher for development (to run tests). The
executable can still be built with a Swift 6 compiler. The Swift Package Manager plugins
continue to work with all versions down to Swift 5.9.
SimplyDanny
Enhancements
- SwiftLint now builds with Bazel versions 7 to 9.
SimplyDanny
Using Bazel
With bzlmod:
// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.65.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 = "d8c4add55c061a298a1913c654bda9e2c59b1af1bfb3bbba1195475e0676d9a0",
url = "https://github.com/realm/SwiftLint/releases/download/0.65.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.64.1: All Windows Opened
Bug Fixes
- Honor
excludedpaths when the linted project is located under a system directory
on macOS that resolves through a symlink, such as/varand/tmp(which point
to/private/varand/private/tmp).
tumata
#6782
0.64.0: All Windows Opened
Breaking
- The
ignored_literal_argument_functionsoption of theforce_unwrappingrule now
uses the configured value as-is instead of always merging in the five built-in defaults
(URL(string:),NSURL(string:),UIImage(named:),NSImage(named:),Data(hexString:)).
Those five functions remain the default when the option is not configured, but setting
ignored_literal_argument_functionsto any explicit list — including[]— now fully
replaces the defaults. Configurations that add functions on top of the defaults must now
explicitly include the five previously-default functions in their list.
SimplyDanny
#6675
Enhancements
-
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.
compnerd
roman-bcny
SimplyDanny
#6351
#6352 -
Rename
allow_implicit_inittoinclude_implicit_initfor the
optional_data_string_conversionrule to convey its purpose more clearly.
SimplyDanny
#6670 -
Improve linting performance by 10-15%, especially when running with many
threads, by optimizing cache locking and reducing contention. Depending on
the project and level of concurrency, the performance improvement can be even
higher (3-4x).
SimplyDanny -
Rewrite the following rules with SwiftSyntax:
file_types_order
-
Fix false positive in
accessibility_label_for_imagerule for images inside
SwiftUILabel'sicon:closure, which are inherently labeled by the
Label's text content.
sutheesh
#6420
Bug Fixes
-
Fix
literal_expression_end_indentationautocorrection deleting source code
when the closing bracket of a multiline literal shares a line with the end of
a multiline last element (e.g....))]). The corrector assumed everything
before the bracket on that line was indentation and replaced it; it now moves
only the bracket to its own line at the expected indentation.
Luan Câmara
#2823 -
Don't rewrite the type operand of an
is/as?/as!cast (such as
x is A) toSelfinprefer_self_in_static_referenceswhen inside a
class-like scope.Selfis the dynamic type, so the rewrite silently changed
runtime behavior for non-final classes (x is Selfis not equivalent to
x is A). Mirrors the rule's existingX.selfskip; static member references
such asA.f()are still corrected.
Brett-Best
#6764 -
Avoid false positives in
vertical_parameter_alignmentwhen a parameter is
preceded by multi-byte characters, such as a function name containing
non-ASCII letters. Alignment is now compared by visible column rather than by
UTF-8 byte offset.
systemBlue
#5037 -
Treat macro declarations like function declarations for
line_lengthwhen
ignores_function_declarationsis enabled.
leno23
#5648 -
Make
Glob.expandGlobstartolerant of unreadable directory entries on
large trees.subpathsOfDirectory(atPath:)aborted the entire glob
expansion on the first unreadable entry (permission denied, dangling
symlink, file removed mid-scan), causing most files in large projects to
be silently ignored. Replace the directory walk with a lazyURL
enumerator that has a per-item error handler so unreadable items are
skipped individually.
Chupik -
Avoid false positives in
prefer_self_in_static_referencesfor generic
constraints and generic parameter bounds such aswhere A: Pand<A: P>
in classes and extensions.
SimplyDanny
#6674 -
Don't rewrite a type reference to
Selfinprefer_self_in_static_references
when it appears in a protocol composition (such asany A & B), as the
constraint of an existential or opaque type (such asany Aorsome A), or
as the base of an existential metatype (such asA.Protocol), since the named
type is not interchangeable withSelfin those positions.
Brett-Best
#6748
Using Bazel
With bzlmod:
// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.64.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 = "d8d48a0d32a2359909d0e32065639b0c4a8e0e0e5fa6dbefbf5b63c24b55be63",
url = "https://github.com/realm/SwiftLint/releases/download/0.64.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.64.0: All Windows Opened
Breaking
- The
ignored_literal_argument_functionsoption of theforce_unwrappingrule now
uses the configured value as-is instead of always merging in the five built-in defaults
(URL(string:),NSURL(string:),UIImage(named:),NSImage(named:),Data(hexString:)).
Those five functions remain the default when the option is not configured, but setting
ignored_literal_argument_functionsto any explicit list — including[]— now fully
replaces the defaults. Configurations that add functions on top of the defaults must now
explicitly include the five previously-default functions in their list.
SimplyDanny
#6675
Experimental
- None.
Enhancements
-
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.
compnerd
roman-bcny
SimplyDanny
#6351
#6352 -
Rename
allow_implicit_inittoinclude_implicit_initfor the
optional_data_string_conversionrule to convey its purpose more clearly.
SimplyDanny
#6670 -
Improve linting performance by 10-15%, especially when running with many
threads, by optimizing cache locking and reducing contention. Depending on
the project and level of concurrency, the performance improvement can be even
higher (3-4x).
SimplyDanny -
Rewrite the following rules with SwiftSyntax:
file_types_order
-
Fix false positive in
accessibility_label_for_imagerule for images inside
SwiftUILabel'sicon:closure, which are inherently labeled by the
Label's text content.
sutheesh
#6420
Bug Fixes
-
Fix
literal_expression_end_indentationautocorrection deleting source code
when the closing bracket of a multiline literal shares a line with the end of
a multiline last element (e.g....))]). The corrector assumed everything
before the bracket on that line was indentation and replaced it; it now moves
only the bracket to its own line at the expected indentation.
Luan Câmara
#2823 -
Don't rewrite the type operand of an
is/as?/as!cast (such as
x is A) toSelfinprefer_self_in_static_referenceswhen inside a
class-like scope.Selfis the dynamic type, so the rewrite silently changed
runtime behavior for non-final classes (x is Selfis not equivalent to
x is A). Mirrors the rule's existingX.selfskip; static member references
such asA.f()are still corrected.
Brett-Best
#6764 -
Avoid false positives in
vertical_parameter_alignmentwhen a parameter is
preceded by multi-byte characters, such as a function name containing
non-ASCII letters. Alignment is now compared by visible column rather than by
UTF-8 byte offset.
systemBlue
#5037 -
Treat macro declarations like function declarations for
line_lengthwhen
ignores_function_declarationsis enabled.
leno23
#5648 -
Make
Glob.expandGlobstartolerant of unreadable directory entries on
large trees.subpathsOfDirectory(atPath:)aborted the entire glob
expansion on the first unreadable entry (permission denied, dangling
symlink, file removed mid-scan), causing most files in large projects to
be silently ignored. Replace the directory walk with a lazyURL
enumerator that has a per-item error handler so unreadable items are
skipped individually.
Chupik -
Avoid false positives in
prefer_self_in_static_referencesfor generic
constraints and generic parameter bounds such aswhere A: Pand<A: P>
in classes and extensions.
SimplyDanny
#6674 -
Don't rewrite a type reference to
Selfinprefer_self_in_static_references
when it appears in a protocol composition (such asany A & B), as the
constraint of an existential or opaque type (such asany Aorsome A), or
as the base of an existential metatype (such asA.Protocol), since the named
type is not interchangeable withSelfin those positions.
Brett-Best
#6748
Using Bazel
With bzlmod:
// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.64.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 = "803d94e159f64c3a75a4ee5271496911139cd6b64e362b73ae859c965cafbf34",
url = "https://github.com/realm/SwiftLint/releases/download/0.64.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.3: High-Speed Extraction
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 ma...
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
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
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
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
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
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
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
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 -- --help