cuelang.org/go@v0.13.0/cue/testdata/export/issue2244.txtar (about) 1 -- in.cue -- 2 package x 3 4 import ( 5 "strings" 6 ) 7 8 _#matchPattern: { 9 #pattern: string 10 [ 11 // can't remove this builtin call 12 if strings.HasSuffix(#pattern, "*") { 13 14 // this let is required _within_ the if block 15 // i.e. it can't be "inlined" with the if that 16 // currently contains it 17 let prefix = strings.TrimSuffix(#pattern, "*") 18 19 prefix 20 }, 21 "'\(#pattern)'", 22 ][0] 23 } 24 25 _#isReleaseTag: _#matchPattern & {#pattern: "refs/tags/v*", _} 26 27 #step: { 28 if: number | string 29 } 30 31 m: #step & { 32 if: _#isReleaseTag 33 } 34 -- out/eval/stats -- 35 Leaks: 18 36 Freed: 17 37 Reused: 13 38 Allocs: 22 39 Retain: 34 40 41 Unifications: 26 42 Conjuncts: 60 43 Disjuncts: 42 44 -- diff/explanation -- 45 New evaluator should ultimately disallow new definitions in closed structs 46 and not allow #pattern in #step 47 -- out/evalalpha -- 48 (struct){ 49 _#matchPattern(:x): (_|_){ 50 // [incomplete] error in call to strings.HasSuffix: non-concrete value string: 51 // ./in.cue:11:6 52 // ./in.cue:8:12 53 #pattern: (string){ string } 54 } 55 _#isReleaseTag(:x): (string){ 56 "refs/tags/v" 57 #pattern: (string){ "refs/tags/v*" } 58 let prefix#1 = (string){ "refs/tags/v" } 59 } 60 #step: (#struct){ 61 if: ((string|number)){ |((number){ number }, (string){ string }) } 62 } 63 m: (#struct){ 64 if: (string){ 65 "refs/tags/v" 66 #pattern: (string){ "refs/tags/v*" } 67 let prefix#1 = (string){ "refs/tags/v" } 68 } 69 } 70 } 71 -- diff/-out/evalalpha<==>+out/eval -- 72 diff old new 73 --- old 74 +++ new 75 @@ -1,6 +1,6 @@ 76 (struct){ 77 _#matchPattern(:x): (_|_){ 78 - // [incomplete] _#matchPattern: error in call to strings.HasSuffix: non-concrete value string: 79 + // [incomplete] error in call to strings.HasSuffix: non-concrete value string: 80 // ./in.cue:11:6 81 // ./in.cue:8:12 82 #pattern: (string){ string } 83 -- out/eval -- 84 (struct){ 85 _#matchPattern(:x): (_|_){ 86 // [incomplete] _#matchPattern: error in call to strings.HasSuffix: non-concrete value string: 87 // ./in.cue:11:6 88 // ./in.cue:8:12 89 #pattern: (string){ string } 90 } 91 _#isReleaseTag(:x): (string){ 92 "refs/tags/v" 93 #pattern: (string){ "refs/tags/v*" } 94 let prefix#1 = (string){ "refs/tags/v" } 95 } 96 #step: (#struct){ 97 if: ((string|number)){ |((number){ number }, (string){ string }) } 98 } 99 m: (#struct){ 100 if: (string){ 101 "refs/tags/v" 102 #pattern: (string){ "refs/tags/v*" } 103 let prefix#1 = (string){ "refs/tags/v" } 104 } 105 } 106 } 107 -- out/compile -- 108 --- in.cue 109 { 110 _#matchPattern: { 111 #pattern: string 112 [ 113 if 〈import;strings〉.HasSuffix(〈1;#pattern〉, "*") { 114 let prefix#1 = 〈import;strings〉.TrimSuffix(〈2;#pattern〉, "*") 115 〈0;let prefix#1〉 116 }, 117 "'\(〈1;#pattern〉)'", 118 ][0] 119 } 120 _#isReleaseTag: (〈0;_#matchPattern〉 & { 121 #pattern: "refs/tags/v*" 122 _ 123 }) 124 #step: { 125 if: (number|string) 126 } 127 m: (〈0;#step〉 & { 128 if: 〈1;_#isReleaseTag〉 129 }) 130 }