Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Library evolution #285

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
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
13 changes: 13 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,16 @@ jobs:
- uses: MaxDesiatov/swift-windows-action@v1
with:
swift-version: "5.5.1"

library-evolution:
runs-on: macos-11
strategy:
matrix:
xcode:
- "13.2.1" # Swift 5.5
steps:
- uses: actions/checkout@v2
- name: Select Xcode ${{ matrix.xcode }}
run: sudo xcode-select -s /Applications/Xcode_${{ matrix.xcode }}.app
- name: Build for library evolution
run: make build-for-library-evolution
8 changes: 8 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,14 @@ test-swift:
--enable-test-discovery \
--parallel

build-for-library-evolution:
swift build \
-c release \
--target Parsing \
-Xswiftc -emit-module-interface \
-Xswiftc -enable-library-evolution


format:
swift format --in-place --recursive \
./Package.swift ./Sources ./Tests
Expand Down
8 changes: 7 additions & 1 deletion Sources/Parsing/Builders/OneOfBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,13 @@ public enum OneOfBuilder {
where P0.Input == P1.Input, P0.Output == P1.Output {
public let p0: P0, p1: P1

@inlinable public init(_ p0: P0, _ p1: P1) {
@inlinable
public init(_ p0: P0, _ p1: P1) {
self.init(internal: p0, p1)
}

@usableFromInline
init(internal p0: P0, _ p1: P1) {
self.p0 = p0
self.p1 = p1
}
Expand Down
14 changes: 14 additions & 0 deletions Sources/Parsing/Conversions/AnyConversion.swift
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,14 @@ public struct AnyConversion<Input, Output>: Conversion {
/// - Parameter conversion: A conversion to wrap with a type eraser.
@inlinable
public init<C: Conversion>(_ conversion: C) where C.Input == Input, C.Output == Output {
self.init(internal: conversion)
}

@usableFromInline
init<C: Conversion>(internal conversion: C) where C.Input == Input, C.Output == Output {
self._apply = conversion.apply
self._unapply = conversion.unapply

}

/// Creates a conversion that wraps the given closures in its ``apply(_:)`` and ``unapply(_:)``
Expand All @@ -135,6 +141,14 @@ public struct AnyConversion<Input, Output>: Conversion {
public init(
apply: @escaping (Input) -> Output?,
unapply: @escaping (Output) -> Input?
) {
self.init(internal: apply, unapply: unapply)
}

@usableFromInline
init(
internal apply: @escaping (Input) -> Output?,
unapply: @escaping (Output) -> Input?
) {
self._apply = {
guard let value = apply($0)
Expand Down
7 changes: 6 additions & 1 deletion Sources/Parsing/Conversions/Identity.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@ import Foundation
extension Conversions {
public struct Identity<Value>: Conversion {
@inlinable
public init() {}
public init() {
self.init(internal: ())
}

@usableFromInline
init(internal: Void) {}

@inlinable
@inline(__always)
Expand Down
13 changes: 13 additions & 0 deletions Sources/Parsing/Conversions/JSON.swift
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,19 @@ extension Conversions {
_ type: Value.Type,
decoder: JSONDecoder = .init(),
encoder: JSONEncoder = .init()
) {
self.init(
internal: type,
decoder: decoder,
encoder: encoder
)
}

@usableFromInline
init(
internal type: Value.Type,
decoder: JSONDecoder = .init(),
encoder: JSONEncoder = .init()
) {
self.decoder = decoder
self.encoder = encoder
Expand Down
7 changes: 6 additions & 1 deletion Sources/Parsing/Conversions/RawRepresentable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,12 @@ extension Conversions {
/// the ``Conversion/representing(_:)-swift.type.method`` operation, which constructs this type.
public struct FromRawValue<Output: RawRepresentable>: Conversion {
@inlinable
public init() {}
public init() {
self.init(internal: ())
}

@usableFromInline
init(internal: Void) {}

@inlinable
public func apply(_ input: Output.RawValue) throws -> Output {
Expand Down
14 changes: 12 additions & 2 deletions Sources/Parsing/Conversions/String.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,12 @@ extension Conversions {
/// the ``Conversion/string-swift.type.property-3u2b5`` operation, which constructs this type.
public struct SubstringToString: Conversion {
@inlinable
public init() {}
public init() {
self.init(internal: ())
}

@usableFromInline
init(internal: Void) {}

@inlinable
public func apply(_ input: Substring) -> String {
Expand All @@ -69,7 +74,12 @@ extension Conversions {
Input.Element == UTF8.CodeUnit
{
@inlinable
public init() {}
public init() {
self.init(internal: ())
}

@usableFromInline
init(internal: Void) {}

@inlinable
public func apply(_ input: Input) -> String {
Expand Down
16 changes: 13 additions & 3 deletions Sources/Parsing/Conversions/Substring.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,12 @@ extension Conversions {
/// type under the hood.
public struct UnicodeScalarViewToSubstring: Conversion {
@inlinable
public init() {}
public init() {
self.init(internal: ())
}

@usableFromInline
init(internal: Void) {}

@inlinable
public func apply(_ input: Substring.UnicodeScalarView) -> Substring {
Expand All @@ -74,8 +79,13 @@ extension Conversions {
/// the ``Conversion/substring-swift.type.property-4r1aj`` operation, which constructs this type.
public struct UTF8ViewToSubstring: Conversion {
@inlinable
public init() {}

public init() {
self.init(internal: ())
}

@usableFromInline
init(internal: Void) {}

@inlinable
public func apply(_ input: Substring.UTF8View) -> Substring {
Substring(input)
Expand Down
7 changes: 6 additions & 1 deletion Sources/Parsing/Conversions/UTF8View.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,12 @@ extension Conversions {
/// the ``Conversion/utf8-swift.type.property`` operation, which constructs this type.
public struct SubstringToUTF8View: Conversion {
@inlinable
public init() {}
public init() {
self.init(internal: ())
}

@usableFromInline
init(internal: Void) {}

@inlinable
public func apply(_ input: Substring) -> Substring.UTF8View {
Expand Down
84 changes: 83 additions & 1 deletion Sources/Parsing/Internal/Deprecations.swift
Original file line number Diff line number Diff line change
Expand Up @@ -540,6 +540,11 @@ where InputToBytes.Input: PrependableCollection, InputToBytes.Output: Prependabl
extension Newline {
@inlinable
public init<C>() where InputToBytes == Conversions.Identity<C> {
self.init(internal: ())
}

@usableFromInline
init<C>(internal: Void) where InputToBytes == Conversions.Identity<C> {
self.inputToBytes = .init()
}
}
Expand All @@ -549,6 +554,11 @@ extension Newline where InputToBytes == Conversions.SubstringToUTF8View {
@_disfavoredOverload
@inlinable
public init() {
self.init(internal: ())
}

@usableFromInline
init(internal: Void) {
self.inputToBytes = .init()
}
}
Expand Down Expand Up @@ -581,12 +591,25 @@ extension Prefix {
minLength: Int,
maxLength: Int?,
while predicate: @escaping (Input.Element) -> Bool
) {
self.init(
minLength: minLength,
maxLength: maxLength,
predicate: predicate
)
}

@usableFromInline
init(
minLength: Int,
maxLength: Int?,
predicate: @escaping (Input.Element) -> Bool
) {
self.minimum = minLength
self.maximum = maxLength
self.predicate = predicate
}

@available(
*, deprecated,
message: "Use the initializer that takes a Length (Int or range expression), instead."
Expand All @@ -595,6 +618,18 @@ extension Prefix {
public init(
minLength: Int,
while predicate: @escaping (Input.Element) -> Bool
) {
self.init(
minLength: minLength,
predicate: predicate
)
}

@usableFromInline
init(
minLength: Int,
predicate: @escaping (Input.Element) -> Bool

) {
self.minimum = minLength
self.maximum = nil
Expand All @@ -609,6 +644,14 @@ extension Prefix {
public init(
maxLength: Int,
while predicate: @escaping (Input.Element) -> Bool
) {
self.init(maxLength: maxLength, predicate: predicate)
}

@usableFromInline
init(
maxLength: Int,
predicate: @escaping (Input.Element) -> Bool
) {
self.minimum = 0
self.maximum = maxLength
Expand Down Expand Up @@ -721,6 +764,11 @@ where SubstringParser.Input == Substring {
extension FromSubstring where Input == ArraySlice<UInt8> {
@inlinable
public init(@ParserBuilder _ build: () -> SubstringParser) {
self.init(internal: build)
}

@usableFromInline
init(@ParserBuilder internal build: () -> SubstringParser) {
self.substringParser = build()
self.toSubstring = { Substring(decoding: $0, as: UTF8.self) }
self.fromSubstring = { ArraySlice($0.utf8) }
Expand All @@ -731,6 +779,11 @@ extension FromSubstring where Input == ArraySlice<UInt8> {
extension FromSubstring where Input == Substring.UnicodeScalarView {
@inlinable
public init(@ParserBuilder _ build: () -> SubstringParser) {
self.init(build, internal: ())
}

@usableFromInline
init(@ParserBuilder _ build: () -> SubstringParser, internal: Void) {
self.substringParser = build()
self.toSubstring = Substring.init
self.fromSubstring = \.unicodeScalars
Expand All @@ -741,6 +794,11 @@ extension FromSubstring where Input == Substring.UnicodeScalarView {
extension FromSubstring where Input == Substring.UTF8View {
@inlinable
public init(@ParserBuilder _ build: () -> SubstringParser) {
self.init(internal: build)
}

@usableFromInline
init(@ParserBuilder internal build: () -> SubstringParser) {
self.substringParser = build()
self.toSubstring = Substring.init
self.fromSubstring = \.utf8
Expand All @@ -766,6 +824,11 @@ where UnicodeScalarsParser.Input == Substring.UnicodeScalarView {
extension FromUnicodeScalarView where Input == ArraySlice<UInt8> {
@inlinable
public init(@ParserBuilder _ build: () -> UnicodeScalarsParser) {
self.init(internal: build)
}

@usableFromInline
init(@ParserBuilder internal build: () -> UnicodeScalarsParser) {
self.unicodeScalarsParser = build()
self.toUnicodeScalars = { Substring(decoding: $0, as: UTF8.self).unicodeScalars }
self.fromUnicodeScalars = { ArraySlice(Substring($0).utf8) }
Expand All @@ -776,6 +839,10 @@ extension FromUnicodeScalarView where Input == ArraySlice<UInt8> {
extension FromUnicodeScalarView where Input == Substring {
@inlinable
public init(@ParserBuilder _ build: () -> UnicodeScalarsParser) {
self.init(internal: build)
}
@usableFromInline
init(@ParserBuilder internal build: () -> UnicodeScalarsParser) {
self.unicodeScalarsParser = build()
self.toUnicodeScalars = \.unicodeScalars
self.fromUnicodeScalars = Substring.init
Expand All @@ -786,6 +853,11 @@ extension FromUnicodeScalarView where Input == Substring {
extension FromUnicodeScalarView where Input == Substring.UTF8View {
@inlinable
public init(@ParserBuilder _ build: () -> UnicodeScalarsParser) {
self.init(internal: build)
}

@usableFromInline
init(@ParserBuilder internal build: () -> UnicodeScalarsParser) {
self.unicodeScalarsParser = build()
self.toUnicodeScalars = { Substring($0).unicodeScalars }
self.fromUnicodeScalars = { Substring($0).utf8 }
Expand All @@ -811,6 +883,11 @@ where UTF8Parser.Input == Substring.UTF8View {
extension FromUTF8View where Input == Substring {
@inlinable
public init(@ParserBuilder _ build: () -> UTF8Parser) {
self.init(internal: build)
}

@usableFromInline
init(@ParserBuilder internal build: () -> UTF8Parser) {
self.utf8Parser = build()
self.toUTF8 = \.utf8
self.fromUTF8 = Substring.init
Expand All @@ -821,6 +898,11 @@ extension FromUTF8View where Input == Substring {
extension FromUTF8View where Input == Substring.UnicodeScalarView {
@inlinable
public init(@ParserBuilder _ build: () -> UTF8Parser) {
self.init(internal: build)
}

@usableFromInline
init(@ParserBuilder internal build: () -> UTF8Parser) {
self.utf8Parser = build()
self.toUTF8 = { Substring($0).utf8 }
self.fromUTF8 = { Substring($0).unicodeScalars }
Expand Down
Loading