Skip to content

Commit 371e210

Browse files
authored
Merge pull request #490 from jpsim/nn-add-SourceKitObject
Add `SourceKitObject` that represents `sourcekitd_object_t` in Swift
2 parents 0035dc1 + 651cc16 commit 371e210

File tree

9 files changed

+332
-99
lines changed

9 files changed

+332
-99
lines changed

CHANGELOG.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,18 @@
22

33
##### Breaking
44

5-
* None.
5+
* Change type of parameter from `sourcekitd_object_t` to `SourceKitObject?`.
6+
- `File.process(dictionary:cursorInfoRequest:syntaxMap:)`
7+
- `Request.customRequest(request:)`
8+
- `SwiftDocs.init(file:dictionary:cursorInfoRequest:)`
9+
[Norio Nomura](https://github.com/norio-nomura)
610

711
##### Enhancements
812

13+
* Add `SourceKitObject` that represents `sourcekitd_object_t` in Swift.
14+
[Norio Nomura](https://github.com/norio-nomura)
15+
[#489](https://github.com/jpsim/SourceKitten/issues/489)
16+
917
* Replaced linear index search with binary search in NSString extension.
1018
[Tamas Lustyik](https://github.com/lvsti)
1119

Source/SourceKittenFramework/File.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ public final class File {
191191
- parameter dictionary: Dictionary to process.
192192
- parameter cursorInfoRequest: Cursor.Info request to get declaration information.
193193
*/
194-
public func process(dictionary: [String: SourceKitRepresentable], cursorInfoRequest: sourcekitd_object_t? = nil,
194+
public func process(dictionary: [String: SourceKitRepresentable], cursorInfoRequest: SourceKitObject? = nil,
195195
syntaxMap: SyntaxMap? = nil) -> [String: SourceKitRepresentable] {
196196
var dictionary = dictionary
197197
if let cursorInfoRequest = cursorInfoRequest {
@@ -233,7 +233,7 @@ public final class File {
233233
- parameter cursorInfoRequest: Cursor.Info request to get declaration information.
234234
*/
235235
internal func furtherProcess(dictionary: [String: SourceKitRepresentable], documentedTokenOffsets: [Int],
236-
cursorInfoRequest: sourcekitd_object_t,
236+
cursorInfoRequest: SourceKitObject,
237237
syntaxMap: SyntaxMap) -> [String: SourceKitRepresentable] {
238238
var dictionary = dictionary
239239
let offsetMap = makeOffsetMap(documentedTokenOffsets: documentedTokenOffsets, dictionary: dictionary)
@@ -261,7 +261,7 @@ public final class File {
261261
`processDictionary(_:cursorInfoRequest:syntaxMap:)` on its elements, only keeping comment marks
262262
and declarations.
263263
*/
264-
private func newSubstructure(_ dictionary: [String: SourceKitRepresentable], cursorInfoRequest: sourcekitd_object_t?,
264+
private func newSubstructure(_ dictionary: [String: SourceKitRepresentable], cursorInfoRequest: SourceKitObject?,
265265
syntaxMap: SyntaxMap?) -> [SourceKitRepresentable]? {
266266
return SwiftDocKey.getSubstructure(dictionary)?
267267
.filter(isDeclarationOrCommentMark)
@@ -277,7 +277,7 @@ public final class File {
277277
- parameter cursorInfoRequest: Cursor.Info request to get declaration information.
278278
*/
279279
private func dictWithCommentMarkNamesCursorInfo(_ dictionary: [String: SourceKitRepresentable],
280-
cursorInfoRequest: sourcekitd_object_t) -> [String: SourceKitRepresentable]? {
280+
cursorInfoRequest: SourceKitObject) -> [String: SourceKitRepresentable]? {
281281
guard let kind = SwiftDocKey.getKind(dictionary) else {
282282
return nil
283283
}

Source/SourceKittenFramework/Request.swift

Lines changed: 74 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,8 @@ public enum Request {
195195
case editorOpen(file: File)
196196
/// A `cursorinfo` request for an offset in the given file, using the `arguments` given.
197197
case cursorInfo(file: String, offset: Int64, arguments: [String])
198-
/// A custom request by passing in the sourcekitd_object_t directly.
199-
case customRequest(request: sourcekitd_object_t)
198+
/// A custom request by passing in the `SourceKitObject` directly.
199+
case customRequest(request: SourceKitObject)
200200
/// A request generated by sourcekit using the yaml representation.
201201
case yamlRequest(yaml: String)
202202
/// A `codecomplete` request by passing in the file name, contents, offset
@@ -217,45 +217,42 @@ public enum Request {
217217
/// A documentation request for the given module.
218218
case moduleInfo(module: String, arguments: [String])
219219

220-
fileprivate var sourcekitObject: sourcekitd_object_t {
221-
let dict: [sourcekitd_uid_t: sourcekitd_object_t?]
220+
fileprivate var sourcekitObject: SourceKitObject {
222221
switch self {
223222
case .editorOpen(let file):
224223
if let path = file.path {
225-
dict = [
226-
sourcekitd_uid_get_from_cstr("key.request")!: sourcekitd_request_uid_create(sourcekitd_uid_get_from_cstr("source.request.editor.open")!),
227-
sourcekitd_uid_get_from_cstr("key.name")!: sourcekitd_request_string_create(path),
228-
sourcekitd_uid_get_from_cstr("key.sourcefile")!: sourcekitd_request_string_create(path)
224+
return [
225+
"key.request": UID("source.request.editor.open"),
226+
"key.name": path,
227+
"key.sourcefile": path
229228
]
230229
} else {
231-
dict = [
232-
sourcekitd_uid_get_from_cstr("key.request")!: sourcekitd_request_uid_create(sourcekitd_uid_get_from_cstr("source.request.editor.open")!),
233-
sourcekitd_uid_get_from_cstr("key.name")!: sourcekitd_request_string_create(String(file.contents.hash)),
234-
sourcekitd_uid_get_from_cstr("key.sourcetext")!: sourcekitd_request_string_create(file.contents)
230+
return [
231+
"key.request": UID("source.request.editor.open"),
232+
"key.name": String(file.contents.hash),
233+
"key.sourcetext": file.contents
235234
]
236235
}
237236
case .cursorInfo(let file, let offset, let arguments):
238-
var compilerargs = arguments.map({ sourcekitd_request_string_create($0) })
239-
dict = [
240-
sourcekitd_uid_get_from_cstr("key.request")!: sourcekitd_request_uid_create(sourcekitd_uid_get_from_cstr("source.request.cursorinfo")!),
241-
sourcekitd_uid_get_from_cstr("key.name")!: sourcekitd_request_string_create(file),
242-
sourcekitd_uid_get_from_cstr("key.sourcefile")!: sourcekitd_request_string_create(file),
243-
sourcekitd_uid_get_from_cstr("key.offset")!: sourcekitd_request_int64_create(offset),
244-
sourcekitd_uid_get_from_cstr("key.compilerargs")!: sourcekitd_request_array_create(&compilerargs, compilerargs.count)
237+
return [
238+
"key.request": UID("source.request.cursorinfo"),
239+
"key.name": file,
240+
"key.sourcefile": file,
241+
"key.offset": offset,
242+
"key.compilerargs": arguments
245243
]
246244
case .customRequest(let request):
247245
return request
248246
case .yamlRequest(let yaml):
249-
return sourcekitd_request_create_from_yaml(yaml, nil)!
247+
return .init(sourcekitd_request_create_from_yaml(yaml, nil)!)
250248
case .codeCompletionRequest(let file, let contents, let offset, let arguments):
251-
var compilerargs = arguments.map({ sourcekitd_request_string_create($0) })
252-
dict = [
253-
sourcekitd_uid_get_from_cstr("key.request")!: sourcekitd_request_uid_create(sourcekitd_uid_get_from_cstr("source.request.codecomplete")!),
254-
sourcekitd_uid_get_from_cstr("key.name")!: sourcekitd_request_string_create(file),
255-
sourcekitd_uid_get_from_cstr("key.sourcefile")!: sourcekitd_request_string_create(file),
256-
sourcekitd_uid_get_from_cstr("key.sourcetext")!: sourcekitd_request_string_create(contents),
257-
sourcekitd_uid_get_from_cstr("key.offset")!: sourcekitd_request_int64_create(offset),
258-
sourcekitd_uid_get_from_cstr("key.compilerargs")!: sourcekitd_request_array_create(&compilerargs, compilerargs.count)
249+
return [
250+
"key.request": UID("source.request.codecomplete"),
251+
"key.name": file,
252+
"key.sourcefile": file,
253+
"key.sourcetext": contents,
254+
"key.offset": offset,
255+
"key.compilerargs": arguments
259256
]
260257
case .interface(let file, let uuid, var arguments):
261258
if !arguments.contains("-x") {
@@ -264,70 +261,58 @@ public enum Request {
264261
if !arguments.contains("-isysroot") {
265262
arguments.append(contentsOf: ["-isysroot", sdkPath()])
266263
}
267-
var compilerargs = ([file] + arguments).map({ sourcekitd_request_string_create($0) })
268-
dict = [
269-
sourcekitd_uid_get_from_cstr("key.request")!:
270-
sourcekitd_request_uid_create(sourcekitd_uid_get_from_cstr("source.request.editor.open.interface.header")!),
271-
sourcekitd_uid_get_from_cstr("key.name")!: sourcekitd_request_string_create(uuid),
272-
sourcekitd_uid_get_from_cstr("key.filepath")!: sourcekitd_request_string_create(file),
273-
sourcekitd_uid_get_from_cstr("key.compilerargs")!: sourcekitd_request_array_create(&compilerargs, compilerargs.count)
264+
return [
265+
"key.request": UID("source.request.editor.open.interface.header"),
266+
"key.name": uuid,
267+
"key.filepath": file,
268+
"key.compilerargs": [file] + arguments
274269
]
275270
case .findUSR(let file, let usr):
276-
dict = [
277-
sourcekitd_uid_get_from_cstr("key.request")!: sourcekitd_request_uid_create(sourcekitd_uid_get_from_cstr("source.request.editor.find_usr")!),
278-
sourcekitd_uid_get_from_cstr("key.usr")!: sourcekitd_request_string_create(usr),
279-
sourcekitd_uid_get_from_cstr("key.sourcefile")!: sourcekitd_request_string_create(file)
271+
return [
272+
"key.request": UID("source.request.editor.find_usr"),
273+
"key.usr": usr,
274+
"key.sourcefile": file
280275
]
281276
case .index(let file, let arguments):
282-
var compilerargs = arguments.map({ sourcekitd_request_string_create($0) })
283-
dict = [
284-
sourcekitd_uid_get_from_cstr("key.request")!: sourcekitd_request_uid_create(sourcekitd_uid_get_from_cstr("source.request.indexsource")!),
285-
sourcekitd_uid_get_from_cstr("key.sourcefile")!: sourcekitd_request_string_create(file),
286-
sourcekitd_uid_get_from_cstr("key.compilerargs")!: sourcekitd_request_array_create(&compilerargs, compilerargs.count)
277+
return [
278+
"key.request": UID("source.request.indexsource"),
279+
"key.sourcefile": file,
280+
"key.compilerargs": arguments
287281
]
288282
case .format(let file, let line, let useTabs, let indentWidth):
289-
let formatOptions = [
290-
sourcekitd_uid_get_from_cstr("key.editor.format.indentwidth")!: sourcekitd_request_int64_create(indentWidth),
291-
sourcekitd_uid_get_from_cstr("key.editor.format.tabwidth")!: sourcekitd_request_int64_create(indentWidth),
292-
sourcekitd_uid_get_from_cstr("key.editor.format.usetabs")!: sourcekitd_request_int64_create(useTabs ? 1 : 0)
293-
]
294-
var formatOptionsKeys = Array(formatOptions.keys.map({ $0 as sourcekitd_uid_t? }))
295-
var formatOptionsValues = Array(formatOptions.values)
296-
dict = [
297-
sourcekitd_uid_get_from_cstr("key.request")!: sourcekitd_request_uid_create(sourcekitd_uid_get_from_cstr("source.request.editor.formattext")!),
298-
sourcekitd_uid_get_from_cstr("key.name")!: sourcekitd_request_string_create(file),
299-
sourcekitd_uid_get_from_cstr("key.line")!: sourcekitd_request_int64_create(line),
300-
sourcekitd_uid_get_from_cstr("key.editor.format.options")!:
301-
sourcekitd_request_dictionary_create(&formatOptionsKeys, &formatOptionsValues, formatOptions.count)
283+
return [
284+
"key.request": UID("source.request.editor.formattext"),
285+
"key.name": file,
286+
"key.line": line,
287+
"key.editor.format.options": [
288+
"key.editor.format.indentwidth": indentWidth,
289+
"key.editor.format.tabwidth": indentWidth,
290+
"key.editor.format.usetabs": useTabs ? 1 : 0
291+
]
302292
]
303293
case .replaceText(let file, let offset, let length, let sourceText):
304-
dict = [
305-
sourcekitd_uid_get_from_cstr("key.request")!: sourcekitd_request_uid_create(sourcekitd_uid_get_from_cstr("source.request.editor.replacetext")!),
306-
sourcekitd_uid_get_from_cstr("key.name")!: sourcekitd_request_string_create(file),
307-
sourcekitd_uid_get_from_cstr("key.offset")!: sourcekitd_request_int64_create(offset),
308-
sourcekitd_uid_get_from_cstr("key.length")!: sourcekitd_request_int64_create(length),
309-
sourcekitd_uid_get_from_cstr("key.sourcetext")!: sourcekitd_request_string_create(sourceText)
294+
return [
295+
"key.request": UID("source.request.editor.replacetext"),
296+
"key.name": file,
297+
"key.offset": offset,
298+
"key.length": length,
299+
"key.sourcetext": sourceText
310300
]
311301
case .docInfo(let text, let arguments):
312-
var compilerargs = arguments.map({ sourcekitd_request_string_create($0) })
313-
dict = [
314-
sourcekitd_uid_get_from_cstr("key.request")!: sourcekitd_request_uid_create(sourcekitd_uid_get_from_cstr("source.request.docinfo")!),
315-
sourcekitd_uid_get_from_cstr("key.name")!: sourcekitd_request_string_create(NSUUID().uuidString),
316-
sourcekitd_uid_get_from_cstr("key.compilerargs")!: sourcekitd_request_array_create(&compilerargs, compilerargs.count),
317-
sourcekitd_uid_get_from_cstr("key.sourcetext")!: sourcekitd_request_string_create(text)
302+
return [
303+
"key.request": UID("source.request.docinfo"),
304+
"key.name": NSUUID().uuidString,
305+
"key.compilerargs": arguments,
306+
"key.sourcetext": text
318307
]
319308
case .moduleInfo(let module, let arguments):
320-
var compilerargs = arguments.map({ sourcekitd_request_string_create($0) })
321-
dict = [
322-
sourcekitd_uid_get_from_cstr("key.request")!: sourcekitd_request_uid_create(sourcekitd_uid_get_from_cstr("source.request.docinfo")!),
323-
sourcekitd_uid_get_from_cstr("key.name")!: sourcekitd_request_string_create(NSUUID().uuidString),
324-
sourcekitd_uid_get_from_cstr("key.compilerargs")!: sourcekitd_request_array_create(&compilerargs, compilerargs.count),
325-
sourcekitd_uid_get_from_cstr("key.modulename")!: sourcekitd_request_string_create(module)
309+
return [
310+
"key.request": UID("source.request.docinfo"),
311+
"key.name": NSUUID().uuidString,
312+
"key.compilerargs": arguments,
313+
"key.modulename": module
326314
]
327315
}
328-
var keys = Array(dict.keys.map({ $0 as sourcekitd_uid_t? }))
329-
var values = Array(dict.values)
330-
return sourcekitd_request_dictionary_create(&keys, &values, dict.count)!
331316
}
332317

333318
/**
@@ -338,7 +323,7 @@ public enum Request {
338323

339324
- returns: sourcekitd_object_t representation of the Request, if successful.
340325
*/
341-
internal static func cursorInfoRequest(filePath: String?, arguments: [String]) -> sourcekitd_object_t? {
326+
internal static func cursorInfoRequest(filePath: String?, arguments: [String]) -> SourceKitObject? {
342327
if let path = filePath {
343328
return Request.cursorInfo(file: path, offset: 0, arguments: arguments).sourcekitObject
344329
}
@@ -353,11 +338,11 @@ public enum Request {
353338

354339
- returns: SourceKit response if successful.
355340
*/
356-
internal static func send(cursorInfoRequest: sourcekitd_object_t, atOffset offset: Int64) -> [String: SourceKitRepresentable]? {
341+
internal static func send(cursorInfoRequest: SourceKitObject, atOffset offset: Int64) -> [String: SourceKitRepresentable]? {
357342
if offset == 0 {
358343
return nil
359344
}
360-
sourcekitd_request_dictionary_set_int64(cursorInfoRequest, sourcekitd_uid_get_from_cstr(SwiftDocKey.offset.rawValue)!, offset)
345+
cursorInfoRequest.updateValue(offset, forKey: SwiftDocKey.offset)
361346
return try? Request.customRequest(request: cursorInfoRequest).send()
362347
}
363348

@@ -369,7 +354,7 @@ public enum Request {
369354
*/
370355
public func send() throws -> [String: SourceKitRepresentable] {
371356
initializeSourceKitFailable
372-
let response = sourcekitd_send_request_sync(sourcekitObject)
357+
let response = sourcekitd_send_request_sync(sourcekitObject.sourcekitdObject!)
373358
defer { sourcekitd_response_dispose(response!) }
374359
if sourcekitd_response_is_error(response!) {
375360
let error = Request.Error(response: response!)
@@ -432,20 +417,16 @@ public enum Request {
432417

433418
extension Request: CustomStringConvertible {
434419
/// A textual representation of `Request`.
435-
public var description: String { return String(validatingUTF8: sourcekitd_request_description_copy(sourcekitObject)!)! }
420+
public var description: String { return sourcekitObject.description }
436421
}
437422

438423
private func interfaceForModule(_ module: String, compilerArguments: [String]) throws -> [String: SourceKitRepresentable] {
439-
var compilerargs = compilerArguments.map { sourcekitd_request_string_create($0) }
440-
let dict = [
441-
sourcekitd_uid_get_from_cstr("key.request")!: sourcekitd_request_uid_create(sourcekitd_uid_get_from_cstr("source.request.editor.open.interface")!),
442-
sourcekitd_uid_get_from_cstr("key.name")!: sourcekitd_request_string_create(NSUUID().uuidString),
443-
sourcekitd_uid_get_from_cstr("key.compilerargs")!: sourcekitd_request_array_create(&compilerargs, compilerargs.count),
444-
sourcekitd_uid_get_from_cstr("key.modulename")!: sourcekitd_request_string_create("SourceKittenFramework.\(module)")
445-
]
446-
var keys = Array(dict.keys.map({ $0 as sourcekitd_uid_t? }))
447-
var values = Array(dict.values)
448-
return try Request.customRequest(request: sourcekitd_request_dictionary_create(&keys, &values, dict.count)!).send()
424+
return try Request.customRequest(request: [
425+
"key.request": UID("source.request.editor.open.interface"),
426+
"key.name": NSUUID().uuidString,
427+
"key.compilerargs": compilerArguments,
428+
"key.modulename": "SourceKittenFramework.\(module)"
429+
]).send()
449430
}
450431

451432
extension String {

0 commit comments

Comments
 (0)