diff --git a/d2compiler/compile.go b/d2compiler/compile.go index 6bf07ecd7..65d528aac 100644 --- a/d2compiler/compile.go +++ b/d2compiler/compile.go @@ -111,7 +111,7 @@ func (c *compiler) compileBoardsField(g *d2graph.Graph, ir *d2ir.Map, fieldName g2 := d2graph.NewGraph() g2.Parent = g g2.AST = f.Map().AST().(*d2ast.Map) - g2.BaseAST = f.Map().BaseAST().(*d2ast.Map) + g2.BaseAST = findFieldAST(g.AST, f) c.compileBoard(g2, f.Map()) g2.Name = f.Name switch fieldName { @@ -125,6 +125,48 @@ func (c *compiler) compileBoardsField(g *d2graph.Graph, ir *d2ir.Map, fieldName } } +func findFieldAST(ast *d2ast.Map, f *d2ir.Field) *d2ast.Map { + path := []string{} + var curr *d2ir.Field = f + for { + path = append([]string{curr.Name}, path...) + boardKind := d2ir.NodeBoardKind(curr) + if boardKind == "" { + break + } + curr = d2ir.ParentField(curr) + } + + currAST := ast + for len(path) > 0 { + head := path[0] + found := false + for _, n := range currAST.Nodes { + if n.MapKey == nil { + continue + } + if n.MapKey.Key == nil { + continue + } + if len(n.MapKey.Key.Path) != 1 { + continue + } + head2 := n.MapKey.Key.Path[0].Unbox().ScalarString() + if head == head2 { + currAST = n.MapKey.Value.Map + found = true + break + } + } + if !found { + return nil + } + path = path[1:] + } + + return currAST +} + type compiler struct { err *d2parser.ParseError } diff --git a/d2oracle/edit.go b/d2oracle/edit.go index 3548fe881..9cf7e8d4f 100644 --- a/d2oracle/edit.go +++ b/d2oracle/edit.go @@ -26,18 +26,16 @@ func Create(g *d2graph.Graph, boardPath []string, key string) (_ *d2graph.Graph, defer xdefer.Errorf(&err, "failed to create %#v", key) boardG := g - baseBoardG := g + baseAST := g.AST if len(boardPath) > 0 { + // When compiling a nested board, we can read from boardG but only write to baseBoardG boardG = GetBoardGraph(g, boardPath) if boardG == nil { return nil, "", fmt.Errorf("board %v not found", boardPath) } - - baseBoardG, err = recompile(g, boardG.BaseAST) - if err != nil { - return nil, "", err - } + // TODO beter name + baseAST = boardG.BaseAST } newKey, edge, err := generateUniqueKey(boardG, key, nil, nil) @@ -46,13 +44,13 @@ func Create(g *d2graph.Graph, boardPath []string, key string) (_ *d2graph.Graph, } if edge { - err = _set(boardG, baseBoardG, key, nil, nil) + err = _set(boardG, baseAST, key, nil, nil) } else { - err = _set(boardG, baseBoardG, newKey, nil, nil) + err = _set(boardG, baseAST, newKey, nil, nil) } if len(boardPath) > 0 { - replaced := ReplaceBoardNode(g.AST, baseBoardG.AST, boardPath) + replaced := ReplaceBoardNode(g.AST, baseAST, boardPath) if !replaced { return nil, "", fmt.Errorf("board %v AST not found", boardPath) } @@ -61,7 +59,7 @@ func Create(g *d2graph.Graph, boardPath []string, key string) (_ *d2graph.Graph, if err != nil { return nil, "", err } - g, err = recompile(g, g.AST) + g, err = recompile(g.AST) if err != nil { return nil, "", err } @@ -83,12 +81,12 @@ func Set(g *d2graph.Graph, key string, tag, value *string) (_ *d2graph.Graph, er defer xdefer.Errorf(&err, "failed to set %#v to %#v", key, valueHelp) } - err = _set(g, g, key, tag, value) + err = _set(g, g.AST, key, tag, value) if err != nil { return nil, err } - return recompile(g, g.AST) + return recompile(g.AST) } func ReconnectEdge(g *d2graph.Graph, edgeKey string, srcKey, dstKey *string) (_ *d2graph.Graph, err error) { @@ -225,7 +223,7 @@ func ReconnectEdge(g *d2graph.Graph, edgeKey string, srcKey, dstKey *string) (_ } } - return recompile(g, g.AST) + return recompile(g.AST) } func pathFromScopeKey(g *d2graph.Graph, key *d2ast.Key, scopeak []string) ([]*d2ast.StringBox, error) { @@ -257,7 +255,7 @@ func pathFromScopeObj(g *d2graph.Graph, key *d2ast.Key, fromScope *d2graph.Objec return pathFromScopeKey(g, key, scopeak) } -func recompile(g *d2graph.Graph, ast *d2ast.Map) (*d2graph.Graph, error) { +func recompile(ast *d2ast.Map) (*d2graph.Graph, error) { s := d2format.Format(ast) g, err := d2compiler.Compile(ast.Range.Path, strings.NewReader(s), nil) if err != nil { @@ -267,7 +265,7 @@ func recompile(g *d2graph.Graph, ast *d2ast.Map) (*d2graph.Graph, error) { } // TODO merge flat styles -func _set(g, baseG *d2graph.Graph, key string, tag, value *string) error { +func _set(g *d2graph.Graph, baseAST *d2ast.Map, key string, tag, value *string) error { if tag != nil { if hasSpace(*tag) { return fmt.Errorf("spaces are not allowed in blockstring tags") @@ -295,7 +293,7 @@ func _set(g, baseG *d2graph.Graph, key string, tag, value *string) error { }) } - scope := baseG.AST + scope := baseAST edgeTrimCommon(mk) obj := g.Root toSkip := 1 @@ -775,10 +773,10 @@ func Delete(g *d2graph.Graph, key string) (_ *d2graph.Graph, err error) { } } } - return recompile(g, g.AST) + return recompile(g.AST) } - prevG, _ := recompile(g, g.AST) + prevG, _ := recompile(g.AST) g, err = renameConflictsToParent(g, mk.Key) if err != nil { @@ -799,7 +797,7 @@ func Delete(g *d2graph.Graph, key string) (_ *d2graph.Graph, err error) { return nil, err } - return recompile(g, g.AST) + return recompile(g.AST) } func bumpChildrenUnderscores(m *d2ast.Map) { @@ -1038,7 +1036,7 @@ func deleteReserved(g *d2graph.Graph, mk *d2ast.Key) (*d2graph.Graph, error) { if err := deleteEdgeField(g, e, targetKey.Path[len(targetKey.Path)-1].Unbox().ScalarString()); err != nil { return nil, err } - return recompile(g, g.AST) + return recompile(g.AST) } isStyleKey := false @@ -1077,7 +1075,7 @@ func deleteReserved(g *d2graph.Graph, mk *d2ast.Key) (*d2graph.Graph, error) { } } - return recompile(g, g.AST) + return recompile(g.AST) } func deleteMapField(m *d2ast.Map, field string) { @@ -1141,7 +1139,7 @@ func deleteObjField(g *d2graph.Graph, obj *d2graph.Object, field string) error { copy(tmpNodes, ref.Scope.Nodes) // If I delete this, will the object still exist? deleteFromMap(ref.Scope, ref.MapKey) - g2, err := recompile(g, g.AST) + g2, err := recompile(g.AST) if err != nil { return err } @@ -1436,10 +1434,10 @@ func move(g *d2graph.Graph, key, newKey string, includeDescendants bool) (*d2gra ref.MapKey.Edges[ref.MapKeyEdgeIndex].SrcArrow = mk2.Edges[0].SrcArrow ref.MapKey.Edges[ref.MapKeyEdgeIndex].DstArrow = mk2.Edges[0].DstArrow } - return recompile(g, g.AST) + return recompile(g.AST) } - prevG, _ := recompile(g, g.AST) + prevG, _ := recompile(g.AST) ak := d2graph.Key(mk.Key) ak2 := d2graph.Key(mk2.Key) @@ -1845,7 +1843,7 @@ func move(g *d2graph.Graph, key, newKey string, includeDescendants bool) (*d2gra return nil, err } - return recompile(g, g.AST) + return recompile(g.AST) } // filterReserved takes a Value and splits it into 2 @@ -1957,7 +1955,7 @@ func updateNear(prevG, g *d2graph.Graph, from, to *string, includeDescendants bo if err != nil { return err } - tmpG, _ := recompile(prevG, prevG.AST) + tmpG, _ := recompile(prevG.AST) appendMapKey(tmpG.AST, valueMK) if to == nil { deltas, err := DeleteIDDeltas(tmpG, *from) @@ -2002,7 +2000,7 @@ func updateNear(prevG, g *d2graph.Graph, from, to *string, includeDescendants bo if err != nil { return err } - tmpG, _ := recompile(prevG, prevG.AST) + tmpG, _ := recompile(prevG.AST) appendMapKey(tmpG.AST, valueMK) if to == nil { deltas, err := DeleteIDDeltas(tmpG, *from) diff --git a/d2oracle/edit_test.go b/d2oracle/edit_test.go index b01e0f80a..60cb3236e 100644 --- a/d2oracle/edit_test.go +++ b/d2oracle/edit_test.go @@ -479,6 +479,52 @@ layers: { b } } +`, + }, + { + name: "layers-edge", + + text: `a +layers: { + x: { + a + } +} +`, + key: `a -> b`, + boardPath: []string{"root", "layers", "x"}, + + expKey: `(a -> b)[0]`, + exp: `a +layers: { + x: { + a + a -> b + } +} +`, + }, + { + name: "layers-edge-duplicate", + + text: `a -> b +layers: { + x: { + a -> b + } +} +`, + key: `a -> b`, + boardPath: []string{"root", "layers", "x"}, + + expKey: `(a -> b)[1]`, + exp: `a -> b +layers: { + x: { + a -> b + a -> b + } +} `, }, { diff --git a/testdata/d2oracle/TestCreate/edge-dupe.exp.json b/testdata/d2oracle/TestCreate/edge-dupe.exp.json new file mode 100644 index 000000000..444e8a838 --- /dev/null +++ b/testdata/d2oracle/TestCreate/edge-dupe.exp.json @@ -0,0 +1,205 @@ +{ + "graph": { + "name": "", + "isFolderOnly": false, + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/edge-dupe.d2,0:0:0-1:0:7", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/edge-dupe.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/edge-dupe.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/edge-dupe.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge-dupe.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/edge-dupe.d2,0:5:5-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge-dupe.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + "edges": [ + { + "index": 0, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge-dupe.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge-dupe.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + { + "id": "y", + "id_val": "y", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge-dupe.d2,0:5:5-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge-dupe.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/layers-basic.exp.json b/testdata/d2oracle/TestCreate/layers-basic.exp.json index 4fe04884d..c4e489b90 100644 --- a/testdata/d2oracle/TestCreate/layers-basic.exp.json +++ b/testdata/d2oracle/TestCreate/layers-basic.exp.json @@ -259,20 +259,21 @@ ] }, "baseAST": { - "range": ",0:0:0-1:0:0", + "range": "d2/testdata/d2oracle/TestCreate/layers-basic.d2,2:5:17-5:3:34", "nodes": [ { "map_key": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/layers-basic.d2,3:4:23-3:5:24", "key": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/layers-basic.d2,3:4:23-3:5:24", "path": [ { "unquoted_string": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/layers-basic.d2,3:4:23-3:5:24", "value": [ { - "string": "a" + "string": "a", + "raw_string": "a" } ] } @@ -285,16 +286,17 @@ }, { "map_key": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/layers-basic.d2,4:4:29-4:5:30", "key": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/layers-basic.d2,4:4:29-4:5:30", "path": [ { "unquoted_string": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/layers-basic.d2,4:4:29-4:5:30", "value": [ { - "string": "b" + "string": "b", + "raw_string": "b" } ] } diff --git a/testdata/d2oracle/TestCreate/layers-edge-duplicate.exp.json b/testdata/d2oracle/TestCreate/layers-edge-duplicate.exp.json new file mode 100644 index 000000000..566b24360 --- /dev/null +++ b/testdata/d2oracle/TestCreate/layers-edge-duplicate.exp.json @@ -0,0 +1,812 @@ +{ + "graph": { + "name": "", + "isFolderOnly": false, + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,0:0:0-7:0:52", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,0:5:5-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,0:5:5-0:6:6", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,1:0:7-6:1:51", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,1:0:7-1:6:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,1:0:7-1:6:13", + "value": [ + { + "string": "layers", + "raw_string": "layers" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,1:8:15-6:1:51", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,2:2:19-5:3:49", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,2:2:19-2:3:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,2:2:19-2:3:20", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,2:5:22-5:3:49", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,3:4:28-3:10:34", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,3:4:28-3:10:34", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,3:4:28-3:5:29", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,3:4:28-3:5:29", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,3:9:33-3:10:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,3:9:33-3:10:34", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,4:4:39-4:10:45", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,4:4:39-4:10:45", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,4:4:39-4:5:40", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,4:4:39-4:5:40", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,4:9:44-4:10:45", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,4:9:44-4:10:45", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + "edges": [ + { + "index": 0, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + { + "id": "b", + "id_val": "b", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,0:5:5-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,0:5:5-0:6:6", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + } + ], + "layers": [ + { + "name": "x", + "isFolderOnly": false, + "ast": { + "range": ",1:0:0-2:0:0", + "nodes": [ + { + "map_key": { + "range": ",0:0:0-0:0:0", + "key": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:0:0", + "value": [ + { + "string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": ",0:0:0-0:0:0", + "key": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:0:0", + "value": [ + { + "string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": ",0:0:0-0:0:0", + "edges": [ + { + "range": ",0:0:0-0:0:0", + "src": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:0:0", + "value": [ + { + "string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:0:0", + "value": [ + { + "string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": ",0:0:0-0:0:0", + "edges": [ + { + "range": ",0:0:0-0:0:0", + "src": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:0:0", + "value": [ + { + "string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:0:0", + "value": [ + { + "string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "baseAST": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,2:5:22-5:3:49", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,3:4:28-3:10:34", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,3:4:28-3:10:34", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,3:4:28-3:5:29", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,3:4:28-3:5:29", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,3:9:33-3:10:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,3:9:33-3:10:34", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,4:4:39-4:10:45", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,4:4:39-4:10:45", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,4:4:39-4:5:40", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,4:4:39-4:5:40", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,4:9:44-4:10:45", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,4:9:44-4:10:45", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + "edges": [ + { + "index": 0, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + { + "index": 1, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,3:4:28-3:5:29", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,3:4:28-3:5:29", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,4:4:39-4:5:40", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,4:4:39-4:5:40", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + { + "id": "b", + "id_val": "b", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,3:9:33-3:10:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,3:9:33-3:10:34", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,4:9:44-4:10:45", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge-duplicate.d2,4:9:44-4:10:45", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + } + ] + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/layers-edge.exp.json b/testdata/d2oracle/TestCreate/layers-edge.exp.json new file mode 100644 index 000000000..73ac59e37 --- /dev/null +++ b/testdata/d2oracle/TestCreate/layers-edge.exp.json @@ -0,0 +1,573 @@ +{ + "graph": { + "name": "", + "isFolderOnly": false, + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,0:0:0-7:0:42", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,1:0:2-6:1:41", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,1:0:2-1:6:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,1:0:2-1:6:8", + "value": [ + { + "string": "layers", + "raw_string": "layers" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,1:8:10-6:1:41", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,2:2:14-5:3:39", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,2:2:14-2:3:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,2:2:14-2:3:15", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,2:5:17-5:3:39", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,3:4:23-3:5:24", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,3:4:23-3:5:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,3:4:23-3:5:24", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,4:4:29-4:10:35", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,4:4:29-4:10:35", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,4:4:29-4:5:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,4:4:29-4:5:30", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,4:9:34-4:10:35", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,4:9:34-4:10:35", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": -1 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + } + ], + "layers": [ + { + "name": "x", + "isFolderOnly": false, + "ast": { + "range": ",1:0:0-2:0:0", + "nodes": [ + { + "map_key": { + "range": ",0:0:0-0:0:0", + "key": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:0:0", + "value": [ + { + "string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": ",0:0:0-0:0:0", + "key": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:0:0", + "value": [ + { + "string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": ",0:0:0-0:0:0", + "edges": [ + { + "range": ",0:0:0-0:0:0", + "src": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:0:0", + "value": [ + { + "string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:0:0", + "value": [ + { + "string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "baseAST": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,2:5:17-5:3:39", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,3:4:23-3:5:24", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,3:4:23-3:5:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,3:4:23-3:5:24", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,4:4:29-4:10:35", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,4:4:29-4:10:35", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,4:4:29-4:5:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,4:4:29-4:5:30", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,4:9:34-4:10:35", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,4:9:34-4:10:35", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + "edges": [ + { + "index": 0, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,3:4:23-3:5:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,3:4:23-3:5:24", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": -1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,4:4:29-4:5:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,4:4:29-4:5:30", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + { + "id": "b", + "id_val": "b", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,4:9:34-4:10:35", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/layers-edge.d2,4:9:34-4:10:35", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + } + ] + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/scenarios-basic.exp.json b/testdata/d2oracle/TestCreate/scenarios-basic.exp.json index 539a60b79..4d4833d74 100644 --- a/testdata/d2oracle/TestCreate/scenarios-basic.exp.json +++ b/testdata/d2oracle/TestCreate/scenarios-basic.exp.json @@ -349,20 +349,21 @@ ] }, "baseAST": { - "range": ",0:0:0-1:0:0", + "range": "d2/testdata/d2oracle/TestCreate/scenarios-basic.d2,3:5:22-6:3:39", "nodes": [ { "map_key": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/scenarios-basic.d2,4:4:28-4:5:29", "key": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/scenarios-basic.d2,4:4:28-4:5:29", "path": [ { "unquoted_string": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/scenarios-basic.d2,4:4:28-4:5:29", "value": [ { - "string": "a" + "string": "a", + "raw_string": "a" } ] } @@ -375,16 +376,17 @@ }, { "map_key": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/scenarios-basic.d2,5:4:34-5:5:35", "key": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/scenarios-basic.d2,5:4:34-5:5:35", "path": [ { "unquoted_string": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/scenarios-basic.d2,5:4:34-5:5:35", "value": [ { - "string": "c" + "string": "c", + "raw_string": "c" } ] } diff --git a/testdata/d2oracle/TestCreate/steps-basic.exp.json b/testdata/d2oracle/TestCreate/steps-basic.exp.json index 72578651c..18b0dc0e5 100644 --- a/testdata/d2oracle/TestCreate/steps-basic.exp.json +++ b/testdata/d2oracle/TestCreate/steps-basic.exp.json @@ -371,20 +371,21 @@ ] }, "baseAST": { - "range": ",0:0:0-1:0:0", + "range": "d2/testdata/d2oracle/TestCreate/steps-basic.d2,3:5:18-6:3:35", "nodes": [ { "map_key": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/steps-basic.d2,4:4:24-4:5:25", "key": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/steps-basic.d2,4:4:24-4:5:25", "path": [ { "unquoted_string": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/steps-basic.d2,4:4:24-4:5:25", "value": [ { - "string": "b" + "string": "b", + "raw_string": "b" } ] } @@ -397,16 +398,17 @@ }, { "map_key": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/steps-basic.d2,5:4:30-5:5:31", "key": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/steps-basic.d2,5:4:30-5:5:31", "path": [ { "unquoted_string": { - "range": ",0:0:0-0:0:0", + "range": "d2/testdata/d2oracle/TestCreate/steps-basic.d2,5:4:30-5:5:31", "value": [ { - "string": "c" + "string": "c", + "raw_string": "c" } ] }