(sctx *super.Context, elems []RecordElem)
| 24 | } |
| 25 | |
| 26 | func newRecordExpr(sctx *super.Context, elems []RecordElem) *recordExpr { |
| 27 | fields := make([]super.Field, 0, len(elems)) |
| 28 | exprs := make([]Evaluator, 0, len(elems)) |
| 29 | var optOff int |
| 30 | var nones []int |
| 31 | for _, elem := range elems { |
| 32 | var name string |
| 33 | var opt bool |
| 34 | var typ super.Type |
| 35 | switch elem := elem.(type) { |
| 36 | case *NoneElem: |
| 37 | name = elem.Name |
| 38 | typ = elem.Type |
| 39 | exprs = append(exprs, nil) |
| 40 | nones = append(nones, optOff) |
| 41 | opt = true |
| 42 | case *FieldElem: |
| 43 | name = elem.Name |
| 44 | opt = elem.Opt |
| 45 | exprs = append(exprs, elem.Expr) |
| 46 | case *SpreadElem: |
| 47 | return nil |
| 48 | } |
| 49 | fields = append(fields, super.NewFieldWithOpt(name, typ, opt)) |
| 50 | if opt { |
| 51 | optOff++ |
| 52 | } |
| 53 | } |
| 54 | return &recordExpr{ |
| 55 | sctx: sctx, |
| 56 | builder: scode.NewBuilder(), |
| 57 | fields: fields, |
| 58 | exprs: exprs, |
| 59 | nones: nones, |
| 60 | } |
| 61 | } |
| 62 | |
| 63 | func (r *recordExpr) Eval(this super.Value) super.Value { |
| 64 | var changed bool |
no test coverage detected