diff --git a/Package.swift b/Package.swift index cedb5599b..08f9024c2 100644 --- a/Package.swift +++ b/Package.swift @@ -37,6 +37,7 @@ let availabilityMacros: [SwiftSetting] = versionNumbers.flatMap { version in let featureSettings: [SwiftSetting] = [ .enableExperimentalFeature("StrictConcurrency"), + .enableExperimentalFeature("ImportMacroAliases"), .enableUpcomingFeature("InferSendableFromCaptures"), .enableUpcomingFeature("MemberImportVisibility") ] diff --git a/Sources/FoundationEssentials/FileManager/FileOperations+Enumeration.swift b/Sources/FoundationEssentials/FileManager/FileOperations+Enumeration.swift index 1d497f8c4..f8a4aa3f1 100644 --- a/Sources/FoundationEssentials/FileManager/FileOperations+Enumeration.swift +++ b/Sources/FoundationEssentials/FileManager/FileOperations+Enumeration.swift @@ -117,6 +117,7 @@ import Darwin #elseif canImport(Android) @preconcurrency import Android import posix_filesystem.dirent +internal import _FoundationCShims #elseif canImport(Glibc) @preconcurrency import Glibc internal import _FoundationCShims diff --git a/Sources/FoundationInternationalization/CMakeLists.txt b/Sources/FoundationInternationalization/CMakeLists.txt index 7edec0fb4..eff8efc0f 100644 --- a/Sources/FoundationInternationalization/CMakeLists.txt +++ b/Sources/FoundationInternationalization/CMakeLists.txt @@ -30,6 +30,7 @@ add_subdirectory(TimeZone) target_compile_options(FoundationInternationalization PRIVATE "SHELL:$<$:-Xfrontend -enable-experimental-feature -Xfrontend AccessLevelOnImport>" + "SHELL:$<$:-Xfrontend -enable-experimental-feature -Xfrontend ImportMacroAliases>" "SHELL:$<$:-Xfrontend -enable-experimental-feature -Xfrontend StrictConcurrency>" "SHELL:$<$:-Xfrontend -enable-upcoming-feature -Xfrontend InferSendableFromCaptures>" "SHELL:$<$:-Xfrontend -enable-upcoming-feature -Xfrontend MemberImportVisibility>") diff --git a/Sources/FoundationInternationalization/Formatting/Number/ICUNumberFormatter.swift b/Sources/FoundationInternationalization/Formatting/Number/ICUNumberFormatter.swift index ed288d189..a9dbcffb0 100644 --- a/Sources/FoundationInternationalization/Formatting/Number/ICUNumberFormatter.swift +++ b/Sources/FoundationInternationalization/Formatting/Number/ICUNumberFormatter.swift @@ -159,7 +159,7 @@ internal class ICUNumberFormatterBase : @unchecked Sendable { // MARK: - class FormatResult { - var result: OpaquePointer + var result: OpaquePointer? init(formatter: OpaquePointer, value: Int64) throws { var status = U_ZERO_ERROR @@ -188,7 +188,9 @@ internal class ICUNumberFormatterBase : @unchecked Sendable { var str = value.description #endif // FOUNDATION_FRAMEWORK str.withUTF8 { - unumf_formatDecimal(formatter, $0.baseAddress, Int32($0.count), result, &status) + $0.withMemoryRebound(to: CChar.self) { + unumf_formatDecimal(formatter, $0.baseAddress, Int32($0.count), result, &status) + } } try status.checkSuccess() } @@ -200,7 +202,9 @@ internal class ICUNumberFormatterBase : @unchecked Sendable { var value = value value.withUTF8 { - unumf_formatDecimal(formatter, $0.baseAddress, Int32($0.count), result, &status) + $0.withMemoryRebound(to: CChar.self) { + unumf_formatDecimal(formatter, $0.baseAddress, Int32($0.count), result, &status) + } } try status.checkSuccess() diff --git a/Sources/FoundationInternationalization/ICU/ICU+CaseMap.swift b/Sources/FoundationInternationalization/ICU/ICU+CaseMap.swift index 92263377c..6b92cc687 100644 --- a/Sources/FoundationInternationalization/ICU/ICU+CaseMap.swift +++ b/Sources/FoundationInternationalization/ICU/ICU+CaseMap.swift @@ -18,7 +18,7 @@ import FoundationEssentials extension ICU { final class CaseMap : @unchecked Sendable { - let casemap: OpaquePointer + let casemap: OpaquePointer? let lock: LockedState diff --git a/Sources/FoundationInternationalization/ICU/ICU+FieldPositer.swift b/Sources/FoundationInternationalization/ICU/ICU+FieldPositer.swift index 995598a0c..7d7028476 100644 --- a/Sources/FoundationInternationalization/ICU/ICU+FieldPositer.swift +++ b/Sources/FoundationInternationalization/ICU/ICU+FieldPositer.swift @@ -14,7 +14,7 @@ internal import _FoundationICU extension ICU { final class FieldPositer { - let positer: OpaquePointer + let positer: OpaquePointer? internal init() throws { var status = U_ZERO_ERROR diff --git a/Sources/FoundationInternationalization/ICU/ICU+Foundation.swift b/Sources/FoundationInternationalization/ICU/ICU+Foundation.swift index 3f43f47e7..1d48f8ce3 100644 --- a/Sources/FoundationInternationalization/ICU/ICU+Foundation.swift +++ b/Sources/FoundationInternationalization/ICU/ICU+Foundation.swift @@ -29,7 +29,10 @@ internal struct ICUError: Error, CustomDebugStringConvertible { } var debugDescription: String { - String(validatingUTF8: u_errorName(code)) ?? "Unknown ICU error \(code.rawValue)" + guard let error = u_errorName(code) else { + return "Unknown ICU error \(code.rawValue)" + } + return String(cString: error) } #if canImport(os) diff --git a/Sources/FoundationInternationalization/ICU/ICU+StringConverter.swift b/Sources/FoundationInternationalization/ICU/ICU+StringConverter.swift index bafc448df..b675b77cd 100644 --- a/Sources/FoundationInternationalization/ICU/ICU+StringConverter.swift +++ b/Sources/FoundationInternationalization/ICU/ICU+StringConverter.swift @@ -75,7 +75,7 @@ extension ICU.StringConverter { converter, dest, capacity, - src.baseAddress, + src.baseAddress?.assumingMemoryBound(to: CChar.self), srcLength, &status ) @@ -85,7 +85,7 @@ extension ICU.StringConverter { } func encode(string: String, allowLossyConversion lossy: Bool) -> Data? { - return _converter.withLock { (converter) -> Data? in + return self._converter.withLock { (converter) -> Data? in defer { ucnv_resetFromUnicode(converter) } @@ -117,7 +117,7 @@ extension ICU.StringConverter { ucnv_setFromUCallBack( converter, - UCNV_FROM_U_CALLBACK_SUBSTITUTE, + { UCNV_FROM_U_CALLBACK_SUBSTITUTE($0, $1, $2, $3, $4, $5, $6) }, nil, // newContext nil, // oldAction nil, // oldContext @@ -127,7 +127,7 @@ extension ICU.StringConverter { } else { ucnv_setFromUCallBack( converter, - UCNV_FROM_U_CALLBACK_STOP, + { UCNV_FROM_U_CALLBACK_STOP($0, $1, $2, $3, $4, $5, $6) }, nil, // newContext nil, // oldAction nil, // oldContext @@ -138,7 +138,7 @@ extension ICU.StringConverter { let actualLength = ucnv_fromUChars( converter, - dest, + dest.assumingMemoryBound(to: CChar.self), CInt(capacity), uchars.baseAddress, CInt(srcLength), diff --git a/Sources/FoundationInternationalization/Locale/Locale+Components_ICU.swift b/Sources/FoundationInternationalization/Locale/Locale+Components_ICU.swift index b257b65a8..5d461acba 100644 --- a/Sources/FoundationInternationalization/Locale/Locale+Components_ICU.swift +++ b/Sources/FoundationInternationalization/Locale/Locale+Components_ICU.swift @@ -216,7 +216,11 @@ extension Locale.Region { return nil } - guard let code = String(validatingUTF8: uregion_getRegionCode(containingRegion)) else { + guard let region = uregion_getRegionCode(containingRegion) else { + return nil + } + + guard let code = String(validatingUTF8: region) else { return nil } @@ -236,7 +240,11 @@ extension Locale.Region { return nil } - guard let code = String(validatingUTF8: uregion_getRegionCode(containingContinent)) else { + guard let region = uregion_getRegionCode(containingContinent) else { + return nil + } + + guard let code = String(validatingUTF8: region) else { return nil } @@ -445,7 +453,11 @@ extension Locale.Region { return nil } - guard let code = String(validatingCString: uregion_getRegionCode(containing)) else { + guard let region = uregion_getRegionCode(containing) else { + return nil + } + + guard let code = String(validatingCString: region) else { return nil } @@ -599,8 +611,8 @@ extension Locale.NumberingSystem { var status = U_ZERO_ERROR let numberingSystem = unumsys_open(localeIdentifier, &status) defer { unumsys_close(numberingSystem) } - if let numberingSystem, status.isSuccess { - self.init(String(cString: unumsys_getName(numberingSystem))) + if let numberingSystem, status.isSuccess, let name = unumsys_getName(numberingSystem) { + self.init(String(cString: name)) } else { self = .latn } diff --git a/Sources/FoundationInternationalization/Locale/Locale_ICU.swift b/Sources/FoundationInternationalization/Locale/Locale_ICU.swift index ca9b86e43..0707881e5 100644 --- a/Sources/FoundationInternationalization/Locale/Locale_ICU.swift +++ b/Sources/FoundationInternationalization/Locale/Locale_ICU.swift @@ -1543,7 +1543,8 @@ extension Locale { var working = Set() let localeCount = uloc_countAvailable() for locale in 0..