1
1
mirror of https://github.com/github/semantic.git synced 2024-12-21 13:51:44 +03:00
semantic/prototype/doubt-swift/main.swift

109 lines
2.9 KiB
Swift
Raw Normal View History

import Doubt
import SourceKittenFramework
let arguments = BoundsCheckedArray(array: Process.arguments)
public protocol StringConvertible {
init(string: String)
}
extension String: StringConvertible {
public init(string: String) {
self = string
}
}
2015-10-07 03:38:00 +03:00
extension Info: StringConvertible {
public init(string: String) {
self = .Literal(string, [])
}
}
private struct Bail: ErrorType {}
2015-10-07 03:39:57 +03:00
extension Fix where A: StringConvertible {
2015-10-07 03:53:35 +03:00
/// Constructs a term representing `JSON`.
init?(JSON: Doubt.JSON) {
func bail<B>() throws -> B {
throw Bail()
}
do {
switch JSON {
case let .Dictionary(d) where d["key.name"] != nil:
let name = d["key.name"]?.string ?? ""
let substructure = d["key.substructure"]?.array ?? []
let kind = d["key.kind"]?.string
switch kind {
case
2015-10-07 03:43:27 +03:00
.Some("source.lang.swift.decl.class"),
.Some("source.lang.swift.decl.extension"),
.Some("source.lang.swift.decl.enum"),
2015-10-07 04:01:53 +03:00
.Some("source.lang.swift.decl.struct"),
.Some("source.lang.swift.decl.protocol"):
2015-10-07 03:45:50 +03:00
self = .In(.Indexed([ .In(.Leaf(A(string: name))), .In(.Indexed(try substructure.map { try Fix(JSON: $0) ?? bail() })) ]))
case .Some("source.lang.swift.decl.enumelement"):
fallthrough
case
2015-10-07 03:43:27 +03:00
.Some("source.lang.swift.decl.function.method.instance"),
.Some("source.lang.swift.decl.function.free"):
2015-10-07 03:45:50 +03:00
self = .In(.Indexed([ .In(.Leaf(A(string: name))), .In(.Indexed(try substructure.map { try Fix(JSON: $0) ?? bail() })) ]))
case
2015-10-07 03:43:27 +03:00
.Some("source.lang.swift.decl.var.instance"),
.Some("source.lang.swift.decl.var.static"):
2015-10-07 03:43:02 +03:00
self = .In(.Leaf(A(string: name)))
default:
return nil
}
case let .Dictionary(d) where d["key.kind"]?.string == "source.lang.swift.decl.enumcase" && d["key.substructure"]?.array?.count == 1:
let substructure = d["key.substructure"]?.array ?? []
2015-10-07 03:39:57 +03:00
self = try Fix(JSON: substructure[0]) ?? bail()
case let .Dictionary(d) where d["key.kind"]?.string == "source.lang.swift.syntaxtype.comment.mark":
2015-10-07 03:43:23 +03:00
self = .In(.Leaf(A(string: "mark")))
default:
return nil
}
} catch _ {
return nil
}
}
2015-10-07 03:53:35 +03:00
/// Constructs a term representing the `JSON` in a file at `path`.
init?(path: String, JSON: Doubt.JSON) {
func bail<B>() throws -> B {
throw Bail()
}
do {
switch JSON.dictionary?["key.substructure"] {
case let .Some(.Array(a)):
2015-10-07 03:45:50 +03:00
self = .In(.Indexed(try a.map { try Fix(JSON: $0) ?? bail() }))
default:
return nil
}
} catch _ {
return nil
}
}
init?(path: String) {
2015-09-24 00:01:09 +03:00
guard path != "/dev/null" else {
return nil
2015-09-24 00:01:09 +03:00
}
guard let term = File(path: path)
.map(Structure.init)
.map({ $0.dictionary })
.map(toAnyObject)
2015-10-09 17:02:31 +03:00
.flatMap({ Doubt.JSON(object: $0).flatMap { Fix(path: path, JSON: $0) } }) else { return nil }
self = term
}
}
2015-10-07 03:39:51 +03:00
if let a = arguments[1].flatMap({ Fix<Info>(path: $0) }), b = arguments[2].flatMap({ Fix<Info>(path: $0) }) {
print(Algorithm<Info, Free<Info, Patch<Info>>>(a, b).evaluate())
}