this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

cue: flx bug for len on non-concrete values

Change-Id: I7925132f01ada119a039cdec7d2a8c891f76fdc3
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/3022
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>

+84 -9
+30 -7
cue/builtin.go
··· 27 27 28 28 "cuelang.org/go/cue/errors" 29 29 "cuelang.org/go/cue/parser" 30 + "cuelang.org/go/cue/token" 30 31 "cuelang.org/go/internal" 31 32 "github.com/cockroachdb/apd/v2" 32 33 ) ··· 118 119 Result: intKind, 119 120 Func: func(c *callCtxt) { 120 121 v := c.value(0) 121 - switch v.Kind() { 122 + switch k := v.IncompleteKind(); k { 122 123 case StructKind: 123 - s, _ := v.structValData(c.ctx) 124 + s, err := v.structValData(c.ctx) 125 + if err != nil { 126 + c.ret = err 127 + break 128 + } 124 129 c.ret = s.Len() 125 130 case ListKind: 126 131 i := 0 127 - iter, _ := v.List() 132 + iter, err := v.List() 133 + if err != nil { 134 + c.ret = err 135 + break 136 + } 128 137 for ; iter.Next(); i++ { 129 138 } 130 139 c.ret = i 131 140 case BytesKind: 132 - b, _ := v.Bytes() 141 + b, err := v.Bytes() 142 + if err != nil { 143 + c.ret = err 144 + break 145 + } 133 146 c.ret = len(b) 134 147 case StringKind: 135 - s, _ := v.String() 148 + s, err := v.String() 149 + if err != nil { 150 + c.ret = err 151 + break 152 + } 136 153 c.ret = len(s) 154 + default: 155 + c.ret = errors.Newf(token.NoPos, 156 + "invalid argument type %v", k) 137 157 } 138 158 }, 139 159 } ··· 268 288 } 269 289 }() 270 290 x.Func(&call) 271 - if e, ok := call.ret.(value); ok { 272 - return e 291 + switch v := call.ret.(type) { 292 + case value: 293 + return v 294 + case *valueError: 295 + return v.err 273 296 } 274 297 return convert(ctx, x, false, call.ret) 275 298 }
+47
cue/resolve_test.go
··· 2182 2182 `str: string, ` + 2183 2183 `s2: strings.ContainsAny ("dd"), ` + 2184 2184 `s3: <4>.ContainsAny (<3>.str,"dd")}`, 2185 + }, { 2186 + desc: "len of incomplete types", 2187 + in: ` 2188 + args: *[] | [...string] 2189 + v1: len(args) 2190 + v2: len([]) 2191 + v3: len({}) 2192 + v4: len({a: 3}) 2193 + v5: len({a: 3} | {a: 4}) 2194 + v6: len('sf' | 'dd') 2195 + v7: len([2] | *[1, 2]) 2196 + v8: len([2] | [1, 2]) 2197 + v9: len("😂") 2198 + v10: len("") 2199 + `, 2200 + out: `<0>{` + 2201 + `args: [], ` + 2202 + `v1: 0, ` + 2203 + `v2: 0, ` + 2204 + `v3: 0, ` + 2205 + `v4: 1, ` + 2206 + `v5: len ((<1>{a: 3} | <2>{a: 4})), ` + 2207 + `v6: len (('sf' | 'dd')), ` + 2208 + `v7: 2, ` + 2209 + `v8: len (([2] | [1,2])), ` + 2210 + `v9: 4, ` + 2211 + `v10: 0}`, 2212 + }, { 2213 + desc: "slice rewrite bug", 2214 + in: ` 2215 + fn: { 2216 + arg: [...int] & [1] 2217 + out: arg[1:] 2218 + } 2219 + fn1: fn & {arg: [1]} 2220 + `, 2221 + out: `<0>{fn: <1>{arg: [1], out: []}, fn1: <2>{arg: [1], out: []}}`, 2185 2222 }} 2186 2223 rewriteHelper(t, testCases, evalFull) 2187 2224 } ··· 2192 2229 // Don't remove. For debugging. 2193 2230 testCases := []testCase{{ 2194 2231 in: ` 2232 + fnRec: {nn: [...int], out: (fn & {arg: nn}).out} 2233 + fn: { 2234 + arg: [...int] 2235 + 2236 + out: arg[0] + (fnRec & {nn: arg[1:]}).out if len(arg) > 0 2237 + out: 0 if len(arg) == 0 2238 + } 2239 + fn7: (fn & {arg: [1, 2, 3]}).out 2240 + 2241 + 2195 2242 `, 2196 2243 }} 2197 2244 rewriteHelper(t, testCases, evalFull)
+7 -2
cue/rewrite.go
··· 130 130 131 131 func (x *sliceExpr) rewrite(ctx *context, fn rewriteFunc) value { 132 132 v := rewrite(ctx, x.x, fn) 133 - lo := rewrite(ctx, x.lo, fn) 134 - hi := rewrite(ctx, x.hi, fn) 133 + var lo, hi value 134 + if x.lo != nil { 135 + lo = rewrite(ctx, x.lo, fn) 136 + } 137 + if x.hi != nil { 138 + hi = rewrite(ctx, x.hi, fn) 139 + } 135 140 if v == x.x && lo == x.lo && hi == x.hi { 136 141 return x 137 142 }