diff --git a/Sources/XCBuildSupport/PIF.swift b/Sources/XCBuildSupport/PIF.swift index 3a319e7bb6d..504a865c436 100644 --- a/Sources/XCBuildSupport/PIF.swift +++ b/Sources/XCBuildSupport/PIF.swift @@ -12,6 +12,7 @@ import Basics import Foundation +import OrderedCollections import PackageModel import struct TSCBasic.ByteString @@ -1011,10 +1012,10 @@ public enum PIF { } } - public private(set) var platformSpecificSingleValueSettings = [Platform: [SingleValueSetting: String]]() - public private(set) var platformSpecificMultipleValueSettings = [Platform: [MultipleValueSetting: [String]]]() - public private(set) var singleValueSettings: [SingleValueSetting: String] = [:] - public private(set) var multipleValueSettings: [MultipleValueSetting: [String]] = [:] + public private(set) var platformSpecificSingleValueSettings = OrderedDictionary>() + public private(set) var platformSpecificMultipleValueSettings = OrderedDictionary>() + public private(set) var singleValueSettings: OrderedDictionary = [:] + public private(set) var multipleValueSettings: OrderedDictionary = [:] public subscript(_ setting: SingleValueSetting) -> String? { get { singleValueSettings[setting] } @@ -1108,10 +1109,10 @@ public enum PIF { public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - platformSpecificSingleValueSettings = try container.decodeIfPresent([Platform: [SingleValueSetting: String]].self, forKey: .platformSpecificSingleValueSettings) ?? .init() - platformSpecificMultipleValueSettings = try container.decodeIfPresent([Platform: [MultipleValueSetting: [String]]].self, forKey: .platformSpecificMultipleValueSettings) ?? .init() - singleValueSettings = try container.decodeIfPresent([SingleValueSetting: String].self, forKey: .singleValueSettings) ?? [:] - multipleValueSettings = try container.decodeIfPresent([MultipleValueSetting: [String]] .self, forKey: .multipleValueSettings) ?? [:] + platformSpecificSingleValueSettings = try container.decodeIfPresent(OrderedDictionary>.self, forKey: .platformSpecificSingleValueSettings) ?? .init() + platformSpecificMultipleValueSettings = try container.decodeIfPresent(OrderedDictionary>.self, forKey: .platformSpecificMultipleValueSettings) ?? .init() + singleValueSettings = try container.decodeIfPresent(OrderedDictionary.self, forKey: .singleValueSettings) ?? [:] + multipleValueSettings = try container.decodeIfPresent(OrderedDictionary.self, forKey: .multipleValueSettings) ?? [:] } } } diff --git a/Tests/XCBuildSupportTests/PIFTests.swift b/Tests/XCBuildSupportTests/PIFTests.swift index 8867c0fabb3..a0ec28a2187 100644 --- a/Tests/XCBuildSupportTests/PIFTests.swift +++ b/Tests/XCBuildSupportTests/PIFTests.swift @@ -213,10 +213,6 @@ class PIFTests: XCTestCase { ) func testRoundTrip() throws { - // FIXME: Disabled because we need to store build settings in - // sorted dictionary in order to get deterministic output - // when encoding (SR-12587). - #if false let encoder = JSONEncoder.makeWithDefaults() if #available(macOS 10.13, *) { encoder.outputFormatting = [.sortedKeys, .prettyPrinted] @@ -233,7 +229,6 @@ class PIFTests: XCTestCase { let decodedString = String(decoding: decodedPIF, as: UTF8.self) XCTAssertEqual(originalString, decodedString) - #endif } func testEncodable() throws {