cuelang.org/go@v0.10.1/cue/testdata/builtins/incomplete.txtar (about) 1 -- in.cue -- 2 import ( 3 "list" 4 "strings" 5 "text/template" 6 ) 7 8 list1: { 9 // Note that Top is not incomplete, only its first element is. 10 // We allow FlattenN to proceed and pass on the incomplete values. 11 Out1: list.FlattenN(Top, 1) 12 Out2: [...] & list.FlattenN(Top, 1) 13 Out3: list.FlattenN(Top, 1) & [...] 14 15 // This evaluates to a list with an incomplete element. 16 Top: [ 17 [for _, F in _Sub {F}], 18 ] 19 20 _Sub: a.b 21 a: {} // b does not 22 } 23 24 list2: { 25 Out1: list.FlattenN(_Top, 1) 26 Out2: [...] & list.FlattenN(_Top, 1) 27 Out3: list.FlattenN(_Top, 1) & [...] 28 29 // This evaluates to a list with an incomplete element. 30 _Top: [ 31 for _, F in #Sub {F}, 32 ] 33 34 #Sub: a.b 35 36 a: {} // b does not 37 } 38 39 value1: { 40 a: len('sf' | 'dd') 41 } 42 43 value2: { 44 len('sf' | 'dd') 45 } 46 47 incompleteArgDecimalList: { 48 a: #a & {param: 123} 49 #a: { 50 param: int 51 transformed: +param 52 max: list.Max([transformed]) 53 } 54 } 55 56 incompleteArgStringList: { 57 a: #a & {param: "123"} 58 #a: { 59 param: string 60 transformed: param + "" 61 joined: strings.Join([transformed], "-") 62 } 63 } 64 65 incompleteList: { 66 x: _ 67 decimal: list.Max(x) 68 str: strings.Join(x, "") 69 } 70 71 // TODO: add better error positions. 72 incompleteListError: { 73 x: y + [] 74 y: _ 75 decimal: list.Max(x) 76 str: strings.Join(x, "") 77 } 78 79 badListType: { 80 x: 2 81 decimal: list.Max(x) 82 str: strings.Join(x, "") 83 } 84 85 badListError: { 86 x: 2 + y 87 y: "foo" 88 decimal: list.Max(x) 89 str: strings.Join(x, "") 90 } 91 92 // Issue #1095 93 // Preserve combined error severity for multiple errors. 94 multipleErrors: { 95 #T: { 96 params: { 97 x: string 98 y: string 99 } 100 out: template.Execute("{{.x}} {{.y}}", params) 101 } 102 } 103 -- out/eval/stats -- 104 Leaks: 8 105 Freed: 121 106 Reused: 116 107 Allocs: 13 108 Retain: 61 109 110 Unifications: 109 111 Conjuncts: 264 112 Disjuncts: 156 113 -- out/eval -- 114 Errors: 115 badListType.decimal: cannot use 2 (type int) as list in argument 1 to list.Max: 116 ./in.cue:79:11 117 badListType.str: cannot use 2 (type int) as list in argument 1 to strings.Join: 118 ./in.cue:79:11 119 badListError.x: invalid operands 2 and "foo" to '+' (type int and string): 120 ./in.cue:85:11 121 ./in.cue:86:11 122 123 Result: 124 (_|_){ 125 // [eval] 126 list1: (struct){ 127 Out1: (#list){ 128 0: (_|_){ 129 // [incomplete] list1._Sub: undefined field: b: 130 // ./in.cue:19:10 131 } 132 } 133 Out2: (#list){ 134 0: (_|_){ 135 // [incomplete] list1._Sub: undefined field: b: 136 // ./in.cue:19:10 137 } 138 } 139 Out3: (#list){ 140 0: (_|_){ 141 // [incomplete] list1._Sub: undefined field: b: 142 // ./in.cue:19:10 143 } 144 } 145 Top: (#list){ 146 0: (_|_){ 147 // [incomplete] list1._Sub: undefined field: b: 148 // ./in.cue:19:10 149 } 150 } 151 _Sub: (_|_){ 152 // [incomplete] list1._Sub: undefined field: b: 153 // ./in.cue:19:10 154 } 155 a: (struct){ 156 } 157 } 158 list2: (struct){ 159 Out1: (_|_){ 160 // [incomplete] list2.#Sub: undefined field: b: 161 // ./in.cue:33:10 162 } 163 Out2: (_|_){ 164 // [incomplete] list2.#Sub: undefined field: b: 165 // ./in.cue:33:10 166 } 167 Out3: (_|_){ 168 // [incomplete] list2.#Sub: undefined field: b: 169 // ./in.cue:33:10 170 } 171 _Top: (_|_){ 172 // [incomplete] list2.#Sub: undefined field: b: 173 // ./in.cue:33:10 174 } 175 #Sub: (_|_){ 176 // [incomplete] list2.#Sub: undefined field: b: 177 // ./in.cue:33:10 178 } 179 a: (struct){ 180 } 181 } 182 value1: (struct){ 183 a: (_|_){ 184 // [incomplete] value1.a: unresolved disjunction 'sf' | 'dd' (type bytes): 185 // ./in.cue:39:5 186 } 187 } 188 value2: (_|_){ 189 // [incomplete] value2: unresolved disjunction 'sf' | 'dd' (type bytes): 190 // ./in.cue:43:2 191 } 192 incompleteArgDecimalList: (struct){ 193 a: (#struct){ 194 param: (int){ 123 } 195 transformed: (int){ 123 } 196 max: (int){ 123 } 197 } 198 #a: (#struct){ 199 param: (int){ int } 200 transformed: (_|_){ 201 // [incomplete] incompleteArgDecimalList.#a.transformed: operand param of '+' not concrete (was int): 202 // ./in.cue:50:17 203 } 204 max: (_|_){ 205 // [incomplete] incompleteArgDecimalList.#a.0: operand param of '+' not concrete (was int): 206 // ./in.cue:50:17 207 } 208 } 209 } 210 incompleteArgStringList: (struct){ 211 a: (#struct){ 212 param: (string){ "123" } 213 transformed: (string){ "123" } 214 joined: (string){ "123" } 215 } 216 #a: (#struct){ 217 param: (string){ string } 218 transformed: (_|_){ 219 // [incomplete] incompleteArgStringList.#a.transformed: non-concrete value string in operand to +: 220 // ./in.cue:59:16 221 // ./in.cue:58:16 222 } 223 joined: (_|_){ 224 // [incomplete] incompleteArgStringList.#a.0: non-concrete value string in operand to +: 225 // ./in.cue:59:16 226 // ./in.cue:58:16 227 } 228 } 229 } 230 incompleteList: (struct){ 231 x: (_){ _ } 232 decimal: (_|_){ 233 // [incomplete] incompleteList.decimal: non-concrete list for argument 0: 234 // ./in.cue:66:11 235 } 236 str: (_|_){ 237 // [incomplete] incompleteList.str: non-concrete list for argument 0: 238 // ./in.cue:67:11 239 } 240 } 241 incompleteListError: (struct){ 242 x: (_|_){ 243 // [incomplete] incompleteListError.x: non-concrete value _ in operand to +: 244 // ./in.cue:72:11 245 } 246 y: (_){ _ } 247 decimal: (_|_){ 248 // [incomplete] incompleteListError.x: non-concrete value _ in operand to +: 249 // ./in.cue:72:11 250 } 251 str: (_|_){ 252 // [incomplete] incompleteListError.x: non-concrete value _ in operand to +: 253 // ./in.cue:72:11 254 } 255 } 256 badListType: (_|_){ 257 // [eval] 258 x: (int){ 2 } 259 decimal: (_|_){ 260 // [eval] badListType.decimal: cannot use 2 (type int) as list in argument 1 to list.Max: 261 // ./in.cue:79:11 262 } 263 str: (_|_){ 264 // [eval] badListType.str: cannot use 2 (type int) as list in argument 1 to strings.Join: 265 // ./in.cue:79:11 266 } 267 } 268 badListError: (_|_){ 269 // [eval] 270 x: (_|_){ 271 // [eval] badListError.x: invalid operands 2 and "foo" to '+' (type int and string): 272 // ./in.cue:85:11 273 // ./in.cue:86:11 274 } 275 y: (string){ "foo" } 276 decimal: (_|_){ 277 // [eval] badListError.x: invalid operands 2 and "foo" to '+' (type int and string): 278 // ./in.cue:85:11 279 // ./in.cue:86:11 280 } 281 str: (_|_){ 282 // [eval] badListError.x: invalid operands 2 and "foo" to '+' (type int and string): 283 // ./in.cue:85:11 284 // ./in.cue:86:11 285 } 286 } 287 multipleErrors: (struct){ 288 #T: (#struct){ 289 params: (#struct){ 290 x: (string){ string } 291 y: (string){ string } 292 } 293 out: (_|_){ 294 // [incomplete] multipleErrors.#T.out: error in call to text/template.Execute: cannot convert non-concrete value string: 295 // ./in.cue:99:8 296 // ./in.cue:96:4 297 } 298 } 299 } 300 } 301 -- out/compile -- 302 --- in.cue 303 { 304 list1: { 305 Out1: 〈import;list〉.FlattenN(〈0;Top〉, 1) 306 Out2: ([ 307 ..., 308 ] & 〈import;list〉.FlattenN(〈0;Top〉, 1)) 309 Out3: (〈import;list〉.FlattenN(〈0;Top〉, 1) & [ 310 ..., 311 ]) 312 Top: [ 313 [ 314 for _, F in 〈2;_Sub〉 { 315 〈1;F〉 316 }, 317 ], 318 ] 319 _Sub: 〈0;a〉.b 320 a: {} 321 } 322 list2: { 323 Out1: 〈import;list〉.FlattenN(〈0;_Top〉, 1) 324 Out2: ([ 325 ..., 326 ] & 〈import;list〉.FlattenN(〈0;_Top〉, 1)) 327 Out3: (〈import;list〉.FlattenN(〈0;_Top〉, 1) & [ 328 ..., 329 ]) 330 _Top: [ 331 for _, F in 〈1;#Sub〉 { 332 〈1;F〉 333 }, 334 ] 335 #Sub: 〈0;a〉.b 336 a: {} 337 } 338 value1: { 339 a: len(('sf'|'dd')) 340 } 341 value2: { 342 len(('sf'|'dd')) 343 } 344 incompleteArgDecimalList: { 345 a: (〈0;#a〉 & { 346 param: 123 347 }) 348 #a: { 349 param: int 350 transformed: +〈0;param〉 351 max: 〈import;list〉.Max([ 352 〈1;transformed〉, 353 ]) 354 } 355 } 356 incompleteArgStringList: { 357 a: (〈0;#a〉 & { 358 param: "123" 359 }) 360 #a: { 361 param: string 362 transformed: (〈0;param〉 + "") 363 joined: 〈import;strings〉.Join([ 364 〈1;transformed〉, 365 ], "-") 366 } 367 } 368 incompleteList: { 369 x: _ 370 decimal: 〈import;list〉.Max(〈0;x〉) 371 str: 〈import;strings〉.Join(〈0;x〉, "") 372 } 373 incompleteListError: { 374 x: (〈0;y〉 + []) 375 y: _ 376 decimal: 〈import;list〉.Max(〈0;x〉) 377 str: 〈import;strings〉.Join(〈0;x〉, "") 378 } 379 badListType: { 380 x: 2 381 decimal: 〈import;list〉.Max(〈0;x〉) 382 str: 〈import;strings〉.Join(〈0;x〉, "") 383 } 384 badListError: { 385 x: (2 + 〈0;y〉) 386 y: "foo" 387 decimal: 〈import;list〉.Max(〈0;x〉) 388 str: 〈import;strings〉.Join(〈0;x〉, "") 389 } 390 multipleErrors: { 391 #T: { 392 params: { 393 x: string 394 y: string 395 } 396 out: 〈import;"text/template"〉.Execute("{{.x}} {{.y}}", 〈0;params〉) 397 } 398 } 399 }