the assign operators, '=' and ':=', can set the value of dict items
This commit is contained in:
+37
-1
@@ -89,6 +89,40 @@ func assignValue(ctx kern.ExprContext, leftTerm *scan.Term, v any, deepCopy bool
|
||||
return
|
||||
}
|
||||
|
||||
func evalAssignDictItem(ctx kern.ExprContext, dotTerm *scan.Term, valueTerm kern.Term) (v any, err error) {
|
||||
var ok bool
|
||||
var dictAny, dotKey any
|
||||
var dict *kern.DictType
|
||||
|
||||
if err = dotTerm.CheckOperands(); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
dotLeftTerm := dotTerm.GetChild(0)
|
||||
if dictAny, err = dotLeftTerm.Compute(ctx); err != nil {
|
||||
return
|
||||
}
|
||||
if dict, ok = dictAny.(*kern.DictType); !ok {
|
||||
err = dotTerm.Tk.ErrorExpectedGot(kern.DictTypeName)
|
||||
return
|
||||
}
|
||||
|
||||
dotRightTerm := dotTerm.Children[1]
|
||||
dotRightSym := dotRightTerm.Symbol()
|
||||
if dotRightSym == scan.SymVariable || dotRightSym == scan.SymString {
|
||||
dotKey = util.UnquoteString(dotRightTerm.Source())
|
||||
} else if dotKey, err = dotRightTerm.Compute(ctx); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if v, err = valueTerm.Compute(ctx); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
dict.SetItem(dotKey, v)
|
||||
return
|
||||
}
|
||||
|
||||
func generalEvalAssign(ctx kern.ExprContext, opTerm *scan.Term, deepCopy bool) (v any, err error) {
|
||||
if err = opTerm.CheckOperands(); err != nil {
|
||||
return
|
||||
@@ -96,7 +130,9 @@ func generalEvalAssign(ctx kern.ExprContext, opTerm *scan.Term, deepCopy bool) (
|
||||
|
||||
leftTerm := opTerm.Children[0]
|
||||
leftSym := leftTerm.Symbol()
|
||||
if leftSym != scan.SymVariable && leftSym != scan.SymIndex {
|
||||
if leftSym == scan.SymDot {
|
||||
return evalAssignDictItem(ctx, opTerm.Children[0], opTerm.GetChild(1))
|
||||
} else if leftSym != scan.SymVariable && leftSym != scan.SymIndex {
|
||||
err = leftTerm.Tk.Errorf("left operand of %q must be a variable or a collection's item", opTerm.Tk.Source())
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user