Skip to content

Releases: realm/SwiftLint

0.63.2: High-Speed Extraction

26 Jan 21:06

Choose a tag to compare

0.63.2: High-Speed Extraction

Enhancements

  • Add ignore_regex configuration option to the large_tuple rule to silence
    violations for tuples inside Regex<...> 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 in trailing_closure rule.
    SimplyDanny
    #6451

0.63.1: High-Speed Extraction

Enhancements

  • Add a --disable-sourcekit flag to the lint command to disable SourceKit when needed.
    The environment variable SWIFTLINT_DISABLE_SOURCEKIT can still be used as well.
    SimplyDanny
    #6282

Bug Fixes

  • Retain async initializers in actors in async_without_await rule.
    SimplyDanny
    #6423

  • Inform users about files being skipped due to impossible file system representation
    instead of crashing.
    SimplyDanny
    #6419

  • Ignore override functions in async_without_await rule.
    SimplyDanny
    #6416

  • Avoid infinite recursion for deeply nested symbolic links which is usually the case
    in node_modules directories managed by pnpm.
    SimplyDanny
    #6425

  • Fix false positive in unneeded_escaping rule 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_name when used inside a tuple.
    tristan-burnside-anz

0.63.0: High-Speed Extraction

Breaking

  • The redundant_self_in_closure rule has been renamed to redundant_self (with
    redundant_self_in_closure as 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 redundant self usages, set the new only_in_closures
    option to false.
    SimplyDanny

Experimental

  • None.

Enhancements

  • Extend redundant_self_in_closure rule to detect all redundant uses of self,
    not just in closures. Initializers (which commonly prefer an explicit self prefix)
    can be ignored by setting keep_in_initializers to true.
    SimplyDanny

  • Add a separation configuration option to the vertical_whitespace_between_cases rule
    to allow customizing blank line separation between switch cases. The default value is
    always (require at least one blank line). Setting it to never enforces no blank
    lines between cases.
    SimplyDanny
    #6326

  • Rewrite the following rules with SwiftSyntax:

    • vertical_whitespace_between_cases

    SimplyDanny

  • Add new opt-in unneeded_throws_rethrows rule that triggers when declarations
    marked throws/rethrows never actually throw or call any throwing code.
    Tony Ngo

  • Add new unneeded_escaping rule that detects closure parameters marked with
    @escaping that are never stored or captured escapingly.
    SimplyDanny

  • Add multiline_call_arguments opt-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_length rule incorrectly ignoring function bodies when
    ignores_function_declarations is enabled. The option should only ignore
    function declarations, not their implementation.
    SimplyDanny
    #6347

  • Fix false positives in vertical_whitespace_between_cases rule when cases are
    interleaved with compiler directives like #if/#else/#endif.
    SimplyDanny
    #6332

  • override_in_extension no longer triggers inside @objc @implementation extensions.
    JaredGrubb

  • Reinstate handling of access level imports in sorted_imports rule.
    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 -- --help

0.64.0-rc.1: All Windows Opened

25 Jan 11:51

Choose a tag to compare

Pre-release

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 \n as line ending in all linted files.
    SimplyDanny
    compnerd
    roman-bcny
    #6351
    #6352

Enhancements

  • Add ignore_regex configuration option to the large_tuple rule to silence
    violations for tuples inside Regex<...> 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 in trailing_closure rule.
    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 -- --help

0.63.1: High-Speed Extraction

15 Jan 20:25

Choose a tag to compare

0.63.1: High-Speed Extraction

Enhancements

  • Add a --disable-sourcekit flag to the lint command to disable SourceKit when needed.
    The environment variable SWIFTLINT_DISABLE_SOURCEKIT can still be used as well.
    SimplyDanny
    #6282

Bug Fixes

  • Retain async initializers in actors in async_without_await rule.
    SimplyDanny
    #6423

  • Inform users about files being skipped due to impossible file system representation
    instead of crashing.
    SimplyDanny
    #6419

  • Ignore override functions in async_without_await rule.
    SimplyDanny
    #6416

  • Avoid infinite recursion for deeply nested symbolic links which is usually the case
    in node_modules directories managed by pnpm.
    SimplyDanny
    #6425

  • Fix false positive in unneeded_escaping rule 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_name when used inside a tuple.
    tristan-burnside-anz

0.63.0: High-Speed Extraction

Breaking

  • The redundant_self_in_closure rule has been renamed to redundant_self (with
    redundant_self_in_closure as 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 redundant self usages, set the new only_in_closures
    option to false.
    SimplyDanny

Experimental

  • None.

Enhancements

  • Extend redundant_self_in_closure rule to detect all redundant uses of self,
    not just in closures. Initializers (which commonly prefer an explicit self prefix)
    can be ignored by setting keep_in_initializers to true.
    SimplyDanny

  • Add a separation configuration option to the vertical_whitespace_between_cases rule
    to allow customizing blank line separation between switch cases. The default value is
    always (require at least one blank line). Setting it to never enforces no blank
    lines between cases.
    SimplyDanny
    #6326

  • Rewrite the following rules with SwiftSyntax:

    • vertical_whitespace_between_cases

    SimplyDanny

  • Add new opt-in unneeded_throws_rethrows rule that triggers when declarations
    marked throws/rethrows never actually throw or call any throwing code.
    Tony Ngo

  • Add new unneeded_escaping rule that detects closure parameters marked with
    @escaping that are never stored or captured escapingly.
    SimplyDanny

  • Add multiline_call_arguments opt-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_length rule incorrectly ignoring function bodies when
    ignores_function_declarations is enabled. The option should only ignore
    function declarations, not their implementation.
    SimplyDanny
    #6347

  • Fix false positives in vertical_whitespace_between_cases rule when cases are
    interleaved with compiler directives like #if/#else/#endif.
    SimplyDanny
    #6332

  • override_in_extension no longer triggers inside @objc @implementation extensions.
    JaredGrubb

  • Reinstate handling of access level imports in sorted_imports rule.
    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 -- --help

0.63.0: High-Speed Extraction

03 Jan 14:25

Choose a tag to compare

Breaking

  • The redundant_self_in_closure rule has been renamed to redundant_self (with
    redundant_self_in_closure as 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 redundant self usages, set the new only_in_closures
    option to false.
    SimplyDanny

Experimental

  • None.

Enhancements

  • Extend redundant_self_in_closure rule to detect all redundant uses of self,
    not just in closures. Initializers (which commonly prefer an explicit self prefix)
    can be ignored by setting keep_in_initializers to true.
    SimplyDanny

  • Add a separation configuration option to the vertical_whitespace_between_cases rule
    to allow customizing blank line separation between switch cases. The default value is
    always (require at least one blank line). Setting it to never enforces no blank
    lines between cases.
    SimplyDanny
    #6326

  • Rewrite the following rules with SwiftSyntax:

    • vertical_whitespace_between_cases

    SimplyDanny

  • Add new opt-in unneeded_throws_rethrows rule that triggers when declarations
    marked throws/rethrows never actually throw or call any throwing code.
    Tony Ngo

  • Add new unneeded_escaping rule that detects closure parameters marked with
    @escaping that are never stored or captured escapingly.
    SimplyDanny

  • Add multiline_call_arguments opt-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_length rule incorrectly ignoring function bodies when
    ignores_function_declarations is enabled. The option should only ignore
    function declarations, not their implementation.
    SimplyDanny
    #6347

  • Fix false positives in vertical_whitespace_between_cases rule when cases are
    interleaved with compiler directives like #if/#else/#endif.
    SimplyDanny
    #6332

  • override_in_extension no longer triggers inside @objc @implementation extensions.
    JaredGrubb

  • Reinstate handling of access level imports in sorted_imports rule.
    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 -- --help

0.63.0-rc.2: High-Speed Extraction

20 Dec 11:45

Choose a tag to compare

Pre-release

Breaking

  • The redundant_self_in_closure rule has been renamed to redundant_self (with
    redundant_self_in_closure as a deprecated alias) to reflect its now broader scope.
    SimplyDanny

Experimental

  • None.

Enhancements

  • Extend redundant_self_in_closure rule to detect all redundant uses of self,
    not just in closures. Initializers (which commonly prefer an explicit self prefix)
    can be ignored by setting keep_in_initializers to true.
    SimplyDanny

  • Add a separation configuration option to the vertical_whitespace_between_cases rule
    to allow customizing blank line separation between switch cases. The default value is
    always (require at least one blank line). Setting it to never enforces no blank
    lines between cases.
    SimplyDanny
    #6326

  • Rewrite the following rules with SwiftSyntax:

    • vertical_whitespace_between_cases

    SimplyDanny

  • Add new opt-in unneeded_throws_rethrows rule that triggers when declarations
    marked throws/rethrows never actually throw or call any throwing code.
    Tony Ngo

  • Add new unneeded_escaping rule that detects closure parameters marked with
    @escaping that are never stored or captured escapingly.
    SimplyDanny

  • Add multiline_call_arguments opt-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_length rule incorrectly ignoring function bodies when
    ignores_function_declarations is enabled. The option should only ignore
    function declarations, not their implementation.
    SimplyDanny
    #6347

  • Fix false positives in vertical_whitespace_between_cases rule when cases are
    interleaved with compiler directives like #if/#else/#endif.
    SimplyDanny
    #6332

  • override_in_extension no longer triggers inside @objc @implementation extensions.
    JaredGrubb

  • Reinstate handling of access level imports in sorted_imports rule.
    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 -- --help

0.62.2: Generous Drum Volume

28 Oct 17:15

Choose a tag to compare

0.62.2: Generous Drum Volume

Enhancements

  • Add new incompatible_concurrency_annotation rule that triggers when a declaration
    isolated to a global actor, @Sendable closure arguments and/or generic sendable
    constraints is not annotated with @preconcurrency in order to maintain compatibility
    with Swift 5.
    mattmassicotte
    SimplyDanny
    #5987

  • Add isolation modifier group to modifier_order rule configuration.
    This allows configuring the position of nonisolated modifiers.
    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 #Preview macro in closure_end_indentation rule.
    gibachan

  • Fix correction of sorted_imports rule 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.zip is now simpler. Internal paths no
    longer contain version numbers, especially. So in an Xcode Run Script build phase,
    you can refer to the swiftlint binary 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_imports rule'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_order
    • sorted_imports

    SimplyDanny

  • Add new prefer_asset_symbols rule that suggests using asset symbols over
    string-based image initialization to avoid typos and enable compile-time
    checking. This rule detects UIImage(named:) and SwiftUI.Image(_:) calls
    with string literals and suggests using asset symbols instead.
    danglingP0inter
    #5939

  • Exclude integer generic parameters from generic_type_name rule.
    Include integer generic parameters in the identifier_name rule for validation.
    nandhinisubbu
    #6213

Bug Fixes

  • Ignore function, initializer and subscript declarations alike when the
    ignores_function_declarations option is enabled in the line_length rule.
    SimplyDanny
    #6241

  • Individual custom_rules can now be specified in the only_rule configuration
    setting and the --only-rule command line option without having to specify
    custom_rules as 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_let rule violations in nested SwiftUI scopes as well
    when ignore_swiftui_view_bodies is enabled.
    SimplyDanny
    #3855
    #6255

  • Exclude function types from async_without_await rule analysis. Higher-order function
    objects can be async without containing an await when assigning to them.
    SimplyDanny
    #6253

  • Exclude @concurrent functions from async_without_await rule analysis.
    @concurrent functions requires aysnc in 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

0.62.1: Generous Drum Volume

13 Oct 21:20

Choose a tag to compare

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.zip is now simpler. Internal paths no
    longer contain version numbers, especially. So in an Xcode Run Script build phase,
    you can refer to the swiftlint binary 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_imports rule'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_order
    • sorted_imports

    SimplyDanny

  • Add new prefer_asset_symbols rule that suggests using asset symbols over
    string-based image initialization to avoid typos and enable compile-time
    checking. This rule detects UIImage(named:) and SwiftUI.Image(_:) calls
    with string literals and suggests using asset symbols instead.
    danglingP0inter
    #5939

  • Exclude integer generic parameters from generic_type_name rule.
    Include integer generic parameters in the identifier_name rule for validation.
    nandhinisubbu
    #6213

Bug Fixes

  • Ignore function, initializer and subscript declarations alike when the
    ignores_function_declarations option is enabled in the line_length rule.
    SimplyDanny
    #6241

  • Individual custom_rules can now be specified in the only_rule configuration
    setting and the --only-rule command line option without having to specify
    custom_rules as 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_let rule violations in nested SwiftUI scopes as well
    when ignore_swiftui_view_bodies is enabled.
    SimplyDanny
    #3855
    #6255

  • Exclude function types from async_without_await rule analysis. Higher-order function
    objects can be async without containing an await when assigning to them.
    SimplyDanny
    #6253

  • Exclude @concurrent functions from async_without_await rule analysis.
    @concurrent functions requires aysnc in 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 -- --help

0.62.0: Generous Drum Volume

13 Oct 20:05

Choose a tag to compare

Breaking

  • The structure of SwiftLintBinary.artifactbundle.zip is now simpler. Internal paths no
    longer contain version numbers, especially. So in an Xcode Run Script build phase,
    you can refer to the swiftlint binary 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_imports rule'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_order
    • sorted_imports

    SimplyDanny

  • Add new prefer_asset_symbols rule that suggests using asset symbols over
    string-based image initialization to avoid typos and enable compile-time
    checking. This rule detects UIImage(named:) and SwiftUI.Image(_:) calls
    with string literals and suggests using asset symbols instead.
    danglingP0inter
    #5939

  • Exclude integer generic parameters from generic_type_name rule.
    Include integer generic parameters in the identifier_name rule for validation.
    nandhinisubbu
    #6213

Bug Fixes

  • Ignore function, initializer and subscript declarations alike when the
    ignores_function_declarations option is enabled in the line_length rule.
    SimplyDanny
    #6241

  • Individual custom_rules can now be specified in the only_rule configuration
    setting and the --only-rule command line option without having to specify
    custom_rules as 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_let rule violations in nested SwiftUI scopes as well
    when ignore_swiftui_view_bodies is enabled.
    SimplyDanny
    #3855
    #6255

  • Exclude function types from async_without_await rule analysis. Higher-order function
    objects can be async without containing an await when assigning to them.
    SimplyDanny
    #6253

  • Exclude @concurrent functions from async_without_await rule analysis.
    @concurrent functions requires aysnc in 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 -- --help

0.61.0: Even Fresher Breeze

06 Sep 14:34

Choose a tag to compare

Breaking

  • If SWIFTLINT_DISABLE_SOURCEKIT is set to prohibit loading libsourcekitdInProc at runtime,
    rules requiring SourceKit will be disabled and a warning will be printed once per rule.
    SimplyDanny

  • The operator_whitespace rule has been removed and its functionality merged into the
    function_name_whitespace rule. The latter now also checks spacing around the func
    keyword, the function name/operator and its generic parameters while respecting comments.
    On top of that, it supports autocorrection.
    SimplyDanny

  • Expose only TestHelpers and ExtraRulesTests as 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.so together with its
      transitive dependencies to be present on the system at runtime. It is named swiftlint
      and the same binary as before. It supports all built-in rules.
    • A fully statically linked binary named swiftlint-static that does not require
      any dynamic libraries at runtime. Rules requiring SourceKit will be disabled and
      reported to the console when running this binary.
    SimplyDanny

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
    require libsourcekitdInProc.so or 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_whitespace rule to enforce consistent spacing between the func
    keyword, function name, and its generic parameters. Ensures exactly one space between
    func and 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_whitespace rule now supports autocorrection and better respects comments in
    function declarations. The rule has been deprecated in favor of the new function_name_whitespace
    rule. You can still refer to it by its identifier, but get checking for normal function names
    on top.
    SimplyDanny

  • In line_length rule, 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_length rule.
    SimplyDanny
    #6219

  • Rewrite quick_discouraged_call rule with SwiftSyntax.
    SimplyDanny

Bug Fixes

  • Ensure that header matched against always end in a newline in file_header rule.
    SimplyDanny
    #6227

  • Fix closure_end_indentation rule 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 -- --help

0.60.0: Fresh Breeze

30 Aug 11:47

Choose a tag to compare

Breaking

  • Remove support for boolean values in the validates_start_with_lowercase option entirely.
    Use the severity levels off, warning or error instead.
    kaseken

  • SwiftLint now requires macOS 13 or higher to run.
    JP Simard

  • In SwiftLintBuildToolPlugin, print the content of the BUILD_WORKSPACE_DIRECTORY
    environment variable only in debug builds.
    SimplyDanny
    #6135

  • The redundant_optional_initialization rule has been replaced by the
    implicit_optional_initialization rule that enforces implicit or explicit initialization
    of optional variables. Its default style always mimics the behavior of the
    redundant_optional_initialization rule by default. redundant_optional_initialization
    is now an alias for implicit_optional_initialization.
    leo-lem
    #1940

  • The swiftlint_linux.zip release archive has been renamed to swiftlint_linux_amd64.zip
    to avoid confusion with the new swiftlint_linux_arm64.zip archive.
    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 count identifiers in empty_count rule.
    SimplyDanny
    #5326

  • The private_swiftui_state rule now applies to ViewModifier types.
    mt00chikin

  • Support for ARM64 Linux binaries has been added. The swiftlint_linux.zip release archive
    has been renamed to swiftlint_linux_amd64.zip. Next to it, a new swiftlint_linux_arm64.zip
    archive has been added. The SwiftLintBinary.artifactbundle.zip now 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_variables configuration option to non_optional_string_data_conversion rule.
    When enabled, the rule will trigger on variables, properties, and function calls in addition
    to string literals. Defaults to false for 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_protocol rule.
    imsonalbajaj
    #6054

  • Support extensions and protocols in type_body_length rule. They can be configured using the
    new excluded_types option which by default excludes extension and protocol types.
    This means the rule now checks struct, class, actor and enum by default. To enable
    checking of extensions and protocols, set excluded_types to an empty array or exclude other
    types as needed.
    SimplyDanny

  • Exclude explicit system modules from duplicate_imports analysis, that is, modules
    that are part of the system frameworks but need to be imported explicitly due to being
    declared as explicit module in their module map.
    SimplyDanny
    #6098

  • Ignore various assignment operators like =, +=, &=, etc. with right-hand side
    ternary expressions otherwise violating the void_function_in_ternary rule.
    SimplyDanny
    #5611

  • Rewrite the following rules with SwiftSyntax:

    • accessibility_label_for_image
    • accessibility_trait_for_button
    • closure_end_indentation
    • expiring_todo
    • file_header
    • file_length
    • line_length
    • trailing_whitespace
    • vertical_whitespace

    JP Simard
    Matt Pennig

  • Add excluded_paths option to the file_name rule. 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 the excluded option
    that only accepts and checks against file names.
    Ueeek
    #6066

  • Fix false positives of redundant_discardable_let rule in @ViewBuilder functions,
    #Preview macro bodies and preview providers when ignore_swiftui_view_bodies is
    enabled.
    kaseken
    #6063

  • Improve multiline_parameters rule to correctly support
    max_number_of_single_line_parameters and detect mixed formatting.
    GandaLF2006

  • Add new prefer_condition_list rule that triggers when a guard/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_keys parameter to nesting rule. Setting this to true prevents
    CodingKey enums from violating the rule.
    braker1nine
    #5641

  • Support deinitializers and subscripts in function_body_length rule.
    SimplyDanny

  • Extend the xct_specific_matcher rule to support identity operators (=== and !==)
    in addition to the existing equality operators (== and !=).
    SimplyDanny
    #5849

  • Add new implicit_optional_initialization rule to enforce implicit or explicit
    initialization of optional variables, configurable via style: always | never.
    It replaces the redundant_optional_initialization rule mimicking it with the
    style: always option which is the default.
    leo-lem
    #1940

  • Add new ignore_identity_closures parameter to prefer_key_paths rule 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 to true when SwiftLint detects a Swift <6 compiler
    to avoid causing compilation errors.
    p4checo
    #5965

Bug Fixes

  • Fix no_extension_access_modifier rule incorrectly triggering for nonisolated extension.
    The rule now only flags actual access control modifiers (private, public, open,
    internal, fileprivate) and ignores isolation modifiers like nonisolated.
    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 warning nor error values are configured.
    Ensure especially that the error level is not set to nil when the warning level
    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