validate nested grid edges (not implemented yet)

This commit is contained in:
Gavin Nishizawa 2023-09-12 22:55:31 -07:00
parent 64313e1787
commit fc06b09df6
No known key found for this signature in database
GPG key ID: AE3B177777CE55CD
6 changed files with 93 additions and 6 deletions

View file

@ -1075,14 +1075,29 @@ func (c *compiler) validateEdges(g *d2graph.Graph) {
srcGrid := edge.Src.Parent.ClosestGridDiagram()
dstGrid := edge.Dst.Parent.ClosestGridDiagram()
if srcGrid != nil || dstGrid != nil {
if top := srcGrid.TopGridDiagram(); srcGrid != top {
// valid: grid.child1 -> grid.child2
// invalid: grid.childGrid.child1 -> grid.childGrid.child2
c.errorf(edge.GetAstEdge(), "edge must be on direct child of grid diagram %#v", top.AbsID())
continue
}
if top := dstGrid.TopGridDiagram(); dstGrid != top {
// valid: grid.child1 -> grid.child2
// invalid: grid.childGrid.child1 -> grid.childGrid.child2
c.errorf(edge.GetAstEdge(), "edge must be on direct child of grid diagram %#v", top.AbsID())
continue
}
if srcGrid != dstGrid {
// valid: a -> grid
// invalid: a -> grid.child
c.errorf(edge.GetAstEdge(), "edges into grid diagrams are not supported yet")
continue
} else {
if srcGrid != edge.Src.Parent || dstGrid != edge.Dst.Parent {
c.errorf(edge.GetAstEdge(), "grid diagrams can only have edges between children right now")
continue
}
}
if srcGrid != edge.Src.Parent || dstGrid != edge.Dst.Parent {
// valid: grid.child1 -> grid.child2
// invalid: grid.child1 -> grid.child2.child1
c.errorf(edge.GetAstEdge(), "grid diagrams can only have edges between children right now")
continue
}
}
}

View file

@ -2496,9 +2496,14 @@ d2/testdata/d2compiler/TestCompile/grid_edge.d2:7:2: edges into grid diagrams ar
b: {
c -> d: not yet
}
a: {
grid-columns: 1
e -> f: also not yet
}
}
`,
expErr: `d2/testdata/d2compiler/TestCompile/grid_deeper_edge.d2:5:3: grid diagrams can only have edges between children right now`,
expErr: `d2/testdata/d2compiler/TestCompile/grid_deeper_edge.d2:9:3: edge must be on direct child of grid diagram "hey"
d2/testdata/d2compiler/TestCompile/grid_deeper_edge.d2:5:3: grid diagrams can only have edges between children right now`,
},
{
name: "grid_nested",

View file

@ -14,3 +14,22 @@ func (obj *Object) ClosestGridDiagram() *Object {
}
return obj.Parent.ClosestGridDiagram()
}
// TopGridDiagram returns the least nested (outermost) grid diagram
func (obj *Object) TopGridDiagram() *Object {
if obj == nil {
return nil
}
var gd *Object
if obj.IsGridDiagram() {
gd = obj
}
curr := obj.Parent
for curr != nil {
if curr.IsGridDiagram() {
gd = curr
}
curr = curr.Parent
}
return gd
}

View file

@ -2834,6 +2834,7 @@ y: profits {
loadFromFile(t, "dagre_spacing"),
loadFromFile(t, "dagre_spacing_right"),
loadFromFile(t, "simple_grid_edges"),
loadFromFile(t, "grid_nested_simple_edges"),
}
runa(t, tcs)

View file

@ -0,0 +1,43 @@
direction: right
outer-grid -> outer-container
outer-grid: {
grid-columns: 1
inner-grid -> container -> etc
container: {
label.near: top-left
# edges not yet supported here since they must be direct grid children
a
b
c
}
inner-grid: {
grid-rows: 1
1
2
3
# edges here are not supported yet since this is inside another grid
}
}
outer-container: {
grid -> container
grid: {
grid-rows: 1
# direct child edges ok in least nested grid
1 -> 2 -> 3
}
container: {
# non grid edges ok
4 -> 5 -> 6
nested container: {
# nested non grid edges ok
7 -> 8
}
}
}

View file

@ -2,6 +2,10 @@
"graph": null,
"err": {
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/grid_deeper_edge.d2,8:2:86-8:8:92",
"errmsg": "d2/testdata/d2compiler/TestCompile/grid_deeper_edge.d2:9:3: edge must be on direct child of grid diagram \"hey\""
},
{
"range": "d2/testdata/d2compiler/TestCompile/grid_deeper_edge.d2,4:2:41-4:8:47",
"errmsg": "d2/testdata/d2compiler/TestCompile/grid_deeper_edge.d2:5:3: grid diagrams can only have edges between children right now"