compiler: support nested struct fielid assignment

This commit is contained in:
Evgenii Stratonikov 2020-05-20 11:08:59 +03:00
parent 1e40f9dac0
commit 051e3608ff
2 changed files with 24 additions and 11 deletions

View file

@ -407,20 +407,17 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor {
c.emitStoreVar(t.Name) c.emitStoreVar(t.Name)
case *ast.SelectorExpr: case *ast.SelectorExpr:
switch expr := t.X.(type) { if !isAssignOp {
case *ast.Ident: ast.Walk(c, n.Rhs[i])
if !isAssignOp { }
ast.Walk(c, n.Rhs[i]) strct, ok := c.typeOf(t.X).Underlying().(*types.Struct)
} if !ok {
if strct, ok := c.typeOf(expr).Underlying().(*types.Struct); ok {
c.emitLoadVar(expr.Name) // load the struct
i := indexOfStruct(strct, t.Sel.Name) // get the index of the field
c.emitStoreStructField(i) // store the field
}
default:
c.prog.Err = fmt.Errorf("nested selector assigns not supported yet") c.prog.Err = fmt.Errorf("nested selector assigns not supported yet")
return nil return nil
} }
ast.Walk(c, t.X) // load the struct
i := indexOfStruct(strct, t.Sel.Name) // get the index of the field
c.emitStoreStructField(i) // store the field
// Assignments to index expressions. // Assignments to index expressions.
// slice[0] = 10 // slice[0] = 10

View file

@ -352,6 +352,22 @@ var structTestCases = []testCase{
}`, }`,
big.NewInt(3), big.NewInt(3),
}, },
{
"nested selectors (simple write)",
`package foo
type S1 struct { x S2 }
type S2 struct { a int }
func Main() int {
s1 := S1{
x: S2 {
a: 3,
},
}
s1.x.a = 11
return s1.x.a
}`,
big.NewInt(11),
},
} }
func TestStructs(t *testing.T) { func TestStructs(t *testing.T) {