From bd7a3d572a5bb800f336b8609f75087fc8b32d7f Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Wed, 5 Jun 2024 12:59:21 -0600 Subject: [PATCH] d2oracle.Delete: do not null non-glob-created edges --- d2oracle/edit.go | 5 +- d2oracle/edit_test.go | 15 + d2oracle/get.go | 5 +- .../TestDelete/edge-with-glob.exp.json | 264 ++++++++++++++++++ 4 files changed, 286 insertions(+), 3 deletions(-) create mode 100644 testdata/d2oracle/TestDelete/edge-with-glob.exp.json diff --git a/d2oracle/edit.go b/d2oracle/edit.go index ce2410349..cc84983d9 100644 --- a/d2oracle/edit.go +++ b/d2oracle/edit.go @@ -949,7 +949,10 @@ func Delete(g *d2graph.Graph, boardPath []string, key string) (_ *d2graph.Graph, for i := len(e.References) - 1; i >= 0; i-- { ref := e.References[i] - deleteEdge(g, ref.Scope, ref.MapKey, ref.MapKeyEdgeIndex) + // Leave glob setters alone + if !(ref.MapKey.EdgeIndex != nil && ref.MapKey.EdgeIndex.Glob) { + deleteEdge(g, ref.Scope, ref.MapKey, ref.MapKeyEdgeIndex) + } } edges, ok := obj.FindEdges(mk) diff --git a/d2oracle/edit_test.go b/d2oracle/edit_test.go index 30d73a9ef..bbab7f2e8 100644 --- a/d2oracle/edit_test.go +++ b/d2oracle/edit_test.go @@ -7892,6 +7892,21 @@ layers: { a } } +`, + }, + { + name: "edge-with-glob", + + text: `x -> y +y + +(* -> *)[*].style.opacity: 0.8 +`, + key: `(x -> y)[0]`, + exp: `x +y + +(* -> *)[*].style.opacity: 0.8 `, }, } diff --git a/d2oracle/get.go b/d2oracle/get.go index 3883bc24e..3d3daf957 100644 --- a/d2oracle/get.go +++ b/d2oracle/get.go @@ -153,11 +153,12 @@ func IsImportedObj(ast *d2ast.Map, obj *d2graph.Object) bool { return false } -// Globs count as imported for now +// Glob creations count as imported for now // TODO Probably rename later func IsImportedEdge(ast *d2ast.Map, edge *d2graph.Edge) bool { for _, ref := range edge.References { - if ref.Edge.Src.HasGlob() || ref.Edge.Dst.HasGlob() { + // If edge index, the glob is just setting something, not responsible for creating the edge + if (ref.Edge.Src.HasGlob() || ref.Edge.Dst.HasGlob()) && ref.MapKey.EdgeIndex == nil { return true } if ref.Edge.Range.Path != ast.Range.Path { diff --git a/testdata/d2oracle/TestDelete/edge-with-glob.exp.json b/testdata/d2oracle/TestDelete/edge-with-glob.exp.json new file mode 100644 index 000000000..1fffd7e42 --- /dev/null +++ b/testdata/d2oracle/TestDelete/edge-with-glob.exp.json @@ -0,0 +1,264 @@ +{ + "graph": { + "name": "", + "isFolderOnly": false, + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,0:0:0-4:0:36", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,1:0:2-1:1:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,1:0:2-1:1:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,3:0:5-3:30:35", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,3:1:6-3:7:12", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,3:1:6-3:2:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,3:1:6-3:2:7", + "value": [ + { + "string": "*", + "raw_string": "*" + } + ], + "pattern": [ + "*" + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,3:6:11-3:7:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,3:6:11-3:7:12", + "value": [ + { + "string": "*", + "raw_string": "*" + } + ], + "pattern": [ + "*" + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,3:8:13-3:11:16", + "int": null, + "glob": true + }, + "edge_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,3:12:17-3:25:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,3:12:17-3:17:22", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,3:18:23-3:25:30", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,3:27:32-3:30:35", + "raw": "0.8", + "value": "4/5" + } + } + } + } + ] + }, + "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": "x", + "id_val": "x", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": -1 + } + ], + "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/TestDelete/edge-with-glob.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge-with-glob.d2,1:0:2-1:1:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": -1 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + } + ] + }, + "err": "" +}