diff --git a/d2oracle/edit.go b/d2oracle/edit.go index b5b9f602e..6397ee13c 100644 --- a/d2oracle/edit.go +++ b/d2oracle/edit.go @@ -559,6 +559,12 @@ func _set(g *d2graph.Graph, baseAST *d2ast.Map, key string, tag, value *string) if reserved { inlined := func(s *d2graph.Scalar) bool { + if s != nil && s.MapKey != nil { + // The value was set outside of what's writeable + if s.MapKey.Range.Path != baseAST.Range.Path { + return false + } + } return s != nil && s.MapKey != nil && !ir.InClass(s.MapKey) } reservedIndex := toSkip - 1 diff --git a/d2oracle/edit_test.go b/d2oracle/edit_test.go index cc87d8fdd..ed74feb4a 100644 --- a/d2oracle/edit_test.go +++ b/d2oracle/edit_test.go @@ -2011,6 +2011,53 @@ scenarios: { y style.stroke: red } +`, + }, + { + name: "import/2", + + text: `x: { + ...@meow.x + y +} +`, + fsTexts: map[string]string{ + "meow": `x: { + style.fill: blue +} +`, + }, + key: `x.style.fill`, + value: go2.Pointer(`red`), + exp: `x: { + ...@meow.x + y + style.fill: red +} +`, + }, + { + name: "import/3", + + text: `x: { + ...@meow.x + y + style.fill: red +} +`, + fsTexts: map[string]string{ + "meow": `x: { + style.fill: blue +} +`, + }, + key: `x.style.fill`, + value: go2.Pointer(`yellow`), + exp: `x: { + ...@meow.x + y + style.fill: yellow +} `, }, } diff --git a/d2oracle/get.go b/d2oracle/get.go index 32adc4f88..6f2074a08 100644 --- a/d2oracle/get.go +++ b/d2oracle/get.go @@ -15,17 +15,29 @@ func GetBoardGraph(g *d2graph.Graph, boardPath []string) *d2graph.Graph { } for i, b := range g.Layers { if b.Name == boardPath[0] { - return GetBoardGraph(g.Layers[i], boardPath[1:]) + g2 := GetBoardGraph(g.Layers[i], boardPath[1:]) + if g2 != nil { + g2.FS = g.FS + } + return g2 } } for i, b := range g.Scenarios { if b.Name == boardPath[0] { - return GetBoardGraph(g.Scenarios[i], boardPath[1:]) + g2 := GetBoardGraph(g.Scenarios[i], boardPath[1:]) + if g2 != nil { + g2.FS = g.FS + } + return g2 } } for i, b := range g.Steps { if b.Name == boardPath[0] { - return GetBoardGraph(g.Steps[i], boardPath[1:]) + g2 := GetBoardGraph(g.Steps[i], boardPath[1:]) + if g2 != nil { + g2.FS = g.FS + } + return g2 } } return nil diff --git a/testdata/d2oracle/TestSet/import/2.exp.json b/testdata/d2oracle/TestSet/import/2.exp.json new file mode 100644 index 000000000..37ff8f8e6 --- /dev/null +++ b/testdata/d2oracle/TestSet/import/2.exp.json @@ -0,0 +1,259 @@ +{ + "graph": { + "name": "", + "isFolderOnly": false, + "ast": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,0:0:0-5:0:42", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,0:0:0-4:1:41", + "key": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,0:3:3-4:1:41", + "nodes": [ + { + "import": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,1:2:7-1:12:17", + "spread": true, + "pre": "", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,1:6:11-1:10:15", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,1:11:16-1:12:17", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,2:2:20-2:3:21", + "key": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,2:2:20-2:3:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,2:2:20-2:3:21", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,3:2:24-3:17:39", + "key": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,3:2:24-3:12:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,3:2:24-3:7:29", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,3:8:30-3:12:34", + "value": [ + { + "string": "fill", + "raw_string": "fill" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,3:14:36-3:17:39", + "value": [ + { + "string": "red", + "raw_string": "red" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "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/TestSet/import/2.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/2.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": { + "fill": { + "value": "red" + } + }, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + { + "id": "y", + "id_val": "y", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,2:2:20-2:3:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/2.d2,2:2:20-2:3:21", + "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": "" +} diff --git a/testdata/d2oracle/TestSet/import/3.exp.json b/testdata/d2oracle/TestSet/import/3.exp.json new file mode 100644 index 000000000..1cca998d1 --- /dev/null +++ b/testdata/d2oracle/TestSet/import/3.exp.json @@ -0,0 +1,259 @@ +{ + "graph": { + "name": "", + "isFolderOnly": false, + "ast": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,0:0:0-5:0:45", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,0:0:0-4:1:44", + "key": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,0:3:3-4:1:44", + "nodes": [ + { + "import": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,1:2:7-1:12:17", + "spread": true, + "pre": "", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,1:6:11-1:10:15", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,1:11:16-1:12:17", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,2:2:20-2:3:21", + "key": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,2:2:20-2:3:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,2:2:20-2:3:21", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,3:2:24-3:20:42", + "key": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,3:2:24-3:12:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,3:2:24-3:7:29", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,3:8:30-3:12:34", + "value": [ + { + "string": "fill", + "raw_string": "fill" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,3:14:36-3:20:42", + "value": [ + { + "string": "yellow", + "raw_string": "yellow" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "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/TestSet/import/3.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/3.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": { + "fill": { + "value": "yellow" + } + }, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + { + "id": "y", + "id_val": "y", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,2:2:20-2:3:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/import/3.d2,2:2:20-2:3:21", + "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": "" +}