Skip to content

Commit 2ee3f0d

Browse files
authored
Merge pull request terrastruct#1861 from alixander/delete-near
d2oracle: fix deleting imported fields
2 parents 808f5c3 + 3b87b73 commit 2ee3f0d

File tree

4 files changed

+364
-29
lines changed

4 files changed

+364
-29
lines changed

d2oracle/edit.go

+54-29
Original file line numberDiff line numberDiff line change
@@ -1244,13 +1244,13 @@ func deleteReserved(g *d2graph.Graph, baseAST *d2ast.Map, mk *d2ast.Key) (*d2gra
12441244
}
12451245
imported := IsImportedEdge(baseAST, e)
12461246

1247-
if imported {
1247+
deleted, err := deleteEdgeField(g, baseAST, e, targetKey.Path[len(targetKey.Path)-1].Unbox().ScalarString())
1248+
if err != nil {
1249+
return nil, err
1250+
}
1251+
if !deleted && imported {
12481252
mk.Value = d2ast.MakeValueBox(&d2ast.Null{})
12491253
appendMapKey(baseAST, mk)
1250-
} else {
1251-
if err := deleteEdgeField(g, e, targetKey.Path[len(targetKey.Path)-1].Unbox().ScalarString()); err != nil {
1252-
return nil, err
1253-
}
12541254
}
12551255
return recompile(g)
12561256
}
@@ -1272,15 +1272,15 @@ func deleteReserved(g *d2graph.Graph, baseAST *d2ast.Map, mk *d2ast.Key) (*d2gra
12721272
}
12731273
}
12741274
if isNestedKey {
1275-
if imported {
1275+
deleted, err := deleteObjField(g, baseAST, obj, id)
1276+
if err != nil {
1277+
return nil, err
1278+
}
1279+
if !deleted && imported {
12761280
mk.Value = d2ast.MakeValueBox(&d2ast.Null{})
12771281
appendMapKey(baseAST, mk)
1278-
} else {
1279-
err := deleteObjField(g, obj, id)
1280-
if err != nil {
1281-
return nil, err
1282-
}
12831282
}
1283+
continue
12841284
}
12851285

12861286
if id == "near" ||
@@ -1291,14 +1291,14 @@ func deleteReserved(g *d2graph.Graph, baseAST *d2ast.Map, mk *d2ast.Key) (*d2gra
12911291
id == "left" ||
12921292
id == "top" ||
12931293
id == "link" {
1294-
if imported {
1294+
deleted, err := deleteObjField(g, baseAST, obj, id)
1295+
if err != nil {
1296+
return nil, err
1297+
}
1298+
if !deleted && imported {
12951299
mk.Value = d2ast.MakeValueBox(&d2ast.Null{})
12961300
appendMapKey(baseAST, mk)
12971301
} else {
1298-
err := deleteObjField(g, obj, id)
1299-
if err != nil {
1300-
return nil, err
1301-
}
13021302
}
13031303
}
13041304
break
@@ -1313,7 +1313,7 @@ func deleteReserved(g *d2graph.Graph, baseAST *d2ast.Map, mk *d2ast.Key) (*d2gra
13131313
return recompile(g)
13141314
}
13151315

1316-
func deleteMapField(m *d2ast.Map, field string) {
1316+
func deleteMapField(m *d2ast.Map, field string) (deleted bool) {
13171317
for i := 0; i < len(m.Nodes); i++ {
13181318
n := m.Nodes[i]
13191319
if n.MapKey != nil && n.MapKey.Key != nil {
@@ -1325,44 +1325,66 @@ func deleteMapField(m *d2ast.Map, field string) {
13251325
n.MapKey.Key.Path[0].Unbox().ScalarString() == "source-arrowhead" ||
13261326
n.MapKey.Key.Path[0].Unbox().ScalarString() == "target-arrowhead" {
13271327
if n.MapKey.Value.Map != nil {
1328-
deleteMapField(n.MapKey.Value.Map, field)
1328+
deleted2 := deleteMapField(n.MapKey.Value.Map, field)
1329+
if deleted2 {
1330+
deleted = true
1331+
}
13291332
if len(n.MapKey.Value.Map.Nodes) == 0 {
1330-
deleteFromMap(m, n.MapKey)
1333+
deleted2 := deleteFromMap(m, n.MapKey)
1334+
if deleted2 {
1335+
deleted = true
1336+
}
13311337
}
13321338
} else if len(n.MapKey.Key.Path) == 2 && n.MapKey.Key.Path[1].Unbox().ScalarString() == field {
1333-
deleteFromMap(m, n.MapKey)
1339+
deleted2 := deleteFromMap(m, n.MapKey)
1340+
if deleted2 {
1341+
deleted = true
1342+
}
13341343
}
13351344
}
13361345
}
13371346
}
1347+
return deleted
13381348
}
13391349

1340-
func deleteEdgeField(g *d2graph.Graph, e *d2graph.Edge, field string) error {
1350+
func deleteEdgeField(g *d2graph.Graph, ast *d2ast.Map, e *d2graph.Edge, field string) (deleted bool, _ error) {
13411351
for _, ref := range e.References {
13421352
// Edge chains can't have fields
13431353
if len(ref.MapKey.Edges) > 1 {
13441354
continue
13451355
}
1356+
if ref.MapKey.Range.Path != ast.Range.Path {
1357+
continue
1358+
}
13461359
if ref.MapKey.Value.Map != nil {
1347-
deleteMapField(ref.MapKey.Value.Map, field)
1360+
deleted2 := deleteMapField(ref.MapKey.Value.Map, field)
1361+
if deleted2 {
1362+
deleted = true
1363+
}
13481364
} else if ref.MapKey.EdgeKey != nil && ref.MapKey.EdgeKey.Path[len(ref.MapKey.EdgeKey.Path)-1].Unbox().ScalarString() == field {
13491365
// It's always safe to delete, since edge references must coexist with edge definition elsewhere
1350-
deleteFromMap(ref.Scope, ref.MapKey)
1366+
deleted2 := deleteFromMap(ref.Scope, ref.MapKey)
1367+
if deleted2 {
1368+
deleted = true
1369+
}
13511370
}
13521371
}
1353-
return nil
1372+
return deleted, nil
13541373
}
13551374

1356-
func deleteObjField(g *d2graph.Graph, obj *d2graph.Object, field string) error {
1375+
func deleteObjField(g *d2graph.Graph, ast *d2ast.Map, obj *d2graph.Object, field string) (deleted bool, _ error) {
13571376
objK, err := d2parser.ParseKey(obj.AbsID())
13581377
if err != nil {
1359-
return err
1378+
return false, err
13601379
}
13611380
objGK := d2graph.Key(objK)
13621381
for _, ref := range obj.References {
13631382
if ref.InEdge() {
13641383
continue
13651384
}
1385+
if ref.Key.Range.Path != ast.Range.Path {
1386+
continue
1387+
}
13661388
if ref.MapKey.Value.Map != nil {
13671389
deleteMapField(ref.MapKey.Value.Map, field)
13681390
} else if (len(ref.Key.Path) >= 2 &&
@@ -1377,10 +1399,13 @@ func deleteObjField(g *d2graph.Graph, obj *d2graph.Object, field string) error {
13771399
tmpNodes := make([]d2ast.MapNodeBox, len(ref.Scope.Nodes))
13781400
copy(tmpNodes, ref.Scope.Nodes)
13791401
// If I delete this, will the object still exist?
1380-
deleteFromMap(ref.Scope, ref.MapKey)
1402+
deleted2 := deleteFromMap(ref.Scope, ref.MapKey)
1403+
if deleted2 {
1404+
deleted = true
1405+
}
13811406
g2, err := recompile(g)
13821407
if err != nil {
1383-
return err
1408+
return false, err
13841409
}
13851410
if _, ok := g2.Root.HasChild(objGK); !ok {
13861411
// Nope, so can't delete it, just remove the field then
@@ -1391,7 +1416,7 @@ func deleteObjField(g *d2graph.Graph, obj *d2graph.Object, field string) error {
13911416

13921417
}
13931418
}
1394-
return nil
1419+
return deleted, nil
13951420
}
13961421

13971422
func deleteObject(g *d2graph.Graph, baseAST *d2ast.Map, key *d2ast.KeyPath, obj *d2graph.Object) (*d2graph.Graph, error) {

d2oracle/edit_test.go

+28
Original file line numberDiff line numberDiff line change
@@ -7469,6 +7469,34 @@ a.link: null
74697469
key: `a.style.fill`,
74707470
exp: `...@meow
74717471
a.style.fill: null
7472+
`,
7473+
},
7474+
{
7475+
name: "import/7",
7476+
7477+
text: `...@meow
7478+
a.label.near: center-center
7479+
`,
7480+
fsTexts: map[string]string{
7481+
"meow.d2": `a
7482+
`,
7483+
},
7484+
key: `a.label.near`,
7485+
exp: `...@meow
7486+
`,
7487+
},
7488+
{
7489+
name: "import/8",
7490+
7491+
text: `...@meow
7492+
(a -> b)[0].style.stroke: red
7493+
`,
7494+
fsTexts: map[string]string{
7495+
"meow.d2": `a -> b
7496+
`,
7497+
},
7498+
key: `(a -> b)[0].style.stroke`,
7499+
exp: `...@meow
74727500
`,
74737501
},
74747502
{

testdata/d2oracle/TestDelete/import/7.exp.json

+103
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)