Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# editorconfig.org
root = true

[*]
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
insert_final_newline = true
end_of_line = lf
59 changes: 33 additions & 26 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,39 +18,46 @@ env:

jobs:
macos:
name: macOS
runs-on: macos-13
name: macOS (Swift ${{ matrix.swift }})
runs-on: macos-15
strategy:
fail-fast: false
matrix:
swift-syntax-version:
[
"509.0.0..<510.0.0",
"510.0.0..<511.0.0",
"511.0.0..<601.0.0",
"601.0.0..<602.0.0",
]

platform:
- macOS
swift:
- "6.0"
- "6.1"
- "6.2"
steps:
- uses: actions/checkout@v4
- name: Select Xcode 15
run: sudo xcode-select -s /Applications/Xcode_15.0.app
- name: Set SWIFT_SYNTAX_VERSION environment variable
run: echo "SWIFT_SYNTAX_VERSION=${{ matrix.swift-syntax-version }}" >> $GITHUB_ENV
- name: Resolve Dependencies
run: swift package resolve
- name: Run tests
run: swift test
- name: Git Checkout
uses: actions/checkout@v5

- name: Run Tests
uses: mxcl/xcodebuild@v3
with:
platform: ${{ matrix.platform }}
swift: ~${{ matrix.swift }}
action: test
verbosity: xcbeautify

linux:
name: Linux
name: Linux (Swift ${{ matrix.swift }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
swift:
- "6.0"
- "6.1"
- "6.2"
container:
image: swift:${{ matrix.swift }}
steps:
- name: Install Swift
uses: swift-actions/setup-swift@v2
with:
swift-version: "6.0.2"
- uses: actions/checkout@v4
- name: Run tests
- name: Git Checkout
uses: actions/checkout@v5

- name: Run Tests
run: swift test

# NB: 5.9 snapshot unavailable, wait for release
Expand Down
38 changes: 0 additions & 38 deletions Makefile

This file was deleted.

24 changes: 17 additions & 7 deletions Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

89 changes: 6 additions & 83 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
// swift-tools-version: 5.9
// swift-tools-version: 6.0

import CompilerPluginSupport
import Foundation
import PackageDescription

let package = Package(
name: "MemberwiseInit",
name: "swift-memberwise-init-macro",
platforms: [
.iOS(.v13),
.macOS(.v10_15),
Expand All @@ -23,15 +22,8 @@ let package = Package(
),
],
dependencies: [
.package(url: "https://github.com/pointfreeco/swift-snapshot-testing", from: "1.18.1"),
//.conditionalPackage(url: "https://github.com/swiftlang/swift-syntax", envVar: "SWIFT_SYNTAX_VERSION", default: "509.0.0..<510.0.0")
//.conditionalPackage(url: "https://github.com/swiftlang/swift-syntax", envVar: "SWIFT_SYNTAX_VERSION", default: "510.0.0..<511.0.0")
//.conditionalPackage(url: "https://github.com/swiftlang/swift-syntax", envVar: "SWIFT_SYNTAX_VERSION", default: "511.0.0..<601.0.0-prerelease")
.conditionalPackage(
url: "https://github.com/swiftlang/swift-syntax",
envVar: "SWIFT_SYNTAX_VERSION",
default: "509.0.0..<602.0.0"
),
.package(url: "https://github.com/pointfreeco/swift-macro-testing", from: "0.6.0"),
.package(url: "https://github.com/swiftlang/swift-syntax", "600.0.0"..<"603.0.0"),
],
targets: [
.macro(
Expand All @@ -53,78 +45,9 @@ let package = Package(
name: "MemberwiseInitTests",
dependencies: [
"MemberwiseInitMacros",
"MacroTesting",
.product(name: "SwiftSyntaxMacrosTestSupport", package: "swift-syntax"),
]
),
.target(
name: "MacroTesting",
dependencies: [
.product(name: "InlineSnapshotTesting", package: "swift-snapshot-testing"),
.product(name: "SwiftDiagnostics", package: "swift-syntax"),
.product(name: "SwiftOperators", package: "swift-syntax"),
.product(name: "SwiftParserDiagnostics", package: "swift-syntax"),
.product(name: "SwiftSyntaxMacros", package: "swift-syntax"),
.product(name: "SwiftSyntaxMacrosTestSupport", package: "swift-syntax"),
]
),
.testTarget(
name: "MacroTestingTests",
dependencies: [
"MacroTesting"
.product(name: "MacroTesting", package: "swift-macro-testing"),
.product(name: "SwiftCompilerPlugin", package: "swift-syntax"),
]
),
]
)

extension Package.Dependency {
/// Creates a dependency based on an environment variable or a default version range.
///
/// This function allows dynamically setting the version range of a package dependency via an environment variable.
/// If the environment variable is not set, it falls back to a specified default version range.
///
/// - Parameters:
/// - url: The URL of the package repository.
/// - envVar: The name of the environment variable that contains the version range.
/// - versionExpression: The default version range in case the environment variable is not set.
/// Example format: `"509.0.0..<511.0.0"` or `"509.0.0...510.0.0"`.
/// - Returns: A `Package.Dependency` configured with the specified or default version range.
/// - Throws: A fatal error if the version expression format is invalid or the range operator is unsupported.
///
static func conditionalPackage(
url: String,
envVar: String,
default versionExpression: String
) -> Package.Dependency {
let versionRangeString = ProcessInfo.processInfo.environment[envVar] ?? versionExpression
let (lower, op, upper) = parseVersionExpression(from: versionRangeString)
if op == "..<" {
return .package(url: url, lower..<upper)
} else if op == "..." {
return .package(url: url, lower...upper)
} else {
fatalError("Unsupported version range operator: \(op)")
}
}

private static func parseVersionExpression(
from expression: String
) -> (Version, String, Version) {
let rangeOperators = ["..<", "..."]
for op in rangeOperators {
if expression.contains(op) {
let parts = expression.split(separator: op, maxSplits: 1, omittingEmptySubsequences: true)
.map(String.init)
guard
parts.count == 2,
let lower = Version(parts[0]),
let upper = Version(parts[1])
else {
fatalError("Invalid version expression format: \(expression)")
}
return (lower, op, upper)
}
}
fatalError("No valid range operator found in expression: \(expression)")
}
}
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ A Swift Macro for enhanced automatic memberwise initializers, greatly reducing m
Informed by explicit developer cues, MemberwiseInit can more often automatically provide your intended memberwise `init`, while maintaining a safe-by-default standard in line with [Swift’s memberwise initializers][swifts-memberwise-init].

> [!IMPORTANT]
> `@MemberwiseInit` is a Swift Macro requiring **swift-tools-version: 5.9** or later (**Xcode 15** onwards).
> `@MemberwiseInit` is a Swift Macro requiring **swift-tools-version: 6.0** or later (**Xcode 16** onwards).

* [Quick start](#quick-start)
* [Quick reference](#quick-reference)
Expand Down
Loading
Loading