From c46f2c6a9cf04e0fbaed76959b1eaf7b5bc15b80 Mon Sep 17 00:00:00 2001 From: Alex Hoppen Date: Mon, 7 Oct 2024 14:20:29 -0700 Subject: [PATCH] Support building swift-format using SwiftPM for toolchain builds on Windows This allows us to also run tests of swift-format on Windows. --- Package.swift | 44 +++++++++++++------ .../NoEmptyLineOpeningClosingBraces.swift | 4 +- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/Package.swift b/Package.swift index d8c46cb4f..1f853d81f 100644 --- a/Package.swift +++ b/Package.swift @@ -47,22 +47,22 @@ let package = Package( .target( name: "SwiftFormat", - dependencies: [ + dependencies: omittingExternalDependenciesIfNecessary([ .product(name: "Markdown", package: "swift-markdown"), .product(name: "SwiftSyntax", package: "swift-syntax"), .product(name: "SwiftSyntaxBuilder", package: "swift-syntax"), .product(name: "SwiftOperators", package: "swift-syntax"), .product(name: "SwiftParser", package: "swift-syntax"), .product(name: "SwiftParserDiagnostics", package: "swift-syntax"), - ], + ]), exclude: ["CMakeLists.txt"] ), .target( name: "_SwiftFormatTestSupport", - dependencies: [ + dependencies: omittingExternalDependenciesIfNecessary([ "SwiftFormat", .product(name: "SwiftOperators", package: "swift-syntax"), - ] + ]) ), .plugin( name: "Format Source Code", @@ -93,36 +93,34 @@ let package = Package( .executableTarget( name: "generate-swift-format", dependencies: [ - "SwiftFormat", - .product(name: "SwiftSyntax", package: "swift-syntax"), - .product(name: "SwiftParser", package: "swift-syntax"), + "SwiftFormat" ] ), .executableTarget( name: "swift-format", - dependencies: [ + dependencies: omittingExternalDependenciesIfNecessary([ "_SwiftFormatInstructionCounter", "SwiftFormat", .product(name: "ArgumentParser", package: "swift-argument-parser"), .product(name: "SwiftSyntax", package: "swift-syntax"), .product(name: "SwiftParser", package: "swift-syntax"), - ], + ]), exclude: ["CMakeLists.txt"], linkerSettings: swiftformatLinkSettings ), .testTarget( name: "SwiftFormatPerformanceTests", - dependencies: [ + dependencies: omittingExternalDependenciesIfNecessary([ "SwiftFormat", "_SwiftFormatTestSupport", .product(name: "SwiftSyntax", package: "swift-syntax"), .product(name: "SwiftParser", package: "swift-syntax"), - ] + ]) ), .testTarget( name: "SwiftFormatTests", - dependencies: [ + dependencies: omittingExternalDependenciesIfNecessary([ "SwiftFormat", "_SwiftFormatTestSupport", .product(name: "Markdown", package: "swift-markdown"), @@ -130,7 +128,7 @@ let package = Package( .product(name: "SwiftParser", package: "swift-syntax"), .product(name: "SwiftSyntax", package: "swift-syntax"), .product(name: "SwiftSyntaxBuilder", package: "swift-syntax"), - ] + ]) ), ] ) @@ -149,10 +147,28 @@ var installAction: Bool { hasEnvironmentVariable("SWIFTFORMAT_CI_INSTALL") } /// remote dependency. var useLocalDependencies: Bool { hasEnvironmentVariable("SWIFTCI_USE_LOCAL_DEPS") } +var omitExternalDependencies: Bool { hasEnvironmentVariable("SWIFTFORMAT_OMIT_EXTERNAL_DEPENDENCIES") } + +func omittingExternalDependenciesIfNecessary( + _ dependencies: [Target.Dependency] +) -> [Target.Dependency] { + guard omitExternalDependencies else { + return dependencies + } + return dependencies.filter { dependency in + if case .productItem(_, let package, _, _) = dependency { + return package == nil + } + return true + } +} + // MARK: - Dependencies var dependencies: [Package.Dependency] { - if useLocalDependencies { + if omitExternalDependencies { + return [] + } else if useLocalDependencies { return [ .package(path: "../swift-argument-parser"), .package(path: "../swift-markdown"), diff --git a/Sources/SwiftFormat/Rules/NoEmptyLineOpeningClosingBraces.swift b/Sources/SwiftFormat/Rules/NoEmptyLineOpeningClosingBraces.swift index 4e5da2dcb..b01d173bf 100644 --- a/Sources/SwiftFormat/Rules/NoEmptyLineOpeningClosingBraces.swift +++ b/Sources/SwiftFormat/Rules/NoEmptyLineOpeningClosingBraces.swift @@ -86,7 +86,9 @@ public final class NoEmptyLinesOpeningClosingBraces: SyntaxFormatRule { let (trimmedLeadingTrivia, count) = first.leadingTrivia.trimmingSuperfluousNewlines() if trimmedLeadingTrivia.sourceLength != first.leadingTriviaLength { diagnose(.removeEmptyLinesAfter(count), on: first, anchor: .leadingTrivia(0)) - result[index] = first.with(\.leadingTrivia, trimmedLeadingTrivia) + var first = first + first.leadingTrivia = trimmedLeadingTrivia + result[index] = first } } return rewrite(result).as(C.self)!