@@ -162,7 +162,7 @@ func (d *decoder) Decode() (ast.Expr, error) {
162
162
return nil , err
163
163
}
164
164
d .yamlNonEmpty = true
165
- return d .extract (& yn )
165
+ return d .extract (& yn , true )
166
166
}
167
167
168
168
// Unmarshal parses a single YAML value to a CUE expression.
@@ -187,14 +187,14 @@ func Unmarshal(filename string, data []byte) (ast.Expr, error) {
187
187
return n , nil
188
188
}
189
189
190
- func (d * decoder ) extractNoAnchor (yn * yaml.Node ) (ast.Expr , error ) {
190
+ func (d * decoder ) extractNoAnchor (yn * yaml.Node , isTopLevel bool ) (ast.Expr , error ) {
191
191
switch yn .Kind {
192
192
case yaml .DocumentNode :
193
193
return d .document (yn )
194
194
case yaml .SequenceNode :
195
195
return d .sequence (yn )
196
196
case yaml .MappingNode :
197
- return d .mapping (yn )
197
+ return d .mapping (yn , isTopLevel )
198
198
case yaml .ScalarNode :
199
199
return d .scalar (yn )
200
200
case yaml .AliasNode :
@@ -204,16 +204,16 @@ func (d *decoder) extractNoAnchor(yn *yaml.Node) (ast.Expr, error) {
204
204
}
205
205
}
206
206
207
- func (d * decoder ) extract (yn * yaml.Node ) (ast.Expr , error ) {
207
+ func (d * decoder ) extract (yn * yaml.Node , isTopLevel bool ) (ast.Expr , error ) {
208
208
d .addHeadCommentsToPending (yn )
209
209
210
210
var expr ast.Expr
211
211
var err error
212
212
213
213
if yn .Anchor == "" {
214
- expr , err = d .extractNoAnchor (yn )
214
+ expr , err = d .extractNoAnchor (yn , isTopLevel )
215
215
} else {
216
- expr , err = d .anchor (yn )
216
+ expr , err = d .anchor (yn , isTopLevel )
217
217
}
218
218
219
219
if err != nil {
@@ -347,7 +347,7 @@ func (d *decoder) document(yn *yaml.Node) (ast.Expr, error) {
347
347
return nil , d .posErrorf (yn , "yaml document nodes are meant to have one content node but have %d" , n )
348
348
}
349
349
350
- expr , err := d .extract (yn .Content [0 ])
350
+ expr , err := d .extract (yn .Content [0 ], true )
351
351
if err != nil {
352
352
return nil , err
353
353
}
@@ -394,7 +394,7 @@ func (d *decoder) sequence(yn *yaml.Node) (ast.Expr, error) {
394
394
closeSameLine := true
395
395
for _ , c := range yn .Content {
396
396
d .forceNewline = multiline
397
- elem , err := d .extract (c )
397
+ elem , err := d .extract (c , false )
398
398
if err != nil {
399
399
return nil , err
400
400
}
@@ -408,14 +408,14 @@ func (d *decoder) sequence(yn *yaml.Node) (ast.Expr, error) {
408
408
return list , nil
409
409
}
410
410
411
- func (d * decoder ) mapping (yn * yaml.Node ) (ast.Expr , error ) {
411
+ func (d * decoder ) mapping (yn * yaml.Node , isTopLevel bool ) (ast.Expr , error ) {
412
412
strct := & ast.StructLit {}
413
413
multiline := false
414
414
if len (yn .Content ) > 0 {
415
415
multiline = yn .Line < yn .Content [len (yn .Content )- 1 ].Line
416
416
}
417
417
418
- if err := d .insertMap (yn , strct , multiline , false ); err != nil {
418
+ if err := d .insertMap (yn , strct , multiline , false , isTopLevel ); err != nil {
419
419
return nil , err
420
420
}
421
421
// 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) {
428
428
return strct , nil
429
429
}
430
430
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 {
432
432
l := len (yn .Content )
433
433
outer:
434
434
for i := 0 ; i < l ; i += 2 {
@@ -459,7 +459,7 @@ outer:
459
459
f := decl .(* ast.Field )
460
460
name , _ , err := ast .LabelName (f .Label )
461
461
if err == nil && name == key {
462
- f .Value , err = d .extract (yv )
462
+ f .Value , err = d .extract (yv , false )
463
463
if err != nil {
464
464
return err
465
465
}
@@ -468,12 +468,19 @@ outer:
468
468
}
469
469
}
470
470
471
- value , err := d .extract (yv )
471
+ value , err := d .extract (yv , false )
472
472
if err != nil {
473
473
return err
474
474
}
475
475
field .Value = value
476
476
477
+ if isTopLevel {
478
+ for _ , field := range d .anchorFields {
479
+ m .Elts = append (m .Elts , & field )
480
+ }
481
+ d .anchorFields = nil
482
+ }
483
+
477
484
m .Elts = append (m .Elts , field )
478
485
}
479
486
return nil
@@ -482,9 +489,9 @@ outer:
482
489
func (d * decoder ) merge (yn * yaml.Node , m * ast.StructLit , multiline bool ) error {
483
490
switch yn .Kind {
484
491
case yaml .MappingNode :
485
- return d .insertMap (yn , m , multiline , true )
492
+ return d .insertMap (yn , m , multiline , true , false )
486
493
case yaml .AliasNode :
487
- return d .insertMap (yn .Alias , m , multiline , true )
494
+ return d .insertMap (yn .Alias , m , multiline , true , false )
488
495
case yaml .SequenceNode :
489
496
// Step backwards as earlier nodes take precedence.
490
497
for _ , c := range slices .Backward (yn .Content ) {
@@ -706,7 +713,7 @@ func (d *decoder) inlineAlias(yn *yaml.Node) (ast.Expr, error) {
706
713
}
707
714
d .extractingAliases [yn ] = true
708
715
var node ast.Expr
709
- node , err := d .extractNoAnchor (yn .Alias )
716
+ node , err := d .extractNoAnchor (yn .Alias , false )
710
717
delete (d .extractingAliases , yn )
711
718
return node , err
712
719
}
@@ -724,7 +731,7 @@ func (d *decoder) referenceAlias(yn *yaml.Node) (ast.Expr, error) {
724
731
}, nil
725
732
}
726
733
727
- func (d * decoder ) anchor (yn * yaml.Node ) (ast.Expr , error ) {
734
+ func (d * decoder ) anchor (yn * yaml.Node , isTopLevel bool ) (ast.Expr , error ) {
728
735
var anchorIdent string
729
736
730
737
// Pick a non-conflicting anchor name.
@@ -744,7 +751,7 @@ func (d *decoder) anchor(yn *yaml.Node) (ast.Expr, error) {
744
751
// Process the node itself, but don't put it into the AST just yet,
745
752
// store it for later to be used as an anchor identifier.
746
753
pos := d .pos (yn )
747
- expr , err := d .extractNoAnchor (yn )
754
+ expr , err := d .extractNoAnchor (yn , isTopLevel )
748
755
if err != nil {
749
756
return nil , err
750
757
}
0 commit comments