diff --git a/Fixtures/SwiftMigrate/ExistentialAnyMigration/Sources/Fixed/Test.swift b/Fixtures/SwiftMigrate/ExistentialAnyMigration/Sources/Fixed/Test.swift index 9ebe6520552..1b6fd4581b9 100644 --- a/Fixtures/SwiftMigrate/ExistentialAnyMigration/Sources/Fixed/Test.swift +++ b/Fixtures/SwiftMigrate/ExistentialAnyMigration/Sources/Fixed/Test.swift @@ -1,5 +1,7 @@ protocol P { } +protocol Q { +} func test1(_: any P) { } @@ -14,3 +16,6 @@ func test3() { func test4() { var x = 42 } + +func test5(_: any P & Q) { +} diff --git a/Fixtures/SwiftMigrate/ExistentialAnyMigration/Sources/Test.swift b/Fixtures/SwiftMigrate/ExistentialAnyMigration/Sources/Test.swift index 5081ad285fa..abfc872e2b4 100644 --- a/Fixtures/SwiftMigrate/ExistentialAnyMigration/Sources/Test.swift +++ b/Fixtures/SwiftMigrate/ExistentialAnyMigration/Sources/Test.swift @@ -1,5 +1,7 @@ protocol P { } +protocol Q { +} func test1(_: P) { } @@ -14,3 +16,6 @@ func test3() { func test4() { var x = 42 } + +func test5(_: P & Q) { +} diff --git a/Fixtures/SwiftMigrate/InferIsolatedConformancesMigration/Sources/Fixed/Test2.swift b/Fixtures/SwiftMigrate/InferIsolatedConformancesMigration/Sources/Fixed/Test2.swift new file mode 100644 index 00000000000..f4e8671264f --- /dev/null +++ b/Fixtures/SwiftMigrate/InferIsolatedConformancesMigration/Sources/Fixed/Test2.swift @@ -0,0 +1,5 @@ +protocol P {} +protocol Q {} + +@MainActor +struct S: nonisolated P & Q {} diff --git a/Fixtures/SwiftMigrate/InferIsolatedConformancesMigration/Sources/Test2.swift b/Fixtures/SwiftMigrate/InferIsolatedConformancesMigration/Sources/Test2.swift new file mode 100644 index 00000000000..b8980dfdaed --- /dev/null +++ b/Fixtures/SwiftMigrate/InferIsolatedConformancesMigration/Sources/Test2.swift @@ -0,0 +1,5 @@ +protocol P {} +protocol Q {} + +@MainActor +struct S: P & Q {} diff --git a/Sources/SwiftFixIt/SwiftFixIt.swift b/Sources/SwiftFixIt/SwiftFixIt.swift index b1539933afc..da0babf5456 100644 --- a/Sources/SwiftFixIt/SwiftFixIt.swift +++ b/Sources/SwiftFixIt/SwiftFixIt.swift @@ -301,7 +301,11 @@ extension SwiftFixIt { } } - let result = SwiftIDEUtils.FixItApplier.apply(edits: consume edits, to: sourceFile.syntax) + let result = SwiftIDEUtils.FixItApplier.apply( + edits: consume edits, + to: sourceFile.syntax, + allowDuplicateInsertions: false + ) try self.fileSystem.writeFileContents(sourceFile.path, string: consume result) } diff --git a/Tests/CommandsTests/PackageCommandTests.swift b/Tests/CommandsTests/PackageCommandTests.swift index 3b96873e169..9732f2cc554 100644 --- a/Tests/CommandsTests/PackageCommandTests.swift +++ b/Tests/CommandsTests/PackageCommandTests.swift @@ -2112,7 +2112,7 @@ class PackageCommandTestCase: CommandsBuildProviderTestCase { "skipping because test environment compiler doesn't support `-print-supported-features`" ) - func doMigration(featureName: String, expectedSummary: String) async throws { + func doMigration(featureName: String, expectedSummary: String) async throws { try await fixture(name: "SwiftMigrate/\(featureName)Migration") { fixturePath in let sourcePaths: [AbsolutePath] let fixedSourcePaths: [AbsolutePath] @@ -2151,9 +2151,11 @@ class PackageCommandTestCase: CommandsBuildProviderTestCase { } } - try await doMigration(featureName: "ExistentialAny", expectedSummary: "Applied 3 fix-its in 1 file") + // When updating these, make sure we keep testing both the singular and + // plural forms of the nouns in the summary. + try await doMigration(featureName: "ExistentialAny", expectedSummary: "Applied 5 fix-its in 1 file") try await doMigration(featureName: "StrictMemorySafety", expectedSummary: "Applied 1 fix-it in 1 file") - try await doMigration(featureName: "InferIsolatedConformances", expectedSummary: "Applied 1 fix-it in 1 file") + try await doMigration(featureName: "InferIsolatedConformances", expectedSummary: "Applied 3 fix-its in 2 files") } func testBuildToolPlugin() async throws { diff --git a/Tests/SwiftFixItTests/FilteringTests.swift b/Tests/SwiftFixItTests/FilteringTests.swift index 82e5f7ec102..dad7176c94f 100644 --- a/Tests/SwiftFixItTests/FilteringTests.swift +++ b/Tests/SwiftFixItTests/FilteringTests.swift @@ -412,19 +412,12 @@ struct FilteringTests { } } - @Test func testDuplicateInsertionFixIts() throws { - withKnownIssue("FIXME: Filter out duplicate insertion fix-its") { - try self._testDuplicateInsertionFixIts() - } - } - - func _testDuplicateInsertionFixIts() throws { try testAPI1File { path in .init( edits: .init(input: "var x = 1", result: "@W var yx = 21"), summary: .init( - // 4 because skipped by SwiftIDEUtils.FixItApplier, not SwiftFixIt. + // 6 because skipped by SwiftIDEUtils.FixItApplier, not SwiftFixIt. numberOfFixItsApplied: 6, numberOfFilesChanged: 1 ), @@ -470,7 +463,7 @@ struct FilteringTests { text: "error3_fixit1", location: .init(path: path, line: 1, column: 3), fixIts: [ - // FIXME: Should be skipped. + // Skipped, duplicate insertion. .init( start: .init(path: path, line: 1, column: 1), end: .init(path: path, line: 1, column: 1), @@ -500,7 +493,7 @@ struct FilteringTests { text: "error5_note1", location: .init(path: path, line: 1, column: 9), fixIts: [ - // FIXME: Should be skipped. + // Skipped, duplicate insertion. .init( start: .init(path: path, line: 1, column: 9), end: .init(path: path, line: 1, column: 9), @@ -519,7 +512,7 @@ struct FilteringTests { text: "error6_note1", location: .init(path: path, line: 1, column: 5), fixIts: [ - // FIXME: Should be skipped. + // Skipped, duplicate insertion. .init( start: .init(path: path, line: 1, column: 5), end: .init(path: path, line: 1, column: 5),