aboutsummaryrefslogtreecommitdiff
path: root/serialize.go
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-04-28 03:30:19 +0900
committerShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-04-28 16:19:41 +0900
commit8c9d0e3d5b38c8c8b3e3a0f929eed465600076fe (patch)
treece30738867f11e654d55fc212100ee0c455aad27 /serialize.go
parentc8bc731ace04bbe477583ba1154aa29d430a323e (diff)
downloadkati-8c9d0e3d5b38c8c8b3e3a0f929eed465600076fe.tar.gz
Start implementing deserializer
Diffstat (limited to 'serialize.go')
-rw-r--r--serialize.go95
1 files changed, 93 insertions, 2 deletions
diff --git a/serialize.go b/serialize.go
index 1383d1b..7cc792e 100644
--- a/serialize.go
+++ b/serialize.go
@@ -2,6 +2,7 @@ package main
import (
"encoding/json"
+ "fmt"
"os"
)
@@ -20,7 +21,7 @@ type SerializableDepNode struct {
IsOrderOnly bool
IsPhony bool
ActualInputs []string
- TargetSpecificVars Vars
+ TargetSpecificVars map[string]SerializableVar
Filename string
Lineno int
}
@@ -41,6 +42,12 @@ func MakeSerializableDepNodes(nodes []*DepNode, done map[string]bool) (r []*Seri
for _, d := range n.Deps {
deps = append(deps, d.Output)
}
+
+ vars := make(map[string]SerializableVar)
+ for k, v := range n.TargetSpecificVars {
+ vars[k] = v.Serialize()
+ }
+
r = append(r, &SerializableDepNode{
Output: n.Output,
Cmds: n.Cmds,
@@ -49,7 +56,7 @@ func MakeSerializableDepNodes(nodes []*DepNode, done map[string]bool) (r []*Seri
IsOrderOnly: n.IsOrderOnly,
IsPhony: n.IsPhony,
ActualInputs: n.ActualInputs,
- TargetSpecificVars: n.TargetSpecificVars,
+ TargetSpecificVars: vars,
Filename: n.Filename,
Lineno: n.Lineno,
})
@@ -80,3 +87,87 @@ func DumpDepGraphAsJson(nodes []*DepNode, vars Vars, filename string) {
}
f.Write(o)
}
+
+func DeserializeVar(sv SerializableVar) (r Value) {
+ switch sv.Type {
+ case "literal":
+ return literal(sv.V)
+
+ case "simple":
+ return SimpleVar{
+ value: []byte(sv.V),
+ origin: sv.Origin,
+ }
+ case "recursive":
+ return RecursiveVar{
+ expr: DeserializeVar(sv.Children[0]),
+ origin: sv.Origin,
+ }
+ default:
+ panic(fmt.Sprintf("unknown serialized variable type: %q", sv))
+ }
+ return UndefinedVar{}
+}
+
+func DeserializeVars(vars map[string]SerializableVar) (r Vars) {
+ return nil
+}
+
+func DeserializeNodes(nodes []*SerializableDepNode) (r []*DepNode) {
+ nodeMap := make(map[string]*DepNode)
+ for _, n := range nodes {
+ d := &DepNode{
+ Output: n.Output,
+ Cmds: n.Cmds,
+ HasRule: n.HasRule,
+ IsOrderOnly: n.IsOrderOnly,
+ IsPhony: n.IsPhony,
+ ActualInputs: n.ActualInputs,
+ Filename: n.Filename,
+ Lineno: n.Lineno,
+ TargetSpecificVars: make(Vars),
+ }
+
+ for k, v := range n.TargetSpecificVars {
+ d.TargetSpecificVars[k] = TargetSpecificVar{
+ v: DeserializeVar(v.Children[0]).(Var),
+ op: v.Type,
+ }
+ }
+
+ nodeMap[n.Output] = d
+ r = append(r, d)
+ }
+
+ for _, n := range nodes {
+ d := nodeMap[n.Output]
+ for _, o := range n.Deps {
+ c, present := nodeMap[o]
+ if !present {
+ panic(fmt.Sprintf("unknown target: %s", o))
+ }
+ d.Deps = append(d.Deps, c)
+ }
+ }
+
+ return r
+}
+
+func LoadDepGraphFromJson(filename string) ([]*DepNode, Vars) {
+ f, err := os.Open(filename)
+ if err != nil {
+ panic(err)
+ }
+
+ d := json.NewDecoder(f)
+ g := SerializableGraph{ Vars: make(map[string]SerializableVar) }
+ err = d.Decode(&g)
+ if err != nil {
+ panic(err)
+ }
+
+ nodes := DeserializeNodes(g.Nodes)
+ vars := DeserializeVars(g.Vars)
+
+ return nodes, vars
+}