Skip to content

Commit

Permalink
Update to Swift 6
Browse files Browse the repository at this point in the history
Drops support for Swift versions prior to Swift 6. Addresses all known
concurrency warnings and errors.

This project's swift-syntax dependency will be bumped in a future change.
  • Loading branch information
rauhul committed Sep 24, 2024
1 parent ced9f4d commit ccf9a40
Show file tree
Hide file tree
Showing 79 changed files with 271 additions and 249 deletions.
8 changes: 2 additions & 6 deletions .github/workflows/swift.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
lint:
name: Lint
runs-on: ubuntu-latest
container: swiftlang/swift:nightly-6.0-jammy
container: swift:6.0-jammy
steps:
- uses: actions/checkout@v4
- name: Install Dependencies
Expand All @@ -34,11 +34,7 @@ jobs:
version: "22.04"
swift:
- repo: swift
version: "5.9"
- repo: swift
version: "5.10"
- repo: swiftlang/swift
version: "nightly-6.0"
version: "6.0"
- repo: swiftlang/swift
version: "nightly-main"
container: ${{ matrix.swift.repo }}:${{ matrix.swift.version }}-${{ matrix.os.name }}
Expand Down
20 changes: 1 addition & 19 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// swift-tools-version: 5.9
// swift-tools-version: 6.0

import CompilerPluginSupport
import PackageDescription
Expand Down Expand Up @@ -134,10 +134,6 @@ let package = Package(
.testTarget(
name: "SVD2SwiftPluginTests",
dependencies: ["MMIO"],
// FIXME: rdar://113256834,swiftlang/swift-package-manager#6935
// SPM 5.9 produces warnings for plugin input files.
// Remove this exclude list when Swift Package Manager bug is resolved.
exclude: ["ARM_Sample.svd", "svd2swift.json"],
plugins: ["SVD2SwiftPlugin"]),

.macro(
Expand All @@ -158,12 +154,6 @@ let package = Package(
],
cxxLanguageStandard: .cxx11)

#if compiler(<6.0) && os(Linux)
#warning("Skipping SVD2LLDBTests, see apple/swift-package-manager#6990")
// Note: Additional needed bug fixes were only merged to SwiftPM 6.0.
package.targets = package.targets.filter { $0.name != "SVD2LLDBTests" }
#endif

let svd2lldb = "FEATURE_SVD2LLDB"
if featureIsEnabled(named: svd2lldb, override: nil) {
let target = package.targets.first { $0.name == "SVD2LLDB" }
Expand All @@ -177,11 +167,3 @@ func featureIsEnabled(named featureName: String, override: Bool?) -> Bool {
let environment = Context.environment[key] != nil
return override ?? environment
}

extension Target {
func swiftDefine(_ value: String) {
var swiftSettings = self.swiftSettings ?? []
swiftSettings.append(.define(value))
self.swiftSettings = swiftSettings
}
}
6 changes: 2 additions & 4 deletions Plugins/SVD2SwiftPlugin/FileKind.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,8 @@ struct FileKind {

var description: String {
switch self {
case .fileExtension(let fileExtension):
fileExtension
case .fileName(let fileName):
fileName
case .fileExtension(let fileExtension): fileExtension
case .fileName(let fileName): fileName
}
}
}
Expand Down
31 changes: 16 additions & 15 deletions Plugins/SVD2SwiftPlugin/SVD2SwiftPlugin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,37 +22,38 @@ struct SVD2SwiftPlugin: BuildToolPlugin {
guard let target = target as? SourceModuleTarget else { return [] }

// Locate the input files.
let executable = try context.tool(named: "SVD2Swift").path
let svdFile = try target.sourceFile(kind: .svd)
let pluginConfigFile = try target.sourceFile(kind: .svd2swift)
let inputFiles = [executable, svdFile, pluginConfigFile]
let executableFile = try context.tool(named: "SVD2Swift").url
let svdFile = try target.sourceFile(kind: .svd).url
let pluginConfigFile = try target.sourceFile(kind: .svd2swift).url
let inputFiles = [executableFile, svdFile, pluginConfigFile]

// Load the list of peripherals to generate from the config file.
let pluginConfigURL = URL(fileURLWithPath: pluginConfigFile.string)
let pluginConfigData = try Data(contentsOf: pluginConfigURL)
let pluginConfigData = try Data(contentsOf: pluginConfigFile)
let pluginConfig: SVD2SwiftPluginConfiguration
do {
pluginConfig = try JSONDecoder()
.decode(SVD2SwiftPluginConfiguration.self, from: pluginConfigData)
} catch let error as DecodingError {
throw SVD2SwiftPluginConfigurationDecodingError(
url: pluginConfigURL,
url: pluginConfigFile,
error: error)
}
guard !pluginConfig.peripherals.isEmpty else {
throw SVD2SwiftPluginError.missingPeripherals(target, pluginConfigFile)
throw SVD2SwiftPluginError.missingPeripherals(
target,
pluginConfigFile.path)
}

// Create a list of output files.
let outputDirectory = context.pluginWorkDirectory
let outputDirectory = context.pluginWorkDirectoryURL
let outputFiles = (pluginConfig.peripherals + ["Device"])
.map { outputDirectory.appending("\($0).swift") }
.map { outputDirectory.appendingPathComponent("\($0).swift") }

// Produce argument list.
var arguments = [
"--plugin",
"--input", svdFile.string,
"--output", outputDirectory.string,
"--input", svdFile.path,
"--output", outputDirectory.path,
]
if let accessLevel = pluginConfig.accessLevel {
arguments += ["--access-level", accessLevel]
Expand All @@ -78,10 +79,10 @@ struct SVD2SwiftPlugin: BuildToolPlugin {
let command = Command.buildCommand(
displayName: """
Generating register interface in '\(target.name)' from \
\(FileKind.svd) file '\(svdFile.lastComponent)' using \
\(FileKind.svd2swift) file '\(pluginConfigFile.lastComponent)'.
\(FileKind.svd) file '\(svdFile.lastPathComponent)' using \
\(FileKind.svd2swift) file '\(pluginConfigFile.lastPathComponent)'.
""",
executable: executable,
executable: executableFile,
arguments: arguments,
inputFiles: inputFiles,
outputFiles: outputFiles)
Expand Down
5 changes: 3 additions & 2 deletions Plugins/SVD2SwiftPlugin/SVD2SwiftPluginError.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@
//
//===----------------------------------------------------------------------===//

import PackagePlugin
// Silence warnings about `Target` not being Sendable.
@preconcurrency import PackagePlugin

enum SVD2SwiftPluginError: Error {
case missingFile(Target, FileKind)
case tooManyFiles(Target, FileKind)
case missingPeripherals(Target, Path)
case missingPeripherals(Target, String)
}

extension SVD2SwiftPluginError: CustomStringConvertible {
Expand Down
59 changes: 6 additions & 53 deletions Plugins/SVD2SwiftPlugin/SourceModuleTarget+FileKind.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,72 +9,25 @@
//
//===----------------------------------------------------------------------===//

// FIXME: rdar://113256834,swiftlang/swift-package-manager#6935
// Remove import
import Foundation
import PackagePlugin

extension SourceModuleTarget {
// FIXME: rdar://113256834,swiftlang/swift-package-manager#6935
// Return `File` and not `Path`
func sourceFile(kind: FileKind) throws -> Path {
func sourceFile(kind: FileKind) throws -> File {
let files = self
.sourceFiles
.filter {
switch kind.match {
case .fileExtension(let fileExtension):
return $0.path.extension == fileExtension
return $0.url.pathExtension == fileExtension
case .fileName(let fileName):
return $0.path.lastComponent == fileName
return $0.url.lastPathComponent == fileName
}
}

switch files.count {
case 0:
// FIXME: rdar://113256834,swiftlang/swift-package-manager#6935
// throw SVD2SwiftPluginError.missingFile(self, kind)
return try _sourceFile(kind: kind)
case 1:
// FIXME: rdar://113256834,swiftlang/swift-package-manager#6935
// return files[0]
return files[0].path
default:
throw SVD2SwiftPluginError.tooManyFiles(self, kind)
}
}

// FIXME: rdar://113256834,swiftlang/swift-package-manager#6935
// Remove this function
private func _sourceFile(kind: FileKind) throws -> Path {
let targetDirectoryURL = URL(fileURLWithPath: self.directory.string)
let enumerator = FileManager.default.enumerator(
at: targetDirectoryURL,
includingPropertiesForKeys: [])
guard let enumerator = enumerator else {
throw SVD2SwiftPluginError.missingFile(self, kind)
}

let files = enumerator
.lazy
.compactMap { $0 as? URL }
.map { Path($0.path) }
.filter {
switch kind.match {
case .fileExtension(let fileExtension):
return $0.extension == fileExtension
case .fileName(let fileName):
return $0.lastComponent == fileName
}
}
.reduce(into: [Path]()) { $0.append($1) }

switch files.count {
case 0:
throw SVD2SwiftPluginError.missingFile(self, kind)
case 1:
return files[0]
default:
throw SVD2SwiftPluginError.tooManyFiles(self, kind)
case 0: throw SVD2SwiftPluginError.missingFile(self, kind)
case 1: return files[0]
default: throw SVD2SwiftPluginError.tooManyFiles(self, kind)
}
}
}
8 changes: 4 additions & 4 deletions Sources/MMIOMacros/Macros/BitFieldMacro.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ let bitFieldMacros: [any BitFieldMacro.Type] = [
WriteOnlyMacro.self,
]

public struct ReservedMacro: BitFieldMacro, Sendable {
public struct ReservedMacro: BitFieldMacro {
static let accessorMacroSuppressParsingDiagnostics = false
static let baseName = "Reserved"
static let isReadable = false
Expand All @@ -87,7 +87,7 @@ public struct ReservedMacro: BitFieldMacro, Sendable {
}
}

public struct ReadWriteMacro: BitFieldMacro, Sendable {
public struct ReadWriteMacro: BitFieldMacro {
static let accessorMacroSuppressParsingDiagnostics = false
static let baseName = "ReadWrite"
static let isReadable = true
Expand Down Expand Up @@ -116,7 +116,7 @@ public struct ReadWriteMacro: BitFieldMacro, Sendable {
}
}

public struct ReadOnlyMacro: BitFieldMacro, Sendable {
public struct ReadOnlyMacro: BitFieldMacro {
static let accessorMacroSuppressParsingDiagnostics = false
static let baseName = "ReadOnly"
static let isReadable = true
Expand Down Expand Up @@ -145,7 +145,7 @@ public struct ReadOnlyMacro: BitFieldMacro, Sendable {
}
}

public struct WriteOnlyMacro: BitFieldMacro, Sendable {
public struct WriteOnlyMacro: BitFieldMacro {
static let accessorMacroSuppressParsingDiagnostics = false
static let baseName = "WriteOnly"
static let isReadable = false
Expand Down
4 changes: 1 addition & 3 deletions Sources/MMIOMacros/Macros/RegisterBlockMacro.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ import SwiftSyntaxMacros

public struct RegisterBlockMacro {}

extension RegisterBlockMacro: Sendable {}

extension RegisterBlockMacro: ParsableMacro {
mutating func update(
label: String,
Expand All @@ -30,7 +28,7 @@ extension RegisterBlockMacro: ParsableMacro {
}

extension RegisterBlockMacro: MMIOMemberMacro {
static var memberMacroSuppressParsingDiagnostics: Bool = false
static let memberMacroSuppressParsingDiagnostics: Bool = false

func expansion(
of node: AttributeSyntax,
Expand Down
4 changes: 0 additions & 4 deletions Sources/MMIOMacros/Macros/RegisterBlockMemberMacro.swift
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,6 @@ public struct RegisterBlockScalarMemberMacro {
var offset: Int
}

extension RegisterBlockScalarMemberMacro: Sendable {}

extension RegisterBlockScalarMemberMacro: ParsableMacro {
static let baseName = "RegisterBlock"

Expand Down Expand Up @@ -128,8 +126,6 @@ public struct RegisterBlockArrayMemberMacro {
var count: Int
}

extension RegisterBlockArrayMemberMacro: Sendable {}

extension RegisterBlockArrayMemberMacro: ParsableMacro {
static let baseName = "RegisterBlock"

Expand Down
2 changes: 0 additions & 2 deletions Sources/MMIOMacros/Macros/RegisterMacro.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ public struct RegisterMacro {
var bitWidth: BitWidth
}

extension RegisterMacro: Sendable {}

extension RegisterMacro: ParsableMacro {
mutating func update(
label: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,12 @@
//
//===----------------------------------------------------------------------===//

import MMIOUtilities
import SwiftSyntax
import SwiftSyntaxMacros

private var signatureCache =
[AnyHashable: (String, AttributeListSyntax.Element)]()
typealias SignatureCache = [AnyHashable: (String, AttributeListSyntax.Element)]
private let signatureCache = Mutex<SignatureCache>([:])

protocol ParsableMacro {
static var baseName: String { get }
Expand All @@ -40,7 +41,8 @@ extension ParsableMacro {
extension ParsableMacro {
private static func signatures() -> (String, AttributeListSyntax.Element) {
let key = ObjectIdentifier(Self.self)
if let signatures = signatureCache[key] { return signatures }
let signatures = signatureCache.withLock { $0[key] }
if let signatures = signatures { return signatures }

// Avoid calling computed property multiple times.
let baseName = Self.baseName
Expand Down Expand Up @@ -83,7 +85,7 @@ extension ParsableMacro {

let attribute: AttributeListSyntax.Element =
.attribute(attributeWithPlaceholders)
signatureCache[key] = (signature, attribute)
signatureCache.withLock { $0[key] = (signature, attribute) }
return (signature, attribute)
}

Expand Down
Loading

0 comments on commit ccf9a40

Please sign in to comment.