Skip to content

FromUnicodeScalarView deprecation message possibly references unimplemented conversion? #344

Open
@kamcma

Description

@kamcma

I think the deprecation messages for FromUnicodeScalarView might reference an unimplemented conversion?

@available(*, deprecated, message: "Use 'From(.unicodeScalars)' instead.")
public struct FromUnicodeScalarView<Input, UnicodeScalarsParser: Parser>: Parser
where UnicodeScalarsParser.Input == Substring.UnicodeScalarView {
public let unicodeScalarsParser: UnicodeScalarsParser
public let toUnicodeScalars: (Input) -> Substring.UnicodeScalarView
public let fromUnicodeScalars: (Substring.UnicodeScalarView) -> Input
@inlinable
public func parse(_ input: inout Input) rethrows -> UnicodeScalarsParser.Output {
var unicodeScalars = self.toUnicodeScalars(input)
defer { input = self.fromUnicodeScalars(unicodeScalars) }
return try self.unicodeScalarsParser.parse(&unicodeScalars)
}
}
@available(*, deprecated, message: "Use 'From(.unicodeScalars)' instead.")
extension FromUnicodeScalarView where Input == ArraySlice<UInt8> {
@inlinable
public init(@ParserBuilder<Substring.UnicodeScalarView> _ build: () -> UnicodeScalarsParser) {
self.unicodeScalarsParser = build()
self.toUnicodeScalars = { Substring(decoding: $0, as: UTF8.self).unicodeScalars }
self.fromUnicodeScalars = { ArraySlice(Substring($0).utf8) }
}
}
@available(*, deprecated, message: "Use 'From(.unicodeScalars)' instead.")
extension FromUnicodeScalarView where Input == Substring {
@inlinable
public init(@ParserBuilder<Substring.UnicodeScalarView> _ build: () -> UnicodeScalarsParser) {
self.unicodeScalarsParser = build()
self.toUnicodeScalars = \.unicodeScalars
self.fromUnicodeScalars = Substring.init
}
}
@available(*, deprecated, message: "Use 'From(.unicodeScalars)' instead.")
extension FromUnicodeScalarView where Input == Substring.UTF8View {
@inlinable
public init(@ParserBuilder<Substring.UnicodeScalarView> _ build: () -> UnicodeScalarsParser) {
self.unicodeScalarsParser = build()
self.toUnicodeScalars = { Substring($0).unicodeScalars }
self.fromUnicodeScalars = { Substring($0).utf8 }
}

This compiles with the deprecation warning:

let foo: some Parser<Substring.UTF8View, Void> = FromUnicodeScalarView { // ⚠️ 'FromUnicodeScalarView' is deprecated: Use 'From(.unicodeScalars)' instead.
  Peek {
    Prefix(1, while: CharacterSet.alphanumerics.contains)
  }
}

But the suggested replacement does not:

let bar: some Parser<Substring.UTF8View, Void> = From(.unicodeScalars) { // 🛑 Type 'Conversion' has no member 'unicodeScalars'
  Peek {
    Prefix(1, while: CharacterSet.alphanumerics.contains)
  }
}

Would be happy to be told I'm holding it wrong! Feel free to close/convert to discussion if so. Thanks for the incredible library.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions