From fd70b5ef4627cc36572fae3ce07a5c1027a73bb2 Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Mon, 10 Jul 2023 21:32:30 -0700 Subject: [PATCH] layers work --- d2compiler/compile_test.go | 40 ++ d2ir/compile.go | 44 +-- .../TestCompile2/vars/boards/layer.exp.json | 372 ++++++++++++++++++ 3 files changed, 425 insertions(+), 31 deletions(-) create mode 100644 testdata/d2compiler/TestCompile2/vars/boards/layer.exp.json diff --git a/d2compiler/compile_test.go b/d2compiler/compile_test.go index bbd0b4e16..eb33cf1a4 100644 --- a/d2compiler/compile_test.go +++ b/d2compiler/compile_test.go @@ -3270,6 +3270,46 @@ hi: not a var } }) + t.Run("boards", func(t *testing.T) { + t.Parallel() + + tca := []struct { + name string + skip bool + run func(t *testing.T) + }{ + { + name: "layer", + run: func(t *testing.T) { + g := assertCompile(t, ` +vars: { + x: im a var +} + +layers: { + l: { + hi: ${x} + } +} +`, "") + assert.Equal(t, 1, len(g.Layers[0].Objects)) + assert.Equal(t, "im a var", g.Layers[0].Objects[0].Label.Value) + }, + }, + } + + for _, tc := range tca { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + if tc.skip { + t.SkipNow() + } + tc.run(t) + }) + } + }) + t.Run("errors", func(t *testing.T) { t.Parallel() diff --git a/d2ir/compile.go b/d2ir/compile.go index a19bda567..bf5d91d8b 100644 --- a/d2ir/compile.go +++ b/d2ir/compile.go @@ -53,7 +53,6 @@ func Compile(ast *d2ast.Map, opts *CompileOptions) (*Map, error) { c.compileMap(m, ast, ast) c.overlayClasses(m) - c.overlayVars(m) if !c.err.Empty() { return nil, c.err } @@ -135,40 +134,22 @@ func (c *compiler) compileVars(m *Map, ast *d2ast.Map) { } } -func (c *compiler) overlayVars(m *Map) { - vars := m.GetField("vars") - if vars == nil || vars.Map() == nil { +func (c *compiler) overlayVars(base, overlay *Map) { + vars := overlay.GetField("vars") + if vars == nil { return } - layersField := m.GetField("layers") - if layersField == nil { - return - } - layers := layersField.Map() - if layers == nil { - return - } + lVars := base.GetField("vars") - for _, lf := range layers.Fields { - if lf.Map() == nil || lf.Primary() != nil { - c.errorf(lf.References[0].Context.Key, "invalid layer") - continue - } - l := lf.Map() - lVars := l.GetField("vars") - - if lVars == nil { - lVars = vars.Copy(l).(*Field) - l.Fields = append(l.Fields, lVars) - } else { - base := vars.Copy(l).(*Field) - OverlayMap(base.Map(), lVars.Map()) - l.DeleteField("vars") - l.Fields = append(l.Fields, base) - } - - c.overlayVars(l) + if lVars == nil { + lVars = vars.Copy(base).(*Field) + base.Fields = append(base.Fields, lVars) + } else { + overlayed := vars.Copy(base).(*Field) + OverlayMap(overlayed.Map(), lVars.Map()) + base.DeleteField("vars") + base.Fields = append(base.Fields, overlayed) } } @@ -275,6 +256,7 @@ func (c *compiler) compileField(dst *Map, kp *d2ast.KeyPath, refctx *RefContext) } } case BoardLayer: + c.overlayVars(f.Map(), ParentBoard(f).Map()) default: // If new board type, use that as the new scope AST, otherwise, carry on scopeAST = refctx.ScopeAST diff --git a/testdata/d2compiler/TestCompile2/vars/boards/layer.exp.json b/testdata/d2compiler/TestCompile2/vars/boards/layer.exp.json new file mode 100644 index 000000000..a336caf0b --- /dev/null +++ b/testdata/d2compiler/TestCompile2/vars/boards/layer.exp.json @@ -0,0 +1,372 @@ +{ + "graph": { + "name": "", + "isFolderOnly": false, + "ast": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,0:0:0-10:0:62", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,1:0:1-3:1:24", + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,1:0:1-1:4:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,1:0:1-1:4:5", + "value": [ + { + "string": "vars", + "raw_string": "vars" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,1:6:7-3:1:24", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,2:2:11-2:13:22", + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,2:2:11-2:3:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,2:2:11-2:3:12", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,2:5:14-2:13:22", + "value": [ + { + "string": "im a var", + "raw_string": "im a var" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,5:0:26-9:1:61", + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,5:0:26-5:6:32", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,5:0:26-5:6:32", + "value": [ + { + "string": "layers", + "raw_string": "layers" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,5:8:34-9:1:61", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,6:2:38-8:3:59", + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,6:2:38-6:3:39", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,6:2:38-6:3:39", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,6:5:41-8:3:59", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,7:4:47-7:12:55", + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,7:4:47-7:6:49", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,7:4:47-7:6:49", + "value": [ + { + "string": "hi", + "raw_string": "hi" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "substitution": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,7:8:51-7:12:55", + "spread": false, + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,7:10:53-7:11:54", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "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": null, + "layers": [ + { + "name": "l", + "isFolderOnly": false, + "ast": { + "range": ",1:0:0-2:0:0", + "nodes": [ + { + "map_key": { + "range": ",0:0:0-0:0:0", + "key": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:0:0", + "value": [ + { + "string": "vars" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": ",1:0:0-2:0:0", + "nodes": [ + { + "map_key": { + "range": ",0:0:0-0:0:0", + "key": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:0:0", + "value": [ + { + "string": "x" + } + ] + } + } + ] + }, + "primary": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,2:5:14-2:13:22", + "value": [ + { + "string": "im a var", + "raw_string": "im a var" + } + ] + } + }, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": ",0:0:0-0:0:0", + "key": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:0:0", + "value": [ + { + "string": "hi" + } + ] + } + } + ] + }, + "primary": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,2:5:14-2:13:22", + "value": [ + { + "string": "im a var", + "raw_string": "im a var" + } + ] + } + }, + "value": {} + } + } + ] + }, + "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": "hi", + "id_val": "hi", + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,7:4:47-7:6:49", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/vars/boards/layer.d2,7:4:47-7:6:49", + "value": [ + { + "string": "hi", + "raw_string": "hi" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": -1 + } + ], + "attributes": { + "label": { + "value": "im a var" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + } + ] + } + ] + }, + "err": null +}