Skip to content

[SE-0163] Migrate from deprecated Unicode APIs #32920

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

Closed
Closed
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
21 changes: 14 additions & 7 deletions stdlib/public/core/MigrationSupport.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,18 @@
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors
// Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

//
// This file contains only support for types deprecated from previous versions
// of Swift
//
//===----------------------------------------------------------------------===//

@available(swift, deprecated: 3.0, obsoleted: 5.0, renamed: "BidirectionalCollection")
public typealias BidirectionalIndexable = BidirectionalCollection
Expand Down Expand Up @@ -243,17 +245,22 @@ extension String.UnicodeScalarView: _CustomPlaygroundQuickLookable {
}
}

//===--- Slicing Support --------------------------------------------------===//
//===----------------------------------------------------------------------===//
//
// [SE-0163] The following typealiases are "soft deprecated" only.
// See the API_TO_BE_DEPRECATED macro in the <os/availability.h> header.
// Another evolution proposal might be required, to formally deprecate them.

// @available(swift,deprecated: 5.0, renamed: "Unicode.UTF8")
@available(swift, deprecated: 100000, renamed: "Unicode.UTF8")
public typealias UTF8 = Unicode.UTF8
// @available(swift, deprecated: 5.0, renamed: "Unicode.UTF16")
@available(swift, deprecated: 100000, renamed: "Unicode.UTF16")
public typealias UTF16 = Unicode.UTF16
// @available(swift, deprecated: 5.0, renamed: "Unicode.UTF32")
@available(swift, deprecated: 100000, renamed: "Unicode.UTF32")
public typealias UTF32 = Unicode.UTF32
// @available(swift, deprecated: 5.0, renamed: "Unicode.Scalar")
@available(swift, deprecated: 100000, renamed: "Unicode.Scalar")
public typealias UnicodeScalar = Unicode.Scalar

//===----------------------------------------------------------------------===//

extension String.UTF16View: _CustomPlaygroundQuickLookable {
@available(swift, deprecated: 4.2/*, obsoleted: 5.0*/, message: "UTF16View.customPlaygroundQuickLook will be removed in Swift 5.0")
Expand Down
34 changes: 16 additions & 18 deletions stdlib/public/core/Unicode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,19 @@
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// [SE-0163] UnicodeCodec and UnicodeDecodingResult are "soft deprecated" only.
// See the API_TO_BE_DEPRECATED macro in the <os/availability.h> header.
// Another evolution proposal might be required, to formally deprecate them.
//
//===----------------------------------------------------------------------===//

import SwiftShims

Expand All @@ -20,6 +26,7 @@ import SwiftShims
/// Each `UnicodeDecodingResult` instance can represent a Unicode scalar value,
/// an indication that no more Unicode scalars are available, or an indication
/// of a decoding error.
@available(swift, deprecated: 100000, message: "[SE-0163] Use the Unicode.Encoding APIs")
@frozen
public enum UnicodeDecodingResult: Equatable {
/// A decoded Unicode scalar value.
Expand All @@ -30,23 +37,6 @@ public enum UnicodeDecodingResult: Equatable {

/// An indication of a decoding error.
case error

@inlinable
public static func == (
lhs: UnicodeDecodingResult,
rhs: UnicodeDecodingResult
) -> Bool {
switch (lhs, rhs) {
case (.scalarValue(let lhsScalar), .scalarValue(let rhsScalar)):
return lhsScalar == rhsScalar
case (.emptyInput, .emptyInput):
return true
case (.error, .error):
return true
default:
return false
}
}
Comment on lines -34 to -49
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can be synthesized by the compiler.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not exactly the same, because the synthesized definition isn’t inlinable. How that will affect performance/code size of code using these APIs is difficult to predict.

}

/// A Unicode encoding form that translates between Unicode scalar values and
Expand All @@ -58,6 +48,7 @@ public enum UnicodeDecodingResult: Equatable {
/// UTF-8, UTF-16, and UTF-32 encoding schemes as the `UTF8`, `UTF16`, and
/// `UTF32` types, respectively. Use the `Unicode.Scalar` type to work with
/// decoded Unicode scalar values.
@available(swift, deprecated: 100000, message: "[SE-0163] Use the Unicode.Encoding APIs")
public protocol UnicodeCodec: Unicode.Encoding {

/// Creates an instance of the codec.
Expand Down Expand Up @@ -139,6 +130,7 @@ public protocol UnicodeCodec: Unicode.Encoding {

/// A codec for translating between Unicode scalar values and UTF-8 code
/// units.
@available(swift, deprecated: 100000, message: "[SE-0163] Use the Unicode.Encoding APIs")
extension Unicode.UTF8: UnicodeCodec {
/// Creates an instance of the UTF-8 codec.
@inlinable
Expand Down Expand Up @@ -276,6 +268,9 @@ extension Unicode.UTF8: UnicodeCodec {
if _fastPath(s == 0) { return }
processCodeUnit(UInt8(truncatingIfNeeded: s) &- 0x01)
}
}

extension Unicode.UTF8 {
Comment on lines +271 to +273
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The non-deprecated APIs could be moved into UTF8.swift:

  • Unicode.UTF8.isContinuation(_:)
  • Unicode.UTF8._nullCodeUnitOffset(in:)
  • Unicode.UTF8._decodeOne(_:) (used in UnicodeLongTest.swift)

The deprecated APIs could be moved into MigrationSupport.swift:

  • UnicodeDecodingResult enum,
  • UnicodeCodec protocol and conformances.

The unused APIs could be moved into LegacyABI.swift:

  • Unicode.UTF16._decodeOne(_:)
  • transcode(_:_:_:_:stopOnError:) (unavailable since Swift 3).


/// Returns a Boolean value indicating whether the specified code unit is a
/// UTF-8 continuation byte.
Expand Down Expand Up @@ -316,6 +311,7 @@ extension Unicode.UTF8: UnicodeCodec {

/// A codec for translating between Unicode scalar values and UTF-16 code
/// units.
@available(swift, deprecated: 100000, message: "[SE-0163] Use the Unicode.Encoding APIs")
extension Unicode.UTF16: UnicodeCodec {
/// Creates an instance of the UTF-16 codec.
@inlinable
Expand Down Expand Up @@ -428,6 +424,7 @@ extension Unicode.UTF16: UnicodeCodec {

/// A codec for translating between Unicode scalar values and UTF-32 code
/// units.
@available(swift, deprecated: 100000, message: "[SE-0163] Use the Unicode.Encoding APIs")
extension Unicode.UTF32: UnicodeCodec {
/// Creates an instance of the UTF-32 codec.
@inlinable
Expand Down Expand Up @@ -643,6 +640,7 @@ extension Unicode.Scalar {
}
}

@available(swift, deprecated: 100000, message: "[SE-0163] Use the Unicode.Encoding APIs")
extension UnicodeCodec {
@inlinable
public static func _nullCodeUnitOffset(
Expand Down