d2ir: Review fixes #714

This commit is contained in:
Anmol Sethi 2023-01-27 17:19:12 -08:00
parent dce4385644
commit f056700152
No known key found for this signature in database
GPG key ID: 25BC68888A99A8BA
17 changed files with 4279 additions and 1197 deletions

View file

@ -9,6 +9,10 @@
- You can now use the reserved keywords `layers`/`scenarios`/`steps` to define diagrams
with multiple levels of abstractions. [#714](https://github.com/terrastruct/d2/pull/714)
Docs to come soon
- [#416](https://github.com/terrastruct/d2/issues/416) was also fixed so you can no
longer use keywords intended for use under `style` outside and vice versa. e.g.
`obj.style.shape` and `obj.double-border` are now illegal. The correct uses are
`obj.shape` and `obj.style.double-border`.
#### Improvements 🧹

2
ci/sub

@ -1 +1 @@
Subproject commit 8ac704818b5d7ab519e4b87caf5eb79716493709
Subproject commit 2009cdd523e00cc2e9b8ba804095f71ca70d5671

View file

@ -26,8 +26,6 @@ func Compile(path string, r io.RuneReader, opts *CompileOptions) (*d2graph.Graph
opts = &CompileOptions{}
}
var pe d2parser.ParseError
ast, err := d2parser.Parse(path, r, &d2parser.ParseOptions{
UTF16: opts.UTF16,
})
@ -40,43 +38,39 @@ func Compile(path string, r io.RuneReader, opts *CompileOptions) (*d2graph.Graph
return nil, err
}
g, err := compileIR(pe, ir)
g, err := compileIR(ast, ir)
if err != nil {
return nil, err
}
g.AST = ast
return g, err
}
func compileIR(pe d2parser.ParseError, m *d2ir.Map) (*d2graph.Graph, error) {
c := &compiler{
err: pe,
}
func compileIR(ast *d2ast.Map, m *d2ir.Map) (*d2graph.Graph, error) {
c := &compiler{}
g := c.compileLayer(m)
g := d2graph.NewGraph()
g.AST = ast
c.compileBoard(g, m)
if len(c.err.Errors) > 0 {
return nil, c.err
}
return g, nil
}
func (c *compiler) compileLayer(ir *d2ir.Map) *d2graph.Graph {
g := d2graph.NewGraph()
m := ir.CopyRoot()
c.compileMap(g.Root, m)
func (c *compiler) compileBoard(g *d2graph.Graph, ir *d2ir.Map) *d2graph.Graph {
c.compileMap(g.Root, ir)
if len(c.err.Errors) == 0 {
c.validateKeys(g.Root, m)
c.validateKeys(g.Root, ir)
}
c.validateNear(g)
c.compileLayersField(g, ir, "layers")
c.compileLayersField(g, ir, "scenarios")
c.compileLayersField(g, ir, "steps")
c.compileBoardsField(g, ir, "layers")
c.compileBoardsField(g, ir, "scenarios")
c.compileBoardsField(g, ir, "steps")
return g
}
func (c *compiler) compileLayersField(g *d2graph.Graph, ir *d2ir.Map, fieldName string) {
func (c *compiler) compileBoardsField(g *d2graph.Graph, ir *d2ir.Map, fieldName string) {
layers := ir.GetField(fieldName)
if layers.Map() == nil {
return
@ -85,11 +79,13 @@ func (c *compiler) compileLayersField(g *d2graph.Graph, ir *d2ir.Map, fieldName
if f.Map() == nil {
continue
}
if g.GetLayer(f.Name) != nil {
c.errorf(f.References[0].AST(), "layer name %v already used by another layer", f.Name)
if g.GetBoard(f.Name) != nil {
c.errorf(f.References[0].AST(), "board name %v already used by another board", f.Name)
continue
}
g2 := c.compileLayer(f.Map())
g2 := d2graph.NewGraph()
g2.AST = g.AST
c.compileBoard(g2, f.Map())
g2.Name = f.Name
switch fieldName {
case "layers":
@ -119,6 +115,9 @@ func (c *compiler) compileMap(obj *d2graph.Object, m *d2ir.Map) {
if f.Name == "shape" {
continue
}
if _, ok := d2graph.BoardKeywords[f.Name]; ok {
continue
}
c.compileField(obj, f)
}
@ -538,6 +537,9 @@ func (c *compiler) compileSQLTable(obj *d2graph.Object) {
func (c *compiler) validateKeys(obj *d2graph.Object, m *d2ir.Map) {
for _, f := range m.Fields {
if _, ok := d2graph.BoardKeywords[f.Name]; ok {
continue
}
c.validateKey(obj, f)
}
}

View file

@ -1479,7 +1479,7 @@ d2/testdata/d2compiler/TestCompile/errors/reserved_icon_style.d2:2:9: near key "
text: `x: {style.opacity: 0.4}
y -> x.style
`,
expErr: `d2/testdata/d2compiler/TestCompile/edge_to_style.d2:2:1: cannot connect to reserved keyword`,
expErr: `d2/testdata/d2compiler/TestCompile/edge_to_style.d2:2:8: reserved keywords are prohibited in edges`,
},
{
name: "escaped_id",
@ -1946,10 +1946,10 @@ Chinchillas_Collectibles.chinchilla -> Chinchillas.id`,
func TestCompile2(t *testing.T) {
t.Parallel()
t.Run("scenarios", testScenarios)
t.Run("boards", testBoards)
}
func testScenarios(t *testing.T) {
func testBoards(t *testing.T) {
t.Parallel()
tca := []struct {
@ -2004,7 +2004,7 @@ layers: {
},
},
{
name: "recursive",
name: "errs/duplicate_board",
run: func(t *testing.T) {
assertCompile(t, `base
@ -2018,7 +2018,7 @@ steps: {
clause
}
}
`, `d2/testdata/d2compiler/TestCompile2/scenarios/recursive#01.d2:9:2: layer name one already used by another layer`)
`, `d2/testdata/d2compiler/TestCompile2/boards/errs/duplicate_board.d2:9:2: board name one already used by another board`)
},
},
}

View file

@ -398,15 +398,14 @@ func (p *printer) edgeIndex(ei *d2ast.EdgeIndex) {
p.sb.WriteByte(']')
}
func KeyPath(kp *d2ast.KeyPath) []string {
var ids []string
func KeyPath(kp *d2ast.KeyPath) (ida []string) {
for _, s := range kp.Path {
// We format each string of the key to ensure the resulting strings can be parsed
// correctly.
n := &d2ast.KeyPath{
Path: []*d2ast.StringBox{d2ast.MakeValueBox(d2ast.RawString(s.Unbox().ScalarString(), true)).StringBox()},
}
ids = append(ids, Format(n))
ida = append(ida, Format(n))
}
return ids
return ida
}

View file

@ -27,6 +27,7 @@ func (s Style) Copy() Style {
Italic: s.Italic.Copy(),
Underline: s.Underline.Copy(),
Filled: s.Filled.Copy(),
DoubleBorder: s.DoubleBorder.Copy(),
}
}
@ -48,7 +49,8 @@ func (attrs *Attributes) Copy() *Attributes {
Language: attrs.Language,
Shape: attrs.Shape,
Direction: attrs.Shape,
Direction: attrs.Direction,
Constraint: attrs.Constraint,
}
}

View file

@ -997,13 +997,13 @@ func (obj *Object) Connect(srcID, dstID []string, srcArrow, dstArrow bool, label
}
e.initIndex()
addSQLTableColumnIndexes(e, srcID, dstID, obj, src, dst)
addSQLTableColumnIndices(e, srcID, dstID, obj, src, dst)
obj.Graph.Edges = append(obj.Graph.Edges, e)
return e, nil
}
func addSQLTableColumnIndexes(e *Edge, srcID, dstID []string, obj, src, dst *Object) {
func addSQLTableColumnIndices(e *Edge, srcID, dstID []string, obj, src, dst *Object) {
if src.Attributes.Shape.Value == d2target.ShapeSQLTable {
if src == dst {
// Ignore edge to column inside table.
@ -1311,6 +1311,9 @@ func Key(k *d2ast.KeyPath) []string {
// All reserved keywords. See init below.
var ReservedKeywords map[string]struct{}
// All reserved keywords not including style keywords.
var ReservedKeywords2 map[string]struct{}
// Non Style/Holder keywords.
var SimpleReservedKeywords = map[string]struct{}{
"label": {},
@ -1379,6 +1382,13 @@ var NearConstantsArray = []string{
}
var NearConstants map[string]struct{}
// BoardKeywords contains the keywords that create new boards.
var BoardKeywords = map[string]struct{}{
"layers": {},
"scenarios": {},
"steps": {},
}
func init() {
ReservedKeywords = make(map[string]struct{})
for k, v := range SimpleReservedKeywords {
@ -1390,13 +1400,28 @@ func init() {
for k, v := range ReservedKeywordHolders {
ReservedKeywords[k] = v
}
for k, v := range BoardKeywords {
ReservedKeywords[k] = v
}
ReservedKeywords2 = make(map[string]struct{})
for k, v := range SimpleReservedKeywords {
ReservedKeywords2[k] = v
}
for k, v := range ReservedKeywordHolders {
ReservedKeywords2[k] = v
}
for k, v := range BoardKeywords {
ReservedKeywords2[k] = v
}
NearConstants = make(map[string]struct{}, len(NearConstantsArray))
for _, k := range NearConstantsArray {
NearConstants[k] = struct{}{}
}
}
func (g *Graph) GetLayer(name string) *Graph {
func (g *Graph) GetBoard(name string) *Graph {
for _, l := range g.Layers {
if l.Name == name {
return l

View file

@ -313,24 +313,31 @@ layers: {
t.Parallel()
tca := []testCase{
{
name: "bad_edge/1",
name: "1/bad_edge",
run: func(t testing.TB) {
_, err := compile(t, `layers.x -> layers.y`)
assert.ErrorString(t, err, `TestCompile/layers/errs/bad_edge/1.d2:1:1: cannot create edges between layers, scenarios or steps`)
assert.ErrorString(t, err, `TestCompile/layers/errs/1/bad_edge.d2:1:1: cannot create edges between boards`)
},
},
{
name: "bad_edge/2",
name: "2/bad_edge",
run: func(t testing.TB) {
_, err := compile(t, `layers -> scenarios`)
assert.ErrorString(t, err, `TestCompile/layers/errs/bad_edge/2.d2:1:1: cannot create edges between layers, scenarios or steps`)
assert.ErrorString(t, err, `TestCompile/layers/errs/2/bad_edge.d2:1:1: edge with board keyword alone doesn't make sense`)
},
},
{
name: "bad_edge/3",
name: "3/bad_edge",
run: func(t testing.TB) {
_, err := compile(t, `layers.x.y -> steps.z.p`)
assert.ErrorString(t, err, `TestCompile/layers/errs/bad_edge/3.d2:1:1: cannot create edges between layers, scenarios or steps`)
assert.ErrorString(t, err, `TestCompile/layers/errs/3/bad_edge.d2:1:1: cannot create edges between boards`)
},
},
{
name: "4/good_edge",
run: func(t testing.TB) {
_, err := compile(t, `layers.x.y -> layers.x.y`)
assert.Success(t, err)
},
},
}

View file

@ -11,6 +11,7 @@ import (
"oss.terrastruct.com/d2/d2ast"
"oss.terrastruct.com/d2/d2format"
"oss.terrastruct.com/d2/d2graph"
"oss.terrastruct.com/d2/d2parser"
)
@ -199,13 +200,6 @@ func (m *Map) CopyBase(newParent Node) *Map {
return m2
}
// CopyRoot copies the map such that it is now the root of a diagram.
func (m *Map) CopyRoot() *Map {
m = m.CopyBase(nil)
m.initRoot()
return m
}
// Root reports whether the Map is the root of the D2 tree.
func (m *Map) Root() bool {
// m.parent exists even on the root map as we store the root AST in
@ -222,28 +216,28 @@ func (f *Field) Root() bool {
return f.parent == nil
}
type LayerKind string
type BoardKind string
const (
LayerLayer LayerKind = "layer"
LayerScenario LayerKind = "scenario"
LayerStep LayerKind = "step"
BoardLayer BoardKind = "layer"
BoardScenario BoardKind = "scenario"
BoardStep BoardKind = "step"
)
// NodeLayerKind reports whether n represents the root of a layer.
// NodeBoardKind reports whether n represents the root of a board.
// n should be *Field or *Map
func NodeLayerKind(n Node) LayerKind {
func NodeBoardKind(n Node) BoardKind {
var f *Field
switch n := n.(type) {
case *Field:
if n.Name == "" {
return LayerLayer
return BoardLayer
}
f = ParentField(n)
case *Map:
f = ParentField(n)
if f.Root() {
return LayerLayer
return BoardLayer
}
f = ParentField(f)
}
@ -252,11 +246,11 @@ func NodeLayerKind(n Node) LayerKind {
}
switch f.Name {
case "layers":
return LayerLayer
return BoardLayer
case "scenarios":
return LayerScenario
return BoardScenario
case "steps":
return LayerStep
return BoardStep
default:
return ""
}
@ -657,8 +651,8 @@ func (m *Map) ensureField(i int, kp *d2ast.KeyPath, refctx *RefContext) (*Field,
return nil, d2parser.Errorf(kp.Path[i].Unbox(), `parent "_" can only be used in the beginning of paths, e.g. "_.x"`)
}
if hasLayerKeywords(head) != -1 && NodeLayerKind(m) == "" {
return nil, d2parser.Errorf(kp.Path[i].Unbox(), "%s is only allowed at a layer root", head)
if findBoardKeyword(head) != -1 && NodeBoardKind(m) == "" {
return nil, d2parser.Errorf(kp.Path[i].Unbox(), "%s is only allowed at a board root", head)
}
for _, f := range m.Fields {
@ -789,25 +783,34 @@ func (m *Map) CreateEdge(eid *EdgeID, refctx *RefContext) (*Edge, error) {
return f.Map().CreateEdge(eid, refctx)
}
ij := hasLayerKeywords(eid.SrcPath...)
ij := findProhibitedEdgeKeyword(eid.SrcPath...)
if ij != -1 {
return nil, d2parser.Errorf(refctx.Edge.Src.Path[ij].Unbox(), "cannot create edges between layers, scenarios or steps")
return nil, d2parser.Errorf(refctx.Edge.Src.Path[ij].Unbox(), "reserved keywords are prohibited in edges")
}
ij = findBoardKeyword(eid.SrcPath...)
if ij == len(eid.SrcPath)-1 {
return nil, d2parser.Errorf(refctx.Edge.Src.Path[ij].Unbox(), "edge with board keyword alone doesn't make sense")
}
src := m.GetField(eid.SrcPath...)
if NodeLayerKind(src) != "" {
return nil, d2parser.Errorf(refctx.Edge.Src, "cannot create edges between layers, scenarios or steps")
}
ij = hasLayerKeywords(eid.DstPath...)
if ij != -1 {
return nil, d2parser.Errorf(refctx.Edge.Dst.Path[ij].Unbox(), "cannot create edges between layers, scenarios or steps")
}
dst := m.GetField(eid.DstPath...)
if NodeLayerKind(dst) != "" {
return nil, d2parser.Errorf(refctx.Edge.Dst, "cannot create edges between layers, scenarios or steps")
if NodeBoardKind(src) != "" {
return nil, d2parser.Errorf(refctx.Edge.Src, "cannot create edges between boards")
}
if ParentLayer(src) != ParentLayer(dst) {
return nil, d2parser.Errorf(refctx.Edge, "cannot create edges between layers, scenarios or steps")
ij = findProhibitedEdgeKeyword(eid.DstPath...)
if ij != -1 {
return nil, d2parser.Errorf(refctx.Edge.Dst.Path[ij].Unbox(), "reserved keywords are prohibited in edges")
}
ij = findBoardKeyword(eid.DstPath...)
if ij == len(eid.DstPath)-1 {
return nil, d2parser.Errorf(refctx.Edge.Dst.Path[ij].Unbox(), "edge with board keyword alone doesn't make sense")
}
dst := m.GetField(eid.DstPath...)
if NodeBoardKind(dst) != "" {
return nil, d2parser.Errorf(refctx.Edge.Dst, "cannot create edges between boards")
}
if ParentBoard(src) != ParentBoard(dst) {
return nil, d2parser.Errorf(refctx.Edge, "cannot create edges between boards")
}
eid.Index = nil
@ -949,13 +952,13 @@ func ParentField(n Node) *Field {
}
}
func ParentLayer(n Node) Node {
func ParentBoard(n Node) Node {
for {
n = n.Parent()
if n == nil {
return nil
}
if NodeLayerKind(n) != "" {
if NodeBoardKind(n) != "" {
return n
}
}
@ -974,20 +977,29 @@ func ParentEdge(n Node) *Edge {
}
func countUnderscores(p []string) int {
var count int
for _, el := range p {
for i, el := range p {
if el != "_" {
break
return i
}
count++
}
return count
return 0
}
func hasLayerKeywords(ida ...string) int {
func findBoardKeyword(ida ...string) int {
for i := range ida {
switch ida[i] {
case "layers", "scenarios", "steps":
if _, ok := d2graph.BoardKeywords[ida[i]]; ok {
return i
}
}
return -1
}
func findProhibitedEdgeKeyword(ida ...string) int {
for i := range ida {
if _, ok := d2graph.SimpleReservedKeywords[ida[i]]; ok {
return i
}
if _, ok := d2graph.ReservedKeywordHolders[ida[i]]; ok {
return i
}
}

View file

@ -4,8 +4,8 @@
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/edge_to_style.d2,1:0:24-1:12:36",
"errmsg": "d2/testdata/d2compiler/TestCompile/edge_to_style.d2:2:1: cannot connect to reserved keyword"
"range": "d2/testdata/d2compiler/TestCompile/edge_to_style.d2,1:7:31-1:12:36",
"errmsg": "d2/testdata/d2compiler/TestCompile/edge_to_style.d2:2:8: reserved keywords are prohibited in edges"
}
]
}

View file

@ -0,0 +1,12 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile2/boards/errs/duplicate_board.d2,8:1:51-8:4:54",
"errmsg": "d2/testdata/d2compiler/TestCompile2/boards/errs/duplicate_board.d2:9:2: board name one already used by another board"
}
]
}
}

File diff suppressed because it is too large Load diff

722
testdata/d2compiler/TestCompile2/boards/root.exp.json generated vendored Normal file
View file

@ -0,0 +1,722 @@
{
"graph": {
"name": "",
"ast": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,0:0:0-10:0:65",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,0:0:0-0:4:4",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,0:0:0-0:4:4",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,0:0:0-0:4:4",
"value": [
{
"string": "base",
"raw_string": "base"
}
]
}
}
]
},
"primary": {},
"value": {}
}
},
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,2:0:6-9:1:64",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,2:0:6-2:6:12",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,2:0:6-2:6:12",
"value": [
{
"string": "layers",
"raw_string": "layers"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,2:8:14-9:0:63",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,3:2:18-5:3:38",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,3:2:18-3:5:21",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,3:2:18-3:5:21",
"value": [
{
"string": "one",
"raw_string": "one"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,3:7:23-5:2:37",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,4:4:29-4:9:34",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,4:4:29-4:9:34",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,4:4:29-4:9:34",
"value": [
{
"string": "santa",
"raw_string": "santa"
}
]
}
}
]
},
"primary": {},
"value": {}
}
}
]
}
}
}
},
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,6:2:41-8:3:62",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,6:2:41-6:5:44",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,6:2:41-6:5:44",
"value": [
{
"string": "two",
"raw_string": "two"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,6:7:46-8:2:61",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,7:4:52-7:10:58",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,7:4:52-7:10:58",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,7:4:52-7:10:58",
"value": [
{
"string": "clause",
"raw_string": "clause"
}
]
}
}
]
},
"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": "base",
"id_val": "base",
"label_dimensions": {
"width": 0,
"height": 0
},
"references": [
{
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,0:0:0-0:4:4",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,0:0:0-0:4:4",
"value": [
{
"string": "base",
"raw_string": "base"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "base"
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
}
],
"layers": [
{
"name": "one",
"ast": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,0:0:0-10:0:65",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,0:0:0-0:4:4",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,0:0:0-0:4:4",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,0:0:0-0:4:4",
"value": [
{
"string": "base",
"raw_string": "base"
}
]
}
}
]
},
"primary": {},
"value": {}
}
},
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,2:0:6-9:1:64",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,2:0:6-2:6:12",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,2:0:6-2:6:12",
"value": [
{
"string": "layers",
"raw_string": "layers"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,2:8:14-9:0:63",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,3:2:18-5:3:38",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,3:2:18-3:5:21",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,3:2:18-3:5:21",
"value": [
{
"string": "one",
"raw_string": "one"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,3:7:23-5:2:37",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,4:4:29-4:9:34",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,4:4:29-4:9:34",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,4:4:29-4:9:34",
"value": [
{
"string": "santa",
"raw_string": "santa"
}
]
}
}
]
},
"primary": {},
"value": {}
}
}
]
}
}
}
},
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,6:2:41-8:3:62",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,6:2:41-6:5:44",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,6:2:41-6:5:44",
"value": [
{
"string": "two",
"raw_string": "two"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,6:7:46-8:2:61",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,7:4:52-7:10:58",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,7:4:52-7:10:58",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,7:4:52-7:10:58",
"value": [
{
"string": "clause",
"raw_string": "clause"
}
]
}
}
]
},
"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": "santa",
"id_val": "santa",
"label_dimensions": {
"width": 0,
"height": 0
},
"references": [
{
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,4:4:29-4:9:34",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,4:4:29-4:9:34",
"value": [
{
"string": "santa",
"raw_string": "santa"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "santa"
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
}
]
},
{
"name": "two",
"ast": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,0:0:0-10:0:65",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,0:0:0-0:4:4",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,0:0:0-0:4:4",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,0:0:0-0:4:4",
"value": [
{
"string": "base",
"raw_string": "base"
}
]
}
}
]
},
"primary": {},
"value": {}
}
},
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,2:0:6-9:1:64",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,2:0:6-2:6:12",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,2:0:6-2:6:12",
"value": [
{
"string": "layers",
"raw_string": "layers"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,2:8:14-9:0:63",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,3:2:18-5:3:38",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,3:2:18-3:5:21",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,3:2:18-3:5:21",
"value": [
{
"string": "one",
"raw_string": "one"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,3:7:23-5:2:37",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,4:4:29-4:9:34",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,4:4:29-4:9:34",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,4:4:29-4:9:34",
"value": [
{
"string": "santa",
"raw_string": "santa"
}
]
}
}
]
},
"primary": {},
"value": {}
}
}
]
}
}
}
},
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,6:2:41-8:3:62",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,6:2:41-6:5:44",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,6:2:41-6:5:44",
"value": [
{
"string": "two",
"raw_string": "two"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,6:7:46-8:2:61",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,7:4:52-7:10:58",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,7:4:52-7:10:58",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,7:4:52-7:10:58",
"value": [
{
"string": "clause",
"raw_string": "clause"
}
]
}
}
]
},
"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": "clause",
"id_val": "clause",
"label_dimensions": {
"width": 0,
"height": 0
},
"references": [
{
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,7:4:52-7:10:58",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/boards/root.d2,7:4:52-7:10:58",
"value": [
{
"string": "clause",
"raw_string": "clause"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "clause"
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
}
]
}
]
},
"err": null
}

View file

@ -1,12 +0,0 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive#01.d2,8:1:51-8:4:54",
"errmsg": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive#01.d2:9:2: layer name one already used by another layer"
}
]
}
}

View file

@ -1,695 +0,0 @@
{
"graph": {
"name": "",
"ast": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,0:0:0-18:0:145",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,0:0:0-0:4:4",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,0:0:0-0:4:4",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,0:0:0-0:4:4",
"value": [
{
"string": "base",
"raw_string": "base"
}
]
}
}
]
},
"primary": {},
"value": {}
}
},
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,2:0:6-17:1:144",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,2:0:6-2:6:12",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,2:0:6-2:6:12",
"value": [
{
"string": "layers",
"raw_string": "layers"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,2:8:14-17:0:143",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,3:2:18-5:3:38",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,3:2:18-3:5:21",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,3:2:18-3:5:21",
"value": [
{
"string": "one",
"raw_string": "one"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,3:7:23-5:2:37",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,4:4:29-4:9:34",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,4:4:29-4:9:34",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,4:4:29-4:9:34",
"value": [
{
"string": "santa",
"raw_string": "santa"
}
]
}
}
]
},
"primary": {},
"value": {}
}
}
]
}
}
}
},
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,6:2:41-16:3:142",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,6:2:41-6:5:44",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,6:2:41-6:5:44",
"value": [
{
"string": "two",
"raw_string": "two"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,6:7:46-16:2:141",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,7:4:52-7:10:58",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,7:4:52-7:10:58",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,7:4:52-7:10:58",
"value": [
{
"string": "clause",
"raw_string": "clause"
}
]
}
}
]
},
"primary": {},
"value": {}
}
},
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,8:2:61-15:3:138",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,8:2:61-8:7:66",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,8:2:61-8:7:66",
"value": [
{
"string": "steps",
"raw_string": "steps"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,8:9:68-15:2:137",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,9:3:73-11:4:102",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,9:3:73-9:11:81",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,9:3:73-9:11:81",
"value": [
{
"string": "seinfeld",
"raw_string": "seinfeld"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,9:13:83-11:3:101",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,10:4:89-10:12:97",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,10:4:89-10:12:97",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,10:4:89-10:12:97",
"value": [
{
"string": "reindeer",
"raw_string": "reindeer"
}
]
}
}
]
},
"primary": {},
"value": {}
}
}
]
}
}
}
},
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,12:3:106-14:4:134",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,12:3:106-12:11:114",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,12:3:106-12:11:114",
"value": [
{
"string": "missoula",
"raw_string": "missoula"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,12:13:116-14:3:133",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,13:4:122-13:11:129",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,13:4:122-13:11:129",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,13:4:122-13:11:129",
"value": [
{
"string": "montana",
"raw_string": "montana"
}
]
}
}
]
},
"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": "base",
"id_val": "base",
"label_dimensions": {
"width": 0,
"height": 0
},
"references": [
{
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,0:0:0-0:4:4",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,0:0:0-0:4:4",
"value": [
{
"string": "base",
"raw_string": "base"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "base"
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
}
],
"layers": [
{
"name": "one",
"ast": null,
"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": "santa",
"id_val": "santa",
"label_dimensions": {
"width": 0,
"height": 0
},
"references": [
{
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,4:4:29-4:9:34",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,4:4:29-4:9:34",
"value": [
{
"string": "santa",
"raw_string": "santa"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "santa"
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
}
]
},
{
"name": "two",
"ast": null,
"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": "clause",
"id_val": "clause",
"label_dimensions": {
"width": 0,
"height": 0
},
"references": [
{
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,7:4:52-7:10:58",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,7:4:52-7:10:58",
"value": [
{
"string": "clause",
"raw_string": "clause"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "clause"
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
}
],
"steps": [
{
"name": "seinfeld",
"ast": null,
"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": "reindeer",
"id_val": "reindeer",
"label_dimensions": {
"width": 0,
"height": 0
},
"references": [
{
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,10:4:89-10:12:97",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,10:4:89-10:12:97",
"value": [
{
"string": "reindeer",
"raw_string": "reindeer"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "reindeer"
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
}
]
},
{
"name": "missoula",
"ast": null,
"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": "montana",
"id_val": "montana",
"label_dimensions": {
"width": 0,
"height": 0
},
"references": [
{
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,13:4:122-13:11:129",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/recursive.d2,13:4:122-13:11:129",
"value": [
{
"string": "montana",
"raw_string": "montana"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "montana"
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
}
]
}
]
}
]
},
"err": null
}

View file

@ -1,402 +0,0 @@
{
"graph": {
"name": "",
"ast": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,0:0:0-10:0:65",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,0:0:0-0:4:4",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,0:0:0-0:4:4",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,0:0:0-0:4:4",
"value": [
{
"string": "base",
"raw_string": "base"
}
]
}
}
]
},
"primary": {},
"value": {}
}
},
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,2:0:6-9:1:64",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,2:0:6-2:6:12",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,2:0:6-2:6:12",
"value": [
{
"string": "layers",
"raw_string": "layers"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,2:8:14-9:0:63",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,3:2:18-5:3:38",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,3:2:18-3:5:21",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,3:2:18-3:5:21",
"value": [
{
"string": "one",
"raw_string": "one"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,3:7:23-5:2:37",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,4:4:29-4:9:34",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,4:4:29-4:9:34",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,4:4:29-4:9:34",
"value": [
{
"string": "santa",
"raw_string": "santa"
}
]
}
}
]
},
"primary": {},
"value": {}
}
}
]
}
}
}
},
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,6:2:41-8:3:62",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,6:2:41-6:5:44",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,6:2:41-6:5:44",
"value": [
{
"string": "two",
"raw_string": "two"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,6:7:46-8:2:61",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,7:4:52-7:10:58",
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,7:4:52-7:10:58",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,7:4:52-7:10:58",
"value": [
{
"string": "clause",
"raw_string": "clause"
}
]
}
}
]
},
"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": "base",
"id_val": "base",
"label_dimensions": {
"width": 0,
"height": 0
},
"references": [
{
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,0:0:0-0:4:4",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,0:0:0-0:4:4",
"value": [
{
"string": "base",
"raw_string": "base"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "base"
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
}
],
"layers": [
{
"name": "one",
"ast": null,
"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": "santa",
"id_val": "santa",
"label_dimensions": {
"width": 0,
"height": 0
},
"references": [
{
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,4:4:29-4:9:34",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,4:4:29-4:9:34",
"value": [
{
"string": "santa",
"raw_string": "santa"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "santa"
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
}
]
},
{
"name": "two",
"ast": null,
"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": "clause",
"id_val": "clause",
"label_dimensions": {
"width": 0,
"height": 0
},
"references": [
{
"key": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,7:4:52-7:10:58",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2compiler/TestCompile2/scenarios/root.d2,7:4:52-7:10:58",
"value": [
{
"string": "clause",
"raw_string": "clause"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "clause"
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": {
"value": ""
}
},
"zIndex": 0
}
]
}
]
},
"err": null
}

File diff suppressed because it is too large Load diff