From 1e9428a92e4b8c079a1f5a318c13033ea63109b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danny=20M=C3=B6sch?= Date: Sat, 20 Jan 2024 14:30:46 +0100 Subject: [PATCH] Respect scattered disable commands in `duplicate_imports` rule (#5432) --- CHANGELOG.md | 5 +++++ .../Rules/Idiomatic/DuplicateImportsRule.swift | 11 ++++++----- .../DuplicateImportsRuleTests.swift | 17 +++++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 Tests/SwiftLintFrameworkTests/DuplicateImportsRuleTests.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index bd3352566f..2698d4a683 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,6 +79,11 @@ [leonardosrodrigues0](https://github.com/leonardosrodrigues0) [#5265](https://github.com/realm/SwiftLint/issues/5265) +* Respect scattered disable commands in auto-correction of `duplicate_imports` + rule. + [SimplyDanny](https://github.com/SimplyDanny) + [#5418](https://github.com/realm/SwiftLint/pull/5418) + * Add new `non_optional_string_data_conversion` rule to enforce non-failable conversions of UTF-8 `String` <-> `Data`. [Ben P](https://github.com/ben-p-commits) diff --git a/Source/SwiftLintBuiltInRules/Rules/Idiomatic/DuplicateImportsRule.swift b/Source/SwiftLintBuiltInRules/Rules/Idiomatic/DuplicateImportsRule.swift index f228842ec7..be10d8e26b 100644 --- a/Source/SwiftLintBuiltInRules/Rules/Idiomatic/DuplicateImportsRule.swift +++ b/Source/SwiftLintBuiltInRules/Rules/Idiomatic/DuplicateImportsRule.swift @@ -167,13 +167,14 @@ private extension DuplicateImportsRule { override func visit(_ node: CodeBlockItemListSyntax) -> CodeBlockItemListSyntax { let itemsToRemove = node .enumerated() + .filter { !$1.isContainedIn(regions: disabledRegions, locationConverter: locationConverter) } .map { ($0, $1.item.positionAfterSkippingLeadingTrivia) } - .filter { _, position in importPositionsToRemove.contains(position) } + .filter { importPositionsToRemove.contains($1) } .map { (indexInParent: $0, absolutePosition: $1) } - - correctionPositions.append( - contentsOf: itemsToRemove.map(\.absolutePosition) - ) + if itemsToRemove.isEmpty { + return super.visit(node) + } + correctionPositions.append(contentsOf: itemsToRemove.map(\.absolutePosition)) var copy = node for indexInParent in itemsToRemove.map(\.indexInParent).reversed() { diff --git a/Tests/SwiftLintFrameworkTests/DuplicateImportsRuleTests.swift b/Tests/SwiftLintFrameworkTests/DuplicateImportsRuleTests.swift new file mode 100644 index 0000000000..d1e9d37d07 --- /dev/null +++ b/Tests/SwiftLintFrameworkTests/DuplicateImportsRuleTests.swift @@ -0,0 +1,17 @@ +@testable import SwiftLintBuiltInRules +import XCTest + +class DuplicateImportsRuleTests: XCTestCase { + func testDisableCommand() { + let content = """ + import InspireAPI + // swiftlint:disable:next duplicate_imports + import class InspireAPI.Response + """ + let file = SwiftLintFile(contents: content) + + _ = DuplicateImportsRule().correct(file: file) + + XCTAssertEqual(file.contents, content) + } +}