parent
c670987516
commit
387c33660f
4 changed files with 106 additions and 4 deletions
|
|
@ -613,6 +613,9 @@ type Key struct {
|
|||
// Indicates this MapKey is a filter selector.
|
||||
Ampersand bool `json:"ampersand,omitempty"`
|
||||
|
||||
// Indicates this MapKey is a not filter selector.
|
||||
NotAmpersand bool `json:"not_ampersand,omitempty"`
|
||||
|
||||
// At least one of Key and Edges will be set but all four can also be set.
|
||||
// The following are all valid MapKeys:
|
||||
// Key:
|
||||
|
|
|
|||
|
|
@ -660,16 +660,27 @@ func (p *parser) parseMapKey() (mk *d2ast.Key) {
|
|||
}
|
||||
}()
|
||||
|
||||
// Check for ampersand/@.
|
||||
// Check for not ampersand/@.
|
||||
r, eof := p.peek()
|
||||
if eof {
|
||||
return mk
|
||||
}
|
||||
if r != '&' {
|
||||
p.rewind()
|
||||
} else {
|
||||
if r == '!' {
|
||||
r, eof := p.peek()
|
||||
if eof {
|
||||
return mk
|
||||
}
|
||||
if r == '&' {
|
||||
p.commit()
|
||||
mk.NotAmpersand = true
|
||||
} else {
|
||||
p.rewind()
|
||||
}
|
||||
} else if r == '&' {
|
||||
p.commit()
|
||||
mk.Ampersand = true
|
||||
} else {
|
||||
p.rewind()
|
||||
}
|
||||
|
||||
r, eof = p.peek()
|
||||
|
|
|
|||
|
|
@ -380,6 +380,18 @@ b-
|
|||
c-
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "not-amper",
|
||||
text: `
|
||||
&k: amper
|
||||
!&k: not amper
|
||||
`,
|
||||
assert: func(t testing.TB, ast *d2ast.Map, err error) {
|
||||
assert.Success(t, err)
|
||||
assert.True(t, ast.Nodes[0].MapKey.Ampersand)
|
||||
assert.True(t, ast.Nodes[1].MapKey.NotAmpersand)
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "whitespace_range",
|
||||
text: ` a -> b -> c `,
|
||||
|
|
|
|||
76
testdata/d2parser/TestParse/not-amper.exp.json
generated
vendored
Normal file
76
testdata/d2parser/TestParse/not-amper.exp.json
generated
vendored
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
{
|
||||
"ast": {
|
||||
"range": "d2/testdata/d2parser/TestParse/not-amper.d2,0:0:0-3:0:26",
|
||||
"nodes": [
|
||||
{
|
||||
"map_key": {
|
||||
"range": "d2/testdata/d2parser/TestParse/not-amper.d2,1:0:1-1:9:10",
|
||||
"ampersand": true,
|
||||
"key": {
|
||||
"range": "d2/testdata/d2parser/TestParse/not-amper.d2,1:1:2-1:2:3",
|
||||
"path": [
|
||||
{
|
||||
"unquoted_string": {
|
||||
"range": "d2/testdata/d2parser/TestParse/not-amper.d2,1:1:2-1:2:3",
|
||||
"value": [
|
||||
{
|
||||
"string": "k",
|
||||
"raw_string": "k"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"primary": {},
|
||||
"value": {
|
||||
"unquoted_string": {
|
||||
"range": "d2/testdata/d2parser/TestParse/not-amper.d2,1:4:5-1:9:10",
|
||||
"value": [
|
||||
{
|
||||
"string": "amper",
|
||||
"raw_string": "amper"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"map_key": {
|
||||
"range": "d2/testdata/d2parser/TestParse/not-amper.d2,2:0:11-2:14:25",
|
||||
"not_ampersand": true,
|
||||
"key": {
|
||||
"range": "d2/testdata/d2parser/TestParse/not-amper.d2,2:2:13-2:3:14",
|
||||
"path": [
|
||||
{
|
||||
"unquoted_string": {
|
||||
"range": "d2/testdata/d2parser/TestParse/not-amper.d2,2:2:13-2:3:14",
|
||||
"value": [
|
||||
{
|
||||
"string": "k",
|
||||
"raw_string": "k"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"primary": {},
|
||||
"value": {
|
||||
"unquoted_string": {
|
||||
"range": "d2/testdata/d2parser/TestParse/not-amper.d2,2:5:16-2:14:25",
|
||||
"value": [
|
||||
{
|
||||
"string": "not amper",
|
||||
"raw_string": "not amper"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"err": null
|
||||
}
|
||||
Loading…
Reference in a new issue