Skip to content

Commit 1a8acaa

Browse files
committed
fix(parser): correctly handle empty documents in multi-document yaml
1 parent 81dbf26 commit 1a8acaa

File tree

2 files changed

+22
-13
lines changed

2 files changed

+22
-13
lines changed

parser/parser_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,20 @@ a:
723723
b: &anchor null
724724
c: &anchor2 null
725725
d: e
726+
`,
727+
},
728+
{
729+
`
730+
a: b
731+
---
732+
---
733+
c: d
734+
`,
735+
`
736+
a: b
737+
---
738+
---
739+
c: d
726740
`,
727741
},
728742
}
@@ -1789,6 +1803,9 @@ func (c *pathCapturer) Visit(node ast.Node) ast.Visitor {
17891803
type Visitor struct{}
17901804

17911805
func (v *Visitor) Visit(node ast.Node) ast.Visitor {
1806+
if node == nil {
1807+
return nil
1808+
}
17921809
tk := node.GetToken()
17931810
tk.Prev = nil
17941811
tk.Next = nil

parser/token.go

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ func CreateGroupedTokens(tokens token.Tokens) ([]*Token, error) {
230230
if err != nil {
231231
return nil, err
232232
}
233-
tks, err = createDocumentTokens(tks)
233+
tks, err = createDocumentTokens(tks, true)
234234
if err != nil {
235235
return nil, err
236236
}
@@ -614,13 +614,13 @@ func createDirectiveTokenGroups(tokens []*Token) ([]*Token, error) {
614614
return ret, nil
615615
}
616616

617-
func createDocumentTokens(tokens []*Token) ([]*Token, error) {
617+
func createDocumentTokens(tokens []*Token, ignoreHeaderIfAtFirst bool) ([]*Token, error) {
618618
var ret []*Token
619619
for i := 0; i < len(tokens); i++ {
620620
tk := tokens[i]
621621
switch tk.Type() {
622622
case token.DocumentHeaderType:
623-
if i != 0 {
623+
if i != 0 || !ignoreHeaderIfAtFirst {
624624
ret = append(ret, &Token{
625625
Group: &TokenGroup{Tokens: tokens[:i]},
626626
})
@@ -634,14 +634,6 @@ func createDocumentTokens(tokens []*Token) ([]*Token, error) {
634634
},
635635
}), nil
636636
}
637-
if tokens[i+1].Type() == token.DocumentHeaderType {
638-
return append(ret, &Token{
639-
Group: &TokenGroup{
640-
Type: TokenGroupDocument,
641-
Tokens: []*Token{tk},
642-
},
643-
}), nil
644-
}
645637
if tokens[i].Line() == tokens[i+1].Line() {
646638
switch tokens[i+1].GroupType() {
647639
case TokenGroupMapKey, TokenGroupMapKeyValue:
@@ -652,7 +644,7 @@ func createDocumentTokens(tokens []*Token) ([]*Token, error) {
652644
return nil, errors.ErrSyntax("value cannot be placed after document separator", tokens[i+1].RawToken())
653645
}
654646
}
655-
tks, err := createDocumentTokens(tokens[i+1:])
647+
tks, err := createDocumentTokens(tokens[i+1:], false)
656648
if err != nil {
657649
return nil, err
658650
}
@@ -683,7 +675,7 @@ func createDocumentTokens(tokens []*Token) ([]*Token, error) {
683675
return nil, errors.ErrSyntax("unexpected end content", tokens[i+1].RawToken())
684676
}
685677

686-
tks, err := createDocumentTokens(tokens[i+1:])
678+
tks, err := createDocumentTokens(tokens[i+1:], true)
687679
if err != nil {
688680
return nil, err
689681
}

0 commit comments

Comments
 (0)