d2ir: Handle imported scenarios/steps/links
This commit is contained in:
parent
a5d3cc1429
commit
7f0450121a
3 changed files with 296 additions and 3 deletions
|
|
@ -124,6 +124,15 @@ func (c *compiler) compileMap(dst *Map, ast *d2ast.Map) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
OverlayMap(dst, impn.Map())
|
OverlayMap(dst, impn.Map())
|
||||||
|
|
||||||
|
if impnf, ok := impn.(*Field); ok {
|
||||||
|
if impnf.Primary_ != nil {
|
||||||
|
dstf := ParentField(dst)
|
||||||
|
if dstf != nil {
|
||||||
|
dstf.Primary_ = impnf.Primary_
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
case n.Substitution != nil:
|
case n.Substitution != nil:
|
||||||
panic("TODO")
|
panic("TODO")
|
||||||
}
|
}
|
||||||
|
|
@ -192,13 +201,47 @@ func (c *compiler) compileField(dst *Map, kp *d2ast.KeyPath, refctx *RefContext)
|
||||||
switch n := n.(type) {
|
switch n := n.(type) {
|
||||||
case *Field:
|
case *Field:
|
||||||
if n.Primary_ != nil {
|
if n.Primary_ != nil {
|
||||||
f.Primary_ = n.Primary_.Copy(f).(*Scalar)
|
refctx2 := refctx.Copy()
|
||||||
|
key2 := *refctx.Key
|
||||||
|
refctx.Key = &key2
|
||||||
|
refctx2.Key.Value = d2ast.MakeValueBox(n.Primary_.Value)
|
||||||
|
// If the link is a board, we need to transform it into an absolute path.
|
||||||
|
if f.Name == "link" {
|
||||||
|
c.compileLink(refctx2)
|
||||||
|
}
|
||||||
|
f.Primary_ = &Scalar{
|
||||||
|
parent: f,
|
||||||
|
Value: refctx2.Key.Value.ScalarBox().Unbox(),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if n.Composite != nil {
|
if n.Composite != nil {
|
||||||
f.Composite = n.Composite.Copy(f).(Composite)
|
f.Composite = n.Composite.Copy(f).(Composite)
|
||||||
}
|
}
|
||||||
case *Map:
|
case *Map:
|
||||||
f.Composite = n.Copy(f).(Composite)
|
f.Composite = &Map{
|
||||||
|
parent: f,
|
||||||
|
}
|
||||||
|
switch NodeBoardKind(f) {
|
||||||
|
case BoardScenario:
|
||||||
|
c.overlay(ParentBoard(f).Map(), f)
|
||||||
|
case BoardStep:
|
||||||
|
stepsMap := ParentMap(f)
|
||||||
|
for i := range stepsMap.Fields {
|
||||||
|
if stepsMap.Fields[i] == f {
|
||||||
|
if i == 0 {
|
||||||
|
c.overlay(ParentBoard(f).Map(), f)
|
||||||
|
} else {
|
||||||
|
c.overlay(stepsMap.Fields[i-1].Map(), f)
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OverlayMap(f.Map(), n)
|
||||||
|
switch NodeBoardKind(f) {
|
||||||
|
case BoardScenario, BoardStep:
|
||||||
|
c.compileClasses(f.Map())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if refctx.Key.Value.ScalarBox().Unbox() != nil {
|
} else if refctx.Key.Value.ScalarBox().Unbox() != nil {
|
||||||
// If the link is a board, we need to transform it into an absolute path.
|
// If the link is a board, we need to transform it into an absolute path.
|
||||||
|
|
@ -408,7 +451,7 @@ func (c *compiler) compileArray(dst *Array, a *d2ast.Array) {
|
||||||
}
|
}
|
||||||
case *Map:
|
case *Map:
|
||||||
if v.Spread {
|
if v.Spread {
|
||||||
c.errorf(v, "cannot spread import map into array")
|
c.errorf(v, "can only spread import array into array")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
irv = n
|
irv = n
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,20 @@ label: meow`,
|
||||||
assertQuery(t, m, 0, 0, nil, "jon")
|
assertQuery(t, m, 0, 0, nil, "jon")
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "nested/spread_primary",
|
||||||
|
run: func(t testing.TB) {
|
||||||
|
m, err := compileFS(t, "index.d2", map[string]string{
|
||||||
|
"index.d2": "q: { ...@x.y }",
|
||||||
|
"x.d2": "y: meow { jon; jan }",
|
||||||
|
})
|
||||||
|
assert.Success(t, err)
|
||||||
|
assertQuery(t, m, 3, 0, nil, "")
|
||||||
|
assertQuery(t, m, 2, 0, "meow", "q")
|
||||||
|
assertQuery(t, m, 0, 0, nil, "q.jan")
|
||||||
|
assertQuery(t, m, 0, 0, nil, "q.jon")
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
runa(t, tca)
|
runa(t, tca)
|
||||||
|
|
@ -156,6 +170,16 @@ x.d2:1:7: connection missing source`)
|
||||||
assert.ErrorString(t, err, `q.d2:1:1: detected cyclic import chain: x -> y -> q -> x`)
|
assert.ErrorString(t, err, `q.d2:1:1: detected cyclic import chain: x -> y -> q -> x`)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "spread_non_map",
|
||||||
|
run: func(t testing.TB) {
|
||||||
|
_, err := compileFS(t, "index.d2", map[string]string{
|
||||||
|
"index.d2": "...@x.y",
|
||||||
|
"x.d2": "y: meow",
|
||||||
|
})
|
||||||
|
assert.ErrorString(t, err, `index.d2:1:1: cannot spread import non map into map`)
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
runa(t, tca)
|
runa(t, tca)
|
||||||
})
|
})
|
||||||
|
|
|
||||||
226
testdata/d2ir/TestCompile/imports/nested/spread_primary.exp.json
generated
vendored
Normal file
226
testdata/d2ir/TestCompile/imports/nested/spread_primary.exp.json
generated
vendored
Normal file
|
|
@ -0,0 +1,226 @@
|
||||||
|
{
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "q",
|
||||||
|
"primary": {
|
||||||
|
"value": {
|
||||||
|
"range": "x.d2,0:3:3-0:7:7",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"string": "meow",
|
||||||
|
"raw_string": "meow"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"composite": {
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "jon",
|
||||||
|
"references": [
|
||||||
|
{
|
||||||
|
"string": {
|
||||||
|
"range": "x.d2,0:10:10-0:13:13",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"string": "jon",
|
||||||
|
"raw_string": "jon"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"key_path": {
|
||||||
|
"range": "x.d2,0:10:10-0:13:13",
|
||||||
|
"path": [
|
||||||
|
{
|
||||||
|
"unquoted_string": {
|
||||||
|
"range": "x.d2,0:10:10-0:13:13",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"string": "jon",
|
||||||
|
"raw_string": "jon"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"context": {
|
||||||
|
"edge": null,
|
||||||
|
"key": {
|
||||||
|
"range": "x.d2,0:10:10-0:13:13",
|
||||||
|
"key": {
|
||||||
|
"range": "x.d2,0:10:10-0:13:13",
|
||||||
|
"path": [
|
||||||
|
{
|
||||||
|
"unquoted_string": {
|
||||||
|
"range": "x.d2,0:10:10-0:13:13",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"string": "jon",
|
||||||
|
"raw_string": "jon"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"primary": {},
|
||||||
|
"value": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "jan",
|
||||||
|
"references": [
|
||||||
|
{
|
||||||
|
"string": {
|
||||||
|
"range": "x.d2,0:15:15-0:18:18",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"string": "jan",
|
||||||
|
"raw_string": "jan"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"key_path": {
|
||||||
|
"range": "x.d2,0:15:15-0:18:18",
|
||||||
|
"path": [
|
||||||
|
{
|
||||||
|
"unquoted_string": {
|
||||||
|
"range": "x.d2,0:15:15-0:18:18",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"string": "jan",
|
||||||
|
"raw_string": "jan"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"context": {
|
||||||
|
"edge": null,
|
||||||
|
"key": {
|
||||||
|
"range": "x.d2,0:15:15-0:19:19",
|
||||||
|
"key": {
|
||||||
|
"range": "x.d2,0:15:15-0:18:18",
|
||||||
|
"path": [
|
||||||
|
{
|
||||||
|
"unquoted_string": {
|
||||||
|
"range": "x.d2,0:15:15-0:18:18",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"string": "jan",
|
||||||
|
"raw_string": "jan"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"primary": {},
|
||||||
|
"value": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"edges": null
|
||||||
|
},
|
||||||
|
"references": [
|
||||||
|
{
|
||||||
|
"string": {
|
||||||
|
"range": "index.d2,0:0:0-0:1:1",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"string": "q",
|
||||||
|
"raw_string": "q"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"key_path": {
|
||||||
|
"range": "index.d2,0:0:0-0:1:1",
|
||||||
|
"path": [
|
||||||
|
{
|
||||||
|
"unquoted_string": {
|
||||||
|
"range": "index.d2,0:0:0-0:1:1",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"string": "q",
|
||||||
|
"raw_string": "q"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"context": {
|
||||||
|
"edge": null,
|
||||||
|
"key": {
|
||||||
|
"range": "index.d2,0:0:0-0:14:14",
|
||||||
|
"key": {
|
||||||
|
"range": "index.d2,0:0:0-0:1:1",
|
||||||
|
"path": [
|
||||||
|
{
|
||||||
|
"unquoted_string": {
|
||||||
|
"range": "index.d2,0:0:0-0:1:1",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"string": "q",
|
||||||
|
"raw_string": "q"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"primary": {},
|
||||||
|
"value": {
|
||||||
|
"map": {
|
||||||
|
"range": "index.d2,0:3:3-0:14:14",
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"import": {
|
||||||
|
"range": "index.d2,0:5:5-0:13:13",
|
||||||
|
"spread": true,
|
||||||
|
"pre": "",
|
||||||
|
"path": [
|
||||||
|
{
|
||||||
|
"unquoted_string": {
|
||||||
|
"range": "index.d2,0:9:9-0:10:10",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"string": "x",
|
||||||
|
"raw_string": "x"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unquoted_string": {
|
||||||
|
"range": "index.d2,0:11:11-0:12:12",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"string": "y",
|
||||||
|
"raw_string": "y"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"edges": null
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue