diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d86995350b..209c7e6773 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -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 diff --git a/Makefile b/Makefile index 2fe6249454..c07fad5993 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/Sources/Parsing/Builders/OneOfBuilder.swift b/Sources/Parsing/Builders/OneOfBuilder.swift index 150babbe39..4571426028 100644 --- a/Sources/Parsing/Builders/OneOfBuilder.swift +++ b/Sources/Parsing/Builders/OneOfBuilder.swift @@ -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 } diff --git a/Sources/Parsing/Conversions/AnyConversion.swift b/Sources/Parsing/Conversions/AnyConversion.swift index 17a0a7f01c..bf23d78087 100644 --- a/Sources/Parsing/Conversions/AnyConversion.swift +++ b/Sources/Parsing/Conversions/AnyConversion.swift @@ -117,8 +117,14 @@ public struct AnyConversion: Conversion { /// - Parameter conversion: A conversion to wrap with a type eraser. @inlinable public init(_ conversion: C) where C.Input == Input, C.Output == Output { + self.init(internal: conversion) + } + + @usableFromInline + init(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(_:)`` @@ -135,6 +141,14 @@ public struct AnyConversion: 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) diff --git a/Sources/Parsing/Conversions/Identity.swift b/Sources/Parsing/Conversions/Identity.swift index c407d2c8ab..29f14b2f00 100644 --- a/Sources/Parsing/Conversions/Identity.swift +++ b/Sources/Parsing/Conversions/Identity.swift @@ -3,7 +3,12 @@ import Foundation extension Conversions { public struct Identity: Conversion { @inlinable - public init() {} + public init() { + self.init(internal: ()) + } + + @usableFromInline + init(internal: Void) {} @inlinable @inline(__always) diff --git a/Sources/Parsing/Conversions/JSON.swift b/Sources/Parsing/Conversions/JSON.swift index 16816ec76d..2416589a0e 100644 --- a/Sources/Parsing/Conversions/JSON.swift +++ b/Sources/Parsing/Conversions/JSON.swift @@ -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 diff --git a/Sources/Parsing/Conversions/RawRepresentable.swift b/Sources/Parsing/Conversions/RawRepresentable.swift index 5400543b3b..a859df6e28 100644 --- a/Sources/Parsing/Conversions/RawRepresentable.swift +++ b/Sources/Parsing/Conversions/RawRepresentable.swift @@ -79,7 +79,12 @@ extension Conversions { /// the ``Conversion/representing(_:)-swift.type.method`` operation, which constructs this type. public struct FromRawValue: Conversion { @inlinable - public init() {} + public init() { + self.init(internal: ()) + } + + @usableFromInline + init(internal: Void) {} @inlinable public func apply(_ input: Output.RawValue) throws -> Output { diff --git a/Sources/Parsing/Conversions/String.swift b/Sources/Parsing/Conversions/String.swift index c6ca29f564..c3abed3fb7 100644 --- a/Sources/Parsing/Conversions/String.swift +++ b/Sources/Parsing/Conversions/String.swift @@ -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 { @@ -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 { diff --git a/Sources/Parsing/Conversions/Substring.swift b/Sources/Parsing/Conversions/Substring.swift index 845c49757b..abcf4cb7a4 100644 --- a/Sources/Parsing/Conversions/Substring.swift +++ b/Sources/Parsing/Conversions/Substring.swift @@ -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 { @@ -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) diff --git a/Sources/Parsing/Conversions/UTF8View.swift b/Sources/Parsing/Conversions/UTF8View.swift index a3b7709b39..8c3834a859 100644 --- a/Sources/Parsing/Conversions/UTF8View.swift +++ b/Sources/Parsing/Conversions/UTF8View.swift @@ -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 { diff --git a/Sources/Parsing/Internal/Deprecations.swift b/Sources/Parsing/Internal/Deprecations.swift index 14feab02c8..f5bbc37ddf 100644 --- a/Sources/Parsing/Internal/Deprecations.swift +++ b/Sources/Parsing/Internal/Deprecations.swift @@ -540,6 +540,11 @@ where InputToBytes.Input: PrependableCollection, InputToBytes.Output: Prependabl extension Newline { @inlinable public init() where InputToBytes == Conversions.Identity { + self.init(internal: ()) + } + + @usableFromInline + init(internal: Void) where InputToBytes == Conversions.Identity { self.inputToBytes = .init() } } @@ -549,6 +554,11 @@ extension Newline where InputToBytes == Conversions.SubstringToUTF8View { @_disfavoredOverload @inlinable public init() { + self.init(internal: ()) + } + + @usableFromInline + init(internal: Void) { self.inputToBytes = .init() } } @@ -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." @@ -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 @@ -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 @@ -721,6 +764,11 @@ where SubstringParser.Input == Substring { extension FromSubstring where Input == ArraySlice { @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) } @@ -731,6 +779,11 @@ extension FromSubstring where Input == ArraySlice { 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 @@ -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 @@ -766,6 +824,11 @@ where UnicodeScalarsParser.Input == Substring.UnicodeScalarView { extension FromUnicodeScalarView where Input == ArraySlice { @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) } @@ -776,6 +839,10 @@ extension FromUnicodeScalarView where Input == ArraySlice { 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 @@ -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 } @@ -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 @@ -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 } diff --git a/Sources/Parsing/ParserPrinters/Always.swift b/Sources/Parsing/ParserPrinters/Always.swift index 173b420a23..59fdd7b988 100644 --- a/Sources/Parsing/ParserPrinters/Always.swift +++ b/Sources/Parsing/ParserPrinters/Always.swift @@ -66,6 +66,11 @@ public struct Always: ParserPrinter { @inlinable public init(_ output: Output) { + self.init(internal: output) + } + + @usableFromInline + init(internal output: Output) { self.output = output } @@ -81,6 +86,11 @@ public struct Always: ParserPrinter { extension Always where Input == Substring { @inlinable public init(_ output: Output) { + self.init(internal: output) + } + + @usableFromInline + init(internal output: Output) { self.output = output } } @@ -88,6 +98,11 @@ extension Always where Input == Substring { extension Always where Input == Substring.UTF8View { @inlinable public init(_ output: Output) { + self.init(internal: output) + } + + @usableFromInline + init(internal output: Output) { self.output = output } } diff --git a/Sources/Parsing/ParserPrinters/AnyParserPrinter.swift b/Sources/Parsing/ParserPrinters/AnyParserPrinter.swift index 46fc928b20..096fb529ec 100644 --- a/Sources/Parsing/ParserPrinters/AnyParserPrinter.swift +++ b/Sources/Parsing/ParserPrinters/AnyParserPrinter.swift @@ -51,6 +51,14 @@ public struct AnyParserPrinter: ParserPrinter { public init( parse: @escaping (inout Input) throws -> Output, print: @escaping (Output, inout Input) throws -> Void + ) { + self.init(internal: parse, print: print) + } + + @usableFromInline + init( + internal parse: @escaping (inout Input) throws -> Output, + print: @escaping (Output, inout Input) throws -> Void ) { self.parser = parse self.printer = print diff --git a/Sources/Parsing/ParserPrinters/Bool.swift b/Sources/Parsing/ParserPrinters/Bool.swift index 4e290ae5de..7de9fbb260 100644 --- a/Sources/Parsing/ParserPrinters/Bool.swift +++ b/Sources/Parsing/ParserPrinters/Bool.swift @@ -61,7 +61,12 @@ extension Parsers { Input.Element == UTF8.CodeUnit { @inlinable - public init() {} + public init() { + self.init(internal: ()) + } + + @usableFromInline + init(internal: Void) {} @inlinable public func parse(_ input: inout Input) throws -> Bool { diff --git a/Sources/Parsing/ParserPrinters/Consumed.swift b/Sources/Parsing/ParserPrinters/Consumed.swift index 2c0743a039..3c77dc37fd 100644 --- a/Sources/Parsing/ParserPrinters/Consumed.swift +++ b/Sources/Parsing/ParserPrinters/Consumed.swift @@ -8,6 +8,11 @@ where @inlinable public init(@ParserBuilder _ build: () -> Upstream) { + self.init(internal: build) + } + + @usableFromInline + init(internal build: () -> Upstream) { self.upstream = build() } diff --git a/Sources/Parsing/ParserPrinters/End.swift b/Sources/Parsing/ParserPrinters/End.swift index a2374433e8..a1c12c6b6e 100644 --- a/Sources/Parsing/ParserPrinters/End.swift +++ b/Sources/Parsing/ParserPrinters/End.swift @@ -18,7 +18,12 @@ /// > ``Parser/parse(_:)-6h1d0`` and ``Parser/parse(_:)-2wzcq`` methods. public struct End: ParserPrinter { @inlinable - public init() {} + public init() { + self.init(internal: ()) + } + + @usableFromInline + init(internal: Void) {} @inlinable public func parse(_ input: inout Input) throws { @@ -51,13 +56,23 @@ public struct End: ParserPrinter { extension End where Input == Substring { @_disfavoredOverload @inlinable - public init() {} + public init() { + self.init(internal: ()) + } + + @usableFromInline + init(internal: Void) {} } extension End where Input == Substring.UTF8View { @_disfavoredOverload @inlinable - public init() {} + public init() { + self.init(internal: ()) + } + + @usableFromInline + init(internal: Void) {} } extension Parsers { diff --git a/Sources/Parsing/ParserPrinters/Fail.swift b/Sources/Parsing/ParserPrinters/Fail.swift index 37845b1b7e..8e893d6c26 100644 --- a/Sources/Parsing/ParserPrinters/Fail.swift +++ b/Sources/Parsing/ParserPrinters/Fail.swift @@ -34,6 +34,11 @@ public struct Fail: ParserPrinter { /// - Parameter error: An error to throw when the parser is run. @inlinable public init(throwing error: Error) { + self.init(internal: error) + } + + @usableFromInline + init(internal error: Error) { self.error = error } diff --git a/Sources/Parsing/ParserPrinters/Filter.swift b/Sources/Parsing/ParserPrinters/Filter.swift index e44c98c594..447eeb9ad8 100644 --- a/Sources/Parsing/ParserPrinters/Filter.swift +++ b/Sources/Parsing/ParserPrinters/Filter.swift @@ -38,6 +38,11 @@ extension Parsers { @inlinable public init(upstream: Upstream, predicate: @escaping (Upstream.Output) -> Bool) { + self.init(internal: upstream, predicate: predicate) + } + + @usableFromInline + init(internal upstream: Upstream, predicate: @escaping (Upstream.Output) -> Bool) { self.upstream = upstream self.predicate = predicate } diff --git a/Sources/Parsing/ParserPrinters/First.swift b/Sources/Parsing/ParserPrinters/First.swift index 02beeb9e41..5c3bef5f94 100644 --- a/Sources/Parsing/ParserPrinters/First.swift +++ b/Sources/Parsing/ParserPrinters/First.swift @@ -23,7 +23,12 @@ /// ``` public struct First: Parser where Input.SubSequence == Input { @inlinable - public init() {} + public init() { + self.init(internal: ()) + } + + @usableFromInline + init(internal: Void) {} @inlinable public func parse(_ input: inout Input) throws -> Input.Element { @@ -45,13 +50,23 @@ extension First: ParserPrinter where Input: PrependableCollection { extension First where Input == Substring { @_disfavoredOverload @inlinable - public init() {} + public init() { + self.init(internal: ()) + } + + @usableFromInline + init(internal: Void) {} } extension First where Input == Substring.UTF8View { @_disfavoredOverload @inlinable - public init() {} + public init() { + self.init(internal: ()) + } + + @usableFromInline + init(internal: Void) {} } extension Parsers { diff --git a/Sources/Parsing/ParserPrinters/Float.swift b/Sources/Parsing/ParserPrinters/Float.swift index ae76601a56..953937d23d 100644 --- a/Sources/Parsing/ParserPrinters/Float.swift +++ b/Sources/Parsing/ParserPrinters/Float.swift @@ -67,7 +67,12 @@ extension Parsers { Output: LosslessStringConvertible { @inlinable - public init() {} + public init() { + self.init(internal: ()) + } + + @usableFromInline + init(internal: Void) {} @inlinable public func parse(_ input: inout Input) throws -> Output { diff --git a/Sources/Parsing/ParserPrinters/From.swift b/Sources/Parsing/ParserPrinters/From.swift index c31f1da86f..ab7f19f9c1 100644 --- a/Sources/Parsing/ParserPrinters/From.swift +++ b/Sources/Parsing/ParserPrinters/From.swift @@ -8,6 +8,11 @@ where Upstream.Output == Downstream.Input { @inlinable public init(_ conversion: Upstream, @ParserBuilder _ parser: () -> Downstream) { + self.init(internal: conversion, parser) + } + + @usableFromInline + init(internal conversion: Upstream, @ParserBuilder _ parser: () -> Downstream) { self.conversion = conversion self.parser = parser() } @@ -49,6 +54,11 @@ extension Parsers { extension From { @inlinable public init(_ conversion: Upstream) where Downstream == Parsers.Identity { + self.init(internal: conversion) + } + + @usableFromInline + init(internal conversion: Upstream) where Downstream == Parsers.Identity { self.conversion = conversion self.parser = .init() } diff --git a/Sources/Parsing/ParserPrinters/Int.swift b/Sources/Parsing/ParserPrinters/Int.swift index fe30d79ee6..62d9aadb47 100644 --- a/Sources/Parsing/ParserPrinters/Int.swift +++ b/Sources/Parsing/ParserPrinters/Int.swift @@ -84,6 +84,11 @@ extension Parsers { @inlinable public init(radix: Int = 10) { + self.init(internal: radix) + } + + @usableFromInline + init(internal radix: Int = 10) { precondition((2...36).contains(radix), "Radix not in range 2...36") self.radix = radix } diff --git a/Sources/Parsing/ParserPrinters/Lazy.swift b/Sources/Parsing/ParserPrinters/Lazy.swift index 11a4f82674..f371f5d349 100644 --- a/Sources/Parsing/ParserPrinters/Lazy.swift +++ b/Sources/Parsing/ParserPrinters/Lazy.swift @@ -7,7 +7,12 @@ public final class Lazy: Parser { public let createParser: () -> LazyParser @inlinable - public init(@ParserBuilder createParser: @escaping () -> LazyParser) { + public convenience init(@ParserBuilder createParser: @escaping () -> LazyParser) { + self.init(internal: createParser) + } + + @usableFromInline + init(internal createParser: @escaping () -> LazyParser) { self.createParser = createParser } diff --git a/Sources/Parsing/ParserPrinters/Many.swift b/Sources/Parsing/ParserPrinters/Many.swift index 213ff8b2ca..b49cc21ca5 100644 --- a/Sources/Parsing/ParserPrinters/Many.swift +++ b/Sources/Parsing/ParserPrinters/Many.swift @@ -237,6 +237,27 @@ extension Many where Printability == Void { @ParserBuilder element: () -> Element, @ParserBuilder separator: () -> Separator, @ParserBuilder terminator: () -> Terminator + ) where I.Element == Element.Output { + self.init( + internal: length, + into: initialResult, + updateAccumulatingResult, + decumulator: decumulator, + element: element, + separator: separator, + terminator: terminator + ) + } + + @usableFromInline + init( + internal length: R, + into initialResult: Result, + _ updateAccumulatingResult: @escaping (inout Result, Element.Output) throws -> Void, + decumulator: @escaping (Result) throws -> I, + @ParserBuilder element: () -> Element, + @ParserBuilder separator: () -> Separator, + @ParserBuilder terminator: () -> Terminator ) where I.Element == Element.Output { self.element = element() self.initialResult = initialResult @@ -303,6 +324,25 @@ extension Many where Printability == Never { @ParserBuilder element: () -> Element, @ParserBuilder separator: () -> Separator, @ParserBuilder terminator: () -> Terminator + ) { + self.init( + internal: length, + into: initialResult, + updateAccumulatingResult, + element: element, + separator: separator, + terminator: terminator + ) + } + + @usableFromInline + init( + internal length: R, + into initialResult: Result, + _ updateAccumulatingResult: @escaping (inout Result, Element.Output) throws -> Void, + @ParserBuilder element: () -> Element, + @ParserBuilder separator: () -> Separator, + @ParserBuilder terminator: () -> Terminator ) { self.element = element() self.initialResult = initialResult diff --git a/Sources/Parsing/ParserPrinters/Map.swift b/Sources/Parsing/ParserPrinters/Map.swift index 0ccfb6012e..b5a80f3484 100644 --- a/Sources/Parsing/ParserPrinters/Map.swift +++ b/Sources/Parsing/ParserPrinters/Map.swift @@ -81,6 +81,11 @@ extension Parsers { @inlinable public init(upstream: Upstream, transform: @escaping (Upstream.Output) -> NewOutput) { + self.init(internal: upstream, transform: transform) + } + + @usableFromInline + init(internal upstream: Upstream, transform: @escaping (Upstream.Output) -> NewOutput) { self.upstream = upstream self.transform = transform } @@ -102,6 +107,11 @@ extension Parsers { @inlinable public init(upstream: Upstream, output: Output) { + self.init(internal: upstream, output: output) + } + + @usableFromInline + init(internal upstream: Upstream, output: Output) { self.upstream = upstream self.output = output } @@ -125,6 +135,11 @@ extension Parsers { @inlinable public init(upstream: Upstream, downstream: Downstream) { + self.init(internal: upstream, downstream: downstream) + } + + @usableFromInline + init(internal upstream: Upstream, downstream: Downstream) { self.upstream = upstream self.downstream = downstream } diff --git a/Sources/Parsing/ParserPrinters/Not.swift b/Sources/Parsing/ParserPrinters/Not.swift index 0f251117b2..d613577760 100644 --- a/Sources/Parsing/ParserPrinters/Not.swift +++ b/Sources/Parsing/ParserPrinters/Not.swift @@ -25,6 +25,11 @@ public struct Not: ParserPrinter { /// fails. @inlinable public init(@ParserBuilder _ build: () -> Upstream) { + self.init(internal: build) + } + + @usableFromInline + init(internal build: () -> Upstream) { self.upstream = build() } diff --git a/Sources/Parsing/ParserPrinters/OneOf.swift b/Sources/Parsing/ParserPrinters/OneOf.swift index 296ff9b29a..a45a3b3da0 100644 --- a/Sources/Parsing/ParserPrinters/OneOf.swift +++ b/Sources/Parsing/ParserPrinters/OneOf.swift @@ -156,6 +156,11 @@ public struct OneOf: Parser { @inlinable public init(@OneOfBuilder _ build: () -> Parsers) { + self.init(internal: build) + } + + @usableFromInline + init(internal build: () -> Parsers) { self.parsers = build() } diff --git a/Sources/Parsing/ParserPrinters/OneOfMany.swift b/Sources/Parsing/ParserPrinters/OneOfMany.swift index 3c92cccd16..1e5ec99339 100644 --- a/Sources/Parsing/ParserPrinters/OneOfMany.swift +++ b/Sources/Parsing/ParserPrinters/OneOfMany.swift @@ -22,6 +22,11 @@ extension Parsers { @inlinable public init(_ parsers: [Parsers]) { + self.init(internal: parsers) + } + + @usableFromInline + init(internal parsers: [Parsers]) { self.parsers = parsers } diff --git a/Sources/Parsing/ParserPrinters/Optionally.swift b/Sources/Parsing/ParserPrinters/Optionally.swift index 01d7be5726..feb8064fc1 100644 --- a/Sources/Parsing/ParserPrinters/Optionally.swift +++ b/Sources/Parsing/ParserPrinters/Optionally.swift @@ -37,6 +37,11 @@ public struct Optionally: Parser { @inlinable public init(@ParserBuilder _ build: () -> Wrapped) { + self.init(internal: build) + } + + @usableFromInline + init(@ParserBuilder internal build: () -> Wrapped) { self.wrapped = build() } diff --git a/Sources/Parsing/ParserPrinters/Parse.swift b/Sources/Parsing/ParserPrinters/Parse.swift index 06d4139412..f007f9b2f2 100644 --- a/Sources/Parsing/ParserPrinters/Parse.swift +++ b/Sources/Parsing/ParserPrinters/Parse.swift @@ -44,6 +44,11 @@ public struct Parse: Parser { /// - Parameter with: A parser builder that will accumulate non-void outputs in a tuple. @inlinable public init(@ParserBuilder with build: () -> Parsers) { + self.init(internal: build) + } + + @usableFromInline + init(internal build: () -> Parsers) { self.parsers = build() } @@ -79,6 +84,14 @@ public struct Parse: Parser { public init( _ transform: @escaping (Upstream.Output) -> NewOutput, @ParserBuilder with build: () -> Upstream + ) where Parsers == Parsing.Parsers.Map { + self.init(internal: transform, with: build) + } + + @usableFromInline + init( + internal transform: @escaping (Upstream.Output) -> NewOutput, + @ParserBuilder with build: () -> Upstream ) where Parsers == Parsing.Parsers.Map { self.parsers = build().map(transform) } @@ -102,6 +115,14 @@ public struct Parse: Parser { public init( _ output: NewOutput, @ParserBuilder with build: () -> Upstream + ) where Parsers == Parsing.Parsers.MapConstant { + self.init(internal: output, with: build) + } + + @usableFromInline + init( + internal output: NewOutput, + @ParserBuilder with build: () -> Upstream ) where Parsers == Parsing.Parsers.MapConstant { self.parsers = build().map { output } } @@ -138,6 +159,14 @@ public struct Parse: Parser { public init( _ conversion: Downstream, @ParserBuilder with build: () -> Upstream + ) where Parsers == Parsing.Parsers.MapConversion { + self.init(internal: conversion, with: build) + } + + @usableFromInline + init( + internal conversion: Downstream, + @ParserBuilder with build: () -> Upstream ) where Parsers == Parsing.Parsers.MapConversion { self.parsers = build().map(conversion) } @@ -193,6 +222,11 @@ public struct ParsePrint: ParserPrinter { @inlinable public init(@ParserBuilder with build: () -> ParserPrinters) { + self.init(internal: build) + } + + @usableFromInline + init(internal build: () -> ParserPrinters) { self.parserPrinters = build() } @@ -200,6 +234,14 @@ public struct ParsePrint: ParserPrinter { public init( _ output: NewOutput, @ParserBuilder with build: () -> Upstream + ) where ParserPrinters == Parsers.MapConstant { + self.init(internal: output, with: build) + } + + @usableFromInline + init( + internal output: NewOutput, + @ParserBuilder with build: () -> Upstream ) where ParserPrinters == Parsers.MapConstant { self.parserPrinters = build().map { output } } @@ -208,6 +250,14 @@ public struct ParsePrint: ParserPrinter { public init( _ conversion: Downstream, @ParserBuilder with build: () -> Upstream + ) where ParserPrinters == Parsers.MapConversion { + self.init(internal: conversion, with: build) + } + + @usableFromInline + init( + internal conversion: Downstream, + @ParserBuilder with build: () -> Upstream ) where ParserPrinters == Parsers.MapConversion { self.parserPrinters = build().map(conversion) } diff --git a/Sources/Parsing/ParserPrinters/ParseableFormatStyle.swift b/Sources/Parsing/ParserPrinters/ParseableFormatStyle.swift index 15aedd35e8..d79b536aa2 100644 --- a/Sources/Parsing/ParserPrinters/ParseableFormatStyle.swift +++ b/Sources/Parsing/ParserPrinters/ParseableFormatStyle.swift @@ -12,6 +12,11 @@ @inlinable public init(_ style: Style) { + self.init(internal: style) + } + + @usableFromInline + init(internal style: Style) { self.style = style } diff --git a/Sources/Parsing/ParserPrinters/Peek.swift b/Sources/Parsing/ParserPrinters/Peek.swift index cafe33ebc8..90a3eea253 100644 --- a/Sources/Parsing/ParserPrinters/Peek.swift +++ b/Sources/Parsing/ParserPrinters/Peek.swift @@ -31,6 +31,11 @@ public struct Peek: ParserPrinter { /// - Parameter build: A parser this parser wants to inspect. @inlinable public init(@ParserBuilder _ build: () -> Upstream) { + self.init(internal: build) + } + + @usableFromInline + init(@ParserBuilder internal build: () -> Upstream) { self.upstream = build() } diff --git a/Sources/Parsing/ParserPrinters/Pipe.swift b/Sources/Parsing/ParserPrinters/Pipe.swift index 13f0f83c2d..0a001ae3ad 100644 --- a/Sources/Parsing/ParserPrinters/Pipe.swift +++ b/Sources/Parsing/ParserPrinters/Pipe.swift @@ -61,6 +61,11 @@ extension Parsers { @inlinable public init(upstream: Upstream, downstream: Downstream) { + self.init(internal: upstream, downstream: downstream) + } + + @usableFromInline + init(internal upstream: Upstream, downstream: Downstream) { self.upstream = upstream self.downstream = downstream } diff --git a/Sources/Parsing/ParserPrinters/Prefix.swift b/Sources/Parsing/ParserPrinters/Prefix.swift index ebc24ca2b4..6a31854491 100644 --- a/Sources/Parsing/ParserPrinters/Prefix.swift +++ b/Sources/Parsing/ParserPrinters/Prefix.swift @@ -74,6 +74,11 @@ public struct Prefix: Parser where Input.SubSequence == Input /// Once the predicate returns `false` it will not be called again. @inlinable public init(_ length: R, while predicate: ((Input.Element) -> Bool)? = nil) { + self.init(internal: length, while: predicate) + } + + @usableFromInline + init(internal length: R, while predicate: ((Input.Element) -> Bool)? = nil) { self.minimum = length.minimum self.maximum = length.maximum self.predicate = predicate @@ -93,6 +98,11 @@ public struct Prefix: Parser where Input.SubSequence == Input /// the predicate returns `false` it will not be called again. @inlinable public init(while predicate: @escaping (Input.Element) -> Bool) { + self.init(internal: predicate) + } + + @usableFromInline + init(internal predicate: @escaping (Input.Element) -> Bool) { self.minimum = 0 self.maximum = nil self.predicate = predicate diff --git a/Sources/Parsing/ParserPrinters/PrefixThrough.swift b/Sources/Parsing/ParserPrinters/PrefixThrough.swift index 5c08341b5a..0febd4b2a8 100644 --- a/Sources/Parsing/ParserPrinters/PrefixThrough.swift +++ b/Sources/Parsing/ParserPrinters/PrefixThrough.swift @@ -19,6 +19,14 @@ public struct PrefixThrough: Parser where Input.SubSequence = public init( _ possibleMatch: Input, by areEquivalent: @escaping (Input.Element, Input.Element) -> Bool + ) { + self.init(internal: possibleMatch, by: areEquivalent) + } + + @usableFromInline + init( + internal possibleMatch: Input, + by areEquivalent: @escaping (Input.Element, Input.Element) -> Bool ) { self.possibleMatch = possibleMatch self.areEquivalent = areEquivalent diff --git a/Sources/Parsing/ParserPrinters/PrefixUpTo.swift b/Sources/Parsing/ParserPrinters/PrefixUpTo.swift index 6f032417ce..788982303b 100644 --- a/Sources/Parsing/ParserPrinters/PrefixUpTo.swift +++ b/Sources/Parsing/ParserPrinters/PrefixUpTo.swift @@ -19,6 +19,14 @@ public struct PrefixUpTo: Parser where Input.SubSequence == I public init( _ possibleMatch: Input, by areEquivalent: @escaping (Input.Element, Input.Element) -> Bool + ) { + self.init(internal: possibleMatch, by: areEquivalent) + } + + @usableFromInline + init( + internal possibleMatch: Input, + by areEquivalent: @escaping (Input.Element, Input.Element) -> Bool ) { self.possibleMatch = possibleMatch self.areEquivalent = areEquivalent diff --git a/Sources/Parsing/ParserPrinters/Printing.swift b/Sources/Parsing/ParserPrinters/Printing.swift index 706a0c5267..6fbc5e6f5f 100644 --- a/Sources/Parsing/ParserPrinters/Printing.swift +++ b/Sources/Parsing/ParserPrinters/Printing.swift @@ -56,6 +56,14 @@ extension Parsers { public init( parser: Parser, printer: Printer + ) { + self.init(internal: parser, printer: printer) + } + + @usableFromInline + init( + internal parser: Parser, + printer: Printer ) { self.parser = parser self.printer = printer @@ -80,6 +88,14 @@ extension Parsers { public init( parser: Upstream, printer: @escaping (Upstream.Output, inout Upstream.Input) -> Void + ) { + self.init(internal: parser, printer: printer) + } + + @usableFromInline + init( + internal parser: Upstream, + printer: @escaping (Upstream.Output, inout Upstream.Input) -> Void ) { self.parser = parser self.printer = printer @@ -104,6 +120,14 @@ extension Parsers { public init( parser: Upstream, printer: @escaping (Upstream.Output, inout Upstream.Input) throws -> Void + ) { + self.init(internal: parser, printer: printer) + } + + @usableFromInline + init( + internal parser: Upstream, + printer: @escaping (Upstream.Output, inout Upstream.Input) throws -> Void ) { self.parser = parser self.printer = printer diff --git a/Sources/Parsing/ParserPrinters/Pullback.swift b/Sources/Parsing/ParserPrinters/Pullback.swift index 6245c357c9..da3070a8da 100644 --- a/Sources/Parsing/ParserPrinters/Pullback.swift +++ b/Sources/Parsing/ParserPrinters/Pullback.swift @@ -39,6 +39,11 @@ extension Parsers { @inlinable public init(downstream: Downstream, keyPath: WritableKeyPath) { + self.init(internal: downstream, keyPath: keyPath) + } + + @usableFromInline + init(internal downstream: Downstream, keyPath: WritableKeyPath) { self.downstream = downstream self.keyPath = keyPath } diff --git a/Sources/Parsing/ParserPrinters/Rest.swift b/Sources/Parsing/ParserPrinters/Rest.swift index 153ec5188e..93a4139bb7 100644 --- a/Sources/Parsing/ParserPrinters/Rest.swift +++ b/Sources/Parsing/ParserPrinters/Rest.swift @@ -23,7 +23,12 @@ /// to coalesce the error into a default output value. public struct Rest: Parser where Input.SubSequence == Input { @inlinable - public init() {} + public init() { + self.init(internal: ()) + } + + @usableFromInline + init(internal: Void) {} @inlinable public func parse(_ input: inout Input) throws -> Input { @@ -74,13 +79,23 @@ extension Rest: ParserPrinter where Input: PrependableCollection { extension Rest where Input == Substring { @_disfavoredOverload @inlinable - public init() {} + public init() { + self.init(internal: ()) + } + + @usableFromInline + init(internal: Void) {} } extension Rest where Input == Substring.UTF8View { @_disfavoredOverload @inlinable - public init() {} + public init() { + self.init(internal: ()) + } + + @usableFromInline + init(internal: Void) {} } extension Parsers { diff --git a/Sources/Parsing/ParserPrinters/Skip.swift b/Sources/Parsing/ParserPrinters/Skip.swift index df5be070f7..5fea7781a6 100644 --- a/Sources/Parsing/ParserPrinters/Skip.swift +++ b/Sources/Parsing/ParserPrinters/Skip.swift @@ -5,6 +5,11 @@ public struct Skip: Parser { @inlinable public init(@ParserBuilder _ build: () -> Parsers) { + self.init(internal: build) + } + + @usableFromInline + init(internal build: () -> Parsers) { self.parsers = build() } diff --git a/Sources/Parsing/ParserPrinters/StartsWith.swift b/Sources/Parsing/ParserPrinters/StartsWith.swift index d21568f005..541ecf4a66 100644 --- a/Sources/Parsing/ParserPrinters/StartsWith.swift +++ b/Sources/Parsing/ParserPrinters/StartsWith.swift @@ -54,6 +54,15 @@ public struct StartsWith: Parser where Input.SubSequence == I _ possiblePrefix: PossiblePrefix, by areEquivalent: @escaping (Input.Element, Input.Element) -> Bool ) + where PossiblePrefix.Element == Input.Element { + self.init(internal: possiblePrefix, by: areEquivalent) + } + + @usableFromInline + init( + internal possiblePrefix: PossiblePrefix, + by areEquivalent: @escaping (Input.Element, Input.Element) -> Bool + ) where PossiblePrefix.Element == Input.Element { self.count = possiblePrefix.count self.possiblePrefix = AnyCollection(possiblePrefix) diff --git a/Sources/Parsing/ParserPrinters/UUID.swift b/Sources/Parsing/ParserPrinters/UUID.swift index 4355b9fad6..5a58a7617a 100644 --- a/Sources/Parsing/ParserPrinters/UUID.swift +++ b/Sources/Parsing/ParserPrinters/UUID.swift @@ -64,7 +64,12 @@ extension Parsers { Input.Element == UTF8.CodeUnit { @inlinable - public init() {} + public init() { + self.init(internal: ()) + } + + @usableFromInline + init(internal: Void) {} @inlinable public func parse(_ input: inout Input) throws -> UUID { diff --git a/Sources/Parsing/ParserPrinters/Whitespace.swift b/Sources/Parsing/ParserPrinters/Whitespace.swift index 62b379b59d..22645021ed 100644 --- a/Sources/Parsing/ParserPrinters/Whitespace.swift +++ b/Sources/Parsing/ParserPrinters/Whitespace.swift @@ -178,6 +178,12 @@ extension Whitespace { @inlinable public init(_ length: Length, _ configuration: Configuration = .all) + where InputToBytes == Conversions.Identity { + self.init(internal: length, configuration) + } + + @usableFromInline + init(internal length: Length, _ configuration: Configuration) where InputToBytes == Conversions.Identity { self.length = length self.configuration = configuration @@ -195,6 +201,11 @@ extension Whitespace where InputToBytes == Conversions.SubstringToUTF8View { @_disfavoredOverload @inlinable public init(_ length: Length, _ configuration: Configuration = .all) { + self.init(internal: length, configuration) + } + + @usableFromInline + init(internal length: Length, _ configuration: Configuration) { self.length = length self.configuration = configuration self.inputToBytes = .init() diff --git a/Sources/Parsing/Parsers/AnyParser.swift b/Sources/Parsing/Parsers/AnyParser.swift index 4647ae14a1..abda585e9e 100644 --- a/Sources/Parsing/Parsers/AnyParser.swift +++ b/Sources/Parsing/Parsers/AnyParser.swift @@ -44,6 +44,11 @@ public struct AnyParser: Parser { /// executed each time the ``parse(_:)`` method is called on the resulting parser. @inlinable public init(_ parse: @escaping (inout Input) throws -> Output) { + self.init(internal: parse) + } + + @usableFromInline + init(internal parse: @escaping (inout Input) throws -> Output) { self.parser = parse } diff --git a/Sources/Parsing/Parsers/CompactMap.swift b/Sources/Parsing/Parsers/CompactMap.swift index 8c04b23e15..634e627682 100644 --- a/Sources/Parsing/Parsers/CompactMap.swift +++ b/Sources/Parsing/Parsers/CompactMap.swift @@ -62,6 +62,14 @@ extension Parsers { public init( upstream: Upstream, transform: @escaping (Upstream.Output) -> Output? + ) { + self.init(internal: upstream, transform: transform) + } + + @usableFromInline + init( + internal upstream: Upstream, + transform: @escaping (Upstream.Output) -> Output? ) { self.upstream = upstream self.transform = transform diff --git a/Sources/Parsing/Parsers/FlatMap.swift b/Sources/Parsing/Parsers/FlatMap.swift index b41aacd0a2..1ca0176ad6 100644 --- a/Sources/Parsing/Parsers/FlatMap.swift +++ b/Sources/Parsing/Parsers/FlatMap.swift @@ -35,6 +35,11 @@ extension Parsers { @inlinable public init(upstream: Upstream, transform: @escaping (Upstream.Output) -> NewParser) { + self.init(internal: upstream, transform: transform) + } + + @usableFromInline + init(internal upstream: Upstream, transform: @escaping (Upstream.Output) -> NewParser) { self.upstream = upstream self.transform = transform } diff --git a/Sources/Parsing/Parsers/Stream.swift b/Sources/Parsing/Parsers/Stream.swift index b230ae1d48..f0a9facc30 100644 --- a/Sources/Parsing/Parsers/Stream.swift +++ b/Sources/Parsing/Parsers/Stream.swift @@ -35,6 +35,11 @@ public struct Stream: Parser where Parsers.Input: RangeReplacea @inlinable public init(@ParserBuilder build: () -> Parsers) { + self.init(internal: build) + } + + @usableFromInline + init(internal build: () -> Parsers) { self.parsers = build() }