fix d2oracle.Delete

This commit is contained in:
Alexander Wang 2023-03-02 15:34:46 -08:00
parent e2c1f313ce
commit be5009ea7a
No known key found for this signature in database
GPG key ID: D89FA31966BDBECE
3 changed files with 373 additions and 5 deletions

View file

@ -681,6 +681,8 @@ func renameConflictsToParent(g *d2graph.Graph, key *d2ast.KeyPath) (*d2graph.Gra
absKeys = append(absKeys, absKey)
}
var newIDs []string
renames := make(map[string]string)
for _, absKey := range absKeys {
ida := d2graph.Key(absKey)
absKeyStr := strings.Join(ida, ".")
@ -700,10 +702,11 @@ func renameConflictsToParent(g *d2graph.Graph, key *d2ast.KeyPath) (*d2graph.Gra
hoistedAbsKey.Path = append(hoistedAbsKey.Path, ref.Key.Path[:ref.KeyPathIndex]...)
hoistedAbsKey.Path = append(hoistedAbsKey.Path, absKey.Path[len(absKey.Path)-1])
uniqueKeyStr, _, err := generateUniqueKey(g, strings.Join(d2graph.Key(hoistedAbsKey), "."), nil, nil)
uniqueKeyStr, _, err := generateUniqueKey(g, strings.Join(d2graph.Key(hoistedAbsKey), "."), nil, newIDs)
if err != nil {
return nil, err
}
newIDs = append(newIDs, uniqueKeyStr)
uniqueKey, err := d2parser.ParseKey(uniqueKeyStr)
if err != nil {
return nil, err
@ -714,10 +717,29 @@ func renameConflictsToParent(g *d2graph.Graph, key *d2ast.KeyPath) (*d2graph.Gra
renamedKeyStr := strings.Join(d2graph.Key(renamedKey), ".")
if absKeyStr != renamedKeyStr {
g, err = move(g, absKeyStr, renamedKeyStr)
if err != nil {
return nil, err
}
renames[absKeyStr] = renamedKeyStr
}
}
// We need to rename in a conflict-free order
// E.g. imagine you have children `Text 4` and `Text`.
// `Text 4` would get renamed to `Text` and `Text` gets renamed to `Text 2`
// But if we follow that order, then both would get named to `Text 2`
// So order such that the ones that have a conflict are done last, after the no-conflict ones are done
// A cycle would never occur, as the uniqueness constraint is guaranteed
var renameOrder []string
for k, v := range renames {
// conflict
if _, ok := renames[v]; ok {
renameOrder = append(renameOrder, k)
} else {
renameOrder = append([]string{k}, renameOrder...)
}
}
for _, k := range renameOrder {
var err error
g, err = move(g, k, renames[k])
if err != nil {
return nil, err
}
}
}

View file

@ -4815,6 +4815,26 @@ A -> B
key: `x.left`,
exp: `x
`,
},
{
name: "conflicts_generated",
text: `Text 4
Square: {
Text 4: {
Text 2
}
Text
}
`,
key: `Square`,
exp: `Text 4
Text: {
Text 2
}
Text 2
`,
},
{

View file

@ -0,0 +1,326 @@
{
"graph": {
"name": "",
"isFolderOnly": false,
"ast": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,0:0:0-6:0:34",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,0:0:0-0:6:6",
"key": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,0:0:0-0:6:6",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,0:0:0-0:6:6",
"value": [
{
"string": "Text 4",
"raw_string": "Text 4"
}
]
}
}
]
},
"primary": {},
"value": {}
}
},
{
"map_key": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,2:0:8-4:1:26",
"key": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,2:0:8-2:4:12",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,2:0:8-2:4:12",
"value": [
{
"string": "Text",
"raw_string": "Text"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,2:6:14-4:0:25",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,3:2:18-3:8:24",
"key": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,3:2:18-3:8:24",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,3:2:18-3:8:24",
"value": [
{
"string": "Text 2",
"raw_string": "Text 2"
}
]
}
}
]
},
"primary": {},
"value": {}
}
}
]
}
}
}
},
{
"map_key": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,5:0:27-5:6:33",
"key": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,5:0:27-5:6:33",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,5:0:27-5:6:33",
"value": [
{
"string": "Text 2",
"raw_string": "Text 2"
}
]
}
}
]
},
"primary": {},
"value": {}
}
}
]
},
"root": {
"id": "",
"id_val": "",
"label_dimensions": {
"width": 0,
"height": 0
},
"attributes": {
"label": {
"value": ""
},
"style": {},
"near_key": null,
"shape": {
"value": ""
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
},
"edges": null,
"objects": [
{
"id": "Text 4",
"id_val": "Text 4",
"label_dimensions": {
"width": 0,
"height": 0
},
"references": [
{
"key": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,0:0:0-0:6:6",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,0:0:0-0:6:6",
"value": [
{
"string": "Text 4",
"raw_string": "Text 4"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "Text 4"
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
},
{
"id": "Text",
"id_val": "Text",
"label_dimensions": {
"width": 0,
"height": 0
},
"references": [
{
"key": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,2:0:8-2:4:12",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,2:0:8-2:4:12",
"value": [
{
"string": "Text",
"raw_string": "Text"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "Text"
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
},
{
"id": "Text 2",
"id_val": "Text 2",
"label_dimensions": {
"width": 0,
"height": 0
},
"references": [
{
"key": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,3:2:18-3:8:24",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,3:2:18-3:8:24",
"value": [
{
"string": "Text 2",
"raw_string": "Text 2"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "Text 2"
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
},
{
"id": "Text 2",
"id_val": "Text 2",
"label_dimensions": {
"width": 0,
"height": 0
},
"references": [
{
"key": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,5:0:27-5:6:33",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2oracle/TestDelete/conflicts_generated.d2,5:0:27-5:6:33",
"value": [
{
"string": "Text 2",
"raw_string": "Text 2"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "Text 2"
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
}
]
},
"err": "<nil>"
}