//===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project // // 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 // //===----------------------------------------------------------------------===// package import Csourcekitd #if canImport(Darwin) import Darwin #elseif canImport(Glibc) import Glibc #elseif canImport(Musl) import Musl #elseif canImport(CRT) import CRT #elseif canImport(Bionic) import Bionic #endif package final class SKDResponseArray: Sendable { private let array: sourcekitd_api_variant_t private let resp: SKDResponse package var sourcekitd: SourceKitD { return resp.sourcekitd } package init(_ array: sourcekitd_api_variant_t, response: SKDResponse) { self.array = array self.resp = response } package var count: Int { return sourcekitd.api.variant_array_get_count(array) } /// If the `applier` returns `false`, iteration terminates. @discardableResult package func forEach(_ applier: (Int, SKDResponseDictionary) throws -> Bool) rethrows -> Bool { for i in 0.. Bool) rethrows -> Bool { for i in 0..(_ transform: (SKDResponseDictionary) throws -> T) rethrows -> [T] { var result: [T] = [] result.reserveCapacity(self.count) // swift-format-ignore: ReplaceForEachWithForLoop // Reference is to `SKDResponseArray.forEach`, not `Array.forEach`. try self.forEach { _, element in result.append(try transform(element)) return true } return result } package func compactMap(_ transform: (SKDResponseDictionary) throws -> T?) rethrows -> [T] { var result: [T] = [] // swift-format-ignore: ReplaceForEachWithForLoop // Reference is to `SKDResponseArray.forEach`, not `Array.forEach`. try self.forEach { _, element in if let transformed = try transform(element) { result.append(transformed) } return true } return result } /// Attempt to access the item at `index` as a string. package subscript(index: Int) -> String? { if let cstr = sourcekitd.api.variant_array_get_string(array, index) { return String(cString: cstr) } return nil } public var asStringArray: [String] { var result: [String] = [] for i in 0..