Skip to content

Commit b8ec951

Browse files
committed
FoundationEssentials,FoundationInternationalization: adjust for aliasing
When enabling symbol renaming in ICU, we import the functions as an alias. This causes the implicit nullability translation with C to disappear. Make these conversions explicit so that we can enable symbol renaming on non-Darwin platforms.
1 parent 1d5d709 commit b8ec951

File tree

9 files changed

+35
-12
lines changed

9 files changed

+35
-12
lines changed

Package.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ let availabilityMacros: [SwiftSetting] = versionNumbers.flatMap { version in
3737

3838
let featureSettings: [SwiftSetting] = [
3939
.enableExperimentalFeature("StrictConcurrency"),
40+
.enableExperimentalFeature("ImportMacroAliases"),
4041
.enableUpcomingFeature("InferSendableFromCaptures"),
4142
.enableUpcomingFeature("MemberImportVisibility")
4243
]

Sources/FoundationEssentials/FileManager/FileOperations+Enumeration.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ import Darwin
117117
#elseif canImport(Android)
118118
@preconcurrency import Android
119119
import posix_filesystem.dirent
120+
internal import _FoundationCShims
120121
#elseif canImport(Glibc)
121122
@preconcurrency import Glibc
122123
internal import _FoundationCShims

Sources/FoundationInternationalization/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ add_subdirectory(TimeZone)
3030

3131
target_compile_options(FoundationInternationalization PRIVATE
3232
"SHELL:$<$<COMPILE_LANGUAGE:Swift>:-Xfrontend -enable-experimental-feature -Xfrontend AccessLevelOnImport>"
33+
"SHELL:$<$<COMPILE_LANGUAGE:Swift>:-Xfrontend -enable-experimental-feature -Xfrontend ImportMacroAliases>"
3334
"SHELL:$<$<COMPILE_LANGUAGE:Swift>:-Xfrontend -enable-experimental-feature -Xfrontend StrictConcurrency>"
3435
"SHELL:$<$<COMPILE_LANGUAGE:Swift>:-Xfrontend -enable-upcoming-feature -Xfrontend InferSendableFromCaptures>"
3536
"SHELL:$<$<COMPILE_LANGUAGE:Swift>:-Xfrontend -enable-upcoming-feature -Xfrontend MemberImportVisibility>")

Sources/FoundationInternationalization/Formatting/Number/ICUNumberFormatter.swift

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ internal class ICUNumberFormatterBase : @unchecked Sendable {
159159
// MARK: -
160160

161161
class FormatResult {
162-
var result: OpaquePointer
162+
var result: OpaquePointer?
163163

164164
init(formatter: OpaquePointer, value: Int64) throws {
165165
var status = U_ZERO_ERROR
@@ -188,7 +188,9 @@ internal class ICUNumberFormatterBase : @unchecked Sendable {
188188
var str = value.description
189189
#endif // FOUNDATION_FRAMEWORK
190190
str.withUTF8 {
191-
unumf_formatDecimal(formatter, $0.baseAddress, Int32($0.count), result, &status)
191+
$0.withMemoryRebound(to: CChar.self) {
192+
unumf_formatDecimal(formatter, $0.baseAddress, Int32($0.count), result, &status)
193+
}
192194
}
193195
try status.checkSuccess()
194196
}
@@ -200,7 +202,9 @@ internal class ICUNumberFormatterBase : @unchecked Sendable {
200202

201203
var value = value
202204
value.withUTF8 {
203-
unumf_formatDecimal(formatter, $0.baseAddress, Int32($0.count), result, &status)
205+
$0.withMemoryRebound(to: CChar.self) {
206+
unumf_formatDecimal(formatter, $0.baseAddress, Int32($0.count), result, &status)
207+
}
204208
}
205209

206210
try status.checkSuccess()

Sources/FoundationInternationalization/ICU/ICU+CaseMap.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import FoundationEssentials
1818

1919
extension ICU {
2020
final class CaseMap : @unchecked Sendable {
21-
let casemap: OpaquePointer
21+
let casemap: OpaquePointer?
2222

2323
let lock: LockedState<Void>
2424

Sources/FoundationInternationalization/ICU/ICU+FieldPositer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ internal import _FoundationICU
1414

1515
extension ICU {
1616
final class FieldPositer {
17-
let positer: OpaquePointer
17+
let positer: OpaquePointer?
1818

1919
internal init() throws {
2020
var status = U_ZERO_ERROR

Sources/FoundationInternationalization/ICU/ICU+Foundation.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ internal struct ICUError: Error, CustomDebugStringConvertible {
2929
}
3030

3131
var debugDescription: String {
32-
String(validatingUTF8: u_errorName(code)) ?? "Unknown ICU error \(code.rawValue)"
32+
guard let error = u_errorName(code) else {
33+
return "Unknown ICU error \(code.rawValue)"
34+
}
35+
return String(cString: error)
3336
}
3437

3538
#if canImport(os)

Sources/FoundationInternationalization/Locale/Locale+Components_ICU.swift

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,11 @@ extension Locale.Region {
216216
return nil
217217
}
218218

219-
guard let code = String(validatingUTF8: uregion_getRegionCode(containingRegion)) else {
219+
guard let region = uregion_getRegionCode(containingRegion) else {
220+
return nil
221+
}
222+
223+
guard let code = String(validatingUTF8: region) else {
220224
return nil
221225
}
222226

@@ -236,7 +240,11 @@ extension Locale.Region {
236240
return nil
237241
}
238242

239-
guard let code = String(validatingUTF8: uregion_getRegionCode(containingContinent)) else {
243+
guard let region = uregion_getRegionCode(containingContinent) else {
244+
return nil
245+
}
246+
247+
guard let code = String(validatingUTF8: region) else {
240248
return nil
241249
}
242250

@@ -445,7 +453,11 @@ extension Locale.Region {
445453
return nil
446454
}
447455

448-
guard let code = String(validatingCString: uregion_getRegionCode(containing)) else {
456+
guard let region = uregion_getRegionCode(containing) else {
457+
return nil
458+
}
459+
460+
guard let code = String(validatingCString: region) else {
449461
return nil
450462
}
451463

@@ -599,8 +611,8 @@ extension Locale.NumberingSystem {
599611
var status = U_ZERO_ERROR
600612
let numberingSystem = unumsys_open(localeIdentifier, &status)
601613
defer { unumsys_close(numberingSystem) }
602-
if let numberingSystem, status.isSuccess {
603-
self.init(String(cString: unumsys_getName(numberingSystem)))
614+
if let numberingSystem, status.isSuccess, let name = unumsys_getName(numberingSystem) {
615+
self.init(String(cString: name))
604616
} else {
605617
self = .latn
606618
}

Sources/FoundationInternationalization/Locale/Locale_ICU.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1543,7 +1543,8 @@ extension Locale {
15431543
var working = Set<String>()
15441544
let localeCount = uloc_countAvailable()
15451545
for locale in 0..<localeCount {
1546-
let localeID = String(cString: uloc_getAvailable(locale))
1546+
guard let name = uloc_getAvailable(locale) else { continue }
1547+
let localeID = String(cString: name)
15471548
working.insert(localeID)
15481549
}
15491550
return Array(working)

0 commit comments

Comments
 (0)