mirror of
https://github.com/github/semantic.git
synced 2024-12-26 00:12:29 +03:00
Term initialization is partial.
This commit is contained in:
parent
0a4dd8111f
commit
975ac8fc2f
@ -36,33 +36,49 @@ public enum Term: CustomDebugStringConvertible, CustomDocConvertible, CustomStri
|
|||||||
// MARK: JSON representation.
|
// MARK: JSON representation.
|
||||||
|
|
||||||
/// Constructs a Term representing the `JSON` in a file at `path`.
|
/// Constructs a Term representing the `JSON` in a file at `path`.
|
||||||
public init(path: String, JSON: Doubt.JSON) {
|
public init?(path: String, JSON: Doubt.JSON) {
|
||||||
|
struct E: ErrorType {}
|
||||||
|
func die<A>() throws -> A {
|
||||||
|
throw E()
|
||||||
|
}
|
||||||
|
do {
|
||||||
switch JSON.dictionary?["key.substructure"] {
|
switch JSON.dictionary?["key.substructure"] {
|
||||||
case let .Some(.Array(a)):
|
case let .Some(.Array(a)):
|
||||||
self = .Roll(.Group(.Roll(.Literal(path)), a.map(Term.init)))
|
self = .Roll(.Group(.Roll(.Literal(path)), try a.map { try Term(JSON: $0) ?? die() }))
|
||||||
default:
|
default:
|
||||||
self = .Empty
|
return nil
|
||||||
|
}
|
||||||
|
} catch _ {
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Constructs a Term representing `JSON`.
|
/// Constructs a Term representing `JSON`.
|
||||||
public init(JSON: Doubt.JSON) {
|
public init?(JSON: Doubt.JSON) {
|
||||||
|
struct E: ErrorType {}
|
||||||
|
func die<A>() throws -> A {
|
||||||
|
throw E()
|
||||||
|
}
|
||||||
|
do {
|
||||||
switch JSON.dictionary {
|
switch JSON.dictionary {
|
||||||
case let .Some(d) where d["key.name"] != nil && d["key.substructure"] != nil:
|
case let .Some(d) where d["key.name"] != nil && d["key.substructure"] != nil:
|
||||||
let name = d["key.name"]?.string ?? ""
|
let name = d["key.name"]?.string ?? ""
|
||||||
let substructure = d["key.substructure"]?.array ?? []
|
let substructure = d["key.substructure"]?.array ?? []
|
||||||
switch d["key.kind"]?.string {
|
switch d["key.kind"]?.string {
|
||||||
case .Some("source.lang.swift.decl.class"), .Some("source.lang.swift.decl.extension"):
|
case .Some("source.lang.swift.decl.class"), .Some("source.lang.swift.decl.extension"):
|
||||||
self = .Group(.Literal(name), substructure.map(Term.init))
|
self = .Group(.Literal(name), try substructure.map { try Term(JSON: $0) ?? die() })
|
||||||
|
|
||||||
case .Some("source.lang.swift.decl.function.method.instance"), .Some("source.lang.swift.decl.function.free"):
|
case .Some("source.lang.swift.decl.function.method.instance"), .Some("source.lang.swift.decl.function.free"):
|
||||||
self = .Assign(name, .Abstract([], substructure.map(Term.init)))
|
self = .Assign(name, .Abstract([], try substructure.map { try Term(JSON: $0) ?? die() }))
|
||||||
|
|
||||||
default:
|
default:
|
||||||
self = .Empty
|
return nil
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
self = .Empty
|
return nil
|
||||||
|
}
|
||||||
|
} catch _ {
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ extension Term {
|
|||||||
.map(Structure.init)
|
.map(Structure.init)
|
||||||
.map({ $0.dictionary })
|
.map({ $0.dictionary })
|
||||||
.map(toAnyObject)
|
.map(toAnyObject)
|
||||||
.flatMap({ JSON(object: $0).map { Term(path: path, JSON: $0) } }) else { return nil }
|
.flatMap({ JSON(object: $0).flatMap { Term(path: path, JSON: $0) } }) else { return nil }
|
||||||
self = term
|
self = term
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user