Skip to content

Releases: realm/SwiftLint

0.57.1: Squeaky Clean Cycle

24 Nov 15:10
Compare
Choose a tag to compare

Breaking

  • None.

Experimental

  • None.

Enhancements

  • Suggest failable String(bytes:encoding:) initializer in
    optional_data_string_conversion rule as it accepts all Sequence
    types.
    Jordan Rose
    SimplyDanny

  • Support reading files to lint from Input File Lists provided
    by Run Script Build Phases in Xcode using the command-line
    argument --use-script-input-file-lists.
    BlueVirusX

  • Adds a lenient configuration file setting, equivalent to the --lenient
    command line option.
    Martin Redington
    #5801

  • Support type casting on configuration option values defined by environment variables.
    Without a cast, these values would always be treated as strings leading to a potentially
    invalid configuration.
    SimplyDanny
    #5774

  • Add new option max_number_of_single_line_parameters that allows only the specified maximum
    number of parameters to be on one line when allows_single_line = true. If the limit is
    exceeded, the rule will still trigger. Confusing option combinations like allows_single_line = false
    together with max_number_of_single_line_parameters > 1 will be reported.
    kimdv
    SimplyDanny
    #5781

  • The redundant_type_annotation rule gains a new option,
    ignore_properties, that skips enforcement on members in a
    type declaration (like a struct). This helps the rule coexist with
    the explicit_type_interface rule that requires such redundancy.
    jaredgrubb
    #3750

  • Allow inherited isolation parameter to be first in function signatures
    depending on the new option ignore_first_isolation_inheritance_parameter
    which is true by default.
    SimplyDanny
    #5793

Bug Fixes

  • Run command plugin in whole package if no targets are defined in the
    package manifest.
    SimplyDanny
    #5787

  • Silence superfluous_else rule on if expressions with only a single
    availability condition.
    SimplyDanny
    #5833

  • Stop triggering the control_statement rule on closures being directly
    called as conditions.
    SimplyDanny
    #5846

  • Do not trigger self_in_property_initialization rule on self in
    key paths expressions.
    SimplyDanny
    #5835

  • Allow to specify transitive modules to be taken into account by
    unused_import rule. This avoids that required imports are removed.
    Paul Taykalo
    SimplyDanny
    #5167

  • Only pass cache path and directory paths to commands that accept these arguments
    in the command plugin.
    SimplyDanny
    #5848

  • Do not throw deprecation warning if deprecated property is not
    presented in configuration.
    chipp
    #5791

  • The prefer_type_checking rule will no longer trigger for non-optional
    type casting (as), or for comparisons to optional types.
    Martin Redington
    #5802

  • Fixes an issue where the superfluous_disable_command rule could generate
    false positives for nested disable commands for custom rules.
    Martin Redington
    #5788

  • Fixes the --only-rule command line option, when a default .swiftlint.yml
    is absent. Additionally rules specified with --only-rule on the command
    line can now be disabled in a child configuration, to allow specific
    directories to be excluded from the rule (or from being auto-corrected by
    the rule), and --only-rule can now be specified multiple times
    to run multiple rules.
    Martin Redington
    #5711


Using Bazel

With bzlmod:

// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.57.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 = "78f9a8dfd3cb4b6b5ff173892c7f273cae0b67f3a0a1bd8651fe10029693f5f4",
    url = "https://github.com/realm/SwiftLint/releases/download/0.57.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.57.0: Squeaky Clean Cycle

08 Sep 16:02
Compare
Choose a tag to compare

Breaking

  • The deprecated anyobject_protocol rule has now been removed.
    Martin Redington
    #5769

  • Revert the part of the non_optional_string_data_conversion
    rule that enforces non-failable conversions of Data to UTF-8
    String. This is due to the fact that the data to be converted
    can be arbitrary and especially doesn't need to represent a valid
    UTF-8-encoded string.
    Sam Rayner
    #5263

Experimental

  • None.

Enhancements

  • Add ignore_multiline_type_headers and ignore_multiline_statement_conditions
    options to opening_brace rule to allow opening braces to be on a new line after
    multiline type headers or statement conditions. Rename allow_multiline_func to
    ignore_multiline_function_signatures.
    leonardosrodrigues0
    #3720

  • Add new optional_data_string_conversion rule to enforce
    failable conversions of Data to UTF-8 String.
    Sam Rayner
    #5263

  • The no_magic_numbers rule will now ignore violations in
    SwiftUI's Preview macro.
    Martin Redington
    #5778

Bug Fixes


Using Bazel

With bzlmod:

// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.57.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 = "82343de268e63d196cf878bd77e88289ec6ea64054d328e92fe1baae18733104",
    url = "https://github.com/realm/SwiftLint/releases/download/0.57.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.56.2: Heat Pump Dryer

22 Aug 11:22
Compare
Choose a tag to compare

Breaking

  • None.

Experimental

  • None.

Enhancements

  • None.

Bug Fixes

  • Ignore initializers with attributes in unneeded_synthesized_initializer rule.
    SimplyDanny
    #5153

  • Silence prefer_key_path rule on macro expansion expressions.
    SimplyDanny
    #5744

  • Check if expressions nested arbitrarily deep in contrasted_opening_brace rule.
    SimplyDanny
    #5752

  • Align left closure brace with associated parent function call in contrasted_opening_brace rule.
    SimplyDanny
    #5752

  • Align left brace of additional trailing closures with right brace of previous trailing closure
    in contrasted_opening_brace rule.
    SimplyDanny
    #5752

  • Trigger on empty closure blocks in no_empty_block rule.
    SimplyDanny
    #5762

  • Silence unneeded_override rule on methods and initializers with attributes.
    SimplyDanny
    #5753


Using Bazel

With bzlmod:

// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.56.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 = "d607223592fb87c67e91d899e8e33b5e0b04da5306afd994c4331c2881b6832d",
    url = "https://github.com/realm/SwiftLint/releases/download/0.56.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.56.1: Heat Pump Dryer

06 Aug 23:09
Compare
Choose a tag to compare

Breaking

  • None.

Experimental

  • None.

Enhancements

  • None.

Bug Fixes

  • Let contrasted_opening_brace be an opt-in rule.
    SimplyDanny

Using Bazel

With bzlmod:

// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.56.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 = "100aa8cbe1c42b0503d5b0a6c1944b9955c1c1795d59e39a4c1d3a5a3153c5b6",
    url = "https://github.com/realm/SwiftLint/releases/download/0.56.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.56.0: Heat Pump Dryer

06 Aug 20:37
Compare
Choose a tag to compare

Breaking

  • The deprecated --path and --in-process-sourcekit arguments have now been
    removed completely.
    Martin Redington
    SimplyDanny
    #5614

  • When SwiftLint corrects violations automatically (swiftlint lint --fix)
    it doesn't report the exact location of the fix any longer. The new format
    is <file-path>: Correcting <rule-name> without line and column numbers.
    Reason: Correction positions are likely just incorrect, especially when
    multiple rules apply their rewrites. Fixing that is not trivial and likely
    not worth the effort also considering that there haven't been any bug
    reports about wrong correction positions so far.
    SimplyDanny

Experimental

  • None.

Enhancements

  • Linting got up to 30% faster due to the praisworthy performance
    improvements done in the SwiftSyntax library.

  • Rewrite the following rules with SwiftSyntax:

    • missing_docs

    woxtu
    SimplyDanny

  • Add new prefer_key_path rule that triggers when a trailing closure on a standard
    function call is only hosting a (chained) member access expression since the closure
    can be replaced with a key path argument. Likewise, it triggers on closure arguments.
    SimplyDanny

  • Adds baseline and write_baseline configuration file settings, equivalent
    to the --baseline and --write-baseline command line options.
    Martin Redington
    #5552

  • Add no_empty_block opt-in rule to validate that code blocks are not empty.
    They should at least contain a comment.
    Ueeek
    #5615

  • Add new contrasted_opening_brace rule that enforces opening
    braces to be on a separate line after the preceding declaration.
    SimplyDanny

  • Add new unused_parameter rule that triggers on function/initializer/subscript
    parameters that are not used inside of the function/initializer/subscript.
    SimplyDanny
    #2120

  • Support --target paths being passed to command plugin by Xcode.
    SimplyDanny
    #5603

  • Add modified configurations to examples in rule documentation.
    SimplyDanny

  • Add new option evaluate_effective_access_control_level to missing_docs
    rule. Setting it to true stops the rule from triggering on declarations
    inside of types with lower visibility. These declarations effectively
    have at most the same access level.
    SimplyDanny

  • Add new --check-for-updates command line option for the lint, analyze,
    and version subcommands to check for new versions of SwiftLint, and an
    equivalent check_for_updates configuration file setting.
    Martin Redington
    SimplyDanny
    Ian Leitch
    #5613

  • Add new --only-rule command line option for the lint and analyze,
    subcommands that overrides configuration file rule enablement and
    disablement, in particular to facilitate running --fix for single rules
    without having to temporarily edit the configuration file.
    Martin Redington
    #5666

Bug Fixes

  • Fix a few false positives and negatives by updating the parser to support
    Swift 6 with all its new language constructs.
    SimplyDanny

  • Stop triggering mark rule on "mark" comments in the middle of another
    comment.
    SimplyDanny
    #5592

  • Don't consider specialized imports with attributes as duplicates in
    duplicate_imports rule.
    SimplyDanny
    #5716

  • Use correct types and relative paths in SARIF reporter output. Generally
    avoid escaping slashes in JSON output as well.
    SimplyDanny
    #5598
    #5599

  • Keep initializers with attributed parameters in
    unneeded_synthesized_initializer rule.
    SimplyDanny
    #5153

  • Make vertical_whitespace_between_cases rule work for
    cases ending with a string literal.
    ilendemli
    #5612

  • Ignore access level modifiers restricted to value setting in
    extension_access_modifier rule.
    SimplyDanny
    #5623

  • Fix baseline compare incorrectly reporting some violations
    as new, and also now sorts the violations from baseline compare
    deterministically.
    Martin Redington
    #5606

  • Fix rewriting for implicit_return rule when violations are
    nested within each other.
    Martin Redington
    #5660

  • Fix opening_brace correction and make sure that disable commands
    are taken into account before applying a fix.
    swiftty
    SimplyDanny
    #5598

  • Violations of the typesafe_array_init rule will now be correctly
    reported as such, instead of as violations of the array_init
    rule.
    Martin Redington
    #5709


Using Bazel

With bzlmod:

// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.56.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 = "40a7873d54899ace4e485317d172c19507135ae1b3683159d521cc1daa42e196",
    url = "https://github.com/realm/SwiftLint/releases/download/0.56.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.55.1: Universal Washing Powder

16 May 19:42
Compare
Choose a tag to compare

Breaking

  • None.

Experimental

  • None.

Enhancements

  • Clarify wording of static_over_final_class rule's violation message.
    SimplyDanny
    #5570

Bug Fixes

  • Fix Bazel build when bzlmod is not in use by adding transitive dependencies
    explicitly.
    SimplyDanny
    #5568

  • Treat condionally activatable variable declarations and initializer as if
    they were always active in unneeded_synthesized_initializer rule to avoid
    compilation issues when unexpected items are there after all.
    SimplyDanny
    #5574

  • Silence unused_enumerated rule when $0 in a closure is explicitly unpacked.
    SimplyDanny
    #5573

  • Remove redundant initializers in unneeded_override rule only when checking
    initializers is actually enabled in the configuration.
    SimplyDanny
    #5571

  • Respect comments before opening brace in opening_brace rule when there is
    one space before the brace after the comment. Everything else is still a
    violation, yet the rewriter will not remove the comment anymore.
    SimplyDanny
    #5578


Using Bazel

With bzlmod:

// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.55.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 = "78220a0b97db39edb08ead8e663aef415915e7d6631ba39ef3cc69b39352f664",
    url = "https://github.com/realm/SwiftLint/releases/download/0.55.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.55.0: Universal Washing Powder

11 May 21:13
Compare
Choose a tag to compare

Breaking

  • Rewrite SwiftLintBuildToolPlugin using BUILD_WORKSPACE_DIRECTORY without relying
    on the --config option.
    Garric Nahapetian

  • Introduce SwiftLintCommandPlugin.
    Rename SwiftLintBuildToolPlugin.
    Add Swift Package Manager installation instructions.
    garricn

  • Fix Code Climate reporter output by having lower case severity
    values to comply with the Code Climate specification.
    waitButY

  • The superfluous_disable_command rule will now be enabled for the analyze
    command, unless it has been disabled, and will warn about superfluous
    disablement of analyzer rules.
    Martin Redington
    #4792

  • With the introduction of the consider_default_literal_types_redundant
    option to the redundant_type_annotation rule, Bool literals will no
    longer be considered redundant by default. Set this option to true to
    preserve the previous behavior.
    Garric Nahapetian

Experimental

  • Add two new options to the lint and analyze commands: --write-baseline
    to save a baseline to disk, and --baseline to read a saved baseline and
    use it to filter out detected pre-existing violations. A new baseline
    command uses the reporters to print the violations in a baseline.
    Martin Redington
    #5475
    #3421

Enhancements

  • Add a reporter that outputs violations in the Static
    Analysis Results Interchange Format (SARIF).
    waitButY

  • Ignore absence of a non-initial local config instead of
    falling back to default.
    kohtenko

  • Add new option ignore_typealiases_and_associatedtypes to
    nesting rule. It excludes typealias and associatedtype
    declarations from the analysis.
    marunomi
    #3183

  • Prevent from compiling SwiftLint target when only using SwiftLintPlugin on macOS.
    Julien Baillon
    #5372

  • Allow to set the severity of rules (if they have one) in the short form
    rule_name: warning|error provided that no other attributes need to be
    configured.
    SimplyDanny

  • Add new ignore_one_liners option to switch_case_alignment
    rule to ignore switch statements written in a single line.
    tonell-m
    #5373

  • Add new shorthand_argument rule that triggers on shorthand arguments
    like $0, $1, etc. in closures if they are too far away from the
    beginning of the closure. Options allow further cases to always trigger.
    SimplyDanny
    #70

  • Warn when --fix comes together with --strict or --lenient as only --fix
    takes effect then.
    SimplyDanny
    #5387

  • Add new one_declaration_per_file rule that allows only a
    single class/struct/enum/protocol declaration per file.
    Extensions are an exception; more than one is allowed.
    Muhammad Zeeshan
    #2802

  • Add new ignore_attributes option to redundant_type_annotation rule
    that allows disabling the rule for properties that are marked with at least
    one of the configured attributes.
    tonell-m
    #5366

  • Rewrite the following rules with SwiftSyntax:

    • explicit_acl
    • extension_access_modifier
    • identifier_name
    • let_var_whitespace
    • mark
    • multiline_literal_brackets
    • nesting
    • nimble_operator
    • opening_brace
    • orphaned_doc_comment
    • redundant_type_annotation
    • trailing_closure
    • void_return

    SimplyDanny
    kishikawakatsumi
    Marcelo Fabri
    swiftty
    KS1019
    tonell-m

  • Print invalid keys when configuration parsing fails.
    SimplyDanny
    #5347

  • Add new final_test_case rule that triggers on non-final test classes.
    SimplyDanny

  • Make superfluous_else rule auto-correctable.
    SimplyDanny

  • Support other scope-exiting statements continue, break and throw in
    superfluous_else rule.
    SimplyDanny

  • Trigger on -> () return signatures in return_value_from_void_function
    rule. Moreover, support automatic fixes for obvious cases.
    SimplyDanny

  • Refine violation position of trailing_closure rule.
    SimplyDanny

  • Trigger on the declaration keyword (i.e. let, var, func, subscript)
    instead of the static or class keywords in the explicit_acl rule.
    SimplyDanny

  • Allow to configure more operators in identifier_name rule. The new option
    is named additional_operators. Use it to add more operators to the list
    of default operators known to the rule.
    SimplyDanny
    #1762

  • Stop triggering no_magic_numbers rule on literals used in range
    expressions assigned to variables.
    SimplyDanny
    #5430

  • Add affect_initializers option to allow unneeded_override rule
    to affect initializers.
    leonardosrodrigues0
    #5265

  • Respect scattered disable commands in auto-correction of duplicate_imports
    rule.
    SimplyDanny
    #5418

  • Add new non_optional_string_data_conversion rule to enforce
    non-failable conversions of UTF-8 String <-> Data.
    Ben P
    #5263

  • Refine violation position of superfluous_else rule.
    SimplyDanny

  • Make sorted_enum_cases rule's comparison case-insensitive to
    avoid unexpected ordering.
    Oleg Kokhtenko

  • Add excluded_lines_patterns to line_length to avoid linting lines
    that contain one of the patterns.
    kasrababaei

  • Make empty_count auto-correctable.
    KS1019

  • Make private_swiftui_state auto-correctable.
    mt00chikin

  • Make trailing_closure correctable.
    KS1019

  • Add new static_over_final_class rule to prefer static over
    final class declaration.
    phlippieb
    #5471

  • Extends unused_enumerated rule to cover closure parameters, to
    detect cases like list.enumerated().map { idx, _ in idx } and
    list.enumerated().map { $1 }.
    Martin Redington
    #5470

  • Include Double, Int and String to the exiting redundant type validation
    check of Bool in the redundant_type_annotation rule. Add
    consider_default_literal_types_redundant option supporting Bool,
    Double, Int and String. Setting this option to true lets the rule
    consider said types in declarations like let i: Int = 1 or
    let s: String = "" as redundant.
    Garric Nahapetian

Bug Fixes

  • Invalid keys in a configuration don't lead to the default configuration being
    used anymore. The invalid key will just be reported but otherwise ignored.
    SimplyDanny
    #5565

  • Fix version comparison algorithm which caused some version-dependent rules to
    misbehave with Swift 5.10.
    chandlerwall
    #5517

  • Silence discarded_notification_center_observer rule in closures. Furthermore,
    handle get and set accessors correctly and consider implicit returns.
    SimplyDanny
    #4801

  • Fix some false positives in let_var_whitespace rule that would happen
    when attributes attached to declarations were spread over multiple lines.
    SimplyDanny
    #4801

  • Support private_over_fileprivate rule for actors.
    SimplyDanny
    #5489

  • Ensure that declarations referenced only as extended types do not count as
    used by means of the unused_declaration rule.
    SimplyDanny
    [#5550](#555...

Read more

0.54.0: Macro-Economic Forces

10 Nov 20:54
f17a4f9
Compare
Choose a tag to compare

Breaking

Experimental

  • None.

Enhancements

  • Add only configuration option to todo rule which allows to specify
    whether the rule shall trigger on TODOs, FIXMEs or both.
    gibachan
    #5233

  • Make unneeded_break_in_switch auto correctable.
    KS1019

  • Speed up closure_parameter_position rule when there are no violations.
    Marcelo Fabri

  • Rewrite cyclomatic_complexity rule using SwiftSyntax.
    Marcelo Fabri

  • Rewrite redundant_void_return rule using SwiftSyntax.
    Also include redundant void return clauses for closures in addition to
    functions. This can be disabled by configuring the rule with
    include_closures: false.
    Marcelo Fabri
    JP Simard

  • Rewrite discouraged_optional_collection rule using SwiftSyntax, catching
    more violations.
    JP Simard

  • Rewrite duplicate_imports rule using SwiftSyntax.
    JP Simard

  • Handle viewIsAppearing in the type_contents_order rule.
    u-abyss
    #5259

  • Rewrite vertical_parameter_alignment_on_call rule using SwiftSyntax, fixing
    some false positives.
    Marcelo Fabri
    #3581

  • Rewrite no_grouping_extension rule using SwiftSyntax.
    Marcelo Fabri

Bug Fixes

  • Fix false positive in implicit_getter rule when using unknown accessors.
    kabiroberai
    #5300

  • Fix correction of explicit_init rule by keeping significant trivia.
    BB9z
    #5289

  • Fix invalid corrections for opaque and existential optionals in
    syntactic_sugar rule.
    SimplyDanny
    #5277

  • Fix false positive in unused_import rule that triggered on
    @_exported imports which could break downstream modules if removed.
    jszumski
    #5242

  • Fix false positive in unused_import rule when using a constructor
    defined in a transitive module.
    jszumski
    #5246


Using Bazel

With bzlmod:

// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.54.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 = "3a97a7d225c6a39716c48aea88eee38df052f678bf6dad73f62c746a3d9cc10c",
    url = "https://github.com/realm/SwiftLint/releases/download/0.54.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.53.0: Laundry List

26 Sep 15:09
6d2e582
Compare
Choose a tag to compare

Breaking

  • Hide all Reporters from SwiftLint's' public interface.
    SimplyDanny

  • The options inlcuded, name and message are from now on ignored in the
    configuration for the private_unit_test rule. The option regex is still
    supported but is deprecated. It's recommended to use the list
    test_parent_classes instead which accepts names of parent test classes.
    SimplyDanny

  • Remove support for disable and enable commands in multiline comments.
    Martin Redington
    #4798

Experimental

  • None.

Enhancements

  • Show specific violation message for the attributes rule when the option
    always_on_line_above or attributes_with_arguments_always_on_line_above
    is involved.
    chrisngabp
    5103

  • Rewrite control_statement rule using SwiftSyntax.
    SimplyDanny

  • Add new non_overridable_class_declaration rule that triggers on class
    function and variable declarations in final classes that are not final
    themselves or private.
    SimplyDanny

  • The Homebrew formula for SwiftLint now also installs completion scripts for
    Bash, Zsh and fish.
    SimplyDanny

  • Add new private_swiftui_state_property opt-in rule to encourage setting
    SwiftUI @State and @StateObject properties to private.
    mt00chikin
    #3173

  • The implicit_return rule now supports the kinds subscript and
    initializer in the included configuration list.
    SimplyDanny

  • Add unneeded_override rule to remove function overrides that only
    call super.
    keith
    5139

  • Show a rule's active YAML configuration in output of
    swiftlint rules <rule>.
    SimplyDanny

  • Add invokeTest() to overridden_super_call defaults.
    DylanBettermannDD

  • Add --config-only option to rules command allowing to print only the YAML
    configuration of a single or all rules.
    SimplyDanny

  • Add --default-config option to rules command allowing to use default
    values for configurations being printed for a single rule or all rules.
    SimplyDanny

  • Add include_bare_init option to the explicit_init rule. include_bare_init
    encourages using named constructors over .init() and type inference.
    Martin Redington
    #5203

  • Improved the reported location and reasons provided for issues
    detected by the invalid_seiftlint_command rule.
    Martin Redington
    #5204

  • 100 is no longer considered to be a magic number by the no_magic_numbers
    rule.
    Martin Redington
    #5215

  • Adds a strict configuration file setting, equivalent to the --strict
    command line option.
    Martin Redington
    #5226

  • Extend implicitly_unwrapped_optional rule with the new mode
    weak_except_iboutlets that only checks weak variables.
    Ricky Tan

Bug Fixes

  • Respect grapheme clusters in counting the number of characters in the collection_alignment rule.
    kishikawakatsumi
    #4837

  • Fix false positive in control_statement rule that triggered on conditions
    with trailing closures where parentheses are recommended by the compiler.
    SimplyDanny
    #5135

  • Fix runtime error when an excluded directory does not exist.
    SimplyDanny
    #5078

  • Support switch expressions used in expression contexts in
    switch_case_alignment rule.
    SimplyDanny
    #5191
    #5227
    #5080

  • Fix bug in prefer_self_in_static_references rule that triggered on
    initializers of computed properties in classes when the property had an
    accessor block.
    SimplyDanny
    #5118

  • Document exclude_ranges option for number_separator rule.
    SimplyDanny

  • Rewrite implicit_return rule with SwiftSyntax fixing a few false positives
    and false negatives in the process.
    SimplyDanny
    #5161

  • Make sure severity is configurable for type_contents_order rule.
    SimplyDanny

  • Bazel: Mark rules_xcodeproj as a development dependency.
    Thi Doãn
    JP Simard
    #4737

  • Fix false negatives for the unneeded_synthesized_initializer rule
    for nested structs in classes.
    Martin Redington
    #5120

  • Fix some unexpected rule enablement interactions between parent and
    child configurations.
    Martin Redington
    #4876

  • The no_magic_numbers rule will not trigger for violations in an
    extension, if the extended class inherits from one of the specified
    test_parent_classes, as long as the class declaration and the
    extension are in the same source file.
    Martin Redington
    #5137

  • Fix false positive in the ns_number_init_as_function_reference rule
    when calling NSNumber.init(value:) directly.
    Marcelo Fabri
    #5172

  • The no_magic_numbers rule will not trigger for bitwise shift
    operations.
    Martin Redington
    #5171

  • The accessibility_label_for_image rule will no longer ignore the
    Image(systemName:) constructor, as many system images do not
    have good accessibility labels.
    Martin Redington
    #5165

  • Fix false positives for superfluous_disable_command rule.
    Martin Redington
    #4798

  • Fix false positive in the test_case_accessibility rule.
    gibachan
    #5211


Using Bazel

With bzlmod:

// Pending BCR update
bazel_dep(name = "swiftlint", version = "0.53.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 = "75839dc9e8a492a86bb585a3cda3d73b58997d7a14d02f1dba94171766bb8599",
    url = "https://github.com/realm/SwiftLint/releases/download/0.53.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.52.4: Lid Switch

06 Jul 18:43
9eaecbe
Compare
Choose a tag to compare

Breaking

  • None.

Experimental

  • None.

Enhancements

  • Handle static spec methods in quick_discouraged_call rule. The method
    type changed from an instance method to a class method in Quick 7.
    SimplyDanny
    #5072

  • Prettify the rule configuration presentation on the command line as well as
    on the website.
    SimplyDanny

Bug Fixes

  • Fix false positives for the unneeded_synthesized_initializer rule, when
    no argument initializers had side-effects.
    Martin Redington
    #5075

  • Ignore switch expressions assigned to variables in switch_case_alignment
    rule.
    SimplyDanny
    #5080

  • Fix auto-correction for the direct_return rule, when statements have
    trailing comments.
    Martin Redington
    #5081

  • Fix false positives for the private_subject rule when creating subjects
    inside initializers.
    kasrababaei

  • Fix false positive for prefer_self_in_static_references when a class
    inherits from another class with generic types.
    kasrababaei


Using Bazel

With bzlmod:

// Pending BCR update: https://github.com/bazelbuild/bazel-central-registry/pull/750
bazel_dep(name = "swiftlint", version = "0.52.4", 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 = "c6ea58b9c72082cdc1ada4a2d48273ecc355896ed72204cedcc586b6ccb8aca6",
    url = "https://github.com/realm/SwiftLint/releases/download/0.52.4/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