Skip to content

Commit 4269e90

Browse files
authored
Merge pull request #1056 from ahoppen/ahoppen/sourcekitd-functions
Rename `sourcekitd_` to `sourcekitd_api_` and add nullability annotations to sourcekit_functions.h
2 parents cc4327d + f5fb23a commit 4269e90

25 files changed

+903
-747
lines changed

Sources/Csourcekitd/include/sourcekitd_functions.h

Lines changed: 254 additions & 101 deletions
Large diffs are not rendered by default.

Sources/Diagnose/SourceKitD+RunWithYaml.swift

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,16 @@ extension SourceKitD {
1818
public func run(requestYaml: String) async throws -> SKDResponse {
1919
let request = try requestYaml.cString(using: .utf8)?.withUnsafeBufferPointer { buffer in
2020
var error: UnsafeMutablePointer<CChar>?
21-
let req = api.request_create_from_yaml(buffer.baseAddress, &error)
21+
let req = api.request_create_from_yaml(buffer.baseAddress!, &error)
2222
if let error {
2323
throw ReductionError("Failed to parse sourcekitd request from YAML: \(String(cString: error))")
2424
}
25-
precondition(req != nil)
2625
return req
2726
}
2827
return await withCheckedContinuation { continuation in
29-
var handle: sourcekitd_request_handle_t? = nil
30-
api.send_request(request, &handle) { resp in
31-
continuation.resume(returning: SKDResponse(resp, sourcekitd: self))
28+
var handle: sourcekitd_api_request_handle_t? = nil
29+
api.send_request(request!, &handle) { response in
30+
continuation.resume(returning: SKDResponse(response!, sourcekitd: self))
3231
}
3332
}
3433
}

Sources/Diagnose/SourcekitdRequestCommand.swift

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,25 @@ public struct SourceKitdRequestCommand: AsyncParsableCommand {
3939

4040
public func run() async throws {
4141
let requestString = try String(contentsOf: URL(fileURLWithPath: sourcekitdRequestPath))
42-
let sourcekitd = try SourceKitDImpl.getOrCreate(dylibPath: try! AbsolutePath(validating: sourcekitdPath))
43-
let response = try await sourcekitd.run(requestYaml: requestString)
42+
43+
let sourcekitd = try SourceKitDImpl.getOrCreate(
44+
dylibPath: try! AbsolutePath(validating: sourcekitdPath)
45+
)
46+
47+
let request = try requestString.cString(using: .utf8)!.withUnsafeBufferPointer { buffer in
48+
var error: UnsafeMutablePointer<CChar>?
49+
let req = sourcekitd.api.request_create_from_yaml(buffer.baseAddress!, &error)!
50+
if let error {
51+
throw ReductionError("Failed to parse sourcekitd request from JSON: \(String(cString: error))")
52+
}
53+
return req
54+
}
55+
let response: SKDResponse = await withCheckedContinuation { continuation in
56+
var handle: sourcekitd_api_request_handle_t? = nil
57+
sourcekitd.api.send_request(request, &handle) { resp in
58+
continuation.resume(returning: SKDResponse(resp!, sourcekitd: sourcekitd))
59+
}
60+
}
4461

4562
switch response.error {
4663
case .requestFailed, .requestInvalid, .requestCancelled, .missingRequiredSymbol:

Sources/SourceKitD/SKDRequestArray.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ extension SourceKitD {
3232
}
3333

3434
public final class SKDRequestArray {
35-
public let array: sourcekitd_object_t?
35+
public let array: sourcekitd_api_object_t
3636
public let sourcekitd: SourceKitD
3737

38-
public init(_ array: sourcekitd_object_t? = nil, sourcekitd: SourceKitD) {
39-
self.array = array ?? sourcekitd.api.request_array_create(nil, 0)
38+
public init(_ array: sourcekitd_api_object_t? = nil, sourcekitd: SourceKitD) {
39+
self.array = array ?? sourcekitd.api.request_array_create(nil, 0)!
4040
self.sourcekitd = sourcekitd
4141
}
4242

@@ -50,15 +50,15 @@ public final class SKDRequestArray {
5050
sourcekitd.api.request_array_set_string(array, -1, newValue)
5151
case let newValue as Int:
5252
sourcekitd.api.request_array_set_int64(array, -1, Int64(newValue))
53-
case let newValue as sourcekitd_uid_t:
53+
case let newValue as sourcekitd_api_uid_t:
5454
sourcekitd.api.request_array_set_uid(array, -1, newValue)
5555
case let newValue as SKDRequestDictionary:
5656
sourcekitd.api.request_array_set_value(array, -1, newValue.dict)
5757
case let newValue as SKDRequestArray:
5858
sourcekitd.api.request_array_set_value(array, -1, newValue.array)
5959
case let newValue as Array<SKDRequestValue>:
6060
self.append(sourcekitd.array(newValue))
61-
case let newValue as Dictionary<sourcekitd_uid_t, SKDRequestValue>:
61+
case let newValue as Dictionary<sourcekitd_api_uid_t, SKDRequestValue>:
6262
self.append(sourcekitd.dictionary(newValue))
6363
case let newValue as Optional<SKDRequestValue>:
6464
if let newValue {

Sources/SourceKitD/SKDRequestDictionary.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,16 @@ public protocol SKDRequestValue {}
3131

3232
extension String: SKDRequestValue {}
3333
extension Int: SKDRequestValue {}
34-
extension sourcekitd_uid_t: SKDRequestValue {}
34+
extension sourcekitd_api_uid_t: SKDRequestValue {}
3535
extension SKDRequestDictionary: SKDRequestValue {}
3636
extension SKDRequestArray: SKDRequestValue {}
3737
extension Array<SKDRequestValue>: SKDRequestValue {}
38-
extension Dictionary<sourcekitd_uid_t, SKDRequestValue>: SKDRequestValue {}
38+
extension Dictionary<sourcekitd_api_uid_t, SKDRequestValue>: SKDRequestValue {}
3939
extension Optional: SKDRequestValue where Wrapped: SKDRequestValue {}
4040

4141
extension SourceKitD {
4242
/// Create a `SKDRequestDictionary` from the given dictionary.
43-
public func dictionary(_ dict: [sourcekitd_uid_t: SKDRequestValue]) -> SKDRequestDictionary {
43+
public func dictionary(_ dict: [sourcekitd_api_uid_t: SKDRequestValue]) -> SKDRequestDictionary {
4444
let result = SKDRequestDictionary(sourcekitd: self)
4545
for (key, value) in dict {
4646
result.set(key, to: value)
@@ -50,33 +50,33 @@ extension SourceKitD {
5050
}
5151

5252
public final class SKDRequestDictionary {
53-
public let dict: sourcekitd_object_t?
53+
public let dict: sourcekitd_api_object_t
5454
public let sourcekitd: SourceKitD
5555

56-
public init(_ dict: sourcekitd_object_t? = nil, sourcekitd: SourceKitD) {
57-
self.dict = dict ?? sourcekitd.api.request_dictionary_create(nil, nil, 0)
56+
public init(_ dict: sourcekitd_api_object_t? = nil, sourcekitd: SourceKitD) {
57+
self.dict = dict ?? sourcekitd.api.request_dictionary_create(nil, nil, 0)!
5858
self.sourcekitd = sourcekitd
5959
}
6060

6161
deinit {
6262
sourcekitd.api.request_release(dict)
6363
}
6464

65-
public func set(_ key: sourcekitd_uid_t, to newValue: SKDRequestValue) {
65+
public func set(_ key: sourcekitd_api_uid_t, to newValue: SKDRequestValue) {
6666
switch newValue {
6767
case let newValue as String:
6868
sourcekitd.api.request_dictionary_set_string(dict, key, newValue)
6969
case let newValue as Int:
7070
sourcekitd.api.request_dictionary_set_int64(dict, key, Int64(newValue))
71-
case let newValue as sourcekitd_uid_t:
71+
case let newValue as sourcekitd_api_uid_t:
7272
sourcekitd.api.request_dictionary_set_uid(dict, key, newValue)
7373
case let newValue as SKDRequestDictionary:
7474
sourcekitd.api.request_dictionary_set_value(dict, key, newValue.dict)
7575
case let newValue as SKDRequestArray:
7676
sourcekitd.api.request_dictionary_set_value(dict, key, newValue.array)
7777
case let newValue as Array<SKDRequestValue>:
7878
self.set(key, to: sourcekitd.array(newValue))
79-
case let newValue as Dictionary<sourcekitd_uid_t, SKDRequestValue>:
79+
case let newValue as Dictionary<sourcekitd_api_uid_t, SKDRequestValue>:
8080
self.set(key, to: sourcekitd.dictionary(newValue))
8181
case let newValue as Optional<SKDRequestValue>:
8282
if let newValue {

Sources/SourceKitD/SKDResponse.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ import CRT
2222
#endif
2323

2424
public final class SKDResponse {
25-
public let response: sourcekitd_response_t?
25+
public let response: sourcekitd_api_response_t
2626
public let sourcekitd: SourceKitD
2727

28-
public init(_ response: sourcekitd_response_t?, sourcekitd: SourceKitD) {
28+
public init(_ response: sourcekitd_api_response_t, sourcekitd: SourceKitD) {
2929
self.response = response
3030
self.sourcekitd = sourcekitd
3131
}
@@ -39,10 +39,10 @@ public final class SKDResponse {
3939
return nil
4040
}
4141
switch sourcekitd.api.response_error_get_kind(response) {
42-
case SOURCEKITD_ERROR_CONNECTION_INTERRUPTED: return .connectionInterrupted
43-
case SOURCEKITD_ERROR_REQUEST_INVALID: return .requestInvalid(description)
44-
case SOURCEKITD_ERROR_REQUEST_FAILED: return .requestFailed(description)
45-
case SOURCEKITD_ERROR_REQUEST_CANCELLED: return .requestCancelled
42+
case SOURCEKITD_API_ERROR_CONNECTION_INTERRUPTED: return .connectionInterrupted
43+
case SOURCEKITD_API_ERROR_REQUEST_INVALID: return .requestInvalid(description)
44+
case SOURCEKITD_API_ERROR_REQUEST_FAILED: return .requestFailed(description)
45+
case SOURCEKITD_API_ERROR_REQUEST_CANCELLED: return .requestCancelled
4646
default: return .requestFailed(description)
4747
}
4848
}

Sources/SourceKitD/SKDResponseArray.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ import CRT
2121
#endif
2222

2323
public final class SKDResponseArray {
24-
public let array: sourcekitd_variant_t
24+
public let array: sourcekitd_api_variant_t
2525
let resp: SKDResponse
2626

2727
public var sourcekitd: SourceKitD { return resp.sourcekitd }
2828

29-
public init(_ array: sourcekitd_variant_t, response: SKDResponse) {
29+
public init(_ array: sourcekitd_api_variant_t, response: SKDResponse) {
3030
self.array = array
3131
self.resp = response
3232
}
@@ -46,7 +46,7 @@ public final class SKDResponseArray {
4646

4747
/// If the `applier` returns `false`, iteration terminates.
4848
@discardableResult
49-
public func forEachUID(_ applier: (Int, sourcekitd_uid_t) throws -> Bool) rethrows -> Bool {
49+
public func forEachUID(_ applier: (Int, sourcekitd_api_uid_t) throws -> Bool) rethrows -> Bool {
5050
for i in 0..<count {
5151
if let uid = sourcekitd.api.variant_array_get_uid(array, i), try !applier(i, uid) {
5252
return false

Sources/SourceKitD/SKDResponseDictionary.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,41 +21,41 @@ import CRT
2121
#endif
2222

2323
public final class SKDResponseDictionary {
24-
public let dict: sourcekitd_variant_t
24+
public let dict: sourcekitd_api_variant_t
2525
let resp: SKDResponse
2626

2727
public var sourcekitd: SourceKitD { return resp.sourcekitd }
2828

29-
public init(_ dict: sourcekitd_variant_t, response: SKDResponse) {
29+
public init(_ dict: sourcekitd_api_variant_t, response: SKDResponse) {
3030
self.dict = dict
3131
self.resp = response
3232
}
3333

34-
public subscript(key: sourcekitd_uid_t?) -> String? {
34+
public subscript(key: sourcekitd_api_uid_t) -> String? {
3535
return sourcekitd.api.variant_dictionary_get_string(dict, key).map(String.init(cString:))
3636
}
37-
public subscript(key: sourcekitd_uid_t?) -> Int? {
37+
public subscript(key: sourcekitd_api_uid_t) -> Int? {
3838
let value = sourcekitd.api.variant_dictionary_get_value(dict, key)
39-
if sourcekitd.api.variant_get_type(value) == SOURCEKITD_VARIANT_TYPE_INT64 {
39+
if sourcekitd.api.variant_get_type(value) == SOURCEKITD_API_VARIANT_TYPE_INT64 {
4040
return Int(sourcekitd.api.variant_int64_get_value(value))
4141
} else {
4242
return nil
4343
}
4444
}
45-
public subscript(key: sourcekitd_uid_t?) -> Bool? {
45+
public subscript(key: sourcekitd_api_uid_t) -> Bool? {
4646
let value = sourcekitd.api.variant_dictionary_get_value(dict, key)
47-
if sourcekitd.api.variant_get_type(value) == SOURCEKITD_VARIANT_TYPE_BOOL {
47+
if sourcekitd.api.variant_get_type(value) == SOURCEKITD_API_VARIANT_TYPE_BOOL {
4848
return sourcekitd.api.variant_bool_get_value(value)
4949
} else {
5050
return nil
5151
}
5252
}
53-
public subscript(key: sourcekitd_uid_t?) -> sourcekitd_uid_t? {
53+
public subscript(key: sourcekitd_api_uid_t) -> sourcekitd_api_uid_t? {
5454
return sourcekitd.api.variant_dictionary_get_uid(dict, key)
5555
}
56-
public subscript(key: sourcekitd_uid_t?) -> SKDResponseArray? {
56+
public subscript(key: sourcekitd_api_uid_t) -> SKDResponseArray? {
5757
let value = sourcekitd.api.variant_dictionary_get_value(dict, key)
58-
if sourcekitd.api.variant_get_type(value) == SOURCEKITD_VARIANT_TYPE_ARRAY {
58+
if sourcekitd.api.variant_get_type(value) == SOURCEKITD_API_VARIANT_TYPE_ARRAY {
5959
return SKDResponseArray(value, response: resp)
6060
} else {
6161
return nil

Sources/SourceKitD/SourceKitD.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,16 @@ import SKSupport
2626
/// `deinit` or by wrapping an existing sourcekitd session that outlives this object.
2727
public protocol SourceKitD: AnyObject {
2828
/// The sourcekitd API functions.
29-
var api: sourcekitd_functions_t { get }
29+
var api: sourcekitd_api_functions_t { get }
3030

3131
/// Convenience for accessing known keys.
32-
var keys: sourcekitd_keys { get }
32+
var keys: sourcekitd_api_keys { get }
3333

3434
/// Convenience for accessing known keys.
35-
var requests: sourcekitd_requests { get }
35+
var requests: sourcekitd_api_requests { get }
3636

3737
/// Convenience for accessing known keys.
38-
var values: sourcekitd_values { get }
38+
var values: sourcekitd_api_values { get }
3939

4040
/// Adds a new notification handler, which will be weakly referenced.
4141
func addNotificationHandler(_ handler: SKDNotificationHandler)
@@ -77,9 +77,9 @@ extension SourceKitD {
7777
let signposterState = signposter.beginInterval("sourcekitd-request", id: signpostID, "Start")
7878

7979
let sourcekitdResponse: SKDResponse = try await withCancellableCheckedThrowingContinuation { continuation in
80-
var handle: sourcekitd_request_handle_t? = nil
81-
api.send_request(req.dict, &handle) { _resp in
82-
continuation.resume(returning: SKDResponse(_resp, sourcekitd: self))
80+
var handle: sourcekitd_api_request_handle_t? = nil
81+
api.send_request(req.dict, &handle) { response in
82+
continuation.resume(returning: SKDResponse(response!, sourcekitd: self))
8383
}
8484
return handle
8585
} cancel: { handle in

Sources/SourceKitD/SourceKitDImpl.swift

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,29 +29,23 @@ public final class SourceKitDImpl: SourceKitD {
2929
let dylib: DLHandle
3030

3131
/// The sourcekitd API functions.
32-
public let api: sourcekitd_functions_t
32+
public let api: sourcekitd_api_functions_t
3333

3434
/// Convenience for accessing known keys.
35-
public let keys: sourcekitd_keys
35+
public let keys: sourcekitd_api_keys
3636

3737
/// Convenience for accessing known keys.
38-
public let requests: sourcekitd_requests
38+
public let requests: sourcekitd_api_requests
3939

4040
/// Convenience for accessing known keys.
41-
public let values: sourcekitd_values
41+
public let values: sourcekitd_api_values
4242

4343
/// Lock protecting private state.
4444
let lock: NSLock = NSLock()
4545

4646
/// List of notification handlers that will be called for each notification.
4747
private var _notificationHandlers: [WeakSKDNotificationHandler] = []
4848

49-
var notificationHandlers: [SKDNotificationHandler] {
50-
lock.withLock {
51-
_notificationHandlers.compactMap { $0.value }
52-
}
53-
}
54-
5549
public static func getOrCreate(dylibPath: AbsolutePath) throws -> SourceKitD {
5650
try SourceKitDRegistry.shared
5751
.getOrAdd(dylibPath, create: { try SourceKitDImpl(dylib: dylibPath) })
@@ -64,14 +58,14 @@ public final class SourceKitDImpl: SourceKitD {
6458
#else
6559
self.dylib = try dlopen(path.pathString, mode: [.lazy, .local, .first])
6660
#endif
67-
self.api = try sourcekitd_functions_t(self.dylib)
68-
self.keys = sourcekitd_keys(api: self.api)
69-
self.requests = sourcekitd_requests(api: self.api)
70-
self.values = sourcekitd_values(api: self.api)
61+
self.api = try sourcekitd_api_functions_t(self.dylib)
62+
self.keys = sourcekitd_api_keys(api: self.api)
63+
self.requests = sourcekitd_api_requests(api: self.api)
64+
self.values = sourcekitd_api_values(api: self.api)
7165

7266
self.api.initialize()
7367
self.api.set_notification_handler { [weak self] rawResponse in
74-
guard let self = self else { return }
68+
guard let self, let rawResponse else { return }
7569
let handlers = self.lock.withLock { self._notificationHandlers.compactMap(\.value) }
7670

7771
let response = SKDResponse(rawResponse, sourcekitd: self)

0 commit comments

Comments
 (0)