//===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2019 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 // //===----------------------------------------------------------------------===// extension Range where Bound == Position { /// Create a range for a single position. public init(_ pos: Position) { self = pos..`, for use with `CustomCodable`. public struct PositionRange: CustomCodableWrapper { public var wrappedValue: Range public init(wrappedValue: Range) { self.wrappedValue = wrappedValue } fileprivate enum CodingKeys: String, CodingKey { case lowerBound = "start" case upperBound = "end" } public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) let lhs = try container.decode(Position.self, forKey: .lowerBound) let rhs = try container.decode(Position.self, forKey: .upperBound) self.wrappedValue = lhs..>`, for use with `CustomCodable`. public struct PositionRangeArray: CustomCodableWrapper { public var wrappedValue: [Range] public init(wrappedValue: [Range]) { self.wrappedValue = wrappedValue } public init(from decoder: Decoder) throws { var values: [Range] = [] var arrayContainer = try decoder.unkeyedContainer() values.reserveCapacity(arrayContainer.count ?? 1) while !arrayContainer.isAtEnd { let range = try arrayContainer.decode(PositionRange.self) values.append(range.wrappedValue) } self.wrappedValue = values } public func encode(to encoder: Encoder) throws { var arrayContainer = encoder.unkeyedContainer() for rangeValue in wrappedValue { try arrayContainer.encode(PositionRange(wrappedValue: rangeValue)) } } } extension Range: LSPAnyCodable where Bound == Position { public init?(fromLSPDictionary dictionary: [String: LSPAny]) { guard case .dictionary(let start)? = dictionary[PositionRange.CodingKeys.lowerBound.stringValue], let startPosition = Position(fromLSPDictionary: start), case .dictionary(let end)? = dictionary[PositionRange.CodingKeys.upperBound.stringValue], let endPosition = Position(fromLSPDictionary: end) else { return nil } self = startPosition.. LSPAny { return .dictionary([ PositionRange.CodingKeys.lowerBound.stringValue: lowerBound.encodeToLSPAny(), PositionRange.CodingKeys.upperBound.stringValue: upperBound.encodeToLSPAny(), ]) } }