d2ir: Implement double globs

This commit is contained in:
Anmol Sethi 2023-07-27 02:36:33 -07:00
parent 1217ff35a7
commit d9b4b952ee
No known key found for this signature in database
GPG key ID: 8CEF1878FF10ADEB
5 changed files with 1564 additions and 87 deletions

View file

@ -672,12 +672,39 @@ func (m *Map) EnsureField(kp *d2ast.KeyPath, refctx *RefContext) ([]*Field, erro
func (m *Map) ensureField(i int, kp *d2ast.KeyPath, refctx *RefContext, fa *[]*Field) error {
us, ok := kp.Path[i].Unbox().(*d2ast.UnquotedString)
if ok && us.Pattern != nil {
fa2, ok := m.doubleGlob(us.Pattern)
if ok {
if i == len(kp.Path)-1 {
*fa = append(*fa, fa2...)
} else {
for _, f := range fa2 {
if f.Map() == nil {
f.Composite = &Map{
parent: f,
}
}
err := f.Map().ensureField(i+1, kp, refctx, fa)
if err != nil {
return err
}
}
}
return nil
}
for _, f := range m.Fields {
if matchPattern(f.Name, us.Pattern) {
if i == len(kp.Path)-1 {
*fa = append(*fa, f)
} else if f.Map() != nil {
f.Map().ensureField(i+1, kp, refctx, fa)
} else {
if f.Map() == nil {
f.Composite = &Map{
parent: f,
}
}
err := f.Map().ensureField(i+1, kp, refctx, fa)
if err != nil {
return err
}
}
}
}

View file

@ -2,8 +2,31 @@ package d2ir
import (
"strings"
"oss.terrastruct.com/d2/d2graph"
)
func (m *Map) doubleGlob(pattern []string) ([]*Field, bool) {
if !(len(pattern) == 3 && pattern[0] == "*" && pattern[1] == "" && pattern[2] == "*") {
return nil, false
}
var fa []*Field
m._doubleGlob(&fa)
return fa, true
}
func (m *Map) _doubleGlob(fa *[]*Field) {
for _, f := range m.Fields {
if _, ok := d2graph.ReservedKeywords[f.Name]; ok {
continue
}
*fa = append(*fa, f)
if f.Map() != nil {
f.Map()._doubleGlob(fa)
}
}
}
func matchPattern(s string, pattern []string) bool {
if len(pattern) == 0 {
return true

View file

@ -134,7 +134,7 @@ sh*.an* -> sh*.an*`)
},
},
{
name: "double-glob",
name: "double-glob/1",
run: func(t testing.TB) {
m, err := compile(t, `shared.animate
shared.animal
@ -142,9 +142,11 @@ shared.animal
assert.Success(t, err)
assertQuery(t, m, 9, 0, nil, "")
assertQuery(t, m, 8, 0, nil, "shared")
assertQuery(t, m, 2, 0, nil, "shared.style")
assertQuery(t, m, 1, 0, nil, "shared.style")
assertQuery(t, m, 2, 0, nil, "shared.animate")
assertQuery(t, m, 1, 0, nil, "shared.animate.style")
assertQuery(t, m, 2, 0, nil, "shared.animal")
assertQuery(t, m, 1, 0, nil, "shared.animal.style")
},
},
}

View file

@ -6,6 +6,203 @@
"fields": [
{
"name": "animate",
"composite": {
"fields": [
{
"name": "style",
"composite": {
"fields": [
{
"name": "fill",
"primary": {
"value": {
"range": "TestCompile/patterns/double-glob.d2,2:18:47-2:21:50",
"value": [
{
"string": "red",
"raw_string": "red"
}
]
}
},
"references": [
{
"string": {
"range": "TestCompile/patterns/double-glob.d2,2:12:41-2:16:45",
"value": [
{
"string": "fill",
"raw_string": "fill"
}
]
},
"key_path": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:16:45",
"path": [
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:11:40",
"value": [
{
"string": "style",
"raw_string": "style"
}
]
}
},
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:12:41-2:16:45",
"value": [
{
"string": "fill",
"raw_string": "fill"
}
]
}
}
]
},
"context": {
"edge": null,
"key": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:22:51",
"key": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:16:45",
"path": [
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:11:40",
"value": [
{
"string": "style",
"raw_string": "style"
}
]
}
},
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:12:41-2:16:45",
"value": [
{
"string": "fill",
"raw_string": "fill"
}
]
}
}
]
},
"primary": {},
"value": {
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:18:47-2:21:50",
"value": [
{
"string": "red",
"raw_string": "red"
}
]
}
}
}
}
}
]
}
],
"edges": null
},
"references": [
{
"string": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:11:40",
"value": [
{
"string": "style",
"raw_string": "style"
}
]
},
"key_path": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:16:45",
"path": [
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:11:40",
"value": [
{
"string": "style",
"raw_string": "style"
}
]
}
},
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:12:41-2:16:45",
"value": [
{
"string": "fill",
"raw_string": "fill"
}
]
}
}
]
},
"context": {
"edge": null,
"key": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:22:51",
"key": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:16:45",
"path": [
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:11:40",
"value": [
{
"string": "style",
"raw_string": "style"
}
]
}
},
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:12:41-2:16:45",
"value": [
{
"string": "fill",
"raw_string": "fill"
}
]
}
}
]
},
"primary": {},
"value": {
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:18:47-2:21:50",
"value": [
{
"string": "red",
"raw_string": "red"
}
]
}
}
}
}
}
]
}
],
"edges": null
},
"references": [
{
"string": {
@ -84,6 +281,203 @@
},
{
"name": "animal",
"composite": {
"fields": [
{
"name": "style",
"composite": {
"fields": [
{
"name": "fill",
"primary": {
"value": {
"range": "TestCompile/patterns/double-glob.d2,2:18:47-2:21:50",
"value": [
{
"string": "red",
"raw_string": "red"
}
]
}
},
"references": [
{
"string": {
"range": "TestCompile/patterns/double-glob.d2,2:12:41-2:16:45",
"value": [
{
"string": "fill",
"raw_string": "fill"
}
]
},
"key_path": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:16:45",
"path": [
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:11:40",
"value": [
{
"string": "style",
"raw_string": "style"
}
]
}
},
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:12:41-2:16:45",
"value": [
{
"string": "fill",
"raw_string": "fill"
}
]
}
}
]
},
"context": {
"edge": null,
"key": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:22:51",
"key": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:16:45",
"path": [
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:11:40",
"value": [
{
"string": "style",
"raw_string": "style"
}
]
}
},
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:12:41-2:16:45",
"value": [
{
"string": "fill",
"raw_string": "fill"
}
]
}
}
]
},
"primary": {},
"value": {
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:18:47-2:21:50",
"value": [
{
"string": "red",
"raw_string": "red"
}
]
}
}
}
}
}
]
}
],
"edges": null
},
"references": [
{
"string": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:11:40",
"value": [
{
"string": "style",
"raw_string": "style"
}
]
},
"key_path": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:16:45",
"path": [
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:11:40",
"value": [
{
"string": "style",
"raw_string": "style"
}
]
}
},
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:12:41-2:16:45",
"value": [
{
"string": "fill",
"raw_string": "fill"
}
]
}
}
]
},
"context": {
"edge": null,
"key": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:22:51",
"key": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:16:45",
"path": [
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:11:40",
"value": [
{
"string": "style",
"raw_string": "style"
}
]
}
},
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:12:41-2:16:45",
"value": [
{
"string": "fill",
"raw_string": "fill"
}
]
}
}
]
},
"primary": {},
"value": {
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:18:47-2:21:50",
"value": [
{
"string": "red",
"raw_string": "red"
}
]
}
}
}
}
}
]
}
],
"edges": null
},
"references": [
{
"string": {
@ -168,7 +562,7 @@
"name": "fill",
"primary": {
"value": {
"range": "TestCompile/patterns/double-glob.d2,2:15:44-2:18:47",
"range": "TestCompile/patterns/double-glob.d2,2:18:47-2:21:50",
"value": [
{
"string": "red",
@ -180,7 +574,7 @@
"references": [
{
"string": {
"range": "TestCompile/patterns/double-glob.d2,2:9:38-2:13:42",
"range": "TestCompile/patterns/double-glob.d2,2:12:41-2:16:45",
"value": [
{
"string": "fill",
@ -189,27 +583,11 @@
]
},
"key_path": {
"range": "TestCompile/patterns/double-glob.d2,2:0:29-2:13:42",
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:16:45",
"path": [
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:0:29-2:2:31",
"value": [
{
"string": "**",
"raw_string": "**"
}
],
"pattern": [
"*",
"",
"*"
]
}
},
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:3:32-2:8:37",
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:11:40",
"value": [
{
"string": "style",
@ -220,7 +598,7 @@
},
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:9:38-2:13:42",
"range": "TestCompile/patterns/double-glob.d2,2:12:41-2:16:45",
"value": [
{
"string": "fill",
@ -234,29 +612,13 @@
"context": {
"edge": null,
"key": {
"range": "TestCompile/patterns/double-glob.d2,2:0:29-2:18:47",
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:22:51",
"key": {
"range": "TestCompile/patterns/double-glob.d2,2:0:29-2:13:42",
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:16:45",
"path": [
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:0:29-2:2:31",
"value": [
{
"string": "**",
"raw_string": "**"
}
],
"pattern": [
"*",
"",
"*"
]
}
},
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:3:32-2:8:37",
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:11:40",
"value": [
{
"string": "style",
@ -267,7 +629,7 @@
},
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:9:38-2:13:42",
"range": "TestCompile/patterns/double-glob.d2,2:12:41-2:16:45",
"value": [
{
"string": "fill",
@ -281,7 +643,7 @@
"primary": {},
"value": {
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:15:44-2:18:47",
"range": "TestCompile/patterns/double-glob.d2,2:18:47-2:21:50",
"value": [
{
"string": "red",
@ -301,7 +663,7 @@
"references": [
{
"string": {
"range": "TestCompile/patterns/double-glob.d2,2:3:32-2:8:37",
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:11:40",
"value": [
{
"string": "style",
@ -310,27 +672,11 @@
]
},
"key_path": {
"range": "TestCompile/patterns/double-glob.d2,2:0:29-2:13:42",
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:16:45",
"path": [
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:0:29-2:2:31",
"value": [
{
"string": "**",
"raw_string": "**"
}
],
"pattern": [
"*",
"",
"*"
]
}
},
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:3:32-2:8:37",
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:11:40",
"value": [
{
"string": "style",
@ -341,7 +687,7 @@
},
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:9:38-2:13:42",
"range": "TestCompile/patterns/double-glob.d2,2:12:41-2:16:45",
"value": [
{
"string": "fill",
@ -355,29 +701,13 @@
"context": {
"edge": null,
"key": {
"range": "TestCompile/patterns/double-glob.d2,2:0:29-2:18:47",
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:22:51",
"key": {
"range": "TestCompile/patterns/double-glob.d2,2:0:29-2:13:42",
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:16:45",
"path": [
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:0:29-2:2:31",
"value": [
{
"string": "**",
"raw_string": "**"
}
],
"pattern": [
"*",
"",
"*"
]
}
},
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:3:32-2:8:37",
"range": "TestCompile/patterns/double-glob.d2,2:6:35-2:11:40",
"value": [
{
"string": "style",
@ -388,7 +718,7 @@
},
{
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:9:38-2:13:42",
"range": "TestCompile/patterns/double-glob.d2,2:12:41-2:16:45",
"value": [
{
"string": "fill",
@ -402,7 +732,7 @@
"primary": {},
"value": {
"unquoted_string": {
"range": "TestCompile/patterns/double-glob.d2,2:15:44-2:18:47",
"range": "TestCompile/patterns/double-glob.d2,2:18:47-2:21:50",
"value": [
{
"string": "red",

1095
testdata/d2ir/TestCompile/patterns/double-glob/1.exp.json generated vendored Normal file

File diff suppressed because it is too large Load diff