Skip to content

Commit ea7dd73

Browse files
authored
Merge pull request #130 from goccy/feature/resolve-alias-before-unmarshal-yaml
Fix processing of MergeKey and Alias at decoding
2 parents 015269f + a56d78c commit ea7dd73

File tree

2 files changed

+30
-14
lines changed

2 files changed

+30
-14
lines changed

decode.go

+28-12
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,15 @@ func (d *Decoder) castToFloat(v interface{}) interface{} {
9595
func (d *Decoder) setToMapValue(node ast.Node, m map[string]interface{}) {
9696
switch n := node.(type) {
9797
case *ast.MappingValueNode:
98-
if n.Key.Type() == ast.MergeKeyType && n.Value.Type() == ast.AliasType {
99-
aliasNode := n.Value.(*ast.AliasNode)
100-
aliasName := aliasNode.Value.GetToken().Value
101-
node := d.anchorNodeMap[aliasName]
102-
d.setToMapValue(node, m)
98+
if n.Key.Type() == ast.MergeKeyType {
99+
if n.Value.Type() == ast.AliasType {
100+
aliasNode := n.Value.(*ast.AliasNode)
101+
aliasName := aliasNode.Value.GetToken().Value
102+
node := d.anchorNodeMap[aliasName]
103+
d.setToMapValue(node, m)
104+
} else {
105+
d.setToMapValue(n.Value, m)
106+
}
103107
} else {
104108
key := n.Key.GetToken().Value
105109
m[key] = d.nodeToValue(n.Value)
@@ -114,11 +118,15 @@ func (d *Decoder) setToMapValue(node ast.Node, m map[string]interface{}) {
114118
func (d *Decoder) setToOrderedMapValue(node ast.Node, m *MapSlice) {
115119
switch n := node.(type) {
116120
case *ast.MappingValueNode:
117-
if n.Key.Type() == ast.MergeKeyType && n.Value.Type() == ast.AliasType {
118-
aliasNode := n.Value.(*ast.AliasNode)
119-
aliasName := aliasNode.Value.GetToken().Value
120-
node := d.anchorNodeMap[aliasName]
121-
d.setToOrderedMapValue(node, m)
121+
if n.Key.Type() == ast.MergeKeyType {
122+
if n.Value.Type() == ast.AliasType {
123+
aliasNode := n.Value.(*ast.AliasNode)
124+
aliasName := aliasNode.Value.GetToken().Value
125+
node := d.anchorNodeMap[aliasName]
126+
d.setToOrderedMapValue(node, m)
127+
} else {
128+
d.setToOrderedMapValue(n.Value, m)
129+
}
122130
} else {
123131
key := n.Key.GetToken().Value
124132
*m = append(*m, MapItem{Key: key, Value: d.nodeToValue(n.Value)})
@@ -221,8 +229,16 @@ func (d *Decoder) resolveAlias(node ast.Node) ast.Node {
221229
n.Values[idx] = d.resolveAlias(value).(*ast.MappingValueNode)
222230
}
223231
case *ast.MappingValueNode:
224-
n.Key = d.resolveAlias(n.Key)
225-
n.Value = d.resolveAlias(n.Value)
232+
if n.Key.Type() == ast.MergeKeyType && n.Value.Type() == ast.AliasType {
233+
value := d.resolveAlias(n.Value)
234+
keyColumn := n.Key.GetToken().Position.Column
235+
requiredColumn := keyColumn + 2
236+
value.AddColumn(requiredColumn)
237+
n.Value = value
238+
} else {
239+
n.Key = d.resolveAlias(n.Key)
240+
n.Value = d.resolveAlias(n.Value)
241+
}
226242
case *ast.SequenceNode:
227243
for idx, value := range n.Values {
228244
n.Values[idx] = d.resolveAlias(value)

decode_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -1903,8 +1903,8 @@ func TestDecoder_UnmarshalYAMLWithAlias(t *testing.T) {
19031903
anchors:
19041904
x: &x hello
19051905
map: &y
1906-
a: b
1907-
c: d
1906+
a: b
1907+
c: d
19081908
a: *x
19091909
b:
19101910
<<: *y

0 commit comments

Comments
 (0)