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) + } +}