d2ir: Compile imports

Works as so:

index.d2:
```d2
x: @x
```

x.d2:
```d2
label: meow
shape: circle
```

TODO:

- [ ] Correctly import into fields by handling the scenarios/steps overlay.
      - And links.
- [ ] Test every kind of import.
This commit is contained in:
Anmol Sethi 2023-06-04 15:39:00 -07:00
parent f61409cb79
commit 2fcc9ed140
No known key found for this signature in database
GPG key ID: 8CEF1878FF10ADEB
70 changed files with 975 additions and 68 deletions

View file

@ -1021,8 +1021,8 @@ type InterpolationBox struct {
// & is only special if it begins a key.
// - is only special if followed by another - in a key.
// ' " and | are only special if they begin an unquoted key or value.
var UnquotedKeySpecials = string([]rune{'#', ';', '\n', '\\', '{', '}', '[', ']', '\'', '"', '|', ':', '.', '-', '<', '>', '*', '&', '(', ')'})
var UnquotedValueSpecials = string([]rune{'#', ';', '\n', '\\', '{', '}', '[', ']', '\'', '"', '|', '$'})
var UnquotedKeySpecials = string([]rune{'#', ';', '\n', '\\', '{', '}', '[', ']', '\'', '"', '|', ':', '.', '-', '<', '>', '*', '&', '(', ')', '@'})
var UnquotedValueSpecials = string([]rune{'#', ';', '\n', '\\', '{', '}', '[', ']', '\'', '"', '|', '$', '@'})
// RawString returns s in a AST String node that can format s in the most aesthetically
// pleasing way.
@ -1071,8 +1071,26 @@ func RawString(s string, inKey bool) String {
return FlatUnquotedString(s)
}
func RawStringBox(s string, inKey bool) *StringBox {
return MakeValueBox(RawString(s, inKey)).StringBox()
}
func hasSurroundingWhitespace(s string) bool {
r, _ := utf8.DecodeRuneInString(s)
r2, _ := utf8.DecodeLastRuneInString(s)
return unicode.IsSpace(r) || unicode.IsSpace(r2)
}
func (s *Substitution) IDA() (ida []string) {
for _, el := range s.Path {
ida = append(ida, el.Unbox().ScalarString())
}
return ida
}
func (i *Import) IDA() (ida []string) {
for _, el := range i.Path[1:] {
ida = append(ida, el.Unbox().ScalarString())
}
return ida
}

View file

@ -4,7 +4,9 @@ import (
"encoding/xml"
"fmt"
"io"
"io/fs"
"net/url"
"os"
"strconv"
"strings"
@ -21,12 +23,18 @@ import (
type CompileOptions struct {
UTF16 bool
// FS is the file system used for resolving imports in the d2 text.
// It should correspond to the root path.
FS fs.FS
}
func Compile(path string, r io.RuneReader, opts *CompileOptions) (*d2graph.Graph, error) {
if opts == nil {
opts = &CompileOptions{}
}
if opts.FS == nil {
opts.FS = os.DirFS("/")
}
ast, err := d2parser.Parse(path, r, &d2parser.ParseOptions{
UTF16: opts.UTF16,
@ -35,7 +43,10 @@ func Compile(path string, r io.RuneReader, opts *CompileOptions) (*d2graph.Graph
return nil, err
}
ir, err := d2ir.Compile(ast)
ir, err := d2ir.Compile(ast, &d2ir.CompileOptions{
UTF16: opts.UTF16,
FS: opts.FS,
})
if err != nil {
return nil, err
}
@ -50,7 +61,9 @@ func Compile(path string, r io.RuneReader, opts *CompileOptions) (*d2graph.Graph
}
func compileIR(ast *d2ast.Map, m *d2ir.Map) (*d2graph.Graph, error) {
c := &compiler{}
c := &compiler{
err: &d2parser.ParseError{},
}
g := d2graph.NewGraph()
g.AST = ast
@ -116,7 +129,7 @@ func (c *compiler) compileBoardsField(g *d2graph.Graph, ir *d2ir.Map, fieldName
}
type compiler struct {
err d2parser.ParseError
err *d2parser.ParseError
}
func (c *compiler) errorf(n d2ast.Node, f string, v ...interface{}) {

View file

@ -1,6 +1,7 @@
package d2ir
import (
"io/fs"
"strings"
"oss.terrastruct.com/d2/d2ast"
@ -9,18 +10,46 @@ import (
)
type compiler struct {
err d2parser.ParseError
err *d2parser.ParseError
fs fs.FS
// importStack is used to detect cyclic imports.
importStack []string
// importCache enables reuse of files imported multiple times.
importCache map[string]*Map
utf16 bool
}
type CompileOptions struct {
UTF16 bool
// Pass nil to disable imports.
FS fs.FS
}
func (c *compiler) errorf(n d2ast.Node, f string, v ...interface{}) {
c.err.Errors = append(c.err.Errors, d2parser.Errorf(n, f, v...).(d2ast.Error))
}
func Compile(ast *d2ast.Map) (*Map, error) {
c := &compiler{}
func Compile(ast *d2ast.Map, opts *CompileOptions) (*Map, error) {
if opts == nil {
opts = &CompileOptions{}
}
c := &compiler{
err: &d2parser.ParseError{},
fs: opts.FS,
importCache: make(map[string]*Map),
utf16: opts.UTF16,
}
m := &Map{}
m.initRoot()
m.parent.(*Field).References[0].Context.Scope = ast
c.pushImportStack(&d2ast.Import{
Path: []*d2ast.StringBox{d2ast.RawStringBox(ast.GetRange().Path, true)},
})
defer c.popImportStack()
c.compileMap(m, ast)
c.compileClasses(m)
if !c.err.Empty() {
@ -85,6 +114,16 @@ func (c *compiler) compileMap(dst *Map, ast *d2ast.Map) {
Scope: ast,
ScopeMap: dst,
})
case n.Import != nil:
impn, ok := c._import(n.Import)
if !ok {
continue
}
if impn.Map() == nil {
c.errorf(n.Import, "cannot spread import non map into map")
continue
}
OverlayMap(dst, impn.Map())
case n.Substitution != nil:
panic("TODO")
}
@ -145,6 +184,22 @@ func (c *compiler) compileField(dst *Map, kp *d2ast.KeyPath, refctx *RefContext)
case BoardScenario, BoardStep:
c.compileClasses(f.Map())
}
} else if refctx.Key.Value.Import != nil {
n, ok := c._import(refctx.Key.Value.Import)
if !ok {
return
}
switch n := n.(type) {
case *Field:
if n.Primary_ != nil {
f.Primary_ = n.Primary_.Copy(f).(*Scalar)
}
if n.Composite != nil {
f.Composite = n.Composite.Copy(f).(Composite)
}
case *Map:
f.Composite = n.Copy(f).(Composite)
}
} else if refctx.Key.Value.ScalarBox().Unbox() != nil {
// If the link is a board, we need to transform it into an absolute path.
if f.Name == "link" {
@ -330,6 +385,34 @@ func (c *compiler) compileArray(dst *Array, a *d2ast.Array) {
parent: dst,
Value: v,
}
case *d2ast.Import:
n, ok := c._import(v)
if !ok {
continue
}
switch n := n.(type) {
case *Field:
if v.Spread {
a, ok := n.Composite.(*Array)
if !ok {
c.errorf(v, "can only spread import array into array")
continue
}
dst.Values = append(dst.Values, a.Values...)
continue
}
if n.Composite != nil {
irv = n.Composite
} else {
irv = n.Primary_
}
case *Map:
if v.Spread {
c.errorf(v, "cannot spread import map into array")
continue
}
irv = n
}
case *d2ast.Substitution:
// panic("TODO")
}

View file

@ -9,6 +9,7 @@ import (
"oss.terrastruct.com/util-go/assert"
"oss.terrastruct.com/util-go/diff"
"oss.terrastruct.com/util-go/mapfs"
"oss.terrastruct.com/d2/d2ast"
"oss.terrastruct.com/d2/d2ir"
@ -24,6 +25,7 @@ func TestCompile(t *testing.T) {
t.Run("layers", testCompileLayers)
t.Run("scenarios", testCompileScenarios)
t.Run("steps", testCompileSteps)
t.Run("imports", testCompileImports)
}
type testCase struct {
@ -45,10 +47,20 @@ func compile(t testing.TB, text string) (*d2ir.Map, error) {
t.Helper()
d2Path := fmt.Sprintf("%v.d2", t.Name())
ast, err := d2parser.Parse(d2Path, strings.NewReader(text), nil)
return compileFS(t, d2Path, map[string]string{d2Path: text})
}
func compileFS(t testing.TB, path string, mfs map[string]string) (*d2ir.Map, error) {
t.Helper()
ast, err := d2parser.Parse(path, strings.NewReader(mfs[path]), nil)
assert.Success(t, err)
m, err := d2ir.Compile(ast)
fs, err := mapfs.New(mfs)
assert.Success(t, err)
m, err := d2ir.Compile(ast, &d2ir.CompileOptions{
FS: fs,
})
if err != nil {
return nil, err
}

98
d2ir/import.go Normal file
View file

@ -0,0 +1,98 @@
package d2ir
import (
"bufio"
"path"
"oss.terrastruct.com/d2/d2ast"
"oss.terrastruct.com/d2/d2parser"
)
func (c *compiler) pushImportStack(imp *d2ast.Import) bool {
if len(imp.Path) == 0 {
c.errorf(imp, "imports must specify a path to import")
return false
}
newPath := imp.Path[0].Unbox().ScalarString()
for _, p := range c.importStack {
if newPath == p {
c.errorf(imp, "detected cyclic import of %q", newPath)
return false
}
}
c.importStack = append(c.importStack, newPath)
return true
}
func (c *compiler) popImportStack() {
c.importStack = c.importStack[:len(c.importStack)-1]
}
// Returns either *Map or *Field.
func (c *compiler) _import(imp *d2ast.Import) (Node, bool) {
ir, ok := c.__import(imp)
if !ok {
return nil, false
}
if len(imp.IDA()) > 0 {
f := ir.GetField(imp.IDA()...)
if f == nil {
c.errorf(imp, "import key %q doesn't exist inside import", imp.IDA())
return nil, false
}
return f, true
}
return ir, true
}
func (c *compiler) __import(imp *d2ast.Import) (*Map, bool) {
impPath := imp.Path[0].Unbox().ScalarString()
if path.IsAbs(impPath) {
c.errorf(imp, "import paths must be relative")
return nil, false
}
if path.Ext(impPath) != ".d2" {
impPath += ".d2"
}
// Imports are always relative to the importing file.
impPath = path.Join(path.Dir(c.importStack[len(c.importStack)-1]), impPath)
if !c.pushImportStack(imp) {
return nil, false
}
defer c.popImportStack()
ir, ok := c.importCache[impPath]
if ok {
return ir, true
}
f, err := c.fs.Open(impPath)
if err != nil {
c.errorf(imp, "failed to import %q: %v", impPath, err)
return nil, false
}
defer f.Close()
ast, err := d2parser.Parse(impPath, bufio.NewReader(f), &d2parser.ParseOptions{
UTF16: c.utf16,
ParseError: c.err,
})
if err != nil {
return nil, false
}
ir = &Map{}
ir.initRoot()
ir.parent.(*Field).References[0].Context.Scope = ast
c.compileMap(ir, ast)
c.importCache[impPath] = ir
return ir, true
}

81
d2ir/import_test.go Normal file
View file

@ -0,0 +1,81 @@
package d2ir_test
import (
"testing"
"oss.terrastruct.com/util-go/assert"
)
func testCompileImports(t *testing.T) {
t.Parallel()
tca := []testCase{
{
name: "value",
run: func(t testing.TB) {
m, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "x: @x.d2",
"x.d2": `shape: circle
label: meow`,
})
assert.Success(t, err)
assertQuery(t, m, 3, 0, nil, "")
assertQuery(t, m, 2, 0, nil, "x")
assertQuery(t, m, 0, 0, "circle", "x.shape")
assertQuery(t, m, 0, 0, "meow", "x.label")
},
},
{
name: "nested",
run: func(t testing.TB) {
m, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "x: @x.y",
"x.d2": `y: {
shape: circle
label: meow
}`,
})
assert.Success(t, err)
assertQuery(t, m, 3, 0, nil, "")
assertQuery(t, m, 2, 0, nil, "x")
assertQuery(t, m, 0, 0, "circle", "x.shape")
assertQuery(t, m, 0, 0, "meow", "x.label")
},
},
{
name: "spread",
run: func(t testing.TB) {
m, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "...@x.d2",
"x.d2": "x: wowa",
})
assert.Success(t, err)
assertQuery(t, m, 1, 0, nil, "")
assertQuery(t, m, 0, 0, "wowa", "x")
},
},
}
runa(t, tca)
t.Run("errors", func(t *testing.T) {
tca := []testCase{
{
name: "parse_error",
run: func(t testing.TB) {
_, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "...@x.d2",
"x.d2": "x<><><<>q",
})
assert.ErrorString(t, err, `x.d2:1:1: connection missing destination
x.d2:1:4: connection missing source
x.d2:1:4: connection missing destination
x.d2:1:6: connection missing source
x.d2:1:6: connection missing destination
x.d2:1:7: connection missing source`)
},
},
}
runa(t, tca)
})
}

View file

@ -347,7 +347,7 @@ func _set(g *d2graph.Graph, key string, tag, value *string) error {
}
}
ir, err := d2ir.Compile(g.AST)
ir, err := d2ir.Compile(g.AST, nil)
if err != nil {
return err
}

View file

@ -59,6 +59,7 @@ func Parse(path string, r io.RuneReader, opts *ParseOptions) (*d2ast.Map, error)
func ParseKey(key string) (*d2ast.KeyPath, error) {
p := &parser{
reader: strings.NewReader(key),
err: &ParseError{},
}
k := p.parseKey()
@ -74,6 +75,7 @@ func ParseKey(key string) (*d2ast.KeyPath, error) {
func ParseMapKey(mapKey string) (*d2ast.Key, error) {
p := &parser{
reader: strings.NewReader(mapKey),
err: &ParseError{},
}
mk := p.parseMapKey()
@ -89,6 +91,7 @@ func ParseMapKey(mapKey string) (*d2ast.Key, error) {
func ParseValue(value string) (d2ast.Value, error) {
p := &parser{
reader: strings.NewReader(value),
err: &ParseError{},
}
v := p.parseValue()

2
go.mod generated
View file

@ -27,7 +27,7 @@ require (
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2
gonum.org/v1/plot v0.12.0
nhooyr.io/websocket v1.8.7
oss.terrastruct.com/util-go v0.0.0-20230320053557-dcb5aac7d972
oss.terrastruct.com/util-go v0.0.0-20230604222829-11c3c60fec14
)
require (

4
go.sum generated
View file

@ -331,4 +331,8 @@ nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g=
nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
oss.terrastruct.com/util-go v0.0.0-20230320053557-dcb5aac7d972 h1:HS7fg2GzGsqRLApsoh7ztaLMvXzxSln/Hfz4wy4tIDA=
oss.terrastruct.com/util-go v0.0.0-20230320053557-dcb5aac7d972/go.mod h1:eMWv0sOtD9T2RUl90DLWfuShZCYp4NrsqNpI8eqO6U4=
oss.terrastruct.com/util-go v0.0.0-20230604220107-5ffc52e2e534 h1:6RWrCAg2bzrmGCXd063nkqaHYJHd3KiN3lVfchm4o5I=
oss.terrastruct.com/util-go v0.0.0-20230604220107-5ffc52e2e534/go.mod h1:eMWv0sOtD9T2RUl90DLWfuShZCYp4NrsqNpI8eqO6U4=
oss.terrastruct.com/util-go v0.0.0-20230604222829-11c3c60fec14 h1:oy5vtt6O2qYxeSpqWhyevrdUenFfuhphixozUlpL6qY=
oss.terrastruct.com/util-go v0.0.0-20230604222829-11c3c60fec14/go.mod h1:eMWv0sOtD9T2RUl90DLWfuShZCYp4NrsqNpI8eqO6U4=
rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4=

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/3d_oval.d2,1:0:17-1:19:36",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/bad-style-nesting.d2,0:12:12-0:17:17",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/blank_underscore.d2,2:2:11-2:3:12",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/border-radius-negative.d2,2:23:30-2:25:32",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/classes-internal-edge.d2,7:2:72-7:16:86",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/classes-unreserved.d2,2:4:26-2:8:30",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,2:6:30-2:7:31",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/edge_invalid_style.d2,1:2:12-1:9:19",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/edge_map_non_reserved.d2,2:2:13-2:3:14",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/edge_to_style.d2,1:7:31-1:12:36",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/edge_unquoted_hex.d2,2:9:29-2:10:30",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/equal_dimensions_on_circle.d2,2:1:26-2:11:36",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/errors/missing_shape_icon.d2,0:0:0-0:14:14",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/errors/reserved_icon_style.d2,2:8:23-2:27:42",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/grid_edge.d2,2:1:22-2:7:28",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/grid_gap_negative.d2,1:17:24-1:21:28",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/grid_negative.d2,2:15:38-2:19:42",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/illegal-stroke-width.d2,1:22:28-1:24:30",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/image_children_Steps.d2,3:2:115-3:7:120",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/image_non_style.d2,3:2:115-3:6:119",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/improper-class-ref.d2,0:6:6-0:11:11",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/invalid-fill-pattern.d2,2:18:33-2:23:38",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/invalid_direction.d2,1:13:18-1:21:26",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/leaky_sequence.d2,4:0:37-4:8:45",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/link-board-not-board.d2,1:0:4-1:18:22",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/link-board-not-found.d2,0:0:0-0:16:16",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore-not-found.d2,6:8:59-6:18:69",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/md_block_string_err.d2,3:18:50-3:24:56",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/near-invalid.d2,8:10:133-8:17:140",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/near_bad_connected.d2,4:4:42-4:10:48",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/near_bad_constant.d2,0:8:8-0:19:19",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/near_descendant_connect_to_outside.d2,5:4:47-5:12:55",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/near_near_const.d2,6:7:50-6:12:55",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/near_sequence.d2,4:8:45-4:11:48",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/nested_edge.d2,1:2:23-1:16:37",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/nested_near_constant.d2,0:10:10-0:20:20",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/no-class-inside-classes.d2,2:4:22-2:9:27",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/no-class-primary.d2,0:2:2-0:7:7",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/no-nested-columns-class.d2,2:4:24-2:5:25",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/no-nested-columns-sql-2.d2,4:4:34-4:5:35",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/no-nested-columns-sql.d2,2:9:33-2:10:34",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/no_url_link_and_url_tooltip_concurrently.d2,0:43:43-0:61:61",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/obj_invalid_style.d2,1:2:7-1:9:14",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/object_arrowhead_shape.d2,0:4:4-0:19:19",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/positions_negative.d2,2:7:24-2:11:28",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/shape_edge_style.d2,2:1:7-2:21:27",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/shape_unquoted_hex.d2,2:9:24-2:10:25",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/sql-panic.d2,2:26:54-2:64:92",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/tail-style-map.d2,0:6:6-0:11:11",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/tail-style.d2,0:6:6-0:11:11",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/underscore_parent_middle_path.d2,2:4:10-2:5:11",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/underscore_parent_root.d2,1:0:1-1:1:2",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/underscore_parent_sandwich_path.d2,2:6:12-2:7:13",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/unsemantic_markdown.d2,0:0:0-3:1:19",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/unsemantic_markdown_2.d2,0:0:0-3:1:20",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile2/boards/errs/duplicate_board.d2,8:1:51-8:4:54",

82
testdata/d2ir/TestCompile/imports/#00.exp.json generated vendored Normal file
View file

@ -0,0 +1,82 @@
{
"fields": [
{
"name": "x",
"primary": {
"value": {
"range": "x.d2,0:3:3-0:7:7",
"value": [
{
"string": "wowa",
"raw_string": "wowa"
}
]
}
},
"references": [
{
"string": {
"range": "x.d2,0:0:0-0:1:1",
"value": [
{
"string": "x",
"raw_string": "x"
}
]
},
"key_path": {
"range": "x.d2,0:0:0-0:1:1",
"path": [
{
"unquoted_string": {
"range": "x.d2,0:0:0-0:1:1",
"value": [
{
"string": "x",
"raw_string": "x"
}
]
}
}
]
},
"context": {
"edge": null,
"key": {
"range": "x.d2,0:0:0-0:7:7",
"key": {
"range": "x.d2,0:0:0-0:1:1",
"path": [
{
"unquoted_string": {
"range": "x.d2,0:0:0-0:1:1",
"value": [
{
"string": "x",
"raw_string": "x"
}
]
}
}
]
},
"primary": {},
"value": {
"unquoted_string": {
"range": "x.d2,0:3:3-0:7:7",
"value": [
{
"string": "wowa",
"raw_string": "wowa"
}
]
}
}
}
}
}
]
}
],
"edges": null
}

249
testdata/d2ir/TestCompile/imports/nested.exp.json generated vendored Normal file
View file

@ -0,0 +1,249 @@
{
"fields": [
{
"name": "x",
"composite": {
"fields": [
{
"name": "shape",
"primary": {
"value": {
"range": "x.d2,1:8:13-1:14:19",
"value": [
{
"string": "circle",
"raw_string": "circle"
}
]
}
},
"references": [
{
"string": {
"range": "x.d2,1:1:6-1:6:11",
"value": [
{
"string": "shape",
"raw_string": "shape"
}
]
},
"key_path": {
"range": "x.d2,1:1:6-1:6:11",
"path": [
{
"unquoted_string": {
"range": "x.d2,1:1:6-1:6:11",
"value": [
{
"string": "shape",
"raw_string": "shape"
}
]
}
}
]
},
"context": {
"edge": null,
"key": {
"range": "x.d2,1:1:6-1:14:19",
"key": {
"range": "x.d2,1:1:6-1:6:11",
"path": [
{
"unquoted_string": {
"range": "x.d2,1:1:6-1:6:11",
"value": [
{
"string": "shape",
"raw_string": "shape"
}
]
}
}
]
},
"primary": {},
"value": {
"unquoted_string": {
"range": "x.d2,1:8:13-1:14:19",
"value": [
{
"string": "circle",
"raw_string": "circle"
}
]
}
}
}
}
}
]
},
{
"name": "label",
"primary": {
"value": {
"range": "x.d2,2:8:28-2:12:32",
"value": [
{
"string": "meow",
"raw_string": "meow"
}
]
}
},
"references": [
{
"string": {
"range": "x.d2,2:1:21-2:6:26",
"value": [
{
"string": "label",
"raw_string": "label"
}
]
},
"key_path": {
"range": "x.d2,2:1:21-2:6:26",
"path": [
{
"unquoted_string": {
"range": "x.d2,2:1:21-2:6:26",
"value": [
{
"string": "label",
"raw_string": "label"
}
]
}
}
]
},
"context": {
"edge": null,
"key": {
"range": "x.d2,2:1:21-2:12:32",
"key": {
"range": "x.d2,2:1:21-2:6:26",
"path": [
{
"unquoted_string": {
"range": "x.d2,2:1:21-2:6:26",
"value": [
{
"string": "label",
"raw_string": "label"
}
]
}
}
]
},
"primary": {},
"value": {
"unquoted_string": {
"range": "x.d2,2:8:28-2:12:32",
"value": [
{
"string": "meow",
"raw_string": "meow"
}
]
}
}
}
}
}
]
}
],
"edges": null
},
"references": [
{
"string": {
"range": "index.d2,0:0:0-0:1:1",
"value": [
{
"string": "x",
"raw_string": "x"
}
]
},
"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": "x",
"raw_string": "x"
}
]
}
}
]
},
"context": {
"edge": null,
"key": {
"range": "index.d2,0:0:0-0:7:7",
"key": {
"range": "index.d2,0:0:0-0:1:1",
"path": [
{
"unquoted_string": {
"range": "index.d2,0:0:0-0:1:1",
"value": [
{
"string": "x",
"raw_string": "x"
}
]
}
}
]
},
"primary": {},
"value": {
"import": {
"range": "index.d2,0:3:3-0:7:7",
"spread": false,
"path": [
{
"unquoted_string": {
"range": "index.d2,0:4:4-0:5:5",
"value": [
{
"string": "x",
"raw_string": "x"
}
]
}
},
{
"unquoted_string": {
"range": "index.d2,0:6:6-0:7:7",
"value": [
{
"string": "y",
"raw_string": "y"
}
]
}
}
]
}
}
}
}
}
]
}
],
"edges": null
}

82
testdata/d2ir/TestCompile/imports/spread.exp.json generated vendored Normal file
View file

@ -0,0 +1,82 @@
{
"fields": [
{
"name": "x",
"primary": {
"value": {
"range": "x.d2,0:3:3-0:7:7",
"value": [
{
"string": "wowa",
"raw_string": "wowa"
}
]
}
},
"references": [
{
"string": {
"range": "x.d2,0:0:0-0:1:1",
"value": [
{
"string": "x",
"raw_string": "x"
}
]
},
"key_path": {
"range": "x.d2,0:0:0-0:1:1",
"path": [
{
"unquoted_string": {
"range": "x.d2,0:0:0-0:1:1",
"value": [
{
"string": "x",
"raw_string": "x"
}
]
}
}
]
},
"context": {
"edge": null,
"key": {
"range": "x.d2,0:0:0-0:7:7",
"key": {
"range": "x.d2,0:0:0-0:1:1",
"path": [
{
"unquoted_string": {
"range": "x.d2,0:0:0-0:1:1",
"value": [
{
"string": "x",
"raw_string": "x"
}
]
}
}
]
},
"primary": {},
"value": {
"unquoted_string": {
"range": "x.d2,0:3:3-0:7:7",
"value": [
{
"string": "wowa",
"raw_string": "wowa"
}
]
}
}
}
}
}
]
}
],
"edges": null
}

238
testdata/d2ir/TestCompile/imports/value.exp.json generated vendored Normal file
View file

@ -0,0 +1,238 @@
{
"fields": [
{
"name": "x",
"composite": {
"fields": [
{
"name": "shape",
"primary": {
"value": {
"range": "x.d2,0:7:7-0:13:13",
"value": [
{
"string": "circle",
"raw_string": "circle"
}
]
}
},
"references": [
{
"string": {
"range": "x.d2,0:0:0-0:5:5",
"value": [
{
"string": "shape",
"raw_string": "shape"
}
]
},
"key_path": {
"range": "x.d2,0:0:0-0:5:5",
"path": [
{
"unquoted_string": {
"range": "x.d2,0:0:0-0:5:5",
"value": [
{
"string": "shape",
"raw_string": "shape"
}
]
}
}
]
},
"context": {
"edge": null,
"key": {
"range": "x.d2,0:0:0-0:13:13",
"key": {
"range": "x.d2,0:0:0-0:5:5",
"path": [
{
"unquoted_string": {
"range": "x.d2,0:0:0-0:5:5",
"value": [
{
"string": "shape",
"raw_string": "shape"
}
]
}
}
]
},
"primary": {},
"value": {
"unquoted_string": {
"range": "x.d2,0:7:7-0:13:13",
"value": [
{
"string": "circle",
"raw_string": "circle"
}
]
}
}
}
}
}
]
},
{
"name": "label",
"primary": {
"value": {
"range": "x.d2,1:7:21-1:11:25",
"value": [
{
"string": "meow",
"raw_string": "meow"
}
]
}
},
"references": [
{
"string": {
"range": "x.d2,1:0:14-1:5:19",
"value": [
{
"string": "label",
"raw_string": "label"
}
]
},
"key_path": {
"range": "x.d2,1:0:14-1:5:19",
"path": [
{
"unquoted_string": {
"range": "x.d2,1:0:14-1:5:19",
"value": [
{
"string": "label",
"raw_string": "label"
}
]
}
}
]
},
"context": {
"edge": null,
"key": {
"range": "x.d2,1:0:14-1:11:25",
"key": {
"range": "x.d2,1:0:14-1:5:19",
"path": [
{
"unquoted_string": {
"range": "x.d2,1:0:14-1:5:19",
"value": [
{
"string": "label",
"raw_string": "label"
}
]
}
}
]
},
"primary": {},
"value": {
"unquoted_string": {
"range": "x.d2,1:7:21-1:11:25",
"value": [
{
"string": "meow",
"raw_string": "meow"
}
]
}
}
}
}
}
]
}
],
"edges": null
},
"references": [
{
"string": {
"range": "index.d2,0:0:0-0:1:1",
"value": [
{
"string": "x",
"raw_string": "x"
}
]
},
"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": "x",
"raw_string": "x"
}
]
}
}
]
},
"context": {
"edge": null,
"key": {
"range": "index.d2,0:0:0-0:8:8",
"key": {
"range": "index.d2,0:0:0-0:1:1",
"path": [
{
"unquoted_string": {
"range": "index.d2,0:0:0-0:1:1",
"value": [
{
"string": "x",
"raw_string": "x"
}
]
}
}
]
},
"primary": {},
"value": {
"import": {
"range": "index.d2,0:3:3-0:8:8",
"spread": false,
"path": [
{
"unquoted_string": {
"range": "index.d2,0:4:4-0:5:5",
"value": [
{
"string": "x",
"raw_string": "x"
}
]
}
}
]
}
}
}
}
}
]
}
],
"edges": null
}