mirror of
https://github.com/github/semantic.git
synced 2024-12-19 12:51:52 +03:00
42 lines
1.3 KiB
Swift
42 lines
1.3 KiB
Swift
import Cocoa
|
|
import Doubt
|
|
import Prelude
|
|
|
|
func readFile(path: String) -> String? {
|
|
guard let data = try? NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding) else { return nil }
|
|
return data as String?
|
|
}
|
|
|
|
typealias Term = Cofree<String, Range<Int>>
|
|
|
|
func termWithInput(string: String) -> Term? {
|
|
let document = ts_document_make()
|
|
defer { ts_document_free(document) }
|
|
return string.withCString {
|
|
ts_document_set_language(document, ts_language_javascript())
|
|
ts_document_set_input_string(document, $0)
|
|
ts_document_parse(document)
|
|
let root = ts_document_root_node(document)
|
|
|
|
return Cofree
|
|
.ana { node in
|
|
let count = ts_node_named_child_count(node)
|
|
guard count > 0 else {
|
|
return String.fromCString(ts_node_name(node, document)).map(Syntax.Leaf)!
|
|
}
|
|
return .Indexed((0..<count).map { ts_node_named_child(node, $0) })
|
|
} (root)
|
|
.map {
|
|
let start = ts_node_pos($0).chars
|
|
return start..<(start + ts_node_size($0).chars)
|
|
}
|
|
}
|
|
}
|
|
|
|
let arguments = BoundsCheckedArray(array: Process.arguments)
|
|
if let aString = arguments[1].flatMap(readFile), bString = arguments[2].flatMap(readFile), c = arguments[3] {
|
|
if let a = termWithInput(aString), b = termWithInput(bString) {
|
|
let diff = Interpreter<Term>(equal: Term.equals(annotation: const(true), leaf: ==), comparable: const(true), cost: Free.sum(Patch.difference)).run(a, b)
|
|
}
|
|
}
|