@@ -162,7 +162,7 @@ func (d *decoder) Decode() (ast.Expr, error) {
162162 return nil , err
163163 }
164164 d .yamlNonEmpty = true
165- return d .extract (& yn )
165+ return d .extract (& yn , true )
166166}
167167
168168// Unmarshal parses a single YAML value to a CUE expression.
@@ -187,14 +187,14 @@ func Unmarshal(filename string, data []byte) (ast.Expr, error) {
187187 return n , nil
188188}
189189
190- func (d * decoder ) extractNoAnchor (yn * yaml.Node ) (ast.Expr , error ) {
190+ func (d * decoder ) extractNoAnchor (yn * yaml.Node , isTopLevel bool ) (ast.Expr , error ) {
191191 switch yn .Kind {
192192 case yaml .DocumentNode :
193193 return d .document (yn )
194194 case yaml .SequenceNode :
195195 return d .sequence (yn )
196196 case yaml .MappingNode :
197- return d .mapping (yn )
197+ return d .mapping (yn , isTopLevel )
198198 case yaml .ScalarNode :
199199 return d .scalar (yn )
200200 case yaml .AliasNode :
@@ -204,16 +204,16 @@ func (d *decoder) extractNoAnchor(yn *yaml.Node) (ast.Expr, error) {
204204 }
205205}
206206
207- func (d * decoder ) extract (yn * yaml.Node ) (ast.Expr , error ) {
207+ func (d * decoder ) extract (yn * yaml.Node , isTopLevel bool ) (ast.Expr , error ) {
208208 d .addHeadCommentsToPending (yn )
209209
210210 var expr ast.Expr
211211 var err error
212212
213213 if yn .Anchor == "" {
214- expr , err = d .extractNoAnchor (yn )
214+ expr , err = d .extractNoAnchor (yn , isTopLevel )
215215 } else {
216- expr , err = d .anchor (yn )
216+ expr , err = d .anchor (yn , isTopLevel )
217217 }
218218
219219 if err != nil {
@@ -347,7 +347,7 @@ func (d *decoder) document(yn *yaml.Node) (ast.Expr, error) {
347347 return nil , d .posErrorf (yn , "yaml document nodes are meant to have one content node but have %d" , n )
348348 }
349349
350- expr , err := d .extract (yn .Content [0 ])
350+ expr , err := d .extract (yn .Content [0 ], true )
351351 if err != nil {
352352 return nil , err
353353 }
@@ -394,7 +394,7 @@ func (d *decoder) sequence(yn *yaml.Node) (ast.Expr, error) {
394394 closeSameLine := true
395395 for _ , c := range yn .Content {
396396 d .forceNewline = multiline
397- elem , err := d .extract (c )
397+ elem , err := d .extract (c , false )
398398 if err != nil {
399399 return nil , err
400400 }
@@ -408,14 +408,14 @@ func (d *decoder) sequence(yn *yaml.Node) (ast.Expr, error) {
408408 return list , nil
409409}
410410
411- func (d * decoder ) mapping (yn * yaml.Node ) (ast.Expr , error ) {
411+ func (d * decoder ) mapping (yn * yaml.Node , isTopLevel bool ) (ast.Expr , error ) {
412412 strct := & ast.StructLit {}
413413 multiline := false
414414 if len (yn .Content ) > 0 {
415415 multiline = yn .Line < yn .Content [len (yn .Content )- 1 ].Line
416416 }
417417
418- if err := d .insertMap (yn , strct , multiline , false ); err != nil {
418+ if err := d .insertMap (yn , strct , multiline , false , isTopLevel ); err != nil {
419419 return nil , err
420420 }
421421 // TODO(mvdan): moving these positions above insertMap breaks a few tests, why?
@@ -428,7 +428,7 @@ func (d *decoder) mapping(yn *yaml.Node) (ast.Expr, error) {
428428 return strct , nil
429429}
430430
431- func (d * decoder ) insertMap (yn * yaml.Node , m * ast.StructLit , multiline , mergeValues bool ) error {
431+ func (d * decoder ) insertMap (yn * yaml.Node , m * ast.StructLit , multiline , mergeValues bool , isTopLevel bool ) error {
432432 l := len (yn .Content )
433433outer:
434434 for i := 0 ; i < l ; i += 2 {
@@ -459,7 +459,7 @@ outer:
459459 f := decl .(* ast.Field )
460460 name , _ , err := ast .LabelName (f .Label )
461461 if err == nil && name == key {
462- f .Value , err = d .extract (yv )
462+ f .Value , err = d .extract (yv , false )
463463 if err != nil {
464464 return err
465465 }
@@ -468,12 +468,19 @@ outer:
468468 }
469469 }
470470
471- value , err := d .extract (yv )
471+ value , err := d .extract (yv , false )
472472 if err != nil {
473473 return err
474474 }
475475 field .Value = value
476476
477+ if isTopLevel {
478+ for _ , field := range d .anchorFields {
479+ m .Elts = append (m .Elts , & field )
480+ }
481+ d .anchorFields = nil
482+ }
483+
477484 m .Elts = append (m .Elts , field )
478485 }
479486 return nil
@@ -482,9 +489,9 @@ outer:
482489func (d * decoder ) merge (yn * yaml.Node , m * ast.StructLit , multiline bool ) error {
483490 switch yn .Kind {
484491 case yaml .MappingNode :
485- return d .insertMap (yn , m , multiline , true )
492+ return d .insertMap (yn , m , multiline , true , false )
486493 case yaml .AliasNode :
487- return d .insertMap (yn .Alias , m , multiline , true )
494+ return d .insertMap (yn .Alias , m , multiline , true , false )
488495 case yaml .SequenceNode :
489496 // Step backwards as earlier nodes take precedence.
490497 for _ , c := range slices .Backward (yn .Content ) {
@@ -706,7 +713,7 @@ func (d *decoder) inlineAlias(yn *yaml.Node) (ast.Expr, error) {
706713 }
707714 d .extractingAliases [yn ] = true
708715 var node ast.Expr
709- node , err := d .extractNoAnchor (yn .Alias )
716+ node , err := d .extractNoAnchor (yn .Alias , false )
710717 delete (d .extractingAliases , yn )
711718 return node , err
712719}
@@ -724,7 +731,7 @@ func (d *decoder) referenceAlias(yn *yaml.Node) (ast.Expr, error) {
724731 }, nil
725732}
726733
727- func (d * decoder ) anchor (yn * yaml.Node ) (ast.Expr , error ) {
734+ func (d * decoder ) anchor (yn * yaml.Node , isTopLevel bool ) (ast.Expr , error ) {
728735 var anchorIdent string
729736
730737 // Pick a non-conflicting anchor name.
@@ -744,7 +751,7 @@ func (d *decoder) anchor(yn *yaml.Node) (ast.Expr, error) {
744751 // Process the node itself, but don't put it into the AST just yet,
745752 // store it for later to be used as an anchor identifier.
746753 pos := d .pos (yn )
747- expr , err := d .extractNoAnchor (yn )
754+ expr , err := d .extractNoAnchor (yn , isTopLevel )
748755 if err != nil {
749756 return nil , err
750757 }
0 commit comments