diff --git a/d2parser/parse.go b/d2parser/parse.go index 1a205e959..162caf5af 100644 --- a/d2parser/parse.go +++ b/d2parser/parse.go @@ -919,11 +919,12 @@ func (p *parser) parseKey() (k *d2ast.KeyPath) { Start: p.pos, }, } - defer k.Range.End.From(&p.pos) defer func() { if len(k.Path) == 0 { k = nil + } else { + k.Range.End = k.Path[len(k.Path)-1].Unbox().GetRange().End } }() @@ -948,6 +949,9 @@ func (p *parser) parseKey() (k *d2ast.KeyPath) { return k } + if len(k.Path) == 0 { + k.Range.Start = s.GetRange().Start + } k.Path = append(k.Path, &sb) r, newlines, eof = p.peekNotSpace() diff --git a/d2parser/parse_test.go b/d2parser/parse_test.go index 32784c1cc..b1c8dfb3d 100644 --- a/d2parser/parse_test.go +++ b/d2parser/parse_test.go @@ -20,8 +20,8 @@ func TestParse(t *testing.T) { t.Parallel() testCases := []struct { - name string - text string + name string + text string assert func(t testing.TB, ast *d2ast.Map, err error) // exp is in testdata/d2parser/TestParse/${name}.json @@ -382,14 +382,14 @@ c- }, { name: "whitespace_range", - text: `a -> b -> c`, + text: ` a -> b -> c `, assert: func(t testing.TB, ast *d2ast.Map, err error) { - assert.Equal(t, "1:1", ast.Nodes[0].MapKey.Edges[0].Src.Range.Start.String()) - assert.Equal(t, "1:2", ast.Nodes[0].MapKey.Edges[0].Src.Range.End.String()) - assert.Equal(t, "1:6", ast.Nodes[0].MapKey.Edges[0].Dst.Range.Start.String()) - assert.Equal(t, "1:7", ast.Nodes[0].MapKey.Edges[0].Dst.Range.End.String()) - assert.Equal(t, "1:6", ast.Nodes[0].MapKey.Edges[1].Dst.Range.Start.String()) - assert.Equal(t, "1:6", ast.Nodes[0].MapKey.Edges[1].Dst.Range.End.String()) + assert.Equal(t, "1:2", ast.Nodes[0].MapKey.Edges[0].Src.Range.Start.String()) + assert.Equal(t, "1:3", ast.Nodes[0].MapKey.Edges[0].Src.Range.End.String()) + assert.Equal(t, "1:7", ast.Nodes[0].MapKey.Edges[0].Dst.Range.Start.String()) + assert.Equal(t, "1:8", ast.Nodes[0].MapKey.Edges[0].Dst.Range.End.String()) + assert.Equal(t, "1:12", ast.Nodes[0].MapKey.Edges[1].Dst.Range.Start.String()) + assert.Equal(t, "1:13", ast.Nodes[0].MapKey.Edges[1].Dst.Range.End.String()) }, }, } diff --git a/testdata/d2parser/TestParse/whitespace_range.exp.json b/testdata/d2parser/TestParse/whitespace_range.exp.json new file mode 100644 index 000000000..cf45c0693 --- /dev/null +++ b/testdata/d2parser/TestParse/whitespace_range.exp.json @@ -0,0 +1,91 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/whitespace_range.d2,0:0:0-0:13:13", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/whitespace_range.d2,0:1:1-0:13:13", + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/whitespace_range.d2,0:1:1-0:7:7", + "src": { + "range": "d2/testdata/d2parser/TestParse/whitespace_range.d2,0:1:1-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/whitespace_range.d2,0:1:1-0:2:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/whitespace_range.d2,0:6:6-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/whitespace_range.d2,0:6:6-0:7:7", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2parser/TestParse/whitespace_range.d2,0:6:6-0:12:12", + "src": { + "range": "d2/testdata/d2parser/TestParse/whitespace_range.d2,0:6:6-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/whitespace_range.d2,0:6:6-0:7:7", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/whitespace_range.d2,0:11:11-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/whitespace_range.d2,0:11:11-0:12:12", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "err": null +}