@@ -1244,13 +1244,13 @@ func deleteReserved(g *d2graph.Graph, baseAST *d2ast.Map, mk *d2ast.Key) (*d2gra
1244
1244
}
1245
1245
imported := IsImportedEdge (baseAST , e )
1246
1246
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 {
1248
1252
mk .Value = d2ast .MakeValueBox (& d2ast.Null {})
1249
1253
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
- }
1254
1254
}
1255
1255
return recompile (g )
1256
1256
}
@@ -1272,15 +1272,15 @@ func deleteReserved(g *d2graph.Graph, baseAST *d2ast.Map, mk *d2ast.Key) (*d2gra
1272
1272
}
1273
1273
}
1274
1274
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 {
1276
1280
mk .Value = d2ast .MakeValueBox (& d2ast.Null {})
1277
1281
appendMapKey (baseAST , mk )
1278
- } else {
1279
- err := deleteObjField (g , obj , id )
1280
- if err != nil {
1281
- return nil , err
1282
- }
1283
1282
}
1283
+ continue
1284
1284
}
1285
1285
1286
1286
if id == "near" ||
@@ -1291,14 +1291,14 @@ func deleteReserved(g *d2graph.Graph, baseAST *d2ast.Map, mk *d2ast.Key) (*d2gra
1291
1291
id == "left" ||
1292
1292
id == "top" ||
1293
1293
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 {
1295
1299
mk .Value = d2ast .MakeValueBox (& d2ast.Null {})
1296
1300
appendMapKey (baseAST , mk )
1297
1301
} else {
1298
- err := deleteObjField (g , obj , id )
1299
- if err != nil {
1300
- return nil , err
1301
- }
1302
1302
}
1303
1303
}
1304
1304
break
@@ -1313,7 +1313,7 @@ func deleteReserved(g *d2graph.Graph, baseAST *d2ast.Map, mk *d2ast.Key) (*d2gra
1313
1313
return recompile (g )
1314
1314
}
1315
1315
1316
- func deleteMapField (m * d2ast.Map , field string ) {
1316
+ func deleteMapField (m * d2ast.Map , field string ) ( deleted bool ) {
1317
1317
for i := 0 ; i < len (m .Nodes ); i ++ {
1318
1318
n := m .Nodes [i ]
1319
1319
if n .MapKey != nil && n .MapKey .Key != nil {
@@ -1325,44 +1325,66 @@ func deleteMapField(m *d2ast.Map, field string) {
1325
1325
n .MapKey .Key .Path [0 ].Unbox ().ScalarString () == "source-arrowhead" ||
1326
1326
n .MapKey .Key .Path [0 ].Unbox ().ScalarString () == "target-arrowhead" {
1327
1327
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
+ }
1329
1332
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
+ }
1331
1337
}
1332
1338
} 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
+ }
1334
1343
}
1335
1344
}
1336
1345
}
1337
1346
}
1347
+ return deleted
1338
1348
}
1339
1349
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 ) {
1341
1351
for _ , ref := range e .References {
1342
1352
// Edge chains can't have fields
1343
1353
if len (ref .MapKey .Edges ) > 1 {
1344
1354
continue
1345
1355
}
1356
+ if ref .MapKey .Range .Path != ast .Range .Path {
1357
+ continue
1358
+ }
1346
1359
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
+ }
1348
1364
} else if ref .MapKey .EdgeKey != nil && ref .MapKey .EdgeKey .Path [len (ref .MapKey .EdgeKey .Path )- 1 ].Unbox ().ScalarString () == field {
1349
1365
// 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
+ }
1351
1370
}
1352
1371
}
1353
- return nil
1372
+ return deleted , nil
1354
1373
}
1355
1374
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 ) {
1357
1376
objK , err := d2parser .ParseKey (obj .AbsID ())
1358
1377
if err != nil {
1359
- return err
1378
+ return false , err
1360
1379
}
1361
1380
objGK := d2graph .Key (objK )
1362
1381
for _ , ref := range obj .References {
1363
1382
if ref .InEdge () {
1364
1383
continue
1365
1384
}
1385
+ if ref .Key .Range .Path != ast .Range .Path {
1386
+ continue
1387
+ }
1366
1388
if ref .MapKey .Value .Map != nil {
1367
1389
deleteMapField (ref .MapKey .Value .Map , field )
1368
1390
} else if (len (ref .Key .Path ) >= 2 &&
@@ -1377,10 +1399,13 @@ func deleteObjField(g *d2graph.Graph, obj *d2graph.Object, field string) error {
1377
1399
tmpNodes := make ([]d2ast.MapNodeBox , len (ref .Scope .Nodes ))
1378
1400
copy (tmpNodes , ref .Scope .Nodes )
1379
1401
// 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
+ }
1381
1406
g2 , err := recompile (g )
1382
1407
if err != nil {
1383
- return err
1408
+ return false , err
1384
1409
}
1385
1410
if _ , ok := g2 .Root .HasChild (objGK ); ! ok {
1386
1411
// 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 {
1391
1416
1392
1417
}
1393
1418
}
1394
- return nil
1419
+ return deleted , nil
1395
1420
}
1396
1421
1397
1422
func deleteObject (g * d2graph.Graph , baseAST * d2ast.Map , key * d2ast.KeyPath , obj * d2graph.Object ) (* d2graph.Graph , error ) {
0 commit comments