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  }