github realm/SwiftLint 0.63.3
0.63.3: High-Speed Extraction

11 hours ago

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_final rule that detects final modifiers on declarations
    where they are redundant due to the containing context, such as final classes
    or actors. Final actors are themselves implicitly final, so the final modifier
    is redundant on them as well.
    william-laverty
    SimplyDanny
    #6407

  • Add discouraged_default_parameter opt-in rule that flags default parameter
    values in functions with configurable access levels.
    William-Laverty
    #6488

  • Add ignored_literal_argument_functions option to the force_unwrapping rule
    to skip violations for configurable function calls when all arguments are
    literal values (e.g. URL(string: "https://example.com")!). Defaults
    include URL(string:), NSURL(string:), UIImage(named:),
    NSImage(named:), and Data(hexString:).
    claudeaceae
    #6487

  • Add rules array to SARIF reporter output, providing metadata for all
    built-in rules in accordance with the SARIF specification.
    ahmadalfy
    #6499

  • Add allow_underscore_prefixed_names option to unused_parameter so
    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_conversion rule.
    nadeemnali
    #6359

  • Add new default invisible_character rule 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_shadowing rule that flags when a variable declaration shadows
    an identifier from an outer scope.
    nadeemnali
    #6228

  • Add legacy_uigraphics_function rule to encourage the use of modern
    UIGraphicsImageRenderer instead of the legacy UIGraphics{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_imports rule.
    SimplyDanny
    #6620

  • Add name="SwiftLint" to JUnit testsuites and testsuite output for
    better CI parser compatibility.
    theamodhshetty
    #6161

  • Improve the opt-in pattern_matching_keywords rule by extending support
    beyond switch case and refining nested pattern handling.
    GandaLF2006

Bug Fixes

  • Detect and autocorrect missing whitespace before else in guard
    statements for the statement_position rule.
    theamodhshetty
    #6153

  • Avoid false positives from unused_enumerated when higher-order calls on
    .enumerated() use result members like ?.offset after the closure.
    theamodhshetty
    #5881

  • Add an ignore_attributes option to implicit_optional_initialization so
    wrappers/attributes that require explicit = nil can be excluded from
    style checks for both style: always and style: never.
    theamodhshetty
    #3998

  • Skip @TestState properties in quick_discouraged_call rule, matching
    existing @TestInjected and @TestWeakly exclusions.
    William-Laverty
    #5803

  • Fix explicit_self false positives around string interpolation.
    jffmrk
    SimplyDanny
    #6611

  • Properly taint variables in tuples for unneeded_escaping rule.
    SimplyDanny
    #6621

  • Ensure that disable commands work for redundant_nil_coalescing rule.
    SimplyDanny
    #6465

  • Take try expressions in call parameters into account even if the call has
    trailing closures as well, so that an outer throws is not considered unneeded
    in the unneeded_throws_rethrows rule.
    SimplyDanny
    #6491

  • Ensure that disable commands work for prefer_key_path rule 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_self rule.
    SimplyDanny
    #6553

  • Respect existing environment variables when setting BUILD_WORKSPACE_DIRECTORY
    in build tool plugins.
    SimplyDanny
    #6080

  • Fix false positives in indentation_width rule for continuation lines
    of multi-line guard/if/while conditions. 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_arguments no 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_references when a nested type
    shadows its enclosing type name.
    theamodhshetty
    #5917

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.3", repo_name = "SwiftLint")

Without bzlmod, put this in your WORKSPACE:

WORKSPACE
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "build_bazel_rules_apple",
    sha256 = "9e26307516c4d5f2ad4aee90ac01eb8cd31f9b8d6ea93619fc64b3cbc81b0944",
    url = "https://github.com/bazelbuild/rules_apple/releases/download/2.2.0/rules_apple.2.2.0.tar.gz",
)

load(
    "@build_bazel_rules_apple//apple:repositories.bzl",
    "apple_rules_dependencies",
)

apple_rules_dependencies()

load(
    "@build_bazel_rules_swift//swift:repositories.bzl",
    "swift_rules_dependencies",
)

swift_rules_dependencies()

load(
    "@build_bazel_rules_swift//swift:extras.bzl",
    "swift_rules_extra_dependencies",
)

swift_rules_extra_dependencies()

http_archive(
    name = "SwiftLint",
    sha256 = "5a4a1e8395e2a6b54506ebe91fca3a6873af4a10dba3322640b5adac46fe8061",
    url = "https://github.com/realm/SwiftLint/releases/download/0.63.3/bazel.tar.gz",
)

load("@SwiftLint//bazel:repos.bzl", "swiftlint_repos")

swiftlint_repos()

load("@SwiftLint//bazel:deps.bzl", "swiftlint_deps")

swiftlint_deps()

Then you can run SwiftLint in the current directory with this command:

bazel run @SwiftLint//:swiftlint -- --help

Don't miss a new SwiftLint release

NewReleases is sending notifications on new releases.