1
1
mirror of https://github.com/github/semantic.git synced 2024-12-19 04:41:47 +03:00
semantic/prototype/doubt-difftool/main.swift

60 lines
1.6 KiB
Swift
Raw Normal View History

import Cocoa
import Darwin
import Doubt
2015-10-27 18:04:39 +03:00
extension TSInput {
init(path: String) {
let file = fopen(path, "r")
self.init(
payload: file,
read_fn: { (payload: UnsafeMutablePointer<Void>, bytesRead: UnsafeMutablePointer<Int>) -> UnsafePointer<Int8> in
2015-10-27 18:45:42 +03:00
errno = 0
2015-10-27 18:27:17 +03:00
var string: UnsafeMutablePointer<Int8> = nil
2015-10-27 18:40:03 +03:00
var capacity = 0
2015-10-27 18:45:42 +03:00
var length = getline(&string, &capacity, UnsafeMutablePointer<FILE>(payload))
if length < 0 {
if errno == 0 { length = 0 }
else {
return nil
}
}
bytesRead.memory = length
2015-10-27 18:27:17 +03:00
return UnsafePointer<Int8>(string)
},
seek_fn: { (payload: UnsafeMutablePointer<Void>, position: TSLength) -> Int32 in
fseek(UnsafeMutablePointer<FILE>(payload), position.bytes, SEEK_CUR) == 0 ? 1 : 0
})
}
}
2015-10-27 18:04:18 +03:00
let arguments = BoundsCheckedArray(array: Process.arguments)
2015-10-27 18:39:51 +03:00
if let a = arguments[1] {
guard NSFileManager.defaultManager().fileExistsAtPath(a) else {
print("\(a): No such file or directory")
exit(1)
}
let a = TSInput(path: a)
2015-10-27 18:04:18 +03:00
let document = ts_document_make()
ts_document_set_language(document, ts_language_javascript())
ts_document_set_input(document, a)
ts_document_parse(document)
let root = ts_document_root_node(document)
2015-10-28 01:07:00 +03:00
2015-10-28 01:13:49 +03:00
let term: Cofree<String, Range<Int>> = Cofree
2015-10-28 01:10:17 +03:00
.ana { node in
2015-10-28 01:20:21 +03:00
let count = ts_node_named_child_count(node)
2015-10-28 01:10:17 +03:00
guard count > 0 else {
return String.fromCString(ts_node_name(node, document)).map(Syntax.Leaf)!
}
2015-10-28 01:20:21 +03:00
return .Indexed((0..<count).map { ts_node_named_child(node, $0) })
2015-10-28 01:10:17 +03:00
} (root)
2015-10-28 01:13:49 +03:00
.map {
let start = ts_node_pos($0).chars
return start..<(start + ts_node_size($0).chars)
}
2015-10-28 01:10:17 +03:00
print(term)
2015-10-28 01:07:00 +03:00
2015-10-27 18:04:18 +03:00
ts_document_free(document)
}