1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2024 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
//
//===----------------------------------------------------------------------===//
import Csourcekitd
import SourceKitD
extension SourceKitD {
nonisolated func responseArray(_ array: [SKDResponseValue]) -> SKDResponseArrayBuilder {
let result = SKDResponseArrayBuilder(sourcekitd: self)
for element in array {
result.append(element)
}
return result
}
}
struct SKDResponseArrayBuilder {
/// The `SKDResponse` object that manages the lifetime of the `sourcekitd_response_t`.
private let response: SKDResponse
var value: sourcekitd_api_response_t { response.value }
private var sourcekitd: SourceKitD { response.sourcekitd }
init(sourcekitd: SourceKitD) {
response = .init(
takingUnderlyingResponse: sourcekitd.servicePluginApi.response_array_create(nil, 0),
sourcekitd: sourcekitd
)
}
func append(_ newValue: SKDResponseValue) {
switch newValue {
case let newValue as String:
sourcekitd.servicePluginApi.response_array_set_string(value, -1, newValue)
case is Bool:
preconditionFailure("Arrays of bools are not supported")
case let newValue as Int:
sourcekitd.servicePluginApi.response_array_set_int64(value, -1, Int64(newValue))
case let newValue as Int64:
sourcekitd.servicePluginApi.response_array_set_int64(value, -1, newValue)
case let newValue as Double:
sourcekitd.servicePluginApi.response_array_set_double(value, -1, newValue)
case let newValue as sourcekitd_api_uid_t:
sourcekitd.servicePluginApi.response_array_set_uid(value, -1, newValue)
case let newValue as SKDResponseDictionaryBuilder:
sourcekitd.servicePluginApi.response_array_set_value(value, -1, newValue.value)
case let newValue as SKDResponseArrayBuilder:
sourcekitd.servicePluginApi.response_array_set_value(value, -1, newValue.value)
case let newValue as Array<SKDResponseValue>:
self.append(sourcekitd.responseArray(newValue))
case let newValue as Dictionary<sourcekitd_api_uid_t, SKDResponseValue>:
self.append(sourcekitd.responseDictionary(newValue))
case let newValue as Optional<SKDResponseValue>:
if let newValue {
self.append(newValue)
}
default:
preconditionFailure("Unknown type conforming to SKDRequestValue")
}
}
}
|