@shd101wyy/yo 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/cjs/index.cjs +322 -322
- package/out/cjs/yo-cli.cjs +478 -442
- package/out/esm/index.mjs +69 -69
- package/out/types/src/codegen/index.d.ts +1 -0
- package/out/types/src/expr.d.ts +1 -0
- package/out/types/src/init.d.ts +2 -0
- package/out/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/std/build.yo +13 -1
package/out/esm/index.mjs
CHANGED
|
@@ -3,7 +3,7 @@ var bi=class{constructor(){this.headers="";this.declarations="";this.code=""}emi
|
|
|
3
3
|
`,this.headers}emitDeclarationLine(t,n=""){return this.declarations+=n+t+`
|
|
4
4
|
`,this.declarations}print(){return this.headers+`
|
|
5
5
|
`+this.declarations+`
|
|
6
|
-
`+this.code.trim()}};import{readFileSync as Ey}from"node:fs";import $y from"path";var Sn=class{constructor({characterIndex:t,message:n,row:r}){this.characterIndex=t,this.message=n,this.row=r}toString(){return`Lexer Error at row ${this.row+1}: ${this.message}`}},
|
|
6
|
+
`+this.code.trim()}};import{readFileSync as Ey}from"node:fs";import $y from"path";var Sn=class{constructor({characterIndex:t,message:n,row:r}){this.characterIndex=t,this.message=n,this.row=r}toString(){return`Lexer Error at row ${this.row+1}: ${this.message}`}},gn=class{constructor(t,n,r){this.tokenAndErrorList=[];this.tokenAndErrorList=t,this.isAssertionError=n||!1,this.kind=r}toString(){return this.tokenAndErrorList.map(({token:n,errorMessage:r})=>`Error: ${r}
|
|
7
7
|
${ql({token:n})}`).join(`
|
|
8
8
|
|
|
9
9
|
`)}};function ql({token:e}){let{position:t,modulePath:n,inputString:r}=e,{row:i,column:o}=t,s=r.split(`
|
|
@@ -11,8 +11,8 @@ ${ql({token:n})}`).join(`
|
|
|
11
11
|
${s}
|
|
12
12
|
${" ".repeat(o+Math.floor(e.value.length/2))}^`}function y({token:e,errorMessage:t,cause:n,isAssertionError:r,kind:i}){let o=`${t.trim()}
|
|
13
13
|
|
|
14
|
-
${ql({token:e})}`;return new
|
|
15
|
-
`+n.message:"")}],r,i)}function lt(e,t,n){if(e.length===0)throw new Error("tokenAndErrorList must not be empty");return new
|
|
14
|
+
${ql({token:e})}`;return new gn([{token:e,errorMessage:o+(n?.message?`
|
|
15
|
+
`+n.message:"")}],r,i)}function lt(e,t,n){if(e.length===0)throw new Error("tokenAndErrorList must not be empty");return new gn(e,t,n)}var jt=($=>($.Operator="operator",$.Dot=".",$.LParen="(",$.RParen=")",$.LBracket="[",$.RBracket="]",$.LCurlyBracket="{",$.RCurlyBracket="}",$.Char="char",$.String="string",$.Identifier="identifier",$.Integer="integer",$.Float="float",$.Bool="bool",$.Semicolon=";",$.Comma=",",$.SingleLineComment="single_line_comment",$.MultiLineComment="multi_line_comment",$.Whitespace="whitespace",$.TemplateString="template_string",$))(jt||{}),ae={modulePath:"_",inputString:"_",type:"identifier",value:"_",position:{row:0,column:0,character:0}},Bh={modulePath:"drop",inputString:"drop",type:"identifier",value:"drop",position:{row:0,column:0,character:0}},rs=["=","+","-","*","/","<",">","@","$","~","&","%","|","!","?","^",".",":","\\","#"];function yo(e){return rs.includes(e)}function sr(e){let t=!0;for(let n=0;n<e.length;n++){let r=e[n];if(!yo(r)){t=!1;break}}return t}var is=/^[_a-zA-Z\xA0-\uFFFF][_a-zA-Z0-9\xA0-\uFFFF]*[!?]?$/;function Hl(e,t){let n=")";if(!e[t])return-1;let r=e[t].type;if(r==="{")n="}";else if(r==="(")n=")";else if(r==="[")n="]";else throw new Error("Expected '{', '(' or '['");t=t+1;let i=1,o=-1;for(;;){let a=e[t];if(!a)return-1;if(a.type===n){if(i=i-1,i===0){o=t;break}}else a.type===r&&(i=i+1);t=t+1}return o}var os;function jl(e){os=e}function S({expr:e,env:t,context:n}){if(!os)throw new Error("Internal Error: evaluateExpression function is not set.");return os({expr:e,env:t,context:n})}function Kl(e,t){let n=[],r=0,i=0;for(let o=0;o<e.length;o++){let a=e[o],s=o-i,l=o,u="",_=o;if(e[_]===".")for(;e[_]===".";)u+=e[_],_=_+1;else for(;yo(e[_])&&e[_]!==".";)u+=e[_],_=_+1;if(u&&!u.startsWith("//")&&!u.startsWith("/*")){n.push({type:u==="."?".":"operator",value:u,position:{row:r,column:s,character:l},modulePath:t,inputString:e}),o=_-1;continue}switch(a){case" ":case" ":case`
|
|
16
16
|
`:case"\r":{let c="",f=o,p=r;for(;e[f]===" "||e[f]===" "||e[f]===`
|
|
17
17
|
`||e[f]==="\r";)c+=e[f],e[f]===`
|
|
18
18
|
`&&(r++,i=f+1),f=f+1;n.push({type:"whitespace",value:c,position:{row:p,column:s,character:l},modulePath:t,inputString:e}),o=f-1;break}case"/":if(e[o+1]==="/"){let c="",f=o;for(;e[f]!==`
|
|
@@ -41,12 +41,12 @@ ${e}
|
|
|
41
41
|
${n.map(r=>w(r)).join(`
|
|
42
42
|
`)}
|
|
43
43
|
`);return n[0]}function go(e){return e.tag==="unit"||e.tag==="bool"||e.tag==="usize"||e.tag==="isize"||e.tag==="u8"||e.tag==="i8"||e.tag==="u16"||e.tag==="i16"||e.tag==="u32"||e.tag==="i32"||e.tag==="u64"||e.tag==="i64"||e.tag==="f32"||e.tag==="f64"||e.tag==="char"||e.tag==="short"||e.tag==="ushort"||e.tag==="int"||e.tag==="uint"||e.tag==="long"||e.tag==="ulong"||e.tag==="longlong"||e.tag==="ulonglong"||e.tag==="longdouble"}function fe(e){return e?.tag==="unit"}function vt(e){return e?.tag==="comptime_int"}function Nt(e){return e?.tag==="comptime_float"}function Et(e){return e?.tag==="comptime_string"}function xt(e){return e?.tag==="ComptimeList"}function Jr(e){return xt(e)&&Lt(e.childType)}function _n(e){return e?.tag==="bool"}function ho(e){return e?.tag==="usize"}function vo(e){return e?.tag==="isize"}function Kn(e){return e?.tag==="u8"}function To(e){return e?.tag==="i8"}function Eo(e){return e?.tag==="u16"}function $o(e){return e?.tag==="i16"}function bo(e){return e?.tag==="u32"}function Co(e){return e?.tag==="i32"}function ko(e){return e?.tag==="u64"}function wo(e){return e?.tag==="i64"}function Fo(e){return e?.tag==="f32"}function Lo(e){return e?.tag==="f64"}function Lt(e){return e?.tag==="Expr"}function ke(e){return e?.tag==="Array"}function Qe(e){return e?.tag==="Slice"}function we(e){return e?.tag==="Tuple"}function it(e){return e?.tag==="Union"}function ge(e){return e?.tag==="Enum"}function _e(e){return e?.tag==="Struct"}function ft(e){return e?.tag==="Struct"&&e.isReferenceSemantics}function Cr(e){return e?.tag==="Struct"&&e.isNewtype}function Te(e){return e?.tag==="Module"}function De(e){return e?.tag==="Trait"}function kt(e){return De(e)&&e.isFn!==void 0}function G(e){return e?.tag==="Function"}function Ao(e){return e?.tag==="Function"&&e.return.isCompileTimeOnly}function He(e){return e?.tag==="Type"}function Xl(e){return He(e)&&e.tag==="Type"&&e.level===0}function V(e){return e?.tag==="SomeType"}function Ie(e){return e?.tag==="Ptr"}function wt(e){return e?.tag==="Iso"}function bt(e){return e?.tag==="Arc"}function Ce(e){return e?.tag==="Dyn"}function sn(e){if(V(e)){let t=e;if(be(t))return!0;if(t.resolvedConcreteType)return sn(t.resolvedConcreteType)}return ft(e)||Ce(e)||wt(e)||bt(e)}function lr(e){return e?.tag==="u8"||e?.tag==="i8"||e?.tag==="u16"||e?.tag==="i16"||e?.tag==="u32"||e?.tag==="i32"||e?.tag==="u64"||e?.tag==="i64"||e?.tag==="usize"||e?.tag==="isize"}function ur(e){return e?.tag==="f32"||e?.tag==="f64"}function Ql(e){return e?.tag==="i8"||e?.tag==="i16"||e?.tag==="i32"||e?.tag==="i64"||e?.tag==="isize"}function ki(e){return e?.tag==="char"}function kr(e){return e?.tag==="void"}function Kt(e){return De(e)&&e.isFuture!==void 0}function oa(e){return De(e)&&e.isConcrete!==void 0}function Xn(e){return!!e&&(e.tag==="char"||e.tag==="short"||e.tag==="ushort"||e.tag==="int"||e.tag==="uint"||e.tag==="long"||e.tag==="ulong"||e.tag==="longlong"||e.tag==="ulonglong"||e.tag==="longdouble")}function Pn(e){if(!e||e.return?.isCompileTimeOnly)return!1;let t=e.parameters.some(r=>r.isCompileTimeOnly)||e.forallParameters.length>0||e.implicitParameters.length>0,n=e.parameters.some(r=>!r.isCompileTimeOnly&&V(r.type)&&!be(r.type));return t||n}function _r(e){if(!e||e.return?.isCompileTimeOnly)return!1;let t=e.parameters.some(r=>r.isCompileTimeOnly)||e.forallParameters.length>0,n=e.parameters.some(r=>!r.isCompileTimeOnly&&V(r.type)&&!be(r.type));return t||n}function as(e){let t=e.type;return t?Pn(t)&&(e.specializedFunctionCaches?.length??0)>0:!1}function $n(e){return ft(e)?e.fields.length===1&&e.fields[0].label==="*"&&!!e.typeName?.startsWith("Box("):!1}function ot(e){return e?.tag==="EffectsRow"}function aa(e,t,n){let r=!1,i=0;for(let o of t){let a=o.type;if(n.includes(o))throw y({token:n[n.length-1].exprs.expr.token,errorMessage:`Recursive type has infinite size in field "${n[n.length-1].label}"
|
|
44
|
-
Insert some indirection (e.g., a pointer '*' or reference '&') to break the cycle.`});if(ft(a))continue;let s=[...n,o],l=Ft(a,s);He(l)&&(i=Math.max(i,l.level),l.tag==="Type"&&(r=!0))}return i>0?gn(i):r?tt(e):tt(e)}function Ft(e,t=[]){if(Ce(e))return tt(e);if(go(e))return tt(e);if(He(e))return gn(e.level+1);if(vt(e)||Nt(e)||Et(e)||xt(e))return tt(e);if(Lt(e))return tt(e);if(G(e))return tt(e);if(kt(e))return tt(e);if(ke(e))return Ft(e.childType,t);if(Qe(e))return tt(e);if(we(e))return aa(e,e.fields,t);if(_e(e))return aa(e,e.fields,t);if(ge(e)){let n=[];for(let r of e.variants)r.fields&&n.push(...r.fields);return aa(e,n,t)}else{if(it(e))return aa(e,e.fields,t);if(Te(e))return gn(1,e);if(De(e))return gn(1,e);if(V(e))return e.parentType;if(Ie(e))return tt(e);if(wt(e))return tt(e);if(bt(e))return tt(e);if(Kt(e))return tt(e);if(kr(e))return tt(e);if(ot(e))return gn(1);throw new Error(`Unknown type tag: ${e.tag}`)}}function Zl(e){if(e.exprs.labelExpr?.token)return e.exprs.labelExpr.token;if(e.exprs.typeExpr?.token)return e.exprs.typeExpr.token;if(e.exprs.defaultValueExpr?.token)return e.exprs.defaultValueExpr.token;throw new Error("Cannot get token for function parameter")}function Me(e){if(!e)return"<runtime value>";switch(e.tag){case"Type":return A(e.value);case"ComptimeInt":case"ComptimeFloat":return e.value.toString();case"ComptimeString":return JSON.stringify(e.value);case"ComptimeList":return`comptime_list(${e.elements.map(Me).join(", ")})`;case"U8":case"I8":case"U16":case"I16":case"U32":case"I32":case"U64":case"I64":case"F32":case"F64":case"Usize":case"Isize":return typeof e.value=="bigint",e.value.toString();case"Bool":return e.value.toString();case"Array":return`[${e.elements.map(Me).join(", ")}${e.elements.length===1?",":""}]`;case"Slice":return`slice[${e.sourceArray[0].elements.slice(e.startIndex,e.endIndex).map(Me).join(", ")}]`;case"Tuple":return e.fields.length===0?"()":`(${e.fields.map(Me).join(", ")}${e.fields.length===1?",":""})`;case"Struct":return`${e.type.typeName??"_"}(${e.fields.map((t,n)=>{let r=e.type.fields[n].label;return sr(r)&&(r=`(${r})`),`${r}: ${Me(t)}`}).join(", ")})`;case"Enum":{if(e.fields.length===0)return`.${e.variantName}`;let t=e.type.variants.find(n=>n.name===e.variantName);return`.${e.variantName}(${e.fields.map((n,r)=>{let i=t?.fields[r].label??"_";return sr(i)&&(i=`(${i})`),`${i}: ${Me(n)}`}).join(", ")})`}case"Function":return e.funcName?`<fn ${e.funcName}>`:e.type.typeName?`<fn ${e.type.typeName}>`:"<fn>";case"Module":return`${e.type.typeName??"_"}(${e.fields.map((t,n)=>{let r=e.type.fields[n].label;return sr(r)&&(r=`(${r})`),`${r}: ${Me(t)}`}).join(", ")})`;case"Trait":return`${e.type.typeName??"_"}(${e.fields.map((t,n)=>{let r=e.type.fields[n].label;return sr(r)&&(r=`(${r})`),`${r}: ${Me(t)}`}).join(", ")})`;case"Unit":return"()";case"Expr":return`quote(${w(e.value)})`;case"Unknown":return e.variableName?e.variableName:`<comptime ${A(e.type)}>`;case"Ptr":{let t=e.targetValue[0];return zn(t)?`<ptr to ${Me(t.elements[e.targetIndex])}>`:`<ptr to ${Me(t)}>`}default:throw new Error("valueToString: Unsupported value")}}function O(e){return e?.tag==="Type"}function An(e){return e?.tag==="ComptimeInt"}function la(e){return e?.tag==="ComptimeFloat"}function xe(e){return e?.tag==="ComptimeString"}function cr(e){return e?.tag==="ComptimeList"}function Jl(e){return cr(e)&&Lt(e.type.childType)}function Ue(e){return e?.tag==="ComptimeInt"||e?.tag==="ComptimeFloat"||e?.tag==="U8"||e?.tag==="I8"||e?.tag==="U16"||e?.tag==="I16"||e?.tag==="U32"||e?.tag==="I32"||e?.tag==="U64"||e?.tag==="I64"||e?.tag==="F32"||e?.tag==="F64"||e?.tag==="Usize"||e?.tag==="Isize"}function Re(e){return e?.tag==="Bool"}function ne(e){return e?.tag==="Function"}function de(e){return e?.tag==="Unknown"}function hn(e){return e?.tag==="Tuple"}function bn(e){return e?.tag==="Struct"}function zn(e){return e?.tag==="Array"}function sa(e){return e?.tag==="Slice"}function It(e){return e?.tag==="Enum"}function We(e){return e?.tag==="Module"}function Tt(e){return e?.tag==="Trait"}function wi(e){return e?.tag==="Ptr"}function ln(e){return e?.tag==="Expr"}function ee(e){return{tag:"Type",type:Ft(e),value:e}}function on(e){return{tag:"ComptimeString",type:Vt(),value:e}}function Un(e,t){return{tag:"ComptimeList",type:Io(e),elements:t}}function Xt(e,t){let n;if(e==="ComptimeInt")n=fr();else if(e==="ComptimeFloat")n=Li();else if(e==="U8")n=Ii();else if(e==="I8")n=Si();else if(e==="U16")n=Ni();else if(e==="I16")n=xi();else if(e==="U32")n=Vi();else if(e==="I32")n=Pr();else if(e==="U64")n=Di();else if(e==="I64")n=Mi();else if(e==="F32")n=Oi();else if(e==="F64")n=zr();else if(e==="Usize")n=gt();else if(e==="Isize")n=Ai();else throw new Error(`createNumberValue: Unsupported tag: ${e}`);return{tag:e,type:n,value:t}}function Bn(e){return Xt("ComptimeInt",e)}function ua(e){return Xt("ComptimeFloat",e)}function pt(e){return{tag:"Bool",type:Je(),value:e}}function K(e,{variableName:t,recursiveTypeRef:n,env:r,context:i}){if(He(e)&&e.level===0){if(!t)throw console.trace("!variableName bug found in createUnknownValue"),new Error(`createUnknownValue expects a variable name for type ${A(e)}`);let o=Cn(e,t,{recursiveTypeRef:n,env:r,context:i});return ee(o)}return{tag:"Unknown",type:e,variableName:t}}function Gn(e,t){return{tag:"Struct",type:e,fields:t}}function _a(e,t){return{tag:"Module",type:e,fields:t}}function Fi(e,t){return{tag:"Trait",type:e,fields:t}}function ca(e,t){return{tag:"Tuple",type:e,fields:t}}function ei(e,t,n){return{tag:"Enum",type:e,variantName:t,fields:n}}function Rr(e,t){return{tag:"Array",type:e,elements:t}}function fa(e,t,n,r){return{tag:"Slice",type:e,sourceArray:t,startIndex:n,endIndex:r}}function Wn(e){return{tag:"Expr",type:cn(),value:e}}function ss(e,t,n=0){return{tag:"Ptr",type:e,targetValue:t,targetIndex:n}}function At(e,t){let n=e.value,r=t.value;if(n===r)return!0;if(!n||!r)return!1;if(n.tag==="Type"&&r.tag==="Type")return q({type:n.value,env:e.env},{type:r.value,env:t.env},!0);if(xe(n)&&xe(r))return n.value===r.value;if(cr(n)&&cr(r)){if(n.elements.length!==r.elements.length)return!1;for(let i=0;i<n.elements.length;i++)if(!At({value:n.elements[i],env:e.env},{value:r.elements[i],env:t.env}))return!1;return!0}else if(Ue(n)&&Ue(r)){let i=n.value,o=r.value;if(typeof i==typeof o)return i===o;let a=typeof i=="bigint"?i:BigInt(i),s=typeof o=="bigint"?o:BigInt(o);return a===s}else{if(Re(n)&&Re(r))return n.value===r.value;if(zn(n)&&zn(r)){if(n.elements.length!==r.elements.length)return!1;for(let i=0;i<n.elements.length;i++)if(!At({value:n.elements[i],env:e.env},{value:r.elements[i],env:t.env}))return!1;return!0}else if(sa(n)&&sa(r)){let i=n.endIndex-n.startIndex,o=r.endIndex-r.startIndex;if(i!==o)return!1;for(let a=0;a<i;a++){let s=n.sourceArray[0].elements[n.startIndex+a],l=r.sourceArray[0].elements[r.startIndex+a];if(!At({value:s,env:e.env},{value:l,env:t.env}))return!1}return!0}else if(hn(n)&&hn(r)){if(n.fields.length!==r.fields.length)return!1;for(let i=0;i<n.fields.length;i++)if(!At({value:n.fields[i],env:e.env},{value:r.fields[i],env:t.env}))return!1;return!0}else if(bn(n)&&bn(r)){if(n.fields.length!==r.fields.length||!q({type:n.type,env:e.env},{type:r.type,env:t.env},!0))return!1;for(let i=0;i<n.fields.length;i++)if(!At({value:n.fields[i],env:e.env},{value:r.fields[i],env:t.env}))return!1;return!0}else if(It(n)&&It(r)){if(n.fields.length!==r.fields.length||!q({type:n.type,env:e.env},{type:r.type,env:t.env},!0)||n.variantName!==r.variantName)return!1;for(let i=0;i<n.fields.length;i++)if(!At({value:n.fields[i],env:e.env},{value:r.fields[i],env:t.env}))return!1;return!0}else if(We(n)&&We(r)){if(n.fields.length!==r.fields.length||!q({type:n.type,env:e.env},{type:r.type,env:t.env},!0))return!1;for(let i=0;i<n.fields.length;i++)if(!At({value:n.fields[i],env:e.env},{value:r.fields[i],env:t.env}))return!1;return!0}else if(Tt(n)&&Tt(r)){if(n.fields.length!==r.fields.length||!q({type:n.type,env:e.env},{type:r.type,env:t.env},!0))return!1;for(let i=0;i<n.fields.length;i++)if(!At({value:n.fields[i],env:e.env},{value:r.fields[i],env:t.env}))return!1;return!0}else{if(ln(n)&&ln(r))return n.value===r.value||pa(n.value,r.value);if(de(n)&&de(r)){let i,o;if(n.variableName){let a=X(e.env,n.variableName);if(a.length>0){let s=a[a.length-1];s.value&&!de(s.value[0])&&(i=s.value[0])}}if(r.variableName){let a=X(t.env,r.variableName);if(a.length>0){let s=a[a.length-1];s.value&&!de(s.value[0])&&(o=s.value[0])}}return i&&o?At({value:i,env:e.env},{value:o,env:t.env}):i||o?!1:q({type:n.type,env:e.env},{type:r.type,env:t.env},!0)}else if(de(n)&&!de(r)){if(n.variableName){let i=X(e.env,n.variableName);if(i.length>0){let o=i[i.length-1];if(o.value&&!de(o.value[0]))return At({value:o.value[0],env:e.env},{value:r,env:t.env})}}return!1}else if(!de(n)&&de(r)){if(r.variableName){let i=X(t.env,r.variableName);if(i.length>0){let o=i[i.length-1];if(o.value&&!de(o.value[0]))return At({value:n,env:e.env},{value:o.value[0],env:t.env})}}return!1}else return wi(n)&&wi(r)?n.targetValue===r.targetValue&&n.targetIndex===r.targetIndex:!1}}}function dr(e,t){return e?ni(e,t):!1}function mr(e,t){return e?$m(e,t):!1}function ni(e,t){return Jn(e,t)&&!Ar(e,t)}function $m(e,t){let n=Jn(e,t),r=Ar(e,t);return!n&&r}function Le(e,t=[]){if(!e||t.includes(e)||(t.push(e),e.isExtern))return!1;if(sn(e))return!0;switch(e.tag){case"Array":return Le(e.childType,t);case"Tuple":return e.fields.some(n=>Le(n.type,t));case"Union":return e.fields.some(n=>Le(n.type,t));case"Struct":return e.fields.some(n=>Le(n.type,t));case"Enum":return e.variants.some(n=>n.fields?.some(r=>Le(r.type,t)));case"Iso":return Le(e.childType,t);case"Arc":return Le(e.childType,t);case"Module":return!1;case"Function":return!1;case"SomeType":{let n=e;return be(n)?!0:n.resolvedConcreteType?Le(n.resolvedConcreteType,t):!0}default:return!1}}function Fe(e,t=[]){if(!e||t.includes(e))return!1;if(t.push(e),V(e))return e.isExtern?!1:e.resolvedConcreteType?Fe(e.resolvedConcreteType,t):!(Wt(e)||be(e));switch(e.tag){case"Array":return Fe(e.childType,t);case"Tuple":return e.fields.some(n=>Fe(n.type,t));case"Struct":return e.fields.some(n=>!n.isEffectParam&&Fe(n.type,t));case"Enum":return e.variants.some(n=>n.fields?.some(r=>Fe(r.type,t)));case"Union":return e.fields.some(n=>Fe(n.type,t));case"Function":{let n=e;return n.forallParameters.length>0||n.parameters.some(r=>Fe(r.type,t))||Fe(n.return.type,t)}case"Module":return e.fields.some(n=>Fe(n.type,t));case"Ptr":return Fe(e.childType,t);default:return!1}}function wr(e,t=new Set){return t.has(e.id)?!1:(t.add(e.id),ke(e)?de(e.length)?!0:wr(e.childType,t):Ie(e)||Qe(e)?wr(e.childType,t):we(e)?e.fields.some(n=>wr(n.type,t)):_e(e)?e.fields.some(n=>wr(n.type,t)):ge(e)?e.variants.some(n=>n.fields?.some(r=>wr(r.type,t))):it(e)?e.fields.some(n=>wr(n.type,t)):!1)}function us(e){let t=new Set,n=new Set;function r(i){if(!(i&&n.has(i))){if(i&&n.add(i),V(i)){if(t.has(i))return;i.resolvedConcreteType||t.add(i)}switch(i.tag){case"Array":r(i.childType);break;case"Tuple":i.fields.forEach(o=>r(o.type));break;case"Struct":i.fields.forEach(o=>r(o.type));break;case"Enum":i.variants.forEach(o=>{o.fields?.forEach(a=>r(a.type))});break;case"Union":i.fields.forEach(o=>r(o.type));break;case"Module":i.fields.forEach(o=>r(o.type));break;case"Ptr":r(i.childType);break;default:break}}}return r(e),t}function Pi(e){if(!e)return!1;switch(e.tag){case"Array":{let t=e;return de(t.length)||Pi(t.childType)}case"SomeType":return!0;case"Module":return!1;case"Trait":{let t=e;return t.isFn?Pi(t.isFn.callType):!1}default:return!1}}function yt({type:e,expectedType:t,expr:n,env:r}){let i;if(vt(e))i=Pr();else if(Nt(e))i=zr();else if(Et(e))t&&(Ie(t)&&(Kn(t.childType)||ki(t.childType))||Qe(t))&&(i=t),i||(i=ru(r));else return e;return i&&n?.$&&(n.$.convertedRuntimeType=i),i??e}function ls(e,t=new Set){let n=e.label;e.isQuote?n=`quote(${n})`:e.isImplicit||e.isCompileTimeOnly&&(n=`comptime(${n})`);let r=A(e.type,t),i=e.exprs.defaultValueExpr?w(e.exprs.defaultValueExpr):"";return n===""?r:i?`(${n} : ${r}) ?= ${i}`:`${n} : ${r}`}function Ri(e,t=new Set){let n=e.label;sr(n)&&(n=`(${n})`);let r=e.defaultValue?Me(e.defaultValue):"",i=e.assignedValue?Me(e.assignedValue):"";return r?`(${n}: ${A(e.type,t)}) ?= ${r}`:i?`(${n}: ${A(e.type,t)}) = ${i}`:`${n}: ${A(e.type,t)}`}function eu(e,t=new Set){let n=e.label;sr(n)&&(n=`(${n})`);let r=e.defaultValue?Me(e.defaultValue):"",i=e.assignedValue?Me(e.assignedValue):"";return r?`(${n} : ${A(e.type,t)}) ?= ${r}`:i?`(${n} : ${A(e.type,t)}) = ${i}`:`${n} : ${A(e.type,t)}`}function tu(e,t=new Set){let n=e.parameters.map(c=>ls(c,t)).join(", "),r=e.forallParameters.length>0?`forall(${e.forallParameters.map(c=>ls(c,t)).join(", ")})`:"",i="";e.variadicParameter&&(e.variadicParameter.label==="..."?i="...":e.variadicParameter.isQuote?i=`...(quote(${e.variadicParameter.label}))`:e.variadicParameter.isCompileTimeOnly?i=`...(comptime(${e.variadicParameter.label}))`:i=`...(${e.variadicParameter.label})`);let o=A(e.return.type,t),a=o;e.return.isUnquote?e.return.label?a=`(unquote(${e.return.label}) : ${o})`:a=`unquote(${o})`:e.return.isCompileTimeOnly&&(e.return.label?a=`(comptime(${e.return.label}) : ${o})`:a=`comptime(${o})`);let s=e.implicitParameters.length>0?`using(${e.implicitParameters.map(c=>c.isEffectRowSpread?`...(${c.label})`:ls(c,t)).join(", ")})`:"",l=[r,n,s,i].filter(c=>!!c).join(", "),u=e.SelfType?.typeName;return`${u?`(${u}) `:""}fn(${l}) -> ${a}`}function A(e,t=new Set){if(e.id&&t.has(e.id))return e.typeName||`<circular:${e.tag}>`;e.id&&t.add(e.id);try{return bm(e,t)}finally{e.id&&t.delete(e.id)}}function bm(e,t){if(!e)return"unknown";switch(e.tag){case"unit":return"unit";case"bool":return"bool";case"usize":return"usize";case"isize":return"isize";case"u8":return"u8";case"i8":return"i8";case"u16":return"u16";case"i16":return"i16";case"u32":return"u32";case"i32":return"i32";case"u64":return"u64";case"i64":return"i64";case"f32":return"f32";case"f64":return"f64";case"Type":return"level"in e&&typeof e.level=="number"&&e.level>0?`Type(${e.level})`:"Type";case"Array":return`[${A(e.childType,t)}; ${Me(e.length)}]`;case"Slice":return`[${A(e.childType,t)}]`;case"Tuple":return e.fields.length===0?"()":`(${e.fields.map(n=>Ri(n,t)).join(", ")}${e.fields.length===1?",":""})`;case"Struct":{let n=e;return n.typeName?n.typeName:`${n.typeName?`(${n.typeName}) `:""}${n.isReferenceSemantics?"object":n.isNewtype?"newtype":"struct"}(${n.fields.map(r=>Ri(r,t)).join(", ")})`}case"Enum":{let n=e;if(n.typeName){let r=n.typeName;return n.requiredVariantNames??n.selectedVariantName?`${r} (${n.requiredVariantNames?`${n.requiredVariantNames.map(i=>`.${i}`).join(" | ")} required`:`.${n.selectedVariantName} selected`})`:r}return`${n.typeName?`(${n.typeName}) `:""}enum(${n.variants.map(r=>`${r.name}${r.fields?`(${r.fields.map(i=>Ri(i,t)).join(", ")})`:""}`).join(", ")})`}case"Union":{let n=e;if(n.typeName)return n.typeName;let r=n.fields;return`${n.typeName?`(${n.typeName}) `:""}${n.typeName?"union":n.id}(${r.map(i=>Ri(i,t)).join(", ")})`}case"Module":{let n=e,r;return n.typeName?r=n.typeName:r=`${n.typeName?`(${n.typeName}) `:""}module(${n.fields.map(i=>eu(i,t)).join(", ")})`,r}case"Trait":{let n=e;if(kt(n))return`Fn${tu(n.isFn.callType,t).slice(2)}`;if(Kt(n)){let i=[A(n.isFuture.outputType,t)];for(let o of n.isFuture.effects)o.isEffectRowSpread?i.push(`...(${o.label})`):i.push(A(o.type,t));return`Future(${i.join(", ")})`}let r;return n.typeName?r=n.typeName:r=`${n.typeName?`(${n.typeName}) `:""}trait(${n.fields.map(i=>eu(i,t)).join(", ")})`,n.receiverType&&(r=`(${A(n.receiverType,t)} <: ${r})`),r}case"Function":{let n=e;return n.typeName?n.typeName:tu(n,t)}case"SomeType":{let n=e;if(n.typeName)return n.typeName;if(n.functionApplication)return w(n.functionApplication);let r=[];if(n.requiredTraits&&n.requiredTraits.length>0)for(let i of n.requiredTraits)r.push(A(i.traitType,t));if(n.negativeTraits&&n.negativeTraits.length>0)for(let i of n.negativeTraits)r.push(`!(${A(i.traitType,t)})`);return r.length>0?`${n.name||"Impl"}(${r.join(", ")})`:n.name||"Impl()"}case"Ptr":return`*(${A(e.childType,t)})`;case"Iso":return`Iso(${A(e.childType,t)})`;case"Arc":return`Arc(${A(e.childType,t)})`;case"Expr":return"Expr";case"ComptimeList":return`ComptimeList(${A(e.childType)})`;case"EffectsRow":{let n=e;return n.implicitParameters.length===0?"EffectsRow()":`EffectsRow(${n.implicitParameters.map(r=>`${r.label} : ${A(r.type,t)}`).join(", ")})`}case"Dyn":{let n=e;if(n.typeName)return n.typeName;let r=[];for(let{traitType:i}of n.requiredTraits)r.push(A(i,t));if(n.negativeTraits&&n.negativeTraits.length>0)for(let{traitType:i}of n.negativeTraits)r.push(`!(${A(i,t)})`);return`Dyn(${r.join(", ")})`}default:return`${e.tag}`}}var nu=64;function Zn(){return nu}function da(){return nu/8}function Cm(e){let t=Ur(e.childType);if(t===null)return null;if(t===-1)return-1;let n=e.length;if(Ue(n)){let r=BigInt(n.value);if(r<0)throw new Error("Array length cannot be negative");return Number(r)*t}return null}function km(e){let t=0,n=1;for(let r of e.fields){let i=Ur(r.type);if(i===null)return null;if(i===-1)return-1;let o=Qn(r.type);if(o===null)return null;let a=Math.ceil(i/8);t=Math.ceil(t/o)*o,t+=a,n=Math.max(n,o)}return t=Math.ceil(t/n)*n,t*8}function wm(e){let t=0,n=1;for(let r of e.fields){let i=Ur(r.type);if(i===null)return null;if(i===-1)return-1;let o=Qn(r.type);if(o===null)return null;let a=Math.ceil(i/8);t=Math.ceil(t/o)*o,t+=a,n=Math.max(n,o)}return t=Math.ceil(t/n)*n,t*8}function Fm(e){let t=0,n=0;for(let m of e.variants){let g=0,h=1;if(m.fields)for(let v of m.fields){let T=Ur(v.type);if(T===null)return null;if(T===-1)return-1;let $=Qn(v.type);if($===null)return null;let b=Math.ceil(T/8);g=Math.ceil(g/$)*$,g+=b,h=Math.max(h,$),n=Math.max(n,$*8)}g=Math.ceil(g/h)*h;let d=g*8;t=Math.max(t,d)}let r=Math.ceil(Math.ceil(Math.log2(e.variants.length))/8)*8,i=32,o=Math.max(n,8),a=Math.max(i,o),s=r/8,l=o/8,u=(l-s%l)%l*8,_=r+u+t,c=_/8,f=a/8,p=(f-c%f)%f*8;return _+p}function Lm(e){let t=0;for(let n of e.fields){let r=Ur(n.type);if(r===null)return null;if(r===-1)return-1;t=Math.max(t,r)}return t}function Qn(e){if(V(e))return null;if(fe(e)||He(e)||vt(e)||Nt(e)||Et(e)||xt(e)||Te(e)||De(e)||Lt(e))return 1;if(_n(e))return 1;if(ho(e)||vo(e))return da();if(Kn(e)||To(e))return 1;if(Eo(e)||$o(e))return 2;if(bo(e)||Co(e))return 4;if(ko(e)||wo(e))return 8;if(Fo(e))return 4;if(Lo(e))return 8;if(ke(e))return Qn(e.childType);if(we(e)){let t=1;for(let n of e.fields){let r=Qn(n.type);if(r===null)return null;t=Math.max(t,r)}return t}else if(_e(e)){if(e.isReferenceSemantics)return da();if(e.isNewtype)return Qn(e.fields[0].type);let t=1;for(let n of e.fields){let r=Qn(n.type);if(r===null)return null;t=Math.max(t,r)}return t}else if(ge(e)){let t=1;for(let n of e.variants)if(n.fields)for(let r of n.fields){let i=Qn(r.type);if(i===null)return null;t=Math.max(t,i)}return t}else if(it(e)){let t=1;for(let n of e.fields){let r=Qn(n.type);if(r===null)return null;t=Math.max(t,r)}return t}else{if(G(e))return da();if(Ie(e))return da()}return null}function Ur(e){return V(e)?null:fe(e)||He(e)||vt(e)||Nt(e)||Et(e)||xt(e)||Te(e)||De(e)||Lt(e)?0:_n(e)?8:ho(e)||vo(e)?Zn():Kn(e)||To(e)?8:Eo(e)||$o(e)?16:bo(e)||Co(e)?32:ko(e)||wo(e)?64:Fo(e)?32:Lo(e)?64:ke(e)?Cm(e):we(e)?km(e):_e(e)?e.isReferenceSemantics?Zn():e.isNewtype?Ur(e.fields[0].type):wm(e):ge(e)?Fm(e):it(e)?Lm(e):G(e)||Ie(e)?Zn():null}function Fr(e,t){if(kr(e))throw lt([{token:t,errorMessage:`Cannot use 'void' type here.
|
|
44
|
+
Insert some indirection (e.g., a pointer '*' or reference '&') to break the cycle.`});if(ft(a))continue;let s=[...n,o],l=Ft(a,s);He(l)&&(i=Math.max(i,l.level),l.tag==="Type"&&(r=!0))}return i>0?hn(i):r?tt(e):tt(e)}function Ft(e,t=[]){if(Ce(e))return tt(e);if(go(e))return tt(e);if(He(e))return hn(e.level+1);if(vt(e)||Nt(e)||Et(e)||xt(e))return tt(e);if(Lt(e))return tt(e);if(G(e))return tt(e);if(kt(e))return tt(e);if(ke(e))return Ft(e.childType,t);if(Qe(e))return tt(e);if(we(e))return aa(e,e.fields,t);if(_e(e))return aa(e,e.fields,t);if(ge(e)){let n=[];for(let r of e.variants)r.fields&&n.push(...r.fields);return aa(e,n,t)}else{if(it(e))return aa(e,e.fields,t);if(Te(e))return hn(1,e);if(De(e))return hn(1,e);if(V(e))return e.parentType;if(Ie(e))return tt(e);if(wt(e))return tt(e);if(bt(e))return tt(e);if(Kt(e))return tt(e);if(kr(e))return tt(e);if(ot(e))return hn(1);throw new Error(`Unknown type tag: ${e.tag}`)}}function Zl(e){if(e.exprs.labelExpr?.token)return e.exprs.labelExpr.token;if(e.exprs.typeExpr?.token)return e.exprs.typeExpr.token;if(e.exprs.defaultValueExpr?.token)return e.exprs.defaultValueExpr.token;throw new Error("Cannot get token for function parameter")}function Me(e){if(!e)return"<runtime value>";switch(e.tag){case"Type":return A(e.value);case"ComptimeInt":case"ComptimeFloat":return e.value.toString();case"ComptimeString":return JSON.stringify(e.value);case"ComptimeList":return`comptime_list(${e.elements.map(Me).join(", ")})`;case"U8":case"I8":case"U16":case"I16":case"U32":case"I32":case"U64":case"I64":case"F32":case"F64":case"Usize":case"Isize":return typeof e.value=="bigint",e.value.toString();case"Bool":return e.value.toString();case"Array":return`[${e.elements.map(Me).join(", ")}${e.elements.length===1?",":""}]`;case"Slice":return`slice[${e.sourceArray[0].elements.slice(e.startIndex,e.endIndex).map(Me).join(", ")}]`;case"Tuple":return e.fields.length===0?"()":`(${e.fields.map(Me).join(", ")}${e.fields.length===1?",":""})`;case"Struct":return`${e.type.typeName??"_"}(${e.fields.map((t,n)=>{let r=e.type.fields[n].label;return sr(r)&&(r=`(${r})`),`${r}: ${Me(t)}`}).join(", ")})`;case"Enum":{if(e.fields.length===0)return`.${e.variantName}`;let t=e.type.variants.find(n=>n.name===e.variantName);return`.${e.variantName}(${e.fields.map((n,r)=>{let i=t?.fields[r].label??"_";return sr(i)&&(i=`(${i})`),`${i}: ${Me(n)}`}).join(", ")})`}case"Function":return e.funcName?`<fn ${e.funcName}>`:e.type.typeName?`<fn ${e.type.typeName}>`:"<fn>";case"Module":return`${e.type.typeName??"_"}(${e.fields.map((t,n)=>{let r=e.type.fields[n].label;return sr(r)&&(r=`(${r})`),`${r}: ${Me(t)}`}).join(", ")})`;case"Trait":return`${e.type.typeName??"_"}(${e.fields.map((t,n)=>{let r=e.type.fields[n].label;return sr(r)&&(r=`(${r})`),`${r}: ${Me(t)}`}).join(", ")})`;case"Unit":return"()";case"Expr":return`quote(${w(e.value)})`;case"Unknown":return e.variableName?e.variableName:`<comptime ${A(e.type)}>`;case"Ptr":{let t=e.targetValue[0];return zn(t)?`<ptr to ${Me(t.elements[e.targetIndex])}>`:`<ptr to ${Me(t)}>`}default:throw new Error("valueToString: Unsupported value")}}function O(e){return e?.tag==="Type"}function An(e){return e?.tag==="ComptimeInt"}function la(e){return e?.tag==="ComptimeFloat"}function xe(e){return e?.tag==="ComptimeString"}function cr(e){return e?.tag==="ComptimeList"}function Jl(e){return cr(e)&&Lt(e.type.childType)}function Ue(e){return e?.tag==="ComptimeInt"||e?.tag==="ComptimeFloat"||e?.tag==="U8"||e?.tag==="I8"||e?.tag==="U16"||e?.tag==="I16"||e?.tag==="U32"||e?.tag==="I32"||e?.tag==="U64"||e?.tag==="I64"||e?.tag==="F32"||e?.tag==="F64"||e?.tag==="Usize"||e?.tag==="Isize"}function Pe(e){return e?.tag==="Bool"}function ne(e){return e?.tag==="Function"}function de(e){return e?.tag==="Unknown"}function vn(e){return e?.tag==="Tuple"}function bn(e){return e?.tag==="Struct"}function zn(e){return e?.tag==="Array"}function sa(e){return e?.tag==="Slice"}function It(e){return e?.tag==="Enum"}function We(e){return e?.tag==="Module"}function Tt(e){return e?.tag==="Trait"}function wi(e){return e?.tag==="Ptr"}function ln(e){return e?.tag==="Expr"}function ee(e){return{tag:"Type",type:Ft(e),value:e}}function on(e){return{tag:"ComptimeString",type:Vt(),value:e}}function Un(e,t){return{tag:"ComptimeList",type:Io(e),elements:t}}function Xt(e,t){let n;if(e==="ComptimeInt")n=fr();else if(e==="ComptimeFloat")n=Li();else if(e==="U8")n=Ii();else if(e==="I8")n=Si();else if(e==="U16")n=Ni();else if(e==="I16")n=xi();else if(e==="U32")n=Vi();else if(e==="I32")n=Pr();else if(e==="U64")n=Di();else if(e==="I64")n=Mi();else if(e==="F32")n=Oi();else if(e==="F64")n=zr();else if(e==="Usize")n=gt();else if(e==="Isize")n=Ai();else throw new Error(`createNumberValue: Unsupported tag: ${e}`);return{tag:e,type:n,value:t}}function Bn(e){return Xt("ComptimeInt",e)}function ua(e){return Xt("ComptimeFloat",e)}function pt(e){return{tag:"Bool",type:Je(),value:e}}function K(e,{variableName:t,recursiveTypeRef:n,env:r,context:i}){if(He(e)&&e.level===0){if(!t)throw console.trace("!variableName bug found in createUnknownValue"),new Error(`createUnknownValue expects a variable name for type ${A(e)}`);let o=Cn(e,t,{recursiveTypeRef:n,env:r,context:i});return ee(o)}return{tag:"Unknown",type:e,variableName:t}}function Gn(e,t){return{tag:"Struct",type:e,fields:t}}function _a(e,t){return{tag:"Module",type:e,fields:t}}function Fi(e,t){return{tag:"Trait",type:e,fields:t}}function ca(e,t){return{tag:"Tuple",type:e,fields:t}}function ei(e,t,n){return{tag:"Enum",type:e,variantName:t,fields:n}}function Rr(e,t){return{tag:"Array",type:e,elements:t}}function fa(e,t,n,r){return{tag:"Slice",type:e,sourceArray:t,startIndex:n,endIndex:r}}function Wn(e){return{tag:"Expr",type:cn(),value:e}}function ss(e,t,n=0){return{tag:"Ptr",type:e,targetValue:t,targetIndex:n}}function At(e,t){let n=e.value,r=t.value;if(n===r)return!0;if(!n||!r)return!1;if(n.tag==="Type"&&r.tag==="Type")return q({type:n.value,env:e.env},{type:r.value,env:t.env},!0);if(xe(n)&&xe(r))return n.value===r.value;if(cr(n)&&cr(r)){if(n.elements.length!==r.elements.length)return!1;for(let i=0;i<n.elements.length;i++)if(!At({value:n.elements[i],env:e.env},{value:r.elements[i],env:t.env}))return!1;return!0}else if(Ue(n)&&Ue(r)){let i=n.value,o=r.value;if(typeof i==typeof o)return i===o;let a=typeof i=="bigint"?i:BigInt(i),s=typeof o=="bigint"?o:BigInt(o);return a===s}else{if(Pe(n)&&Pe(r))return n.value===r.value;if(zn(n)&&zn(r)){if(n.elements.length!==r.elements.length)return!1;for(let i=0;i<n.elements.length;i++)if(!At({value:n.elements[i],env:e.env},{value:r.elements[i],env:t.env}))return!1;return!0}else if(sa(n)&&sa(r)){let i=n.endIndex-n.startIndex,o=r.endIndex-r.startIndex;if(i!==o)return!1;for(let a=0;a<i;a++){let s=n.sourceArray[0].elements[n.startIndex+a],l=r.sourceArray[0].elements[r.startIndex+a];if(!At({value:s,env:e.env},{value:l,env:t.env}))return!1}return!0}else if(vn(n)&&vn(r)){if(n.fields.length!==r.fields.length)return!1;for(let i=0;i<n.fields.length;i++)if(!At({value:n.fields[i],env:e.env},{value:r.fields[i],env:t.env}))return!1;return!0}else if(bn(n)&&bn(r)){if(n.fields.length!==r.fields.length||!q({type:n.type,env:e.env},{type:r.type,env:t.env},!0))return!1;for(let i=0;i<n.fields.length;i++)if(!At({value:n.fields[i],env:e.env},{value:r.fields[i],env:t.env}))return!1;return!0}else if(It(n)&&It(r)){if(n.fields.length!==r.fields.length||!q({type:n.type,env:e.env},{type:r.type,env:t.env},!0)||n.variantName!==r.variantName)return!1;for(let i=0;i<n.fields.length;i++)if(!At({value:n.fields[i],env:e.env},{value:r.fields[i],env:t.env}))return!1;return!0}else if(We(n)&&We(r)){if(n.fields.length!==r.fields.length||!q({type:n.type,env:e.env},{type:r.type,env:t.env},!0))return!1;for(let i=0;i<n.fields.length;i++)if(!At({value:n.fields[i],env:e.env},{value:r.fields[i],env:t.env}))return!1;return!0}else if(Tt(n)&&Tt(r)){if(n.fields.length!==r.fields.length||!q({type:n.type,env:e.env},{type:r.type,env:t.env},!0))return!1;for(let i=0;i<n.fields.length;i++)if(!At({value:n.fields[i],env:e.env},{value:r.fields[i],env:t.env}))return!1;return!0}else{if(ln(n)&&ln(r))return n.value===r.value||pa(n.value,r.value);if(de(n)&&de(r)){let i,o;if(n.variableName){let a=X(e.env,n.variableName);if(a.length>0){let s=a[a.length-1];s.value&&!de(s.value[0])&&(i=s.value[0])}}if(r.variableName){let a=X(t.env,r.variableName);if(a.length>0){let s=a[a.length-1];s.value&&!de(s.value[0])&&(o=s.value[0])}}return i&&o?At({value:i,env:e.env},{value:o,env:t.env}):i||o?!1:q({type:n.type,env:e.env},{type:r.type,env:t.env},!0)}else if(de(n)&&!de(r)){if(n.variableName){let i=X(e.env,n.variableName);if(i.length>0){let o=i[i.length-1];if(o.value&&!de(o.value[0]))return At({value:o.value[0],env:e.env},{value:r,env:t.env})}}return!1}else if(!de(n)&&de(r)){if(r.variableName){let i=X(t.env,r.variableName);if(i.length>0){let o=i[i.length-1];if(o.value&&!de(o.value[0]))return At({value:n,env:e.env},{value:o.value[0],env:t.env})}}return!1}else return wi(n)&&wi(r)?n.targetValue===r.targetValue&&n.targetIndex===r.targetIndex:!1}}}function dr(e,t){return e?ni(e,t):!1}function mr(e,t){return e?$m(e,t):!1}function ni(e,t){return Jn(e,t)&&!Ar(e,t)}function $m(e,t){let n=Jn(e,t),r=Ar(e,t);return!n&&r}function Le(e,t=[]){if(!e||t.includes(e)||(t.push(e),e.isExtern))return!1;if(sn(e))return!0;switch(e.tag){case"Array":return Le(e.childType,t);case"Tuple":return e.fields.some(n=>Le(n.type,t));case"Union":return e.fields.some(n=>Le(n.type,t));case"Struct":return e.fields.some(n=>Le(n.type,t));case"Enum":return e.variants.some(n=>n.fields?.some(r=>Le(r.type,t)));case"Iso":return Le(e.childType,t);case"Arc":return Le(e.childType,t);case"Module":return!1;case"Function":return!1;case"SomeType":{let n=e;return be(n)?!0:n.resolvedConcreteType?Le(n.resolvedConcreteType,t):!0}default:return!1}}function Fe(e,t=[]){if(!e||t.includes(e))return!1;if(t.push(e),V(e))return e.isExtern?!1:e.resolvedConcreteType?Fe(e.resolvedConcreteType,t):!(Wt(e)||be(e));switch(e.tag){case"Array":return Fe(e.childType,t);case"Tuple":return e.fields.some(n=>Fe(n.type,t));case"Struct":return e.fields.some(n=>!n.isEffectParam&&Fe(n.type,t));case"Enum":return e.variants.some(n=>n.fields?.some(r=>Fe(r.type,t)));case"Union":return e.fields.some(n=>Fe(n.type,t));case"Function":{let n=e;return n.forallParameters.length>0||n.parameters.some(r=>Fe(r.type,t))||Fe(n.return.type,t)}case"Module":return e.fields.some(n=>Fe(n.type,t));case"Ptr":return Fe(e.childType,t);default:return!1}}function wr(e,t=new Set){return t.has(e.id)?!1:(t.add(e.id),ke(e)?de(e.length)?!0:wr(e.childType,t):Ie(e)||Qe(e)?wr(e.childType,t):we(e)?e.fields.some(n=>wr(n.type,t)):_e(e)?e.fields.some(n=>wr(n.type,t)):ge(e)?e.variants.some(n=>n.fields?.some(r=>wr(r.type,t))):it(e)?e.fields.some(n=>wr(n.type,t)):!1)}function us(e){let t=new Set,n=new Set;function r(i){if(!(i&&n.has(i))){if(i&&n.add(i),V(i)){if(t.has(i))return;i.resolvedConcreteType||t.add(i)}switch(i.tag){case"Array":r(i.childType);break;case"Tuple":i.fields.forEach(o=>r(o.type));break;case"Struct":i.fields.forEach(o=>r(o.type));break;case"Enum":i.variants.forEach(o=>{o.fields?.forEach(a=>r(a.type))});break;case"Union":i.fields.forEach(o=>r(o.type));break;case"Module":i.fields.forEach(o=>r(o.type));break;case"Ptr":r(i.childType);break;default:break}}}return r(e),t}function Pi(e){if(!e)return!1;switch(e.tag){case"Array":{let t=e;return de(t.length)||Pi(t.childType)}case"SomeType":return!0;case"Module":return!1;case"Trait":{let t=e;return t.isFn?Pi(t.isFn.callType):!1}default:return!1}}function yt({type:e,expectedType:t,expr:n,env:r}){let i;if(vt(e))i=Pr();else if(Nt(e))i=zr();else if(Et(e))t&&(Ie(t)&&(Kn(t.childType)||ki(t.childType))||Qe(t))&&(i=t),i||(i=ru(r));else return e;return i&&n?.$&&(n.$.convertedRuntimeType=i),i??e}function ls(e,t=new Set){let n=e.label;e.isQuote?n=`quote(${n})`:e.isImplicit||e.isCompileTimeOnly&&(n=`comptime(${n})`);let r=A(e.type,t),i=e.exprs.defaultValueExpr?w(e.exprs.defaultValueExpr):"";return n===""?r:i?`(${n} : ${r}) ?= ${i}`:`${n} : ${r}`}function Ri(e,t=new Set){let n=e.label;sr(n)&&(n=`(${n})`);let r=e.defaultValue?Me(e.defaultValue):"",i=e.assignedValue?Me(e.assignedValue):"";return r?`(${n}: ${A(e.type,t)}) ?= ${r}`:i?`(${n}: ${A(e.type,t)}) = ${i}`:`${n}: ${A(e.type,t)}`}function eu(e,t=new Set){let n=e.label;sr(n)&&(n=`(${n})`);let r=e.defaultValue?Me(e.defaultValue):"",i=e.assignedValue?Me(e.assignedValue):"";return r?`(${n} : ${A(e.type,t)}) ?= ${r}`:i?`(${n} : ${A(e.type,t)}) = ${i}`:`${n} : ${A(e.type,t)}`}function tu(e,t=new Set){let n=e.parameters.map(c=>ls(c,t)).join(", "),r=e.forallParameters.length>0?`forall(${e.forallParameters.map(c=>ls(c,t)).join(", ")})`:"",i="";e.variadicParameter&&(e.variadicParameter.label==="..."?i="...":e.variadicParameter.isQuote?i=`...(quote(${e.variadicParameter.label}))`:e.variadicParameter.isCompileTimeOnly?i=`...(comptime(${e.variadicParameter.label}))`:i=`...(${e.variadicParameter.label})`);let o=A(e.return.type,t),a=o;e.return.isUnquote?e.return.label?a=`(unquote(${e.return.label}) : ${o})`:a=`unquote(${o})`:e.return.isCompileTimeOnly&&(e.return.label?a=`(comptime(${e.return.label}) : ${o})`:a=`comptime(${o})`);let s=e.implicitParameters.length>0?`using(${e.implicitParameters.map(c=>c.isEffectRowSpread?`...(${c.label})`:ls(c,t)).join(", ")})`:"",l=[r,n,s,i].filter(c=>!!c).join(", "),u=e.SelfType?.typeName;return`${u?`(${u}) `:""}fn(${l}) -> ${a}`}function A(e,t=new Set){if(e.id&&t.has(e.id))return e.typeName||`<circular:${e.tag}>`;e.id&&t.add(e.id);try{return bm(e,t)}finally{e.id&&t.delete(e.id)}}function bm(e,t){if(!e)return"unknown";switch(e.tag){case"unit":return"unit";case"bool":return"bool";case"usize":return"usize";case"isize":return"isize";case"u8":return"u8";case"i8":return"i8";case"u16":return"u16";case"i16":return"i16";case"u32":return"u32";case"i32":return"i32";case"u64":return"u64";case"i64":return"i64";case"f32":return"f32";case"f64":return"f64";case"Type":return"level"in e&&typeof e.level=="number"&&e.level>0?`Type(${e.level})`:"Type";case"Array":return`[${A(e.childType,t)}; ${Me(e.length)}]`;case"Slice":return`[${A(e.childType,t)}]`;case"Tuple":return e.fields.length===0?"()":`(${e.fields.map(n=>Ri(n,t)).join(", ")}${e.fields.length===1?",":""})`;case"Struct":{let n=e;return n.typeName?n.typeName:`${n.typeName?`(${n.typeName}) `:""}${n.isReferenceSemantics?"object":n.isNewtype?"newtype":"struct"}(${n.fields.map(r=>Ri(r,t)).join(", ")})`}case"Enum":{let n=e;if(n.typeName){let r=n.typeName;return n.requiredVariantNames??n.selectedVariantName?`${r} (${n.requiredVariantNames?`${n.requiredVariantNames.map(i=>`.${i}`).join(" | ")} required`:`.${n.selectedVariantName} selected`})`:r}return`${n.typeName?`(${n.typeName}) `:""}enum(${n.variants.map(r=>`${r.name}${r.fields?`(${r.fields.map(i=>Ri(i,t)).join(", ")})`:""}`).join(", ")})`}case"Union":{let n=e;if(n.typeName)return n.typeName;let r=n.fields;return`${n.typeName?`(${n.typeName}) `:""}${n.typeName?"union":n.id}(${r.map(i=>Ri(i,t)).join(", ")})`}case"Module":{let n=e,r;return n.typeName?r=n.typeName:r=`${n.typeName?`(${n.typeName}) `:""}module(${n.fields.map(i=>eu(i,t)).join(", ")})`,r}case"Trait":{let n=e;if(kt(n))return`Fn${tu(n.isFn.callType,t).slice(2)}`;if(Kt(n)){let i=[A(n.isFuture.outputType,t)];for(let o of n.isFuture.effects)o.isEffectRowSpread?i.push(`...(${o.label})`):i.push(A(o.type,t));return`Future(${i.join(", ")})`}let r;return n.typeName?r=n.typeName:r=`${n.typeName?`(${n.typeName}) `:""}trait(${n.fields.map(i=>eu(i,t)).join(", ")})`,n.receiverType&&(r=`(${A(n.receiverType,t)} <: ${r})`),r}case"Function":{let n=e;return n.typeName?n.typeName:tu(n,t)}case"SomeType":{let n=e;if(n.typeName)return n.typeName;if(n.functionApplication)return w(n.functionApplication);let r=[];if(n.requiredTraits&&n.requiredTraits.length>0)for(let i of n.requiredTraits)r.push(A(i.traitType,t));if(n.negativeTraits&&n.negativeTraits.length>0)for(let i of n.negativeTraits)r.push(`!(${A(i.traitType,t)})`);return r.length>0?`${n.name||"Impl"}(${r.join(", ")})`:n.name||"Impl()"}case"Ptr":return`*(${A(e.childType,t)})`;case"Iso":return`Iso(${A(e.childType,t)})`;case"Arc":return`Arc(${A(e.childType,t)})`;case"Expr":return"Expr";case"ComptimeList":return`ComptimeList(${A(e.childType)})`;case"EffectsRow":{let n=e;return n.implicitParameters.length===0?"EffectsRow()":`EffectsRow(${n.implicitParameters.map(r=>`${r.label} : ${A(r.type,t)}`).join(", ")})`}case"Dyn":{let n=e;if(n.typeName)return n.typeName;let r=[];for(let{traitType:i}of n.requiredTraits)r.push(A(i,t));if(n.negativeTraits&&n.negativeTraits.length>0)for(let{traitType:i}of n.negativeTraits)r.push(`!(${A(i,t)})`);return`Dyn(${r.join(", ")})`}default:return`${e.tag}`}}var nu=64;function Zn(){return nu}function da(){return nu/8}function Cm(e){let t=Ur(e.childType);if(t===null)return null;if(t===-1)return-1;let n=e.length;if(Ue(n)){let r=BigInt(n.value);if(r<0)throw new Error("Array length cannot be negative");return Number(r)*t}return null}function km(e){let t=0,n=1;for(let r of e.fields){let i=Ur(r.type);if(i===null)return null;if(i===-1)return-1;let o=Qn(r.type);if(o===null)return null;let a=Math.ceil(i/8);t=Math.ceil(t/o)*o,t+=a,n=Math.max(n,o)}return t=Math.ceil(t/n)*n,t*8}function wm(e){let t=0,n=1;for(let r of e.fields){let i=Ur(r.type);if(i===null)return null;if(i===-1)return-1;let o=Qn(r.type);if(o===null)return null;let a=Math.ceil(i/8);t=Math.ceil(t/o)*o,t+=a,n=Math.max(n,o)}return t=Math.ceil(t/n)*n,t*8}function Fm(e){let t=0,n=0;for(let m of e.variants){let g=0,h=1;if(m.fields)for(let v of m.fields){let T=Ur(v.type);if(T===null)return null;if(T===-1)return-1;let $=Qn(v.type);if($===null)return null;let b=Math.ceil(T/8);g=Math.ceil(g/$)*$,g+=b,h=Math.max(h,$),n=Math.max(n,$*8)}g=Math.ceil(g/h)*h;let d=g*8;t=Math.max(t,d)}let r=Math.ceil(Math.ceil(Math.log2(e.variants.length))/8)*8,i=32,o=Math.max(n,8),a=Math.max(i,o),s=r/8,l=o/8,u=(l-s%l)%l*8,_=r+u+t,c=_/8,f=a/8,p=(f-c%f)%f*8;return _+p}function Lm(e){let t=0;for(let n of e.fields){let r=Ur(n.type);if(r===null)return null;if(r===-1)return-1;t=Math.max(t,r)}return t}function Qn(e){if(V(e))return null;if(fe(e)||He(e)||vt(e)||Nt(e)||Et(e)||xt(e)||Te(e)||De(e)||Lt(e))return 1;if(_n(e))return 1;if(ho(e)||vo(e))return da();if(Kn(e)||To(e))return 1;if(Eo(e)||$o(e))return 2;if(bo(e)||Co(e))return 4;if(ko(e)||wo(e))return 8;if(Fo(e))return 4;if(Lo(e))return 8;if(ke(e))return Qn(e.childType);if(we(e)){let t=1;for(let n of e.fields){let r=Qn(n.type);if(r===null)return null;t=Math.max(t,r)}return t}else if(_e(e)){if(e.isReferenceSemantics)return da();if(e.isNewtype)return Qn(e.fields[0].type);let t=1;for(let n of e.fields){let r=Qn(n.type);if(r===null)return null;t=Math.max(t,r)}return t}else if(ge(e)){let t=1;for(let n of e.variants)if(n.fields)for(let r of n.fields){let i=Qn(r.type);if(i===null)return null;t=Math.max(t,i)}return t}else if(it(e)){let t=1;for(let n of e.fields){let r=Qn(n.type);if(r===null)return null;t=Math.max(t,r)}return t}else{if(G(e))return da();if(Ie(e))return da()}return null}function Ur(e){return V(e)?null:fe(e)||He(e)||vt(e)||Nt(e)||Et(e)||xt(e)||Te(e)||De(e)||Lt(e)?0:_n(e)?8:ho(e)||vo(e)?Zn():Kn(e)||To(e)?8:Eo(e)||$o(e)?16:bo(e)||Co(e)?32:ko(e)||wo(e)?64:Fo(e)?32:Lo(e)?64:ke(e)?Cm(e):we(e)?km(e):_e(e)?e.isReferenceSemantics?Zn():e.isNewtype?Ur(e.fields[0].type):wm(e):ge(e)?Fm(e):it(e)?Lm(e):G(e)||Ie(e)?Zn():null}function Fr(e,t){if(kr(e))throw lt([{token:t,errorMessage:`Cannot use 'void' type here.
|
|
45
45
|
Please consider use 'unit' type instead.
|
|
46
46
|
`}])}function Lr(e,t,n){if(!ft(e)||ri(e,n))return!1;if(t.has(e.id))return!0;t.add(e.id);try{for(let r of e.fields)if(ti(r.type,e,t,n))return!0;return!1}finally{t.delete(e.id)}}function ti(e,t,n,r){if(_e(e)&&e.id===t.id)return!0;if(_e(e)&&e.isReferenceSemantics)return Lr(e,new Set(n),r);if(ge(e)){for(let i of e.variants)if(i.fields){for(let o of i.fields)if(ti(o.type,t,n,r))return!0}}if(V(e))return ri(e,r)?!1:e.resolvedConcreteType?ti(e.resolvedConcreteType,t,n,r):!0;if(ke(e)||Qe(e))return ti(e.childType,t,n,r);if(we(e)){for(let i of e.fields)if(ti(i.type,t,n,r))return!0}if(it(e)){for(let i of e.fields)if(ti(i.type,t,n,r))return!0}return Ce(e)?!0:(Ie(e),!1)}function pr(e,t){return t?e.id===t.id?!0:ke(e)||Qe(e)||Ie(e)?pr(e.childType,t):we(e)?e.fields.some(n=>pr(n.type,t)):_e(e)?e.fields.some(n=>pr(n.type,t)):it(e)?e.fields.some(n=>pr(n.type,t)):ge(e)?e.variants.some(n=>n.fields?.some(r=>pr(r.type,t))):G(e)?pr(e.return.type,t):!1:!1}import{createHash as iu}from"crypto";function zi(e){return"yo"+iu("sha1").update(e).digest("hex").slice(0,8)}var ma=new Map;function Ye(e){let t=ma.get(e);return t===void 0&&(t=0),ma.set(e,t+1),`${zi(e)}_id_${t}`}function ya(e){ma.delete(e)}var ou=1;function au(e){return`_${zi(e)}_temp_`}function su(e){return`${au(e)}${ou++}`}function ut(e,t){return t.startsWith(au(e))}var _s=new Map;function ii(e,t){let n="";for(let o=0;o<t.length;o++)if(yo(t[o])){let a=rs.indexOf(t[o]);n+=`${a}`}else n+=t[o];let r=zi(e)+"_"+n,i=_s.get(r);return i===void 0?i=0:i++,_s.set(r,i),r+(i==0?"":`_${i}`)}function cs(e){return iu("sha1").update(e).digest("hex").slice(0,10)}function lu(){ma.clear(),_s.clear(),ou=1}function Br(e){return{[e]:!0}}function et(e,t){return e?.[t]===!0}function nt(e){return e!==void 0&&(e.return===!0||e.escape===!0||e.break===!0||e.continue===!0)}function So(e){let t={};for(let n of e)n.return&&(t.return=!0),n.escape&&(t.escape=!0),n.break&&(t.break=!0),n.continue&&(t.continue=!0);return t}function uu(e){let t=[];return e.return&&t.push("return"),e.escape&&t.push("escape"),e.break&&t.push("break"),e.continue&&t.push("continue"),t.join("+")}function Ae(e){switch(e.tag){case"Atom":return{...e,$:void 0};case"FnCall":return{...e,func:Ae(e.func),args:e.args.map(Ae),$:void 0}}}function F(e){return e?.tag==="FnCall"}function U(e){return e?.tag==="Atom"}function dt(e,t){return e.tag==="Atom"&&(typeof t=="string"?e.token.value===t:t.includes(e.token.value))}function Ui(e){return e.tag==="Atom"&&e.token.type==="operator"}function E(e,t,n){if(e.tag!=="FnCall"||e.func.tag!=="Atom")return!1;let r=e.func.token.value;return e.tag==="FnCall"&&e.func.tag==="Atom"&&(typeof t=="string"?r===t:t.includes(r))&&(n===void 0||e.args.length===n)}function he(e,t,n){if(!F(e))throw y({token:e.token,errorMessage:`Expected function call, got atom:
|
|
47
47
|
${w(e)}`});if(!E(e,t))throw y({token:e.token,errorMessage:`Expected function call of ${Array.isArray(t)?t.map(r=>`"${r}"`).join(" or "):`"${t}"`}, got:
|
|
48
48
|
${w(e)}`});if(n!==void 0&&e.args.length!==n)throw y({token:e.token,errorMessage:`Expected ${n} arguments, got ${e.args.length}:
|
|
49
|
-
${w(e)}`})}function pa(e,t){if(e.tag!==t.tag)return!1;if(e.tag==="Atom"&&t.tag==="Atom")return e.token.value===t.token.value;if(e.tag==="FnCall"&&t.tag==="FnCall"){if(!pa(e.func,t.func)||e.args.length!==t.args.length)return!1;for(let n=0;n<e.args.length;n++)if(!pa(e.args[n],t.args[n]))return!1;return!0}return!1}var I={comptime:["comptime"],runtime:["runtime"],ref:["ref"],forall:["forall","\u2200"],using:["using"],given:["given"],where:["where"],quote:["quote",":"],unquote:["unquote","#"],unquote_splicing:["unquote_splicing","...#"],return:["return"],recur:["recur"],fn:["fn"],unsafe_fn:["unsafe_fn"],escape:["escape"],extern:["extern"],cond:["cond"],type:["type"],match:["match"],test:["test"],struct:["struct"],object:["object"],newtype:["newtype"],enum:["enum"],union:["union"],module:["module"],trait:["trait"],impl:["impl"],Impl:["Impl"],begin:["begin"],module_begin:["module_begin"],import:["import"],export:["export"],open:["open"],clone:["clone","%"],break:["break"],continue:["continue"],while:["while"],if:["if"],op_and:["&&"],op_or:["||"],gensym:["gensym"],dyn:["dyn"],Dyn:["Dyn"],Fn:["Fn"],c_include:["c_include"],undefined:["undefined"],null:["null"],true:["true"],false:["false"],unique:["unique","^"],Ptr:["*"],Iso:["Iso"],Arc:["Arc"],Tuple:["Tuple"],Array:["Array"],Slice:["Slice"],Future:["Future"],Concrete:["Concrete"],Type:["Type"],Module:["Module"],Trait:["Trait"],ComptimeList:["ComptimeList"],tuple:["tuple"],array:["array"],comptime_list:["comptime_list"]},k={comptime_expect_error:["comptime_expect_error"],comptime_assert:["comptime_assert"],comptime_print:["comptime_print"],comptime_fn:["comptime_fn"],va_start:["va_start"],__yo_array_fill:["__yo_array_fill"],typeof:["typeof"],sizeof:["sizeof"],alignof:["alignof"],typeid:["typeid"],downcast:["downcast"],consume:["consume"],macro_expand:["macro_expand"],as:["as"],the:["the"],do:["do"],rc:"rc",__yo_thread_set_maximum_threads:["__yo_thread_set_maximum_threads"],__yo_ptr_add:["__yo_ptr_add"],__yo_ptr_sub:["__yo_ptr_sub"],__yo_ptr_diff:["__yo_ptr_diff"],__yo_ptr_eq:["__yo_ptr_eq"],__yo_ptr_neq:["__yo_ptr_neq"],__yo_ptr_lt:["__yo_ptr_lt"],__yo_ptr_lte:["__yo_ptr_lte"],__yo_ptr_gt:["__yo_ptr_gt"],__yo_ptr_gte:["__yo_ptr_gte"],__yo_address_of:["&"],__yo_ptr_deref:["__yo_ptr_deref"],__yo_ptr_set:["__yo_ptr_set"],__yo_slice_len:["__yo_slice_len"],__yo_slice_new:["__yo_slice_new"],__yo_as:["__yo_as"],__yo_expr_is_atom:["__yo_expr_is_atom"],__yo_expr_is_fn_call:["__yo_expr_is_fn_call"],__yo_expr_get_callee:["__yo_expr_get_callee"],__yo_expr_get_args:["__yo_expr_get_args"],__yo_expr_to_string:["__yo_expr_to_string"],__yo_expr_eq:["__yo_expr_eq"],__yo_comptime_list_car:["__yo_comptime_list_car"],__yo_comptime_list_cdr:["__yo_comptime_list_cdr"],__yo_comptime_list_cons:["__yo_comptime_list_cons"],__yo_comptime_list_append:["__yo_comptime_list_append"],__yo_comptime_list_length:["__yo_comptime_list_length"],__yo_comptime_list_element_type:["__yo_comptime_list_element_type"],__yo_comptime_int_add:["__yo_comptime_int_add"],__yo_comptime_int_sub:["__yo_comptime_int_sub"],__yo_comptime_int_mul:["__yo_comptime_int_mul"],__yo_comptime_int_div:["__yo_comptime_int_div"],__yo_comptime_int_mod:["__yo_comptime_int_mod"],__yo_comptime_int_eq:["__yo_comptime_int_eq"],__yo_comptime_int_neq:["__yo_comptime_int_neq"],__yo_comptime_int_lt:["__yo_comptime_int_lt"],__yo_comptime_int_lte:["__yo_comptime_int_lte"],__yo_comptime_int_gt:["__yo_comptime_int_gt"],__yo_comptime_int_gte:["__yo_comptime_int_gte"],__yo_comptime_int_bit_and:["__yo_comptime_int_bit_and"],__yo_comptime_int_bit_or:["__yo_comptime_int_bit_or"],__yo_comptime_int_bit_xor:["__yo_comptime_int_bit_xor"],__yo_comptime_int_shl:["__yo_comptime_int_shl"],__yo_comptime_int_shr:["__yo_comptime_int_shr"],__yo_comptime_int_neg:["__yo_comptime_int_neg"],__yo_comptime_int_bit_not:["__yo_comptime_int_bit_not"],__yo_comptime_int_to_comptime_string:["__yo_comptime_int_to_comptime_string"],__yo_comptime_float_add:["__yo_comptime_float_add"],__yo_comptime_float_sub:["__yo_comptime_float_sub"],__yo_comptime_float_mul:["__yo_comptime_float_mul"],__yo_comptime_float_div:["__yo_comptime_float_div"],__yo_comptime_float_eq:["__yo_comptime_float_eq"],__yo_comptime_float_neq:["__yo_comptime_float_neq"],__yo_comptime_float_lt:["__yo_comptime_float_lt"],__yo_comptime_float_lte:["__yo_comptime_float_lte"],__yo_comptime_float_gt:["__yo_comptime_float_gt"],__yo_comptime_float_gte:["__yo_comptime_float_gte"],__yo_comptime_float_neg:["__yo_comptime_float_neg"],__yo_comptime_float_to_comptime_string:["__yo_comptime_float_to_comptime_string"],__yo_comptime_u8_add:["__yo_comptime_u8_add"],__yo_comptime_u8_sub:["__yo_comptime_u8_sub"],__yo_comptime_u8_mul:["__yo_comptime_u8_mul"],__yo_comptime_u8_div:["__yo_comptime_u8_div"],__yo_comptime_u8_mod:["__yo_comptime_u8_mod"],__yo_comptime_u8_eq:["__yo_comptime_u8_eq"],__yo_comptime_u8_neq:["__yo_comptime_u8_neq"],__yo_comptime_u8_lt:["__yo_comptime_u8_lt"],__yo_comptime_u8_lte:["__yo_comptime_u8_lte"],__yo_comptime_u8_gt:["__yo_comptime_u8_gt"],__yo_comptime_u8_gte:["__yo_comptime_u8_gte"],__yo_comptime_u8_neg:["__yo_comptime_u8_neg"],__yo_comptime_u8_bit_and:["__yo_comptime_u8_bit_and"],__yo_comptime_u8_bit_or:["__yo_comptime_u8_bit_or"],__yo_comptime_u8_bit_xor:["__yo_comptime_u8_bit_xor"],__yo_comptime_u8_bit_not:["__yo_comptime_u8_bit_not"],__yo_comptime_u8_shl:["__yo_comptime_u8_shl"],__yo_comptime_u8_shr:["__yo_comptime_u8_shr"],__yo_comptime_u8_to_comptime_string:["__yo_comptime_u8_to_comptime_string"],__yo_comptime_i8_add:["__yo_comptime_i8_add"],__yo_comptime_i8_sub:["__yo_comptime_i8_sub"],__yo_comptime_i8_mul:["__yo_comptime_i8_mul"],__yo_comptime_i8_div:["__yo_comptime_i8_div"],__yo_comptime_i8_mod:["__yo_comptime_i8_mod"],__yo_comptime_i8_eq:["__yo_comptime_i8_eq"],__yo_comptime_i8_neq:["__yo_comptime_i8_neq"],__yo_comptime_i8_lt:["__yo_comptime_i8_lt"],__yo_comptime_i8_lte:["__yo_comptime_i8_lte"],__yo_comptime_i8_gt:["__yo_comptime_i8_gt"],__yo_comptime_i8_gte:["__yo_comptime_i8_gte"],__yo_comptime_i8_neg:["__yo_comptime_i8_neg"],__yo_comptime_i8_bit_and:["__yo_comptime_i8_bit_and"],__yo_comptime_i8_bit_or:["__yo_comptime_i8_bit_or"],__yo_comptime_i8_bit_xor:["__yo_comptime_i8_bit_xor"],__yo_comptime_i8_bit_not:["__yo_comptime_i8_bit_not"],__yo_comptime_i8_shl:["__yo_comptime_i8_shl"],__yo_comptime_i8_shr:["__yo_comptime_i8_shr"],__yo_comptime_i8_to_comptime_string:["__yo_comptime_i8_to_comptime_string"],__yo_comptime_u16_add:["__yo_comptime_u16_add"],__yo_comptime_u16_sub:["__yo_comptime_u16_sub"],__yo_comptime_u16_mul:["__yo_comptime_u16_mul"],__yo_comptime_u16_div:["__yo_comptime_u16_div"],__yo_comptime_u16_mod:["__yo_comptime_u16_mod"],__yo_comptime_u16_eq:["__yo_comptime_u16_eq"],__yo_comptime_u16_neq:["__yo_comptime_u16_neq"],__yo_comptime_u16_lt:["__yo_comptime_u16_lt"],__yo_comptime_u16_lte:["__yo_comptime_u16_lte"],__yo_comptime_u16_gt:["__yo_comptime_u16_gt"],__yo_comptime_u16_gte:["__yo_comptime_u16_gte"],__yo_comptime_u16_neg:["__yo_comptime_u16_neg"],__yo_comptime_u16_bit_and:["__yo_comptime_u16_bit_and"],__yo_comptime_u16_bit_or:["__yo_comptime_u16_bit_or"],__yo_comptime_u16_bit_xor:["__yo_comptime_u16_bit_xor"],__yo_comptime_u16_bit_not:["__yo_comptime_u16_bit_not"],__yo_comptime_u16_shl:["__yo_comptime_u16_shl"],__yo_comptime_u16_shr:["__yo_comptime_u16_shr"],__yo_comptime_u16_to_comptime_string:["__yo_comptime_u16_to_comptime_string"],__yo_comptime_i16_add:["__yo_comptime_i16_add"],__yo_comptime_i16_sub:["__yo_comptime_i16_sub"],__yo_comptime_i16_mul:["__yo_comptime_i16_mul"],__yo_comptime_i16_div:["__yo_comptime_i16_div"],__yo_comptime_i16_mod:["__yo_comptime_i16_mod"],__yo_comptime_i16_eq:["__yo_comptime_i16_eq"],__yo_comptime_i16_neq:["__yo_comptime_i16_neq"],__yo_comptime_i16_lt:["__yo_comptime_i16_lt"],__yo_comptime_i16_lte:["__yo_comptime_i16_lte"],__yo_comptime_i16_gt:["__yo_comptime_i16_gt"],__yo_comptime_i16_gte:["__yo_comptime_i16_gte"],__yo_comptime_i16_neg:["__yo_comptime_i16_neg"],__yo_comptime_i16_bit_and:["__yo_comptime_i16_bit_and"],__yo_comptime_i16_bit_or:["__yo_comptime_i16_bit_or"],__yo_comptime_i16_bit_xor:["__yo_comptime_i16_bit_xor"],__yo_comptime_i16_bit_not:["__yo_comptime_i16_bit_not"],__yo_comptime_i16_shl:["__yo_comptime_i16_shl"],__yo_comptime_i16_shr:["__yo_comptime_i16_shr"],__yo_comptime_i16_to_comptime_string:["__yo_comptime_i16_to_comptime_string"],__yo_comptime_u32_add:["__yo_comptime_u32_add"],__yo_comptime_u32_sub:["__yo_comptime_u32_sub"],__yo_comptime_u32_mul:["__yo_comptime_u32_mul"],__yo_comptime_u32_div:["__yo_comptime_u32_div"],__yo_comptime_u32_mod:["__yo_comptime_u32_mod"],__yo_comptime_u32_eq:["__yo_comptime_u32_eq"],__yo_comptime_u32_neq:["__yo_comptime_u32_neq"],__yo_comptime_u32_lt:["__yo_comptime_u32_lt"],__yo_comptime_u32_lte:["__yo_comptime_u32_lte"],__yo_comptime_u32_gt:["__yo_comptime_u32_gt"],__yo_comptime_u32_gte:["__yo_comptime_u32_gte"],__yo_comptime_u32_neg:["__yo_comptime_u32_neg"],__yo_comptime_u32_bit_and:["__yo_comptime_u32_bit_and"],__yo_comptime_u32_bit_or:["__yo_comptime_u32_bit_or"],__yo_comptime_u32_bit_xor:["__yo_comptime_u32_bit_xor"],__yo_comptime_u32_bit_not:["__yo_comptime_u32_bit_not"],__yo_comptime_u32_shl:["__yo_comptime_u32_shl"],__yo_comptime_u32_shr:["__yo_comptime_u32_shr"],__yo_comptime_u32_to_comptime_string:["__yo_comptime_u32_to_comptime_string"],__yo_comptime_i32_add:["__yo_comptime_i32_add"],__yo_comptime_i32_sub:["__yo_comptime_i32_sub"],__yo_comptime_i32_mul:["__yo_comptime_i32_mul"],__yo_comptime_i32_div:["__yo_comptime_i32_div"],__yo_comptime_i32_mod:["__yo_comptime_i32_mod"],__yo_comptime_i32_eq:["__yo_comptime_i32_eq"],__yo_comptime_i32_neq:["__yo_comptime_i32_neq"],__yo_comptime_i32_lt:["__yo_comptime_i32_lt"],__yo_comptime_i32_lte:["__yo_comptime_i32_lte"],__yo_comptime_i32_gt:["__yo_comptime_i32_gt"],__yo_comptime_i32_gte:["__yo_comptime_i32_gte"],__yo_comptime_i32_neg:["__yo_comptime_i32_neg"],__yo_comptime_i32_bit_and:["__yo_comptime_i32_bit_and"],__yo_comptime_i32_bit_or:["__yo_comptime_i32_bit_or"],__yo_comptime_i32_bit_xor:["__yo_comptime_i32_bit_xor"],__yo_comptime_i32_bit_not:["__yo_comptime_i32_bit_not"],__yo_comptime_i32_shl:["__yo_comptime_i32_shl"],__yo_comptime_i32_shr:["__yo_comptime_i32_shr"],__yo_comptime_i32_to_comptime_string:["__yo_comptime_i32_to_comptime_string"],__yo_comptime_u64_add:["__yo_comptime_u64_add"],__yo_comptime_u64_sub:["__yo_comptime_u64_sub"],__yo_comptime_u64_mul:["__yo_comptime_u64_mul"],__yo_comptime_u64_div:["__yo_comptime_u64_div"],__yo_comptime_u64_mod:["__yo_comptime_u64_mod"],__yo_comptime_u64_eq:["__yo_comptime_u64_eq"],__yo_comptime_u64_neq:["__yo_comptime_u64_neq"],__yo_comptime_u64_lt:["__yo_comptime_u64_lt"],__yo_comptime_u64_lte:["__yo_comptime_u64_lte"],__yo_comptime_u64_gt:["__yo_comptime_u64_gt"],__yo_comptime_u64_gte:["__yo_comptime_u64_gte"],__yo_comptime_u64_neg:["__yo_comptime_u64_neg"],__yo_comptime_u64_bit_and:["__yo_comptime_u64_bit_and"],__yo_comptime_u64_bit_or:["__yo_comptime_u64_bit_or"],__yo_comptime_u64_bit_xor:["__yo_comptime_u64_bit_xor"],__yo_comptime_u64_bit_not:["__yo_comptime_u64_bit_not"],__yo_comptime_u64_shl:["__yo_comptime_u64_shl"],__yo_comptime_u64_shr:["__yo_comptime_u64_shr"],__yo_comptime_u64_to_comptime_string:["__yo_comptime_u64_to_comptime_string"],__yo_comptime_i64_add:["__yo_comptime_i64_add"],__yo_comptime_i64_sub:["__yo_comptime_i64_sub"],__yo_comptime_i64_mul:["__yo_comptime_i64_mul"],__yo_comptime_i64_div:["__yo_comptime_i64_div"],__yo_comptime_i64_mod:["__yo_comptime_i64_mod"],__yo_comptime_i64_eq:["__yo_comptime_i64_eq"],__yo_comptime_i64_neq:["__yo_comptime_i64_neq"],__yo_comptime_i64_lt:["__yo_comptime_i64_lt"],__yo_comptime_i64_lte:["__yo_comptime_i64_lte"],__yo_comptime_i64_gt:["__yo_comptime_i64_gt"],__yo_comptime_i64_gte:["__yo_comptime_i64_gte"],__yo_comptime_i64_neg:["__yo_comptime_i64_neg"],__yo_comptime_i64_bit_and:["__yo_comptime_i64_bit_and"],__yo_comptime_i64_bit_or:["__yo_comptime_i64_bit_or"],__yo_comptime_i64_bit_xor:["__yo_comptime_i64_bit_xor"],__yo_comptime_i64_bit_not:["__yo_comptime_i64_bit_not"],__yo_comptime_i64_shl:["__yo_comptime_i64_shl"],__yo_comptime_i64_shr:["__yo_comptime_i64_shr"],__yo_comptime_i64_to_comptime_string:["__yo_comptime_i64_to_comptime_string"],__yo_comptime_usize_add:["__yo_comptime_usize_add"],__yo_comptime_usize_sub:["__yo_comptime_usize_sub"],__yo_comptime_usize_mul:["__yo_comptime_usize_mul"],__yo_comptime_usize_div:["__yo_comptime_usize_div"],__yo_comptime_usize_mod:["__yo_comptime_usize_mod"],__yo_comptime_usize_eq:["__yo_comptime_usize_eq"],__yo_comptime_usize_neq:["__yo_comptime_usize_neq"],__yo_comptime_usize_lt:["__yo_comptime_usize_lt"],__yo_comptime_usize_lte:["__yo_comptime_usize_lte"],__yo_comptime_usize_gt:["__yo_comptime_usize_gt"],__yo_comptime_usize_gte:["__yo_comptime_usize_gte"],__yo_comptime_usize_neg:["__yo_comptime_usize_neg"],__yo_comptime_usize_bit_and:["__yo_comptime_usize_bit_and"],__yo_comptime_usize_bit_or:["__yo_comptime_usize_bit_or"],__yo_comptime_usize_bit_xor:["__yo_comptime_usize_bit_xor"],__yo_comptime_usize_bit_not:["__yo_comptime_usize_bit_not"],__yo_comptime_usize_shl:["__yo_comptime_usize_shl"],__yo_comptime_usize_shr:["__yo_comptime_usize_shr"],__yo_comptime_usize_to_comptime_string:["__yo_comptime_usize_to_comptime_string"],__yo_comptime_isize_add:["__yo_comptime_isize_add"],__yo_comptime_isize_sub:["__yo_comptime_isize_sub"],__yo_comptime_isize_mul:["__yo_comptime_isize_mul"],__yo_comptime_isize_div:["__yo_comptime_isize_div"],__yo_comptime_isize_mod:["__yo_comptime_isize_mod"],__yo_comptime_isize_eq:["__yo_comptime_isize_eq"],__yo_comptime_isize_neq:["__yo_comptime_isize_neq"],__yo_comptime_isize_lt:["__yo_comptime_isize_lt"],__yo_comptime_isize_lte:["__yo_comptime_isize_lte"],__yo_comptime_isize_gt:["__yo_comptime_isize_gt"],__yo_comptime_isize_gte:["__yo_comptime_isize_gte"],__yo_comptime_isize_neg:["__yo_comptime_isize_neg"],__yo_comptime_isize_bit_and:["__yo_comptime_isize_bit_and"],__yo_comptime_isize_bit_or:["__yo_comptime_isize_bit_or"],__yo_comptime_isize_bit_xor:["__yo_comptime_isize_bit_xor"],__yo_comptime_isize_bit_not:["__yo_comptime_isize_bit_not"],__yo_comptime_isize_shl:["__yo_comptime_isize_shl"],__yo_comptime_isize_shr:["__yo_comptime_isize_shr"],__yo_comptime_isize_to_comptime_string:["__yo_comptime_isize_to_comptime_string"],__yo_comptime_f32_add:["__yo_comptime_f32_add"],__yo_comptime_f32_sub:["__yo_comptime_f32_sub"],__yo_comptime_f32_mul:["__yo_comptime_f32_mul"],__yo_comptime_f32_div:["__yo_comptime_f32_div"],__yo_comptime_f32_eq:["__yo_comptime_f32_eq"],__yo_comptime_f32_neq:["__yo_comptime_f32_neq"],__yo_comptime_f32_lt:["__yo_comptime_f32_lt"],__yo_comptime_f32_lte:["__yo_comptime_f32_lte"],__yo_comptime_f32_gt:["__yo_comptime_f32_gt"],__yo_comptime_f32_gte:["__yo_comptime_f32_gte"],__yo_comptime_f32_neg:["__yo_comptime_f32_neg"],__yo_comptime_f32_to_comptime_string:["__yo_comptime_f32_to_comptime_string"],__yo_comptime_f64_add:["__yo_comptime_f64_add"],__yo_comptime_f64_sub:["__yo_comptime_f64_sub"],__yo_comptime_f64_mul:["__yo_comptime_f64_mul"],__yo_comptime_f64_div:["__yo_comptime_f64_div"],__yo_comptime_f64_eq:["__yo_comptime_f64_eq"],__yo_comptime_f64_neq:["__yo_comptime_f64_neq"],__yo_comptime_f64_lt:["__yo_comptime_f64_lt"],__yo_comptime_f64_lte:["__yo_comptime_f64_lte"],__yo_comptime_f64_gt:["__yo_comptime_f64_gt"],__yo_comptime_f64_gte:["__yo_comptime_f64_gte"],__yo_comptime_f64_neg:["__yo_comptime_f64_neg"],__yo_comptime_f64_to_comptime_string:["__yo_comptime_f64_to_comptime_string"],__yo_comptime_bool_and:["__yo_comptime_bool_and"],__yo_comptime_bool_or:["__yo_comptime_bool_or"],__yo_comptime_bool_eq:["__yo_comptime_bool_eq"],__yo_comptime_bool_neq:["__yo_comptime_bool_neq"],__yo_comptime_bool_not:["__yo_comptime_bool_not"],__yo_comptime_bool_to_comptime_string:["__yo_comptime_bool_to_comptime_string"],__yo_comptime_string_concat:["__yo_comptime_string_concat"],__yo_comptime_string_eq:["__yo_comptime_string_eq"],__yo_comptime_string_neq:["__yo_comptime_string_neq"],__yo_comptime_string_lt:["__yo_comptime_string_lt"],__yo_comptime_string_lte:["__yo_comptime_string_lte"],__yo_comptime_string_gt:["__yo_comptime_string_gt"],__yo_comptime_string_gte:["__yo_comptime_string_gte"],__yo_comptime_string_length:["__yo_comptime_string_length"],__yo_comptime_string_to_upper:["__yo_comptime_string_to_upper"],__yo_comptime_string_to_lower:["__yo_comptime_string_to_lower"],__yo_comptime_string_slice:["__yo_comptime_string_slice"],__yo_type_to_comptime_string:["__yo_type_to_comptime_string"],__yo_type_contains_rc_type:["__yo_type_contains_rc_type"],__yo_type_can_form_rc_cycle:["__yo_type_can_form_rc_cycle"],__yo_are_types_compatible:["__yo_are_types_compatible"],__yo_type_impls:["__yo_type_impls"],__yo_var_print_info:["__yo_var_print_info"],__yo_var_is_owning_the_rc_value:["__yo_var_is_owning_the_rc_value"],__yo_var_has_other_aliases:["__yo_var_has_other_aliases"],__yo_op_add:["__yo_op_add"],__yo_op_sub:["__yo_op_sub"],__yo_op_mul:["__yo_op_mul"],__yo_op_div:["__yo_op_div"],__yo_op_mod:["__yo_op_mod"],__yo_op_neg:["__yo_op_neg"],__yo_op_eq:["__yo_op_eq"],__yo_op_neq:["__yo_op_neq"],__yo_op_lt:["__yo_op_lt"],__yo_op_lte:["__yo_op_lte"],__yo_op_gt:["__yo_op_gt"],__yo_op_gte:["__yo_op_gte"],__yo_op_not:["__yo_op_not"],__yo_op_bit_and:["__yo_op_bit_and"],__yo_op_bit_or:["__yo_op_bit_or"],__yo_op_bit_xor:["__yo_op_bit_xor"],__yo_op_bit_complement:["__yo_op_bit_complement"],__yo_op_bit_left_shift:["__yo_op_bit_left_shift"],__yo_op_bit_right_shift:["__yo_op_bit_right_shift"],c_include:["c_include"],panic:["panic"],__yo_decr_rc:["__yo_decr_rc"],__yo_incr_rc:["__yo_incr_rc"],__yo_decr_rc_atomic:["__yo_decr_rc_atomic"],__yo_incr_rc_atomic:["__yo_incr_rc_atomic"],__yo_rc_own:["__yo_rc_own"],__yo_iso_extract:["__yo_iso_extract"],__yo_iso_dispose:["__yo_iso_dispose"],__yo_arc_dispose:["__yo_arc_dispose"],__yo_gc_collect:["__yo_gc_collect"],__yo_dyn_drop:["__yo_dyn_drop"],__yo_dyn_dup:["__yo_dyn_dup"],__yo_sometype_drop:["__yo_sometype_drop"],__yo_sometype_dup:["__yo_sometype_dup"],___drop:["___drop"],___dispose:["___dispose"],___dup:["___dup"],dispose:["dispose"],__yo_drop_array_element:["__yo_drop_array_element"],__yo_dup_array_element:["__yo_dup_array_element"],__yo_drop_tuple_element:["__yo_drop_tuple_element"],__yo_dup_tuple_element:["__yo_dup_tuple_element"],__yo_noop:["__yo_noop"],__yo_return_self:["__yo_return_self"],__yo_ms_sleep:["__yo_ms_sleep"],__yo_getrandom:["__yo_getrandom"],__yo_arc4random_buf:["__yo_arc4random_buf"],__yo_bcrypt_gen_random:["__yo_bcrypt_gen_random"],__yo_getentropy:["__yo_getentropy"],__yo_maybe_uninit_new:["__yo_maybe_uninit_new"],__yo_maybe_uninit_as_ptr:["__yo_maybe_uninit_as_ptr"],__yo_maybe_uninit_assume_init:["__yo_maybe_uninit_assume_init"],__yo_process_platform:["__yo_process_platform"],__yo_process_arch:["__yo_process_arch"],__yo_pointer_size_bits:["__yo_pointer_size_bits"],__yo_build_executable:["__yo_build_executable"],__yo_build_static_library:["__yo_build_static_library"],__yo_build_shared_library:["__yo_build_shared_library"],__yo_build_test:["__yo_build_test"],__yo_build_run:["__yo_build_run"],__yo_build_step:["__yo_build_step"],__yo_build_step_depend_on:["__yo_build_step_depend_on"],__yo_build_link:["__yo_build_link"],__yo_build_link_system_library:["__yo_build_link_system_library"],__yo_build_target_host:["__yo_build_target_host"],__yo_build_target_parse:["__yo_build_target_parse"],__yo_build_dependency:["__yo_build_dependency"],__yo_build_path_dependency:["__yo_build_path_dependency"],__yo_build_system_library:["__yo_build_system_library"],__yo_build_option:["__yo_build_option"],__yo_build_dep_artifact:["__yo_build_dep_artifact"],__yo_build_module:["__yo_build_module"],__yo_build_module_link:["__yo_build_module_link"],__yo_build_add_import:["__yo_build_add_import"],__yo_build_dep_module:["__yo_build_dep_module"],asm:["asm"],global_asm:["global_asm"]};function Bi(e){return!!(e.tag==="FnCall"&&e.isInfix&&e.func.tag==="Atom"&&e.func.token.type==="operator"&&e.args.length===2)}function w(e,t){let r={...{prettyPrint:!1,indentSize:2,maxLineLength:80,indentLevel:0},...t};return r.prettyPrint?kn(e,r):yr(e)}function yr(e){let t="";switch(e.tag){case"Atom":{t=e.token.value;break}case"FnCall":{if(e.func.tag==="Atom"&&(e.func.token.type==="operator"||e.func.token.type===".")){if(e.args.length===1){e.func.token.value==="."?t=`${e.func.token.value}${yr(e.args[0])}`:t=`${e.func.token.value}(${yr(e.args[0])})`;break}else if(e.args.length===2&&e.isInfix){let i=yr(e.args[0]),o=yr(e.args[1]);i=Bi(e.args[0])||Ui(e.args[0])?`(${i})`:i,o=Bi(e.args[1])||Ui(e.args[1])?`(${o})`:o,e.func.token.value==="."?t=`(${i}.${o})`:t=`${i} ${e.func.token.value} ${o}`;break}}if(e.func.tag==="Atom"&&e.func.token.type==="identifier"&&e.func.token.value===I.tuple[0]){e.args.length===1?t=`(${yr(e.args[0])},)`:t=`(${e.args.map(i=>yr(i)).join(", ").trim()})`;break}let n=yr(e.func);n=Bi(e.func)||Ui(e.func)?`(${n})`:n;let r=e.args.map(i=>yr(i)).join(", ").trim();t=`${n}(${r})`;break}}return t}function kn(e,t){let n=" ".repeat(t.indentLevel*t.indentSize),r={...t,indentLevel:t.indentLevel+1},i=" ".repeat(r.indentLevel*t.indentSize);switch(e.tag){case"Atom":return e.token.value;case"FnCall":{if(e.func.tag==="Atom"&&(e.func.token.type==="operator"||e.func.token.type===".")){if(e.args.length===1){if(e.func.token.value===".")return`${e.func.token.value}${kn(e.args[0],t)}`;{let u=kn(e.args[0],t);return`${e.func.token.value}(${u})`}}else if(e.args.length===2&&e.isInfix){let u=kn(e.args[0],t),_=kn(e.args[1],t);return u=Bi(e.args[0])||Ui(e.args[0])?`(${u})`:u,_=Bi(e.args[1])||Ui(e.args[1])?`(${_})`:_,e.func.token.value==="."?`(${u}.${_})`:`${u} ${e.func.token.value} ${_}`}}if(e.func.tag==="Atom"&&e.func.token.type==="identifier"&&e.func.token.value===I.tuple[0]){if(e.args.length===0)return"()";if(e.args.length===1)return`(${kn(e.args[0],t)},)`;{let u=e.args.map(c=>kn(c,t)),_=`(${u.join(", ")})`;return _.length<=t.maxLineLength?_:`(
|
|
49
|
+
${w(e)}`})}function pa(e,t){if(e.tag!==t.tag)return!1;if(e.tag==="Atom"&&t.tag==="Atom")return e.token.value===t.token.value;if(e.tag==="FnCall"&&t.tag==="FnCall"){if(!pa(e.func,t.func)||e.args.length!==t.args.length)return!1;for(let n=0;n<e.args.length;n++)if(!pa(e.args[n],t.args[n]))return!1;return!0}return!1}var I={comptime:["comptime"],runtime:["runtime"],ref:["ref"],forall:["forall","\u2200"],using:["using"],given:["given"],where:["where"],quote:["quote",":"],unquote:["unquote","#"],unquote_splicing:["unquote_splicing","...#"],return:["return"],recur:["recur"],fn:["fn"],unsafe_fn:["unsafe_fn"],escape:["escape"],extern:["extern"],cond:["cond"],type:["type"],match:["match"],test:["test"],struct:["struct"],object:["object"],newtype:["newtype"],enum:["enum"],union:["union"],module:["module"],trait:["trait"],impl:["impl"],Impl:["Impl"],begin:["begin"],module_begin:["module_begin"],import:["import"],export:["export"],open:["open"],clone:["clone","%"],break:["break"],continue:["continue"],while:["while"],if:["if"],op_and:["&&"],op_or:["||"],gensym:["gensym"],dyn:["dyn"],Dyn:["Dyn"],Fn:["Fn"],c_include:["c_include"],undefined:["undefined"],null:["null"],true:["true"],false:["false"],unique:["unique","^"],Ptr:["*"],Iso:["Iso"],Arc:["Arc"],Tuple:["Tuple"],Array:["Array"],Slice:["Slice"],Future:["Future"],Concrete:["Concrete"],Type:["Type"],Module:["Module"],Trait:["Trait"],ComptimeList:["ComptimeList"],tuple:["tuple"],array:["array"],comptime_list:["comptime_list"]},k={comptime_expect_error:["comptime_expect_error"],comptime_assert:["comptime_assert"],comptime_print:["comptime_print"],comptime_fn:["comptime_fn"],va_start:["va_start"],__yo_array_fill:["__yo_array_fill"],typeof:["typeof"],sizeof:["sizeof"],alignof:["alignof"],typeid:["typeid"],downcast:["downcast"],consume:["consume"],macro_expand:["macro_expand"],as:["as"],the:["the"],do:["do"],rc:"rc",__yo_thread_set_maximum_threads:["__yo_thread_set_maximum_threads"],__yo_ptr_add:["__yo_ptr_add"],__yo_ptr_sub:["__yo_ptr_sub"],__yo_ptr_diff:["__yo_ptr_diff"],__yo_ptr_eq:["__yo_ptr_eq"],__yo_ptr_neq:["__yo_ptr_neq"],__yo_ptr_lt:["__yo_ptr_lt"],__yo_ptr_lte:["__yo_ptr_lte"],__yo_ptr_gt:["__yo_ptr_gt"],__yo_ptr_gte:["__yo_ptr_gte"],__yo_address_of:["&"],__yo_ptr_deref:["__yo_ptr_deref"],__yo_ptr_set:["__yo_ptr_set"],__yo_slice_len:["__yo_slice_len"],__yo_slice_new:["__yo_slice_new"],__yo_as:["__yo_as"],__yo_expr_is_atom:["__yo_expr_is_atom"],__yo_expr_is_fn_call:["__yo_expr_is_fn_call"],__yo_expr_get_callee:["__yo_expr_get_callee"],__yo_expr_get_args:["__yo_expr_get_args"],__yo_expr_to_string:["__yo_expr_to_string"],__yo_expr_eq:["__yo_expr_eq"],__yo_comptime_list_car:["__yo_comptime_list_car"],__yo_comptime_list_cdr:["__yo_comptime_list_cdr"],__yo_comptime_list_cons:["__yo_comptime_list_cons"],__yo_comptime_list_append:["__yo_comptime_list_append"],__yo_comptime_list_length:["__yo_comptime_list_length"],__yo_comptime_list_element_type:["__yo_comptime_list_element_type"],__yo_comptime_int_add:["__yo_comptime_int_add"],__yo_comptime_int_sub:["__yo_comptime_int_sub"],__yo_comptime_int_mul:["__yo_comptime_int_mul"],__yo_comptime_int_div:["__yo_comptime_int_div"],__yo_comptime_int_mod:["__yo_comptime_int_mod"],__yo_comptime_int_eq:["__yo_comptime_int_eq"],__yo_comptime_int_neq:["__yo_comptime_int_neq"],__yo_comptime_int_lt:["__yo_comptime_int_lt"],__yo_comptime_int_lte:["__yo_comptime_int_lte"],__yo_comptime_int_gt:["__yo_comptime_int_gt"],__yo_comptime_int_gte:["__yo_comptime_int_gte"],__yo_comptime_int_bit_and:["__yo_comptime_int_bit_and"],__yo_comptime_int_bit_or:["__yo_comptime_int_bit_or"],__yo_comptime_int_bit_xor:["__yo_comptime_int_bit_xor"],__yo_comptime_int_shl:["__yo_comptime_int_shl"],__yo_comptime_int_shr:["__yo_comptime_int_shr"],__yo_comptime_int_neg:["__yo_comptime_int_neg"],__yo_comptime_int_bit_not:["__yo_comptime_int_bit_not"],__yo_comptime_int_to_comptime_string:["__yo_comptime_int_to_comptime_string"],__yo_comptime_float_add:["__yo_comptime_float_add"],__yo_comptime_float_sub:["__yo_comptime_float_sub"],__yo_comptime_float_mul:["__yo_comptime_float_mul"],__yo_comptime_float_div:["__yo_comptime_float_div"],__yo_comptime_float_eq:["__yo_comptime_float_eq"],__yo_comptime_float_neq:["__yo_comptime_float_neq"],__yo_comptime_float_lt:["__yo_comptime_float_lt"],__yo_comptime_float_lte:["__yo_comptime_float_lte"],__yo_comptime_float_gt:["__yo_comptime_float_gt"],__yo_comptime_float_gte:["__yo_comptime_float_gte"],__yo_comptime_float_neg:["__yo_comptime_float_neg"],__yo_comptime_float_to_comptime_string:["__yo_comptime_float_to_comptime_string"],__yo_comptime_u8_add:["__yo_comptime_u8_add"],__yo_comptime_u8_sub:["__yo_comptime_u8_sub"],__yo_comptime_u8_mul:["__yo_comptime_u8_mul"],__yo_comptime_u8_div:["__yo_comptime_u8_div"],__yo_comptime_u8_mod:["__yo_comptime_u8_mod"],__yo_comptime_u8_eq:["__yo_comptime_u8_eq"],__yo_comptime_u8_neq:["__yo_comptime_u8_neq"],__yo_comptime_u8_lt:["__yo_comptime_u8_lt"],__yo_comptime_u8_lte:["__yo_comptime_u8_lte"],__yo_comptime_u8_gt:["__yo_comptime_u8_gt"],__yo_comptime_u8_gte:["__yo_comptime_u8_gte"],__yo_comptime_u8_neg:["__yo_comptime_u8_neg"],__yo_comptime_u8_bit_and:["__yo_comptime_u8_bit_and"],__yo_comptime_u8_bit_or:["__yo_comptime_u8_bit_or"],__yo_comptime_u8_bit_xor:["__yo_comptime_u8_bit_xor"],__yo_comptime_u8_bit_not:["__yo_comptime_u8_bit_not"],__yo_comptime_u8_shl:["__yo_comptime_u8_shl"],__yo_comptime_u8_shr:["__yo_comptime_u8_shr"],__yo_comptime_u8_to_comptime_string:["__yo_comptime_u8_to_comptime_string"],__yo_comptime_i8_add:["__yo_comptime_i8_add"],__yo_comptime_i8_sub:["__yo_comptime_i8_sub"],__yo_comptime_i8_mul:["__yo_comptime_i8_mul"],__yo_comptime_i8_div:["__yo_comptime_i8_div"],__yo_comptime_i8_mod:["__yo_comptime_i8_mod"],__yo_comptime_i8_eq:["__yo_comptime_i8_eq"],__yo_comptime_i8_neq:["__yo_comptime_i8_neq"],__yo_comptime_i8_lt:["__yo_comptime_i8_lt"],__yo_comptime_i8_lte:["__yo_comptime_i8_lte"],__yo_comptime_i8_gt:["__yo_comptime_i8_gt"],__yo_comptime_i8_gte:["__yo_comptime_i8_gte"],__yo_comptime_i8_neg:["__yo_comptime_i8_neg"],__yo_comptime_i8_bit_and:["__yo_comptime_i8_bit_and"],__yo_comptime_i8_bit_or:["__yo_comptime_i8_bit_or"],__yo_comptime_i8_bit_xor:["__yo_comptime_i8_bit_xor"],__yo_comptime_i8_bit_not:["__yo_comptime_i8_bit_not"],__yo_comptime_i8_shl:["__yo_comptime_i8_shl"],__yo_comptime_i8_shr:["__yo_comptime_i8_shr"],__yo_comptime_i8_to_comptime_string:["__yo_comptime_i8_to_comptime_string"],__yo_comptime_u16_add:["__yo_comptime_u16_add"],__yo_comptime_u16_sub:["__yo_comptime_u16_sub"],__yo_comptime_u16_mul:["__yo_comptime_u16_mul"],__yo_comptime_u16_div:["__yo_comptime_u16_div"],__yo_comptime_u16_mod:["__yo_comptime_u16_mod"],__yo_comptime_u16_eq:["__yo_comptime_u16_eq"],__yo_comptime_u16_neq:["__yo_comptime_u16_neq"],__yo_comptime_u16_lt:["__yo_comptime_u16_lt"],__yo_comptime_u16_lte:["__yo_comptime_u16_lte"],__yo_comptime_u16_gt:["__yo_comptime_u16_gt"],__yo_comptime_u16_gte:["__yo_comptime_u16_gte"],__yo_comptime_u16_neg:["__yo_comptime_u16_neg"],__yo_comptime_u16_bit_and:["__yo_comptime_u16_bit_and"],__yo_comptime_u16_bit_or:["__yo_comptime_u16_bit_or"],__yo_comptime_u16_bit_xor:["__yo_comptime_u16_bit_xor"],__yo_comptime_u16_bit_not:["__yo_comptime_u16_bit_not"],__yo_comptime_u16_shl:["__yo_comptime_u16_shl"],__yo_comptime_u16_shr:["__yo_comptime_u16_shr"],__yo_comptime_u16_to_comptime_string:["__yo_comptime_u16_to_comptime_string"],__yo_comptime_i16_add:["__yo_comptime_i16_add"],__yo_comptime_i16_sub:["__yo_comptime_i16_sub"],__yo_comptime_i16_mul:["__yo_comptime_i16_mul"],__yo_comptime_i16_div:["__yo_comptime_i16_div"],__yo_comptime_i16_mod:["__yo_comptime_i16_mod"],__yo_comptime_i16_eq:["__yo_comptime_i16_eq"],__yo_comptime_i16_neq:["__yo_comptime_i16_neq"],__yo_comptime_i16_lt:["__yo_comptime_i16_lt"],__yo_comptime_i16_lte:["__yo_comptime_i16_lte"],__yo_comptime_i16_gt:["__yo_comptime_i16_gt"],__yo_comptime_i16_gte:["__yo_comptime_i16_gte"],__yo_comptime_i16_neg:["__yo_comptime_i16_neg"],__yo_comptime_i16_bit_and:["__yo_comptime_i16_bit_and"],__yo_comptime_i16_bit_or:["__yo_comptime_i16_bit_or"],__yo_comptime_i16_bit_xor:["__yo_comptime_i16_bit_xor"],__yo_comptime_i16_bit_not:["__yo_comptime_i16_bit_not"],__yo_comptime_i16_shl:["__yo_comptime_i16_shl"],__yo_comptime_i16_shr:["__yo_comptime_i16_shr"],__yo_comptime_i16_to_comptime_string:["__yo_comptime_i16_to_comptime_string"],__yo_comptime_u32_add:["__yo_comptime_u32_add"],__yo_comptime_u32_sub:["__yo_comptime_u32_sub"],__yo_comptime_u32_mul:["__yo_comptime_u32_mul"],__yo_comptime_u32_div:["__yo_comptime_u32_div"],__yo_comptime_u32_mod:["__yo_comptime_u32_mod"],__yo_comptime_u32_eq:["__yo_comptime_u32_eq"],__yo_comptime_u32_neq:["__yo_comptime_u32_neq"],__yo_comptime_u32_lt:["__yo_comptime_u32_lt"],__yo_comptime_u32_lte:["__yo_comptime_u32_lte"],__yo_comptime_u32_gt:["__yo_comptime_u32_gt"],__yo_comptime_u32_gte:["__yo_comptime_u32_gte"],__yo_comptime_u32_neg:["__yo_comptime_u32_neg"],__yo_comptime_u32_bit_and:["__yo_comptime_u32_bit_and"],__yo_comptime_u32_bit_or:["__yo_comptime_u32_bit_or"],__yo_comptime_u32_bit_xor:["__yo_comptime_u32_bit_xor"],__yo_comptime_u32_bit_not:["__yo_comptime_u32_bit_not"],__yo_comptime_u32_shl:["__yo_comptime_u32_shl"],__yo_comptime_u32_shr:["__yo_comptime_u32_shr"],__yo_comptime_u32_to_comptime_string:["__yo_comptime_u32_to_comptime_string"],__yo_comptime_i32_add:["__yo_comptime_i32_add"],__yo_comptime_i32_sub:["__yo_comptime_i32_sub"],__yo_comptime_i32_mul:["__yo_comptime_i32_mul"],__yo_comptime_i32_div:["__yo_comptime_i32_div"],__yo_comptime_i32_mod:["__yo_comptime_i32_mod"],__yo_comptime_i32_eq:["__yo_comptime_i32_eq"],__yo_comptime_i32_neq:["__yo_comptime_i32_neq"],__yo_comptime_i32_lt:["__yo_comptime_i32_lt"],__yo_comptime_i32_lte:["__yo_comptime_i32_lte"],__yo_comptime_i32_gt:["__yo_comptime_i32_gt"],__yo_comptime_i32_gte:["__yo_comptime_i32_gte"],__yo_comptime_i32_neg:["__yo_comptime_i32_neg"],__yo_comptime_i32_bit_and:["__yo_comptime_i32_bit_and"],__yo_comptime_i32_bit_or:["__yo_comptime_i32_bit_or"],__yo_comptime_i32_bit_xor:["__yo_comptime_i32_bit_xor"],__yo_comptime_i32_bit_not:["__yo_comptime_i32_bit_not"],__yo_comptime_i32_shl:["__yo_comptime_i32_shl"],__yo_comptime_i32_shr:["__yo_comptime_i32_shr"],__yo_comptime_i32_to_comptime_string:["__yo_comptime_i32_to_comptime_string"],__yo_comptime_u64_add:["__yo_comptime_u64_add"],__yo_comptime_u64_sub:["__yo_comptime_u64_sub"],__yo_comptime_u64_mul:["__yo_comptime_u64_mul"],__yo_comptime_u64_div:["__yo_comptime_u64_div"],__yo_comptime_u64_mod:["__yo_comptime_u64_mod"],__yo_comptime_u64_eq:["__yo_comptime_u64_eq"],__yo_comptime_u64_neq:["__yo_comptime_u64_neq"],__yo_comptime_u64_lt:["__yo_comptime_u64_lt"],__yo_comptime_u64_lte:["__yo_comptime_u64_lte"],__yo_comptime_u64_gt:["__yo_comptime_u64_gt"],__yo_comptime_u64_gte:["__yo_comptime_u64_gte"],__yo_comptime_u64_neg:["__yo_comptime_u64_neg"],__yo_comptime_u64_bit_and:["__yo_comptime_u64_bit_and"],__yo_comptime_u64_bit_or:["__yo_comptime_u64_bit_or"],__yo_comptime_u64_bit_xor:["__yo_comptime_u64_bit_xor"],__yo_comptime_u64_bit_not:["__yo_comptime_u64_bit_not"],__yo_comptime_u64_shl:["__yo_comptime_u64_shl"],__yo_comptime_u64_shr:["__yo_comptime_u64_shr"],__yo_comptime_u64_to_comptime_string:["__yo_comptime_u64_to_comptime_string"],__yo_comptime_i64_add:["__yo_comptime_i64_add"],__yo_comptime_i64_sub:["__yo_comptime_i64_sub"],__yo_comptime_i64_mul:["__yo_comptime_i64_mul"],__yo_comptime_i64_div:["__yo_comptime_i64_div"],__yo_comptime_i64_mod:["__yo_comptime_i64_mod"],__yo_comptime_i64_eq:["__yo_comptime_i64_eq"],__yo_comptime_i64_neq:["__yo_comptime_i64_neq"],__yo_comptime_i64_lt:["__yo_comptime_i64_lt"],__yo_comptime_i64_lte:["__yo_comptime_i64_lte"],__yo_comptime_i64_gt:["__yo_comptime_i64_gt"],__yo_comptime_i64_gte:["__yo_comptime_i64_gte"],__yo_comptime_i64_neg:["__yo_comptime_i64_neg"],__yo_comptime_i64_bit_and:["__yo_comptime_i64_bit_and"],__yo_comptime_i64_bit_or:["__yo_comptime_i64_bit_or"],__yo_comptime_i64_bit_xor:["__yo_comptime_i64_bit_xor"],__yo_comptime_i64_bit_not:["__yo_comptime_i64_bit_not"],__yo_comptime_i64_shl:["__yo_comptime_i64_shl"],__yo_comptime_i64_shr:["__yo_comptime_i64_shr"],__yo_comptime_i64_to_comptime_string:["__yo_comptime_i64_to_comptime_string"],__yo_comptime_usize_add:["__yo_comptime_usize_add"],__yo_comptime_usize_sub:["__yo_comptime_usize_sub"],__yo_comptime_usize_mul:["__yo_comptime_usize_mul"],__yo_comptime_usize_div:["__yo_comptime_usize_div"],__yo_comptime_usize_mod:["__yo_comptime_usize_mod"],__yo_comptime_usize_eq:["__yo_comptime_usize_eq"],__yo_comptime_usize_neq:["__yo_comptime_usize_neq"],__yo_comptime_usize_lt:["__yo_comptime_usize_lt"],__yo_comptime_usize_lte:["__yo_comptime_usize_lte"],__yo_comptime_usize_gt:["__yo_comptime_usize_gt"],__yo_comptime_usize_gte:["__yo_comptime_usize_gte"],__yo_comptime_usize_neg:["__yo_comptime_usize_neg"],__yo_comptime_usize_bit_and:["__yo_comptime_usize_bit_and"],__yo_comptime_usize_bit_or:["__yo_comptime_usize_bit_or"],__yo_comptime_usize_bit_xor:["__yo_comptime_usize_bit_xor"],__yo_comptime_usize_bit_not:["__yo_comptime_usize_bit_not"],__yo_comptime_usize_shl:["__yo_comptime_usize_shl"],__yo_comptime_usize_shr:["__yo_comptime_usize_shr"],__yo_comptime_usize_to_comptime_string:["__yo_comptime_usize_to_comptime_string"],__yo_comptime_isize_add:["__yo_comptime_isize_add"],__yo_comptime_isize_sub:["__yo_comptime_isize_sub"],__yo_comptime_isize_mul:["__yo_comptime_isize_mul"],__yo_comptime_isize_div:["__yo_comptime_isize_div"],__yo_comptime_isize_mod:["__yo_comptime_isize_mod"],__yo_comptime_isize_eq:["__yo_comptime_isize_eq"],__yo_comptime_isize_neq:["__yo_comptime_isize_neq"],__yo_comptime_isize_lt:["__yo_comptime_isize_lt"],__yo_comptime_isize_lte:["__yo_comptime_isize_lte"],__yo_comptime_isize_gt:["__yo_comptime_isize_gt"],__yo_comptime_isize_gte:["__yo_comptime_isize_gte"],__yo_comptime_isize_neg:["__yo_comptime_isize_neg"],__yo_comptime_isize_bit_and:["__yo_comptime_isize_bit_and"],__yo_comptime_isize_bit_or:["__yo_comptime_isize_bit_or"],__yo_comptime_isize_bit_xor:["__yo_comptime_isize_bit_xor"],__yo_comptime_isize_bit_not:["__yo_comptime_isize_bit_not"],__yo_comptime_isize_shl:["__yo_comptime_isize_shl"],__yo_comptime_isize_shr:["__yo_comptime_isize_shr"],__yo_comptime_isize_to_comptime_string:["__yo_comptime_isize_to_comptime_string"],__yo_comptime_f32_add:["__yo_comptime_f32_add"],__yo_comptime_f32_sub:["__yo_comptime_f32_sub"],__yo_comptime_f32_mul:["__yo_comptime_f32_mul"],__yo_comptime_f32_div:["__yo_comptime_f32_div"],__yo_comptime_f32_eq:["__yo_comptime_f32_eq"],__yo_comptime_f32_neq:["__yo_comptime_f32_neq"],__yo_comptime_f32_lt:["__yo_comptime_f32_lt"],__yo_comptime_f32_lte:["__yo_comptime_f32_lte"],__yo_comptime_f32_gt:["__yo_comptime_f32_gt"],__yo_comptime_f32_gte:["__yo_comptime_f32_gte"],__yo_comptime_f32_neg:["__yo_comptime_f32_neg"],__yo_comptime_f32_to_comptime_string:["__yo_comptime_f32_to_comptime_string"],__yo_comptime_f64_add:["__yo_comptime_f64_add"],__yo_comptime_f64_sub:["__yo_comptime_f64_sub"],__yo_comptime_f64_mul:["__yo_comptime_f64_mul"],__yo_comptime_f64_div:["__yo_comptime_f64_div"],__yo_comptime_f64_eq:["__yo_comptime_f64_eq"],__yo_comptime_f64_neq:["__yo_comptime_f64_neq"],__yo_comptime_f64_lt:["__yo_comptime_f64_lt"],__yo_comptime_f64_lte:["__yo_comptime_f64_lte"],__yo_comptime_f64_gt:["__yo_comptime_f64_gt"],__yo_comptime_f64_gte:["__yo_comptime_f64_gte"],__yo_comptime_f64_neg:["__yo_comptime_f64_neg"],__yo_comptime_f64_to_comptime_string:["__yo_comptime_f64_to_comptime_string"],__yo_comptime_bool_and:["__yo_comptime_bool_and"],__yo_comptime_bool_or:["__yo_comptime_bool_or"],__yo_comptime_bool_eq:["__yo_comptime_bool_eq"],__yo_comptime_bool_neq:["__yo_comptime_bool_neq"],__yo_comptime_bool_not:["__yo_comptime_bool_not"],__yo_comptime_bool_to_comptime_string:["__yo_comptime_bool_to_comptime_string"],__yo_comptime_string_concat:["__yo_comptime_string_concat"],__yo_comptime_string_eq:["__yo_comptime_string_eq"],__yo_comptime_string_neq:["__yo_comptime_string_neq"],__yo_comptime_string_lt:["__yo_comptime_string_lt"],__yo_comptime_string_lte:["__yo_comptime_string_lte"],__yo_comptime_string_gt:["__yo_comptime_string_gt"],__yo_comptime_string_gte:["__yo_comptime_string_gte"],__yo_comptime_string_length:["__yo_comptime_string_length"],__yo_comptime_string_to_upper:["__yo_comptime_string_to_upper"],__yo_comptime_string_to_lower:["__yo_comptime_string_to_lower"],__yo_comptime_string_slice:["__yo_comptime_string_slice"],__yo_type_to_comptime_string:["__yo_type_to_comptime_string"],__yo_type_contains_rc_type:["__yo_type_contains_rc_type"],__yo_type_can_form_rc_cycle:["__yo_type_can_form_rc_cycle"],__yo_are_types_compatible:["__yo_are_types_compatible"],__yo_type_impls:["__yo_type_impls"],__yo_var_print_info:["__yo_var_print_info"],__yo_var_is_owning_the_rc_value:["__yo_var_is_owning_the_rc_value"],__yo_var_has_other_aliases:["__yo_var_has_other_aliases"],__yo_op_add:["__yo_op_add"],__yo_op_sub:["__yo_op_sub"],__yo_op_mul:["__yo_op_mul"],__yo_op_div:["__yo_op_div"],__yo_op_mod:["__yo_op_mod"],__yo_op_neg:["__yo_op_neg"],__yo_op_eq:["__yo_op_eq"],__yo_op_neq:["__yo_op_neq"],__yo_op_lt:["__yo_op_lt"],__yo_op_lte:["__yo_op_lte"],__yo_op_gt:["__yo_op_gt"],__yo_op_gte:["__yo_op_gte"],__yo_op_not:["__yo_op_not"],__yo_op_bit_and:["__yo_op_bit_and"],__yo_op_bit_or:["__yo_op_bit_or"],__yo_op_bit_xor:["__yo_op_bit_xor"],__yo_op_bit_complement:["__yo_op_bit_complement"],__yo_op_bit_left_shift:["__yo_op_bit_left_shift"],__yo_op_bit_right_shift:["__yo_op_bit_right_shift"],c_include:["c_include"],panic:["panic"],__yo_decr_rc:["__yo_decr_rc"],__yo_incr_rc:["__yo_incr_rc"],__yo_decr_rc_atomic:["__yo_decr_rc_atomic"],__yo_incr_rc_atomic:["__yo_incr_rc_atomic"],__yo_rc_own:["__yo_rc_own"],__yo_iso_extract:["__yo_iso_extract"],__yo_iso_dispose:["__yo_iso_dispose"],__yo_arc_dispose:["__yo_arc_dispose"],__yo_gc_collect:["__yo_gc_collect"],__yo_dyn_drop:["__yo_dyn_drop"],__yo_dyn_dup:["__yo_dyn_dup"],__yo_sometype_drop:["__yo_sometype_drop"],__yo_sometype_dup:["__yo_sometype_dup"],___drop:["___drop"],___dispose:["___dispose"],___dup:["___dup"],dispose:["dispose"],__yo_drop_array_element:["__yo_drop_array_element"],__yo_dup_array_element:["__yo_dup_array_element"],__yo_drop_tuple_element:["__yo_drop_tuple_element"],__yo_dup_tuple_element:["__yo_dup_tuple_element"],__yo_noop:["__yo_noop"],__yo_return_self:["__yo_return_self"],__yo_ms_sleep:["__yo_ms_sleep"],__yo_getrandom:["__yo_getrandom"],__yo_arc4random_buf:["__yo_arc4random_buf"],__yo_bcrypt_gen_random:["__yo_bcrypt_gen_random"],__yo_getentropy:["__yo_getentropy"],__yo_maybe_uninit_new:["__yo_maybe_uninit_new"],__yo_maybe_uninit_as_ptr:["__yo_maybe_uninit_as_ptr"],__yo_maybe_uninit_assume_init:["__yo_maybe_uninit_assume_init"],__yo_process_platform:["__yo_process_platform"],__yo_process_arch:["__yo_process_arch"],__yo_pointer_size_bits:["__yo_pointer_size_bits"],__yo_build_executable:["__yo_build_executable"],__yo_build_static_library:["__yo_build_static_library"],__yo_build_shared_library:["__yo_build_shared_library"],__yo_build_test:["__yo_build_test"],__yo_build_run:["__yo_build_run"],__yo_build_step:["__yo_build_step"],__yo_build_step_depend_on:["__yo_build_step_depend_on"],__yo_build_link:["__yo_build_link"],__yo_build_link_system_library:["__yo_build_link_system_library"],__yo_build_target_host:["__yo_build_target_host"],__yo_build_target_parse:["__yo_build_target_parse"],__yo_build_dependency:["__yo_build_dependency"],__yo_build_path_dependency:["__yo_build_path_dependency"],__yo_build_system_library:["__yo_build_system_library"],__yo_build_option:["__yo_build_option"],__yo_build_dep_artifact:["__yo_build_dep_artifact"],__yo_build_module:["__yo_build_module"],__yo_build_module_link:["__yo_build_module_link"],__yo_build_add_import:["__yo_build_add_import"],__yo_build_add_cflags:["__yo_build_add_cflags"],__yo_build_dep_module:["__yo_build_dep_module"],asm:["asm"],global_asm:["global_asm"]};function Bi(e){return!!(e.tag==="FnCall"&&e.isInfix&&e.func.tag==="Atom"&&e.func.token.type==="operator"&&e.args.length===2)}function w(e,t){let r={...{prettyPrint:!1,indentSize:2,maxLineLength:80,indentLevel:0},...t};return r.prettyPrint?kn(e,r):yr(e)}function yr(e){let t="";switch(e.tag){case"Atom":{t=e.token.value;break}case"FnCall":{if(e.func.tag==="Atom"&&(e.func.token.type==="operator"||e.func.token.type===".")){if(e.args.length===1){e.func.token.value==="."?t=`${e.func.token.value}${yr(e.args[0])}`:t=`${e.func.token.value}(${yr(e.args[0])})`;break}else if(e.args.length===2&&e.isInfix){let i=yr(e.args[0]),o=yr(e.args[1]);i=Bi(e.args[0])||Ui(e.args[0])?`(${i})`:i,o=Bi(e.args[1])||Ui(e.args[1])?`(${o})`:o,e.func.token.value==="."?t=`(${i}.${o})`:t=`${i} ${e.func.token.value} ${o}`;break}}if(e.func.tag==="Atom"&&e.func.token.type==="identifier"&&e.func.token.value===I.tuple[0]){e.args.length===1?t=`(${yr(e.args[0])},)`:t=`(${e.args.map(i=>yr(i)).join(", ").trim()})`;break}let n=yr(e.func);n=Bi(e.func)||Ui(e.func)?`(${n})`:n;let r=e.args.map(i=>yr(i)).join(", ").trim();t=`${n}(${r})`;break}}return t}function kn(e,t){let n=" ".repeat(t.indentLevel*t.indentSize),r={...t,indentLevel:t.indentLevel+1},i=" ".repeat(r.indentLevel*t.indentSize);switch(e.tag){case"Atom":return e.token.value;case"FnCall":{if(e.func.tag==="Atom"&&(e.func.token.type==="operator"||e.func.token.type===".")){if(e.args.length===1){if(e.func.token.value===".")return`${e.func.token.value}${kn(e.args[0],t)}`;{let u=kn(e.args[0],t);return`${e.func.token.value}(${u})`}}else if(e.args.length===2&&e.isInfix){let u=kn(e.args[0],t),_=kn(e.args[1],t);return u=Bi(e.args[0])||Ui(e.args[0])?`(${u})`:u,_=Bi(e.args[1])||Ui(e.args[1])?`(${_})`:_,e.func.token.value==="."?`(${u}.${_})`:`${u} ${e.func.token.value} ${_}`}}if(e.func.tag==="Atom"&&e.func.token.type==="identifier"&&e.func.token.value===I.tuple[0]){if(e.args.length===0)return"()";if(e.args.length===1)return`(${kn(e.args[0],t)},)`;{let u=e.args.map(c=>kn(c,t)),_=`(${u.join(", ")})`;return _.length<=t.maxLineLength?_:`(
|
|
50
50
|
${i}${u.join(`,
|
|
51
51
|
${i}`)}
|
|
52
52
|
${n})`}}let o=e.func.tag==="Atom"?e.func.token.value:null,a=o&&[...I.begin,...I.cond,...I.match,...I.fn,...I.if,...I.while].includes(o),s=kn(e.func,t);if(s=Bi(e.func)||Ui(e.func)?`(${s})`:s,e.args.length===0)return`${s}()`;if(!a){let u=e.args.map(c=>kn(c,t)),_=`${s}(${u.join(", ")})`;if(_.length<=t.maxLineLength)return _}if(a){if(o===I.begin[0]){if(e.args.length===1){let _=kn(e.args[0],t);if(_.length<=t.maxLineLength&&!_.includes(`
|
|
@@ -68,7 +68,7 @@ Impl(...) uses static dispatch and requires the same concrete type in all branch
|
|
|
68
68
|
Consider using Dyn(...) for dynamic dispatch if different concrete types are needed.`},{token:p[d[0].index],errorMessage:`First branch has concrete type: ${A(B)}`},{token:p[d[C].index],errorMessage:`Conflicting branch has concrete type: ${A(D)}`}])}if(b!==R&&!q({type:b,env:L},{type:R,env:N}))throw lt([{token:t[d[0].index].token,errorMessage:`Variable "${f}" has incompatible types across different cases:`},{token:p[d[0].index],errorMessage:`First initialization: ${A(b)}`},{token:p[d[C].index],errorMessage:`Conflicting initialization: ${A(R)}`}])}}if(p.length===1){if(p[0]&&!s[c].initializedAtToken)throw lt([{token:s[c].token,errorMessage:`Variable "${s[c].name}" might not be initialized in all cases.`},{token:p[0],errorMessage:"Might be initialized here:"}])}else if(!s[c].initializedAtToken&&p.every(b=>b)){let b={...s[c],initializedAtToken:p[0]};e=Be(e,s[c],b),s[c]=b}else{let b=p.filter(C=>!!C),L=p.filter(C=>!C);if(b.length>0&&L.length>0)throw lt(p.map((C,R)=>({errorMessage:(R===0?`Variable "${f}" might be initialized in some cases but not initialized in other cases:
|
|
69
69
|
`:"")+(C?"Might be initialized here:":"Not initialized here:"),token:C??t[R].token})))}if(g.length===1){if(g[0]&&!s[c].consumedAtToken){let b={...s[c],consumedAtToken:g[0]};e=Be(e,s[c],b),s[c]=b}}else if(!s[c].consumedAtToken&&g.every(b=>b)){let b={...s[c],consumedAtToken:g[0]};e=Be(e,s[c],b),s[c]=b}else{let b=g.filter(C=>!!C),L=g.filter(C=>!C);if(b.length>0&&L.length>0)throw lt(g.map((C,R)=>({errorMessage:(R===0?`Variable "${f}" is consumed in some cases but not in other cases:
|
|
70
70
|
`:"")+(C?"Consumed here:":"Not consumed here:"),token:C??t[R].token})))}if(!s[c].isOwningTheRcValue&&m.every(b=>b)){let b={...s[c],isOwningTheRcValue:!0,isOwningTheSameRcValueAs:void 0};e=Be(e,s[c],b),s[c]=b}else{let b=m.filter(C=>!!C),L=m.filter(C=>!C);if(b.length>0&&L.length>0)throw lt(m.map((C,R)=>({errorMessage:(R===0?`Variable "${f}" might be holding the Rc value in some cases but not holding the Rc value in other cases:
|
|
71
|
-
`:"")+(C?"Might be owning the Rc value here:":"Might be not owning the Rc value here:"),token:C??t[R].token})))}let v=s[c].id,T=[];for(let b=1;b<u;b++){let R=r[b-1].frames[o].variables[c];T.push(R.id)}if(T.some(b=>b!==v)){let b=ii(e.modulePath,f),L={...s[c],id:b,isOwningTheSameRcValueAs:void 0};e=Be(e,s[c],L),s[c]=L}}}return e}function gr(e,t){e.$=t.$,e.args=t.args,e.func=t.func,e.isInfix=t.isInfix,e.tag=t.tag,e.token=t.token}function ga(e,t){F(e)||(e.tag=t.tag),gr(e,t)}function
|
|
71
|
+
`:"")+(C?"Might be owning the Rc value here:":"Might be not owning the Rc value here:"),token:C??t[R].token})))}let v=s[c].id,T=[];for(let b=1;b<u;b++){let R=r[b-1].frames[o].variables[c];T.push(R.id)}if(T.some(b=>b!==v)){let b=ii(e.modulePath,f),L={...s[c],id:b,isOwningTheSameRcValueAs:void 0};e=Be(e,s[c],L),s[c]=L}}}return e}function gr(e,t){e.$=t.$,e.args=t.args,e.func=t.func,e.isInfix=t.isInfix,e.tag=t.tag,e.token=t.token}function ga(e,t){F(e)||(e.tag=t.tag),gr(e,t)}function En(e,t,n=!1){if(e.$?.value&&O(e.$?.value))return t;let r=e.$?.variableName;if(!r)return t;let i=X(t,r);if(i.length===0)throw lt([{token:e.token,errorMessage:`Variable "${r}" is not defined.`}]);let o=i[i.length-1];if(o.consumedAtToken&&!n){let a=`use of moved value: \`${r}\``;throw lt([{token:e.token,errorMessage:a},{token:o.consumedAtToken,errorMessage:"value moved here"}])}else t=Be(t,o,{...o,consumedAtToken:e.token});return t}function Yt(e,t){if(!e.$||!e.$.variableName)return;if(e.$.value){let r=e.$.variableName;if(r&&ut(e.$.env.modulePath,r)&&Le(e.$.type)){let i=X(e.$.env,r);if(i.length>0){let o=i[i.length-1];o.isOwningTheRcValue&&!o.consumedAtToken&&(e.$.env=Be(e.$.env,o,{...o,consumedAtToken:e.token}))}}return}let n=e.$.variableName;if(!n)throw y({token:e.token,errorMessage:`Expression does not have a variable name to call ${k.___dup} on:
|
|
72
72
|
${w(e)}`});if(Le(e.$.type)){if(ut(e.$.env.modulePath,n)&&!(U(e)&&e.token.value!==n)){let o=X(e.$.env,n);if(o.length>0){let a=o[o.length-1];if(a.isOwningTheRcValue){a.consumedAtToken||(e.$.env=Be(e.$.env,a,{...a,consumedAtToken:e.token}));return}}}let r=Jt(`${k.___dup[0]}(${n})`),i=S({expr:r,env:e.$.env,context:{...t,expectedType:void 0}});if(i.$?.variableName){let o=X(i.$.env,i.$.variableName);if(o.length>0){let a=o[o.length-1];a.consumedAtToken||(i.$.env=Be(i.$.env,a,{...a,consumedAtToken:i.token}))}}e.$.deferredDupExpressions=[i],e.$.env=i.$.env}}function oi(e,t){let n=e.$?.variableName;if(!n)return;let r=X(t,n);if(r.length===0)throw lt([{token:e.token,errorMessage:`Variable "${n}" is not defined.`}]);let i=r[r.length-1];if(i.consumedAtToken){let o=`use of moved value: \`${n}\``;throw lt([{token:e.token,errorMessage:o},{token:i.consumedAtToken,errorMessage:"value moved here"}])}}var mt="__yo_self";function ai(e,t,n){if(_e(e)){if(e.isReferenceSemantics)return!1;if(n.has(e.id))return!0;n.add(e.id);let r=e.fields.every(i=>ai(i.type,t,n));return n.delete(e.id),r}if(we(e)){if(n.has(e.id))return!0;n.add(e.id);let r=e.fields.every(i=>ai(i.type,t,n));return n.delete(e.id),r}if(ge(e)){if(n.has(e.id))return!0;n.add(e.id);let r=e.variants.every(i=>(i.fields??[]).every(o=>ai(o.type,t,n)));return n.delete(e.id),r}return ke(e)||Qe(e)||Ie(e)?ai(e.childType,t,n):Jn(e,t)}function si(e,t,n){if(_e(e)){if(e.isReferenceSemantics||n.has(e.id))return!0;n.add(e.id);let r=e.fields.every(i=>si(i.type,t,n));return n.delete(e.id),r}if(we(e)){if(n.has(e.id))return!0;n.add(e.id);let r=e.fields.every(i=>si(i.type,t,n));return n.delete(e.id),r}if(ge(e)){if(n.has(e.id))return!0;n.add(e.id);let r=e.variants.every(i=>(i.fields??[]).every(o=>si(o.type,t,n)));return n.delete(e.id),r}return ke(e)||Qe(e)||Ie(e)?si(e.childType,t,n):Ar(e,t)}function _u(e,t,n,r){let i=Jt(e),o=S({expr:i,env:n,context:{...r,SelfType:t,forceCompileTimeBindings:!1}});if(!o.$)throw new Error(`Failed to evaluate auto-generated expression: ${w(i)}`);return{expr:o,env:o.$.env}}function Wi({label:e,functionSignature:t,SelfType:n,env:r,context:i}){let{expr:o,env:a}=_u(t,n,r,i);if(F(o)&&o.$&&o.$.value&&O(o.$.value)&&G(o.$.value.value)){let s=o.$.value.value,l={label:e,type:s,assignedValue:void 0,exprs:{expr:o,labelExpr:o.args[0],typeExpr:void 0,defaultValueExpr:void 0,assignedValueExpr:void 0}};if(n.trait){let u=n.trait.fields.findIndex(_=>_.label===e);u>=0?n.trait.fields[u]=l:n.trait.fields.push(l)}}return a}function wn({label:e,functionCode:t,SelfType:n,env:r,context:i}){let{expr:o,env:a}=_u(t,n,r,i);if(F(o)&&o.$&&o.$.value&&ne(o.$.value)){o.$.value.funcId+=e,o.$.value.funcName=e;let s={label:e,type:o.$.type,assignedValue:o.$.value,exprs:{expr:o,labelExpr:o.args[0],typeExpr:void 0,defaultValueExpr:void 0,assignedValueExpr:o}};if(n.trait){let l=n.trait.fields.findIndex(u=>u.label===e);l>=0?n.trait.fields[l]=s:n.trait.fields.push(s)}}return a}var fs=`(fn(${mt} : Self) -> unit)`,ha=`(fn(${mt} : Self) -> unit)`,va=`(fn(${mt} : Self) -> Self)`;function Am(e){return e.replace(/[^a-zA-Z0-9_]/g,t=>`_u${t.charCodeAt(0)}_`)}function Im(e){return/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e)}function ps(e,t){if(e.length===0)return{destructuringExpr:"",callsExpr:""};let n=[],r=[];for(let i of e)if(Im(i)){let o=Ye("field_"+i);n.push(`${i} : ${o}`),r.push(`(${t})(${o});`)}else{let o=Ye("field_"+Am(i));n.push(`(${i}) : ${o}`),r.push(`(${t})(${o});`)}return{destructuringExpr:`{ ${n.join(", ")} } := ${mt};`,callsExpr:r.join(`
|
|
73
73
|
`)}}function Sm(e){let t=fs;if(!sn(e))return{signature:t,code:`(${t} ())`};let n=e.fields.filter(a=>Le(a.type)).map(a=>a.label);if(!n.length)return{signature:t,code:`(${t} ())`};let{destructuringExpr:r,callsExpr:i}=ps(n,k.___drop[0]),o=`
|
|
74
74
|
${r}
|
|
@@ -146,16 +146,16 @@ ${l}
|
|
|
146
146
|
})`}function Hm(e){return`((fn(${mt} : Self) -> Self) { // ___dup for Arc
|
|
147
147
|
${k.__yo_incr_rc_atomic[0]}(${mt});
|
|
148
148
|
return ${k.__yo_rc_own[0]}(${mt});
|
|
149
|
-
})`}function pu({arcType:e,env:t,context:n}){let r=Ym(e),i=qm(e),o=Hm(e);return t=wn({label:k.___dispose[0],functionCode:r,SelfType:e,env:t,context:n}),t=wn({label:k.___drop[0],functionCode:i,SelfType:e,env:t,context:n}),t=wn({label:k.___dup[0],functionCode:o,SelfType:e,env:t,context:n}),t}function tn(e,t,n,r){let i=`${e}()`,o=Jt(i),a=S({expr:o,env:n,context:{...r,expectedType:void 0,ReceiverType:t}});if(!a.$||!Tt(a.$.value))return n;n=a.$.env;let s=a.$.value;s.type.receiverType=t;let l={label:"",type:gn(1),assignedValue:s,sourceModulePath:r.currentModulePath,exprs:{expr:o}};return t.trait.fields.push(l),n}function jm({structType:e,env:t,context:n}){return e.isReferenceSemantics||e.fields.every(i=>xo(i.type,t))&&(t=tn("Send",e,t,n)),t}function Km({structType:e,env:t,context:n}){return e.isReferenceSemantics&&(t=tn("Rc",e,t,n)),t}function Xm({enumType:e,env:t,context:n}){return e.variants.every(i=>!i.fields||i.fields.length===0?!0:i.fields.every(o=>xo(o.type,t)))&&(t=tn("Send",e,t,n)),t}function du({unionType:e,env:t,context:n}){return e.fields.every(i=>xo(i.type,t))&&(t=tn("Send",e,t,n)),t}function Qm({structType:e,env:t,context:n}){return e.isReferenceSemantics?Lr(e,new Set,t)||(t=tn("Acyclic",e,t,n)):e.fields.every(i=>ri(i.type,t))&&(t=tn("Acyclic",e,t,n)),t}function Zm({enumType:e,env:t,context:n}){return e.variants.every(i=>!i.fields||i.fields.length===0?!0:i.fields.every(o=>ri(o.type,t)))&&(t=tn("Acyclic",e,t,n)),t}function mu({unionType:e,env:t,context:n}){return e.fields.every(i=>ri(i.type,t))&&(t=tn("Acyclic",e,t,n)),t}function Jm({structType:e,env:t,context:n}){return e.isReferenceSemantics||e.fields.every(i=>ai(i.type,t,new Set([e.id])))&&(t=tn("Comptime",e,t,n)),t}function ey({enumType:e,env:t,context:n}){return e.variants.every(i=>!i.fields||i.fields.length===0?!0:i.fields.every(o=>ai(o.type,t,new Set([e.id]))))&&(t=tn("Comptime",e,t,n)),t}function ty({structType:e,env:t,context:n}){return e.isReferenceSemantics?(t=tn("Runtime",e,t,n),t):(e.fields.every(i=>si(i.type,t,new Set([e.id])))&&(t=tn("Runtime",e,t,n)),t)}function ny({enumType:e,env:t,context:n}){return e.variants.every(i=>!i.fields||i.fields.length===0?!0:i.fields.every(o=>si(o.type,t,new Set([e.id]))))&&(t=tn("Runtime",e,t,n)),t}function yu({unionType:e,env:t,context:n}){return t=tn("Runtime",e,t,n),t}function ry({tupleType:e,env:t,context:n}){return e.fields.every(i=>xo(i.type,t))&&(t=tn("Send",e,t,n)),t}function iy({tupleType:e,env:t,context:n}){return e.fields.every(i=>ai(i.type,t,new Set([e.id])))&&(t=tn("Comptime",e,t,n)),t}function oy({tupleType:e,env:t,context:n}){return e.fields.every(i=>si(i.type,t,new Set([e.id])))&&(t=tn("Runtime",e,t,n)),t}function li({structType:e,env:t,context:n,errorToken:r}){return t=jm({structType:e,env:t,context:n}),t=Km({structType:e,env:t,context:n}),t=Qm({structType:e,env:t,context:n}),t=Jm({structType:e,env:t,context:n}),t=ty({structType:e,env:t,context:n}),t=Vm({structType:e,env:t,context:n}),Ta(e,t,r,n),t}function gu({enumType:e,env:t,context:n,errorToken:r}){return t=Xm({enumType:e,env:t,context:n}),t=Zm({enumType:e,env:t,context:n}),t=ey({enumType:e,env:t,context:n}),t=ny({enumType:e,env:t,context:n}),t=Om({enumType:e,env:t,context:n}),Ta(e,t,r,n),t}function hu({tupleType:e,env:t,context:n,errorToken:r}){return t=ry({tupleType:e,env:t,context:n}),t=iy({tupleType:e,env:t,context:n}),t=oy({tupleType:e,env:t,context:n}),Ta(e,t,r,n),t}function xn(e,t){let n=X(e,t);if(n.length===0)return;let r=n[n.length-1];if(r.value&&O(r.value[0])){let i=r.value[0];if(De(i.value))return i.value}}function Ot(e,t){let n=t.definitionFrameLevel;if(n!==void 0&&n>=0){let o=e.frames[n];if(o){let a=o.variables.find(s=>s.name===t.name&&s.value?.[0]?.tag==="Type");if(a&&a.value){let s=a.value[0];if(s.value===t||V(s.value)&&s.value.id===t.id)return t;V(s.value)&&(s.value.id,t.id)}}}let r,i=new Set;do{if(i.has(t))return t;i.add(t);let o=X(e,t.name,a=>a.value?.[0]?.tag==="Type");if(!o.length||(r=o[o.length-1].value[0],r.value===t))return t;if(V(r.value)){if(r.value.name===t.name&&r.value.id!==t.id){let a=!1;for(let s=e.frames.length-1;s>=0;s--){let l=e.frames[s];if(l){for(let u of l.variables)if(u.name===t.name&&u.value){let _=u.value[0];if(_?.tag==="Type"&&_.value===t){a=!0;break}}if(a)break}}if(!a)return t}t=r.value}else{let a=!1;for(let s=e.frames.length-1;s>=0;s--){let l=e.frames[s];if(l){for(let u of l.variables)if(u.name===t.name&&u.value){let _=u.value[0];if(_?.tag==="Type"){let c=_;if(c.value===t){a=!0;break}if(V(c.value)&&c.value.id!==t.id)return t}}if(a)break}}if(!a)return t;break}}while(V(t));return r.value}var ys=null;function fr(){if(ys)return ys;let e=at(),t=Oe(e),n={id:"comptime_int",tag:"comptime_int",trait:t};return t.receiverType=n,ys=n,n}var gs=null;function Li(){if(gs)return gs;let e=at(),t=Oe(e),n={id:"comptime_float",tag:"comptime_float",trait:t};return t.receiverType=n,gs=n,n}var hs=null;function Vt(){if(hs)return hs;let e=at(),t=Oe(e),n={id:"comptime_string",tag:"comptime_string",trait:t};return t.receiverType=n,hs=n,n}var vs=null;function cn(){if(vs)return vs;let e=at(),t=Oe(e),n={id:"Expr",tag:"Expr",trait:t};return t.receiverType=n,vs=n,n}var Ts=new Map;function Io(e){if(Ts.has(e))return Ts.get(e);let t=at(),n=Oe(t),i={id:`comptime_list_${e.id}`,tag:"ComptimeList",childType:e,trait:n};return n.receiverType=i,Ts.set(e,i),i}function Vo(){return Io(cn())}var Es=null;function Je(){if(Es)return Es;let e=at(),t=Oe(e),n={id:"bool",tag:"bool",trait:t};return t.receiverType=n,Es=n,n}var $s=null;function gt(){if($s)return $s;let e=at(),t=Oe(e),n={id:"usize",tag:"usize",trait:t};return t.receiverType=n,$s=n,n}var bs=null;function Ai(){if(bs)return bs;let e=at(),t=Oe(e),n={id:"isize",tag:"isize",trait:t};return t.receiverType=n,bs=n,n}var Cs=null;function Ii(){if(Cs)return Cs;let e=at(),t=Oe(e),n={id:"u8",tag:"u8",trait:t};return t.receiverType=n,Cs=n,n}var ks=null;function Si(){if(ks)return ks;let e=at(),t=Oe(e),n={id:"i8",tag:"i8",trait:t};return t.receiverType=n,ks=n,n}var ws=null;function Ni(){if(ws)return ws;let e=at(),t=Oe(e),n={id:"u16",tag:"u16",trait:t};return t.receiverType=n,ws=n,n}var Fs=null;function xi(){if(Fs)return Fs;let e=at(),t=Oe(e),n={id:"i16",tag:"i16",trait:t};return t.receiverType=n,Fs=n,n}var Ls=null;function Vi(){if(Ls)return Ls;let e=at(),t=Oe(e),n={id:"u32",tag:"u32",trait:t};return t.receiverType=n,Ls=n,n}var As=null;function Pr(){if(As)return As;let e=at(),t=Oe(e),n={id:"i32",tag:"i32",trait:t};return t.receiverType=n,As=n,n}var Is=null;function Di(){if(Is)return Is;let e=at(),t=Oe(e),n={id:"u64",tag:"u64",trait:t};return t.receiverType=n,Is=n,n}var Ss=null;function Mi(){if(Ss)return Ss;let e=at(),t=Oe(e),n={id:"i64",tag:"i64",trait:t};return t.receiverType=n,Ss=n,n}var Ns=null;function Oi(){if(Ns)return Ns;let e=at(),t=Oe(e),n={id:"f32",tag:"f32",trait:t};return t.receiverType=n,Ns=n,n}var xs=null;function zr(){if(xs)return xs;let e=at(),t=Oe(e),n={id:"f64",tag:"f64",trait:t};return t.receiverType=n,xs=n,n}var Vs=null;function Vn(){if(Vs)return Vs;let e=at(),t=Oe(e),n={id:"unit",tag:"unit",trait:t};return t.receiverType=n,Vs=n,n}var Ds=null;function Tu(){if(Ds)return Ds;let e=at(),t=Oe(e),n={id:"char",tag:"char",trait:t};return t.receiverType=n,Ds=n,n}var Ms=null;function Eu(){if(Ms)return Ms;let e=at(),t=Oe(e),n={id:"short",tag:"short",trait:t};return t.receiverType=n,Ms=n,n}var Os=null;function $u(){if(Os)return Os;let e=at(),t=Oe(e),n={id:"ushort",tag:"ushort",trait:t};return t.receiverType=n,Os=n,n}var Rs=null;function bu(){if(Rs)return Rs;let e=at(),t=Oe(e),n={id:"int",tag:"int",trait:t};return t.receiverType=n,Rs=n,n}var Ps=null;function Cu(){if(Ps)return Ps;let e=at(),t=Oe(e),n={id:"uint",tag:"uint",trait:t};return t.receiverType=n,Ps=n,n}var zs=null;function ku(){if(zs)return zs;let e=at(),t=Oe(e),n={id:"long",tag:"long",trait:t};return t.receiverType=n,zs=n,n}var Us=null;function wu(){if(Us)return Us;let e=at(),t=Oe(e),n={id:"ulong",tag:"ulong",trait:t};return t.receiverType=n,Us=n,n}var Bs=null;function Fu(){if(Bs)return Bs;let e=at(),t=Oe(e),n={id:"longlong",tag:"longlong",trait:t};return t.receiverType=n,Bs=n,n}var Gs=null;function Lu(){if(Gs)return Gs;let e=at(),t=Oe(e),n={id:"ulonglong",tag:"ulonglong",trait:t};return t.receiverType=n,Gs=n,n}var Ws=null;function Au(){if(Ws)return Ws;let e=at(),t=Oe(e),n={id:"longdouble",tag:"longdouble",trait:t};return t.receiverType=n,Ws=n,n}function tt(e){return gn(0,e)}function hr(e,t){let n=at(),r=Oe(n),i={id:`array_${e.id+"_"+cs(Me(t))}`,tag:"Array",childType:e,length:t,trait:r};return r.receiverType=i,i}var Ys=new Map;function $a(e){if(Ys.has(e))return Ys.get(e);let t=at(),n=Oe(t),r={id:`slice_${e.id}`,tag:"Slice",childType:e,trait:n};return n.receiverType=r,Ys.set(e,r),r}function ru(e){let n=X(e,"str").find(r=>O(r.value?.[0])&&r.value[0].type);if(!n||!O(n.value?.[0]))throw new Error("'str' type not found in environment. Make sure prelude is loaded.");return n.value[0].value}var qs;function Iu(){if(qs)return qs;let e=at(),t=Oe(e),n={id:"void",tag:"void",trait:t};return t.receiverType=n,qs=n,n}function Yi(e){let t=at(),n=Oe(t),r={id:`tuple_${e.map(i=>i.type.id).join("_")}`,tag:"Tuple",fields:e,trait:n};return n.receiverType=r,r}function _i(e,t=!1,n=!1){let r=Oe(e),i={id:`struct_${Ye(e.modulePath)}`,tag:"Struct",isReferenceSemantics:t,isNewtype:n,fields:[],trait:r,env:e};return r.receiverType=i,i}function ba(e){return{id:`module_${Ye(e.modulePath)}`,tag:"Module",fields:[],env:e,trait:void 0}}function Oe(e){return{id:`trait_${Ye(e.modulePath)}`,tag:"Trait",fields:[],env:e,trait:void 0}}function Su(e){let t=Oe(e),n={id:`enum_${Ye(e.modulePath)}`,tag:"Enum",variants:[],trait:t,env:e};return t.receiverType=n,n}function Nu(e){let t=Oe(e),n={id:`union_${Ye(e.modulePath)}`,tag:"Union",fields:[],trait:t,env:e};return t.receiverType=n,n}function ci({parameters:e,forallParameters:t,implicitParameters:n,variadicParameter:r,whereClauseExprs:i,return_:o,env:a,parametersFrame:s,SelfType:l,SelfTraitType:u,SelfModuleType:_,isClosure:c}){let f=at(),p=Oe(f),m={id:`fn_${Ye(a.modulePath)}`,tag:"Function",parameters:e,forallParameters:t,implicitParameters:n??[],variadicParameter:r,whereClauseExprs:i,return:o,env:a,parametersFrame:s,SelfType:l,SelfTraitType:u,SelfModuleType:_,trait:p,isClosure:c};return p.receiverType=m,m}var Hs=new Map;function fi(e){if(Hs.has(e))return Hs.get(e);let t=at(),n=Oe(t),r={id:`ptr_${e.id}`,tag:"Ptr",childType:e,trait:n};return n.receiverType=r,Hs.set(e,r),r}var js=new Map;function xu(e,t){if(js.has(e))return js.get(e);let n=Oe(t),r={id:`iso_${e.id}`,tag:"Iso",childType:e,trait:n,env:t};return n.receiverType=r,js.set(e,r),r}var Ks=new Map;function Vu(e,t){if(Ks.has(e))return Ks.get(e);let n=Oe(t),r={id:`arc_${e.id}`,tag:"Arc",childType:e,trait:n,env:t};return n.receiverType=r,Ks.set(e,r),r}function Cn(e,t,{id:n,requiredTraits:r,negativeTraits:i,recursiveTypeRef:o,env:a,context:s}){if(e.level!==0)throw console.trace(),new Error(`createSomeType expects a type with level 0, got level ${e.level}`);let l=Oe(a),u=r?.map(f=>({traitType:f,frameLevel:-1}))??[],_=i?.map(f=>({traitType:f,frameLevel:-1}))??[],c={id:n??`sometype_${Ye(a.modulePath)}`,tag:"SomeType",name:t,definitionFrameLevel:a.frames.length>0?a.frames.length-1:void 0,parentType:e,size:void 0,requiredTraits:u,negativeTraits:_,trait:l,isExtern:e.isExtern,externName:e.externName,recursiveTypeRef:o};return l.receiverType=c,xn(a,"Runtime")&&tn("Runtime",c,a,s),cu({someType:c,env:a,context:{SelfType:c,stdPath:""}}),c}var Ea=new Map;function pi(e,t){let n=Oe(t),r=gn(1),i={id:`effects_row_sometype_${Ye(t.modulePath)}`,tag:"SomeType",name:e,definitionFrameLevel:t.frames.length>0?t.frames.length-1:void 0,parentType:r,size:void 0,requiredTraits:[],negativeTraits:[],trait:n,isEffectsRow:!0};return n.receiverType=i,i}function Ir(e){let t=at(),n=Oe(t),r={id:`EffectsRow_${Ye(t.modulePath)}`,tag:"EffectsRow",implicitParameters:e,trait:n};return n.receiverType=r,r}function gn(e,t){if(Ea.has(e)){let i=Ea.get(e);if(i.has(t))return i.get(t)}else Ea.set(e,new Map);let n=Oe(at()),r={id:`Type(${e})`,tag:"Type",level:e,baseType:t,trait:n};return n.receiverType=r,Ea.get(e).set(t,r),r}function di({expr:e,labelExpr:t,typeExpr:n,defaultValueExpr:r,assignedValueExpr:i}){return{expr:e,labelExpr:t,typeExpr:n,defaultValueExpr:r,assignedValueExpr:i}}function Du(e,t){let n=`fn_trait_${e.id}`,r=Oe(t);return r.isFn={callType:e},r.id=n,r.receiverType=void 0,r}function vu(e){return e.fields.map(n=>{if(n.type.tag==="Function"){let r=n.type,i=r.parameters.map(a=>`${a.label}:${A(a.type)}`).join(","),o=A(r.return.type);return`${n.label}:(${i})->${o}`}return`${n.label}:${A(n.type)}`}).join(";")}function Do({requiredTraits:e,env:t,negativeTraits:n}){let r=Oe(t),i=e.map(_=>vu(_)).join("__"),o=n?n.map(_=>vu(_)).join("__"):"",a=`dyn_${cs(i+(o?`_neg_${o}`:""))}`,s=e.map(_=>({traitType:_,frameLevel:-1}))??[],l=n?.map(_=>({traitType:_,frameLevel:-1}))??[],u={id:a,tag:"Dyn",requiredTraits:s,negativeTraits:l,trait:r,env:t};return r.receiverType=u,u}function Mu(e,t){return!He(e)||!He(t)?!1:t.level===e.level&&(t.tag===e.tag||e.tag==="Type")}function Dn(e,t,n=new Set){if(n.has(t.id))return!1;if(n.add(t.id),V(t))return e===t.id;if(_e(t))return t.fields.some(r=>Dn(e,r.type,n));if(ge(t))return t.variants.some(r=>r.fields?r.fields.some(i=>Dn(e,i.type,n)):!1);if(we(t))return t.fields.some(r=>Dn(e,r.type,n));if(ke(t)||Qe(t)||xt(t))return Dn(e,t.childType,n);if(Ie(t))return!1;if(wt(t)||bt(t))return Dn(e,t.childType,n);if(G(t))return t.parameters.some(r=>Dn(e,r.type,n))||Dn(e,t.return.type,n);if(Kt(t)){if(Dn(e,t.isFuture.outputType,n))return!0;for(let r of t.isFuture.effects)if(Dn(e,r.type,n))return!0;return!1}return kt(t)?Dn(e,t.isFn.callType,n):!1}function Ze(e,t,n=[]){if(n.find(r=>r.expected===e.type&&r.given===t.type))return{expectedEnv:e.env,givenEnv:t.env};if(n.push({expected:e.type,given:t.type}),V(e.type)&&V(t.type)){let r=Ot(e.env,e.type),i=Ot(t.env,t.type);if(V(r))if(V(i)){if(r!==i){let o=ee(t.type);{let a=X(e.env,e.type.name),s=a[a.length-1];if(s)e.env=Be(e.env,s,{...s,value:[o]});else{let{env:l}=me({env:e.env,variable:{name:e.type.name,value:[o],type:o.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=l}}{let a=X(t.env,t.type.name),s=a[a.length-1];if(s)t.env=Be(t.env,s,{...s,value:[o]});else{let{env:l}=me({env:t.env,variable:{name:t.type.name,value:[o],type:o.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});t.env=l}}}}else{let o=ee(i),a=X(e.env,e.type.name),s=a[a.length-1];if(s)e.env=Be(e.env,s,{...s,value:[o]});else{let{env:l}=me({env:e.env,variable:{name:e.type.name,value:[o],type:o.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=l}}else{let o=ee(r),a=X(t.env,t.type.name),s=a[a.length-1];if(s)t.env=Be(t.env,s,{...s,value:[o]});else{let{env:l}=me({env:t.env,variable:{name:t.type.name,value:[o],type:o.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});t.env=l}}if(e.type.id!==t.type.id&&e.type.requiredTraits&&t.type.requiredTraits){let o=e.type.requiredTraits,a=t.type.requiredTraits;for(let s=0;s<o.length;s++){let l=o[s].traitType;if(kt(l)){let u=a.find(_=>kt(_.traitType));if(u&&kt(u.traitType)){let{expectedEnv:_,givenEnv:c}=Ze({type:l.isFn.callType,env:e.env},{type:u.traitType.isFn.callType,env:t.env},n);e.env=_,t.env=c}}else if(Kt(l)){let u=a.find(_=>Kt(_.traitType));if(u&&Kt(u.traitType)){let{expectedEnv:_,givenEnv:c}=Ze({type:l.isFuture.outputType,env:e.env},{type:u.traitType.isFuture.outputType,env:t.env},n);e.env=_,t.env=c,Xs(l.isFuture.effects,u.traitType.isFuture.effects,e,t,n)}}}}}else if(V(e.type)){let r=Ot(e.env,e.type);if(V(r)&&(r.id===e.type.id||r.name===e.type.name)){if(Dn(e.type.id,t.type))throw new Error(`Cannot unify type variable "${e.type.name}" with type "${A(t.type)}" because it would create an infinite type.`);let i=ee(t.type),o=X(e.env,e.type.name),a=o[o.length-1];if(a)a&&(e.env=Be(e.env,a,{...a,value:[i]}));else{let{env:s}=me({env:e.env,variable:{name:e.type.name,value:[i],type:i.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=s}if(e.type.requiredTraits){for(let{traitType:s}of e.type.requiredTraits)if(kt(s)&&G(t.type)){let l=s.isFn.callType,{expectedEnv:u,givenEnv:_}=Ze({type:l,env:e.env},{type:t.type,env:t.env},n);e.env=u,t.env=_}else if(Kt(s)&&Kt(t.type)){let{expectedEnv:l,givenEnv:u}=Ze({type:s.isFuture.outputType,env:e.env},{type:t.type.isFuture.outputType,env:t.env},n);e.env=l,t.env=u,Xs(s.isFuture.effects,t.type.isFuture.effects,e,t,n)}}}else if(!V(r)){let{expectedEnv:i,givenEnv:o}=Ze({type:r,env:e.env},{type:t.type,env:t.env},n);e.env=i,t.env=o}}else if(V(t.type)){let r=Ot(t.env,t.type);if(V(r)){if(Dn(t.type.id,e.type))throw new Error(`Cannot unify type variable "${t.type.name}" with type "${A(e.type)}" because it would create an infinite type.`);let i=ee(e.type),o=X(t.env,t.type.name),a=o[o.length-1];if(a)a&&(t.env=Be(t.env,a,{...a,value:[i]}));else{let{env:s}=me({env:t.env,variable:{name:t.type.name,value:[i],type:i.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});t.env=s}}else{let{expectedEnv:i,givenEnv:o}=Ze({type:e.type,env:e.env},{type:r,env:t.env},n);e.env=i,t.env=o}}else if(we(e.type)&&we(t.type)&&e.type.fields.length===t.type.fields.length)for(let r=0;r<e.type.fields.length;r++){let{expectedEnv:i,givenEnv:o}=Ze({type:e.type.fields[r].type,env:e.env},{type:t.type.fields[r].type,env:t.env},n);e.env=i,t.env=o}else{if(we(e.type)&&we(t.type))throw new Error(`Cannot unify incompatible tuple types: "${A(e.type)}" and "${A(t.type)}"`);if(_e(e.type)&&_e(t.type)){if(!(e.type.id===t.type.id||e.type.functionValue&&t.type.functionValue&&e.type.functionValue===t.type.functionValue)){if(!(e.type.functionValue&&t.type.functionValue&&e.type.functionValue.funcId===t.type.functionValue.funcId))throw new Error(`Cannot unify incompatible struct types: "${A(e.type)}" and "${A(t.type)}"`)}for(let r=0;r<e.type.fields.length;r++){let i=e.type.fields[r],o=t.type.fields[r],{expectedEnv:a,givenEnv:s}=Ze({type:i.type,env:e.env},{type:o.type,env:t.env},n);if(e.env=a,t.env=s,i.assignedValue&&o.assignedValue&&O(i.assignedValue)&&O(o.assignedValue)){let{expectedEnv:l,givenEnv:u}=Ze({type:i.assignedValue.value,env:e.env},{type:o.assignedValue.value,env:t.env},n);e.env=l,t.env=u}}}else if(ge(e.type)&&ge(t.type)&&(e.type.id===t.type.id||e.type.functionValue&&t.type.functionValue&&e.type.functionValue===t.type.functionValue))for(let r=0;r<e.type.variants.length;r++){let i=e.type.variants[r],o=t.type.variants[r],a=i.fields??[],s=o.fields??[];for(let l=0;l<a.length;l++){let{expectedEnv:u,givenEnv:_}=Ze({type:a[l].type,env:e.env},{type:s[l].type,env:t.env},n);e.env=u,t.env=_}}else{if(ge(e.type)&&ge(t.type))throw new Error(`Cannot unify incompatible enum types: "${A(e.type)}" and "${A(t.type)}"`);if(Te(e.type)&&Te(t.type)&&e.type.functionValue&&t.type.functionValue&&e.type.functionValue===t.type.functionValue)for(let r=0;r<e.type.fields.length;r++){let i=e.type.fields[r],o=t.type.fields[r],{expectedEnv:a,givenEnv:s}=Ze({type:i.type,env:e.env},{type:o.type,env:t.env},n);if(e.env=a,t.env=s,i.assignedValue&&o.assignedValue&&O(i.assignedValue)&&O(o.assignedValue)){let{expectedEnv:l,givenEnv:u}=Ze({type:i.assignedValue.value,env:e.env},{type:o.assignedValue.value,env:t.env},n);e.env=l,t.env=u}}else if(De(e.type)&&De(t.type)&&e.type.functionValue&&t.type.functionValue&&e.type.functionValue===t.type.functionValue)for(let r=0;r<e.type.fields.length;r++){let i=e.type.fields[r],o=t.type.fields[r],{expectedEnv:a,givenEnv:s}=Ze({type:i.type,env:e.env},{type:o.type,env:t.env},n);if(e.env=a,t.env=s,i.assignedValue&&o.assignedValue&&O(i.assignedValue)&&O(o.assignedValue)){let{expectedEnv:l,givenEnv:u}=Ze({type:i.assignedValue.value,env:e.env},{type:o.assignedValue.value,env:t.env},n);e.env=l,t.env=u}}else if(Ie(e.type)&&Ie(t.type)){let{expectedEnv:r,givenEnv:i}=Ze({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);e.env=r,t.env=i}else if(wt(e.type)&&wt(t.type)){let{expectedEnv:r,givenEnv:i}=Ze({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);e.env=r,t.env=i}else if(bt(e.type)&&bt(t.type)){let{expectedEnv:r,givenEnv:i}=Ze({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);e.env=r,t.env=i}else if(ke(e.type)&&ke(t.type)){let{expectedEnv:r,givenEnv:i}=Ze({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);if(e.env=r,t.env=i,de(e.type.length)&&e.type.length.variableName&&!de(t.type.length)){let o=e.type.length.variableName,a=t.type.length,s=X(e.env,o),l=s[s.length-1];if(l)l&&(e.env=Be(e.env,l,{...l,value:[a]}));else{let{env:u}=me({env:e.env,variable:{name:o,value:[a],type:t.type.length.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=u}}}else if(Qe(e.type)&&Qe(t.type)){let{expectedEnv:r,givenEnv:i}=Ze({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);e.env=r,t.env=i}else if(xt(e.type)&&xt(t.type)){let{expectedEnv:r,givenEnv:i}=Ze({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);e.env=r,t.env=i}else if(Kt(e.type)&&Kt(t.type)){let{expectedEnv:r,givenEnv:i}=Ze({type:e.type.isFuture.outputType,env:e.env},{type:t.type.isFuture.outputType,env:t.env},n);e.env=r,t.env=i,Xs(e.type.isFuture.effects,t.type.isFuture.effects,e,t,n)}else if(kt(e.type)&&kt(t.type)){let r=e.type,i=t.type,{expectedEnv:o,givenEnv:a}=Ze({type:r.isFn.callType,env:e.env},{type:i.isFn.callType,env:t.env},n);e.env=o,t.env=a}else if(G(e.type)&&G(t.type)&&e.type.forallParameters.length===t.type.forallParameters.length&&e.type.parameters.length===t.type.parameters.length){let r=e.type,i=t.type;for(let s=0;s<r.forallParameters.length;s++){let l=r.forallParameters[s],u=i.forallParameters[s],{expectedEnv:_,givenEnv:c}=Ze({type:l.type,env:e.env},{type:u.type,env:t.env},n);e.env=_,t.env=c}for(let s=0;s<r.parameters.length;s++){let{expectedEnv:l,givenEnv:u}=Ze({type:r.parameters[s].type,env:e.env},{type:i.parameters[s].type,env:t.env},n);e.env=l,t.env=u}{let s=r.implicitParameters,l=[];for(let p of i.implicitParameters)p.isEffectRowSpread?ot(p.type)&&l.push(...p.type.implicitParameters):l.push(p);let u=[],_=[],c=[];for(let p of s)p.isEffectRowSpread?ot(p.type)?_.push(p):V(p.type)&&p.type.isEffectsRow&&c.push(p):u.push(p);if(c.length>1)throw new Error(`Ambiguous effect row unification: multiple unsolved effect row variables (${c.map(p=>p.label).join(", ")}). At most one effect row spread can be unsolved during type unification.`);let f=new Set;for(let p of u)for(let m=0;m<l.length;m++)if(!f.has(m)&&p.type.id===l[m].type.id){let{expectedEnv:g,givenEnv:h}=Ze({type:p.type,env:e.env},{type:l[m].type,env:t.env},n);e.env=g,t.env=h,f.add(m);break}for(let p of _){let m=p.type.implicitParameters;for(let g of m)for(let h=0;h<l.length;h++)if(!f.has(h)&&g.type.id===l[h].type.id){let{expectedEnv:d,givenEnv:v}=Ze({type:g.type,env:e.env},{type:l[h].type,env:t.env},n);e.env=d,t.env=v,f.add(h);break}}if(c.length===1){let p=c[0],m=[];for(let g=0;g<l.length;g++)f.has(g)||m.push(l[g]);if(V(p.type)&&p.type.isEffectsRow){let g=Ir(m),h=ee(g),d=X(e.env,p.type.name),v=d[d.length-1];if(v)e.env=Be(e.env,v,{...v,value:[h]});else{let{env:T}=me({env:e.env,variable:{name:p.type.name,value:[h],type:h.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=T}}}}let{expectedEnv:o,givenEnv:a}=Ze({type:r.return.type,env:e.env},{type:i.return.type,env:t.env},n);e.env=o,t.env=a}else if(!(He(e.type)&&!He(t.type))){if(e.type.tag!==t.type.tag)throw new Error(`Cannot unify incompatible types:
|
|
149
|
+
})`}function pu({arcType:e,env:t,context:n}){let r=Ym(e),i=qm(e),o=Hm(e);return t=wn({label:k.___dispose[0],functionCode:r,SelfType:e,env:t,context:n}),t=wn({label:k.___drop[0],functionCode:i,SelfType:e,env:t,context:n}),t=wn({label:k.___dup[0],functionCode:o,SelfType:e,env:t,context:n}),t}function tn(e,t,n,r){let i=`${e}()`,o=Jt(i),a=S({expr:o,env:n,context:{...r,expectedType:void 0,ReceiverType:t}});if(!a.$||!Tt(a.$.value))return n;n=a.$.env;let s=a.$.value;s.type.receiverType=t;let l={label:"",type:hn(1),assignedValue:s,sourceModulePath:r.currentModulePath,exprs:{expr:o}};return t.trait.fields.push(l),n}function jm({structType:e,env:t,context:n}){return e.isReferenceSemantics||e.fields.every(i=>xo(i.type,t))&&(t=tn("Send",e,t,n)),t}function Km({structType:e,env:t,context:n}){return e.isReferenceSemantics&&(t=tn("Rc",e,t,n)),t}function Xm({enumType:e,env:t,context:n}){return e.variants.every(i=>!i.fields||i.fields.length===0?!0:i.fields.every(o=>xo(o.type,t)))&&(t=tn("Send",e,t,n)),t}function du({unionType:e,env:t,context:n}){return e.fields.every(i=>xo(i.type,t))&&(t=tn("Send",e,t,n)),t}function Qm({structType:e,env:t,context:n}){return e.isReferenceSemantics?Lr(e,new Set,t)||(t=tn("Acyclic",e,t,n)):e.fields.every(i=>ri(i.type,t))&&(t=tn("Acyclic",e,t,n)),t}function Zm({enumType:e,env:t,context:n}){return e.variants.every(i=>!i.fields||i.fields.length===0?!0:i.fields.every(o=>ri(o.type,t)))&&(t=tn("Acyclic",e,t,n)),t}function mu({unionType:e,env:t,context:n}){return e.fields.every(i=>ri(i.type,t))&&(t=tn("Acyclic",e,t,n)),t}function Jm({structType:e,env:t,context:n}){return e.isReferenceSemantics||e.fields.every(i=>ai(i.type,t,new Set([e.id])))&&(t=tn("Comptime",e,t,n)),t}function ey({enumType:e,env:t,context:n}){return e.variants.every(i=>!i.fields||i.fields.length===0?!0:i.fields.every(o=>ai(o.type,t,new Set([e.id]))))&&(t=tn("Comptime",e,t,n)),t}function ty({structType:e,env:t,context:n}){return e.isReferenceSemantics?(t=tn("Runtime",e,t,n),t):(e.fields.every(i=>si(i.type,t,new Set([e.id])))&&(t=tn("Runtime",e,t,n)),t)}function ny({enumType:e,env:t,context:n}){return e.variants.every(i=>!i.fields||i.fields.length===0?!0:i.fields.every(o=>si(o.type,t,new Set([e.id]))))&&(t=tn("Runtime",e,t,n)),t}function yu({unionType:e,env:t,context:n}){return t=tn("Runtime",e,t,n),t}function ry({tupleType:e,env:t,context:n}){return e.fields.every(i=>xo(i.type,t))&&(t=tn("Send",e,t,n)),t}function iy({tupleType:e,env:t,context:n}){return e.fields.every(i=>ai(i.type,t,new Set([e.id])))&&(t=tn("Comptime",e,t,n)),t}function oy({tupleType:e,env:t,context:n}){return e.fields.every(i=>si(i.type,t,new Set([e.id])))&&(t=tn("Runtime",e,t,n)),t}function li({structType:e,env:t,context:n,errorToken:r}){return t=jm({structType:e,env:t,context:n}),t=Km({structType:e,env:t,context:n}),t=Qm({structType:e,env:t,context:n}),t=Jm({structType:e,env:t,context:n}),t=ty({structType:e,env:t,context:n}),t=Vm({structType:e,env:t,context:n}),Ta(e,t,r,n),t}function gu({enumType:e,env:t,context:n,errorToken:r}){return t=Xm({enumType:e,env:t,context:n}),t=Zm({enumType:e,env:t,context:n}),t=ey({enumType:e,env:t,context:n}),t=ny({enumType:e,env:t,context:n}),t=Om({enumType:e,env:t,context:n}),Ta(e,t,r,n),t}function hu({tupleType:e,env:t,context:n,errorToken:r}){return t=ry({tupleType:e,env:t,context:n}),t=iy({tupleType:e,env:t,context:n}),t=oy({tupleType:e,env:t,context:n}),Ta(e,t,r,n),t}function xn(e,t){let n=X(e,t);if(n.length===0)return;let r=n[n.length-1];if(r.value&&O(r.value[0])){let i=r.value[0];if(De(i.value))return i.value}}function Ot(e,t){let n=t.definitionFrameLevel;if(n!==void 0&&n>=0){let o=e.frames[n];if(o){let a=o.variables.find(s=>s.name===t.name&&s.value?.[0]?.tag==="Type");if(a&&a.value){let s=a.value[0];if(s.value===t||V(s.value)&&s.value.id===t.id)return t;V(s.value)&&(s.value.id,t.id)}}}let r,i=new Set;do{if(i.has(t))return t;i.add(t);let o=X(e,t.name,a=>a.value?.[0]?.tag==="Type");if(!o.length||(r=o[o.length-1].value[0],r.value===t))return t;if(V(r.value)){if(r.value.name===t.name&&r.value.id!==t.id){let a=!1;for(let s=e.frames.length-1;s>=0;s--){let l=e.frames[s];if(l){for(let u of l.variables)if(u.name===t.name&&u.value){let _=u.value[0];if(_?.tag==="Type"&&_.value===t){a=!0;break}}if(a)break}}if(!a)return t}t=r.value}else{let a=!1;for(let s=e.frames.length-1;s>=0;s--){let l=e.frames[s];if(l){for(let u of l.variables)if(u.name===t.name&&u.value){let _=u.value[0];if(_?.tag==="Type"){let c=_;if(c.value===t){a=!0;break}if(V(c.value)&&c.value.id!==t.id)return t}}if(a)break}}if(!a)return t;break}}while(V(t));return r.value}var ys=null;function fr(){if(ys)return ys;let e=at(),t=Oe(e),n={id:"comptime_int",tag:"comptime_int",trait:t};return t.receiverType=n,ys=n,n}var gs=null;function Li(){if(gs)return gs;let e=at(),t=Oe(e),n={id:"comptime_float",tag:"comptime_float",trait:t};return t.receiverType=n,gs=n,n}var hs=null;function Vt(){if(hs)return hs;let e=at(),t=Oe(e),n={id:"comptime_string",tag:"comptime_string",trait:t};return t.receiverType=n,hs=n,n}var vs=null;function cn(){if(vs)return vs;let e=at(),t=Oe(e),n={id:"Expr",tag:"Expr",trait:t};return t.receiverType=n,vs=n,n}var Ts=new Map;function Io(e){if(Ts.has(e))return Ts.get(e);let t=at(),n=Oe(t),i={id:`comptime_list_${e.id}`,tag:"ComptimeList",childType:e,trait:n};return n.receiverType=i,Ts.set(e,i),i}function Vo(){return Io(cn())}var Es=null;function Je(){if(Es)return Es;let e=at(),t=Oe(e),n={id:"bool",tag:"bool",trait:t};return t.receiverType=n,Es=n,n}var $s=null;function gt(){if($s)return $s;let e=at(),t=Oe(e),n={id:"usize",tag:"usize",trait:t};return t.receiverType=n,$s=n,n}var bs=null;function Ai(){if(bs)return bs;let e=at(),t=Oe(e),n={id:"isize",tag:"isize",trait:t};return t.receiverType=n,bs=n,n}var Cs=null;function Ii(){if(Cs)return Cs;let e=at(),t=Oe(e),n={id:"u8",tag:"u8",trait:t};return t.receiverType=n,Cs=n,n}var ks=null;function Si(){if(ks)return ks;let e=at(),t=Oe(e),n={id:"i8",tag:"i8",trait:t};return t.receiverType=n,ks=n,n}var ws=null;function Ni(){if(ws)return ws;let e=at(),t=Oe(e),n={id:"u16",tag:"u16",trait:t};return t.receiverType=n,ws=n,n}var Fs=null;function xi(){if(Fs)return Fs;let e=at(),t=Oe(e),n={id:"i16",tag:"i16",trait:t};return t.receiverType=n,Fs=n,n}var Ls=null;function Vi(){if(Ls)return Ls;let e=at(),t=Oe(e),n={id:"u32",tag:"u32",trait:t};return t.receiverType=n,Ls=n,n}var As=null;function Pr(){if(As)return As;let e=at(),t=Oe(e),n={id:"i32",tag:"i32",trait:t};return t.receiverType=n,As=n,n}var Is=null;function Di(){if(Is)return Is;let e=at(),t=Oe(e),n={id:"u64",tag:"u64",trait:t};return t.receiverType=n,Is=n,n}var Ss=null;function Mi(){if(Ss)return Ss;let e=at(),t=Oe(e),n={id:"i64",tag:"i64",trait:t};return t.receiverType=n,Ss=n,n}var Ns=null;function Oi(){if(Ns)return Ns;let e=at(),t=Oe(e),n={id:"f32",tag:"f32",trait:t};return t.receiverType=n,Ns=n,n}var xs=null;function zr(){if(xs)return xs;let e=at(),t=Oe(e),n={id:"f64",tag:"f64",trait:t};return t.receiverType=n,xs=n,n}var Vs=null;function Vn(){if(Vs)return Vs;let e=at(),t=Oe(e),n={id:"unit",tag:"unit",trait:t};return t.receiverType=n,Vs=n,n}var Ds=null;function Tu(){if(Ds)return Ds;let e=at(),t=Oe(e),n={id:"char",tag:"char",trait:t};return t.receiverType=n,Ds=n,n}var Ms=null;function Eu(){if(Ms)return Ms;let e=at(),t=Oe(e),n={id:"short",tag:"short",trait:t};return t.receiverType=n,Ms=n,n}var Os=null;function $u(){if(Os)return Os;let e=at(),t=Oe(e),n={id:"ushort",tag:"ushort",trait:t};return t.receiverType=n,Os=n,n}var Rs=null;function bu(){if(Rs)return Rs;let e=at(),t=Oe(e),n={id:"int",tag:"int",trait:t};return t.receiverType=n,Rs=n,n}var Ps=null;function Cu(){if(Ps)return Ps;let e=at(),t=Oe(e),n={id:"uint",tag:"uint",trait:t};return t.receiverType=n,Ps=n,n}var zs=null;function ku(){if(zs)return zs;let e=at(),t=Oe(e),n={id:"long",tag:"long",trait:t};return t.receiverType=n,zs=n,n}var Us=null;function wu(){if(Us)return Us;let e=at(),t=Oe(e),n={id:"ulong",tag:"ulong",trait:t};return t.receiverType=n,Us=n,n}var Bs=null;function Fu(){if(Bs)return Bs;let e=at(),t=Oe(e),n={id:"longlong",tag:"longlong",trait:t};return t.receiverType=n,Bs=n,n}var Gs=null;function Lu(){if(Gs)return Gs;let e=at(),t=Oe(e),n={id:"ulonglong",tag:"ulonglong",trait:t};return t.receiverType=n,Gs=n,n}var Ws=null;function Au(){if(Ws)return Ws;let e=at(),t=Oe(e),n={id:"longdouble",tag:"longdouble",trait:t};return t.receiverType=n,Ws=n,n}function tt(e){return hn(0,e)}function hr(e,t){let n=at(),r=Oe(n),i={id:`array_${e.id+"_"+cs(Me(t))}`,tag:"Array",childType:e,length:t,trait:r};return r.receiverType=i,i}var Ys=new Map;function $a(e){if(Ys.has(e))return Ys.get(e);let t=at(),n=Oe(t),r={id:`slice_${e.id}`,tag:"Slice",childType:e,trait:n};return n.receiverType=r,Ys.set(e,r),r}function ru(e){let n=X(e,"str").find(r=>O(r.value?.[0])&&r.value[0].type);if(!n||!O(n.value?.[0]))throw new Error("'str' type not found in environment. Make sure prelude is loaded.");return n.value[0].value}var qs;function Iu(){if(qs)return qs;let e=at(),t=Oe(e),n={id:"void",tag:"void",trait:t};return t.receiverType=n,qs=n,n}function Yi(e){let t=at(),n=Oe(t),r={id:`tuple_${e.map(i=>i.type.id).join("_")}`,tag:"Tuple",fields:e,trait:n};return n.receiverType=r,r}function _i(e,t=!1,n=!1){let r=Oe(e),i={id:`struct_${Ye(e.modulePath)}`,tag:"Struct",isReferenceSemantics:t,isNewtype:n,fields:[],trait:r,env:e};return r.receiverType=i,i}function ba(e){return{id:`module_${Ye(e.modulePath)}`,tag:"Module",fields:[],env:e,trait:void 0}}function Oe(e){return{id:`trait_${Ye(e.modulePath)}`,tag:"Trait",fields:[],env:e,trait:void 0}}function Su(e){let t=Oe(e),n={id:`enum_${Ye(e.modulePath)}`,tag:"Enum",variants:[],trait:t,env:e};return t.receiverType=n,n}function Nu(e){let t=Oe(e),n={id:`union_${Ye(e.modulePath)}`,tag:"Union",fields:[],trait:t,env:e};return t.receiverType=n,n}function ci({parameters:e,forallParameters:t,implicitParameters:n,variadicParameter:r,whereClauseExprs:i,return_:o,env:a,parametersFrame:s,SelfType:l,SelfTraitType:u,SelfModuleType:_,isClosure:c}){let f=at(),p=Oe(f),m={id:`fn_${Ye(a.modulePath)}`,tag:"Function",parameters:e,forallParameters:t,implicitParameters:n??[],variadicParameter:r,whereClauseExprs:i,return:o,env:a,parametersFrame:s,SelfType:l,SelfTraitType:u,SelfModuleType:_,trait:p,isClosure:c};return p.receiverType=m,m}var Hs=new Map;function fi(e){if(Hs.has(e))return Hs.get(e);let t=at(),n=Oe(t),r={id:`ptr_${e.id}`,tag:"Ptr",childType:e,trait:n};return n.receiverType=r,Hs.set(e,r),r}var js=new Map;function xu(e,t){if(js.has(e))return js.get(e);let n=Oe(t),r={id:`iso_${e.id}`,tag:"Iso",childType:e,trait:n,env:t};return n.receiverType=r,js.set(e,r),r}var Ks=new Map;function Vu(e,t){if(Ks.has(e))return Ks.get(e);let n=Oe(t),r={id:`arc_${e.id}`,tag:"Arc",childType:e,trait:n,env:t};return n.receiverType=r,Ks.set(e,r),r}function Cn(e,t,{id:n,requiredTraits:r,negativeTraits:i,recursiveTypeRef:o,env:a,context:s}){if(e.level!==0)throw console.trace(),new Error(`createSomeType expects a type with level 0, got level ${e.level}`);let l=Oe(a),u=r?.map(f=>({traitType:f,frameLevel:-1}))??[],_=i?.map(f=>({traitType:f,frameLevel:-1}))??[],c={id:n??`sometype_${Ye(a.modulePath)}`,tag:"SomeType",name:t,definitionFrameLevel:a.frames.length>0?a.frames.length-1:void 0,parentType:e,size:void 0,requiredTraits:u,negativeTraits:_,trait:l,isExtern:e.isExtern,externName:e.externName,recursiveTypeRef:o};return l.receiverType=c,xn(a,"Runtime")&&tn("Runtime",c,a,s),cu({someType:c,env:a,context:{SelfType:c,stdPath:""}}),c}var Ea=new Map;function pi(e,t){let n=Oe(t),r=hn(1),i={id:`effects_row_sometype_${Ye(t.modulePath)}`,tag:"SomeType",name:e,definitionFrameLevel:t.frames.length>0?t.frames.length-1:void 0,parentType:r,size:void 0,requiredTraits:[],negativeTraits:[],trait:n,isEffectsRow:!0};return n.receiverType=i,i}function Ir(e){let t=at(),n=Oe(t),r={id:`EffectsRow_${Ye(t.modulePath)}`,tag:"EffectsRow",implicitParameters:e,trait:n};return n.receiverType=r,r}function hn(e,t){if(Ea.has(e)){let i=Ea.get(e);if(i.has(t))return i.get(t)}else Ea.set(e,new Map);let n=Oe(at()),r={id:`Type(${e})`,tag:"Type",level:e,baseType:t,trait:n};return n.receiverType=r,Ea.get(e).set(t,r),r}function di({expr:e,labelExpr:t,typeExpr:n,defaultValueExpr:r,assignedValueExpr:i}){return{expr:e,labelExpr:t,typeExpr:n,defaultValueExpr:r,assignedValueExpr:i}}function Du(e,t){let n=`fn_trait_${e.id}`,r=Oe(t);return r.isFn={callType:e},r.id=n,r.receiverType=void 0,r}function vu(e){return e.fields.map(n=>{if(n.type.tag==="Function"){let r=n.type,i=r.parameters.map(a=>`${a.label}:${A(a.type)}`).join(","),o=A(r.return.type);return`${n.label}:(${i})->${o}`}return`${n.label}:${A(n.type)}`}).join(";")}function Do({requiredTraits:e,env:t,negativeTraits:n}){let r=Oe(t),i=e.map(_=>vu(_)).join("__"),o=n?n.map(_=>vu(_)).join("__"):"",a=`dyn_${cs(i+(o?`_neg_${o}`:""))}`,s=e.map(_=>({traitType:_,frameLevel:-1}))??[],l=n?.map(_=>({traitType:_,frameLevel:-1}))??[],u={id:a,tag:"Dyn",requiredTraits:s,negativeTraits:l,trait:r,env:t};return r.receiverType=u,u}function Mu(e,t){return!He(e)||!He(t)?!1:t.level===e.level&&(t.tag===e.tag||e.tag==="Type")}function Dn(e,t,n=new Set){if(n.has(t.id))return!1;if(n.add(t.id),V(t))return e===t.id;if(_e(t))return t.fields.some(r=>Dn(e,r.type,n));if(ge(t))return t.variants.some(r=>r.fields?r.fields.some(i=>Dn(e,i.type,n)):!1);if(we(t))return t.fields.some(r=>Dn(e,r.type,n));if(ke(t)||Qe(t)||xt(t))return Dn(e,t.childType,n);if(Ie(t))return!1;if(wt(t)||bt(t))return Dn(e,t.childType,n);if(G(t))return t.parameters.some(r=>Dn(e,r.type,n))||Dn(e,t.return.type,n);if(Kt(t)){if(Dn(e,t.isFuture.outputType,n))return!0;for(let r of t.isFuture.effects)if(Dn(e,r.type,n))return!0;return!1}return kt(t)?Dn(e,t.isFn.callType,n):!1}function Ze(e,t,n=[]){if(n.find(r=>r.expected===e.type&&r.given===t.type))return{expectedEnv:e.env,givenEnv:t.env};if(n.push({expected:e.type,given:t.type}),V(e.type)&&V(t.type)){let r=Ot(e.env,e.type),i=Ot(t.env,t.type);if(V(r))if(V(i)){if(r!==i){let o=ee(t.type);{let a=X(e.env,e.type.name),s=a[a.length-1];if(s)e.env=Be(e.env,s,{...s,value:[o]});else{let{env:l}=me({env:e.env,variable:{name:e.type.name,value:[o],type:o.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=l}}{let a=X(t.env,t.type.name),s=a[a.length-1];if(s)t.env=Be(t.env,s,{...s,value:[o]});else{let{env:l}=me({env:t.env,variable:{name:t.type.name,value:[o],type:o.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});t.env=l}}}}else{let o=ee(i),a=X(e.env,e.type.name),s=a[a.length-1];if(s)e.env=Be(e.env,s,{...s,value:[o]});else{let{env:l}=me({env:e.env,variable:{name:e.type.name,value:[o],type:o.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=l}}else{let o=ee(r),a=X(t.env,t.type.name),s=a[a.length-1];if(s)t.env=Be(t.env,s,{...s,value:[o]});else{let{env:l}=me({env:t.env,variable:{name:t.type.name,value:[o],type:o.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});t.env=l}}if(e.type.id!==t.type.id&&e.type.requiredTraits&&t.type.requiredTraits){let o=e.type.requiredTraits,a=t.type.requiredTraits;for(let s=0;s<o.length;s++){let l=o[s].traitType;if(kt(l)){let u=a.find(_=>kt(_.traitType));if(u&&kt(u.traitType)){let{expectedEnv:_,givenEnv:c}=Ze({type:l.isFn.callType,env:e.env},{type:u.traitType.isFn.callType,env:t.env},n);e.env=_,t.env=c}}else if(Kt(l)){let u=a.find(_=>Kt(_.traitType));if(u&&Kt(u.traitType)){let{expectedEnv:_,givenEnv:c}=Ze({type:l.isFuture.outputType,env:e.env},{type:u.traitType.isFuture.outputType,env:t.env},n);e.env=_,t.env=c,Xs(l.isFuture.effects,u.traitType.isFuture.effects,e,t,n)}}}}}else if(V(e.type)){let r=Ot(e.env,e.type);if(V(r)&&(r.id===e.type.id||r.name===e.type.name)){if(Dn(e.type.id,t.type))throw new Error(`Cannot unify type variable "${e.type.name}" with type "${A(t.type)}" because it would create an infinite type.`);let i=ee(t.type),o=X(e.env,e.type.name),a=o[o.length-1];if(a)a&&(e.env=Be(e.env,a,{...a,value:[i]}));else{let{env:s}=me({env:e.env,variable:{name:e.type.name,value:[i],type:i.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=s}if(e.type.requiredTraits){for(let{traitType:s}of e.type.requiredTraits)if(kt(s)&&G(t.type)){let l=s.isFn.callType,{expectedEnv:u,givenEnv:_}=Ze({type:l,env:e.env},{type:t.type,env:t.env},n);e.env=u,t.env=_}else if(Kt(s)&&Kt(t.type)){let{expectedEnv:l,givenEnv:u}=Ze({type:s.isFuture.outputType,env:e.env},{type:t.type.isFuture.outputType,env:t.env},n);e.env=l,t.env=u,Xs(s.isFuture.effects,t.type.isFuture.effects,e,t,n)}}}else if(!V(r)){let{expectedEnv:i,givenEnv:o}=Ze({type:r,env:e.env},{type:t.type,env:t.env},n);e.env=i,t.env=o}}else if(V(t.type)){let r=Ot(t.env,t.type);if(V(r)){if(Dn(t.type.id,e.type))throw new Error(`Cannot unify type variable "${t.type.name}" with type "${A(e.type)}" because it would create an infinite type.`);let i=ee(e.type),o=X(t.env,t.type.name),a=o[o.length-1];if(a)a&&(t.env=Be(t.env,a,{...a,value:[i]}));else{let{env:s}=me({env:t.env,variable:{name:t.type.name,value:[i],type:i.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});t.env=s}}else{let{expectedEnv:i,givenEnv:o}=Ze({type:e.type,env:e.env},{type:r,env:t.env},n);e.env=i,t.env=o}}else if(we(e.type)&&we(t.type)&&e.type.fields.length===t.type.fields.length)for(let r=0;r<e.type.fields.length;r++){let{expectedEnv:i,givenEnv:o}=Ze({type:e.type.fields[r].type,env:e.env},{type:t.type.fields[r].type,env:t.env},n);e.env=i,t.env=o}else{if(we(e.type)&&we(t.type))throw new Error(`Cannot unify incompatible tuple types: "${A(e.type)}" and "${A(t.type)}"`);if(_e(e.type)&&_e(t.type)){if(!(e.type.id===t.type.id||e.type.functionValue&&t.type.functionValue&&e.type.functionValue===t.type.functionValue)){if(!(e.type.functionValue&&t.type.functionValue&&e.type.functionValue.funcId===t.type.functionValue.funcId))throw new Error(`Cannot unify incompatible struct types: "${A(e.type)}" and "${A(t.type)}"`)}for(let r=0;r<e.type.fields.length;r++){let i=e.type.fields[r],o=t.type.fields[r],{expectedEnv:a,givenEnv:s}=Ze({type:i.type,env:e.env},{type:o.type,env:t.env},n);if(e.env=a,t.env=s,i.assignedValue&&o.assignedValue&&O(i.assignedValue)&&O(o.assignedValue)){let{expectedEnv:l,givenEnv:u}=Ze({type:i.assignedValue.value,env:e.env},{type:o.assignedValue.value,env:t.env},n);e.env=l,t.env=u}}}else if(ge(e.type)&&ge(t.type)&&(e.type.id===t.type.id||e.type.functionValue&&t.type.functionValue&&e.type.functionValue===t.type.functionValue))for(let r=0;r<e.type.variants.length;r++){let i=e.type.variants[r],o=t.type.variants[r],a=i.fields??[],s=o.fields??[];for(let l=0;l<a.length;l++){let{expectedEnv:u,givenEnv:_}=Ze({type:a[l].type,env:e.env},{type:s[l].type,env:t.env},n);e.env=u,t.env=_}}else{if(ge(e.type)&&ge(t.type))throw new Error(`Cannot unify incompatible enum types: "${A(e.type)}" and "${A(t.type)}"`);if(Te(e.type)&&Te(t.type)&&e.type.functionValue&&t.type.functionValue&&e.type.functionValue===t.type.functionValue)for(let r=0;r<e.type.fields.length;r++){let i=e.type.fields[r],o=t.type.fields[r],{expectedEnv:a,givenEnv:s}=Ze({type:i.type,env:e.env},{type:o.type,env:t.env},n);if(e.env=a,t.env=s,i.assignedValue&&o.assignedValue&&O(i.assignedValue)&&O(o.assignedValue)){let{expectedEnv:l,givenEnv:u}=Ze({type:i.assignedValue.value,env:e.env},{type:o.assignedValue.value,env:t.env},n);e.env=l,t.env=u}}else if(De(e.type)&&De(t.type)&&e.type.functionValue&&t.type.functionValue&&e.type.functionValue===t.type.functionValue)for(let r=0;r<e.type.fields.length;r++){let i=e.type.fields[r],o=t.type.fields[r],{expectedEnv:a,givenEnv:s}=Ze({type:i.type,env:e.env},{type:o.type,env:t.env},n);if(e.env=a,t.env=s,i.assignedValue&&o.assignedValue&&O(i.assignedValue)&&O(o.assignedValue)){let{expectedEnv:l,givenEnv:u}=Ze({type:i.assignedValue.value,env:e.env},{type:o.assignedValue.value,env:t.env},n);e.env=l,t.env=u}}else if(Ie(e.type)&&Ie(t.type)){let{expectedEnv:r,givenEnv:i}=Ze({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);e.env=r,t.env=i}else if(wt(e.type)&&wt(t.type)){let{expectedEnv:r,givenEnv:i}=Ze({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);e.env=r,t.env=i}else if(bt(e.type)&&bt(t.type)){let{expectedEnv:r,givenEnv:i}=Ze({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);e.env=r,t.env=i}else if(ke(e.type)&&ke(t.type)){let{expectedEnv:r,givenEnv:i}=Ze({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);if(e.env=r,t.env=i,de(e.type.length)&&e.type.length.variableName&&!de(t.type.length)){let o=e.type.length.variableName,a=t.type.length,s=X(e.env,o),l=s[s.length-1];if(l)l&&(e.env=Be(e.env,l,{...l,value:[a]}));else{let{env:u}=me({env:e.env,variable:{name:o,value:[a],type:t.type.length.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=u}}}else if(Qe(e.type)&&Qe(t.type)){let{expectedEnv:r,givenEnv:i}=Ze({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);e.env=r,t.env=i}else if(xt(e.type)&&xt(t.type)){let{expectedEnv:r,givenEnv:i}=Ze({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);e.env=r,t.env=i}else if(Kt(e.type)&&Kt(t.type)){let{expectedEnv:r,givenEnv:i}=Ze({type:e.type.isFuture.outputType,env:e.env},{type:t.type.isFuture.outputType,env:t.env},n);e.env=r,t.env=i,Xs(e.type.isFuture.effects,t.type.isFuture.effects,e,t,n)}else if(kt(e.type)&&kt(t.type)){let r=e.type,i=t.type,{expectedEnv:o,givenEnv:a}=Ze({type:r.isFn.callType,env:e.env},{type:i.isFn.callType,env:t.env},n);e.env=o,t.env=a}else if(G(e.type)&&G(t.type)&&e.type.forallParameters.length===t.type.forallParameters.length&&e.type.parameters.length===t.type.parameters.length){let r=e.type,i=t.type;for(let s=0;s<r.forallParameters.length;s++){let l=r.forallParameters[s],u=i.forallParameters[s],{expectedEnv:_,givenEnv:c}=Ze({type:l.type,env:e.env},{type:u.type,env:t.env},n);e.env=_,t.env=c}for(let s=0;s<r.parameters.length;s++){let{expectedEnv:l,givenEnv:u}=Ze({type:r.parameters[s].type,env:e.env},{type:i.parameters[s].type,env:t.env},n);e.env=l,t.env=u}{let s=r.implicitParameters,l=[];for(let p of i.implicitParameters)p.isEffectRowSpread?ot(p.type)&&l.push(...p.type.implicitParameters):l.push(p);let u=[],_=[],c=[];for(let p of s)p.isEffectRowSpread?ot(p.type)?_.push(p):V(p.type)&&p.type.isEffectsRow&&c.push(p):u.push(p);if(c.length>1)throw new Error(`Ambiguous effect row unification: multiple unsolved effect row variables (${c.map(p=>p.label).join(", ")}). At most one effect row spread can be unsolved during type unification.`);let f=new Set;for(let p of u)for(let m=0;m<l.length;m++)if(!f.has(m)&&p.type.id===l[m].type.id){let{expectedEnv:g,givenEnv:h}=Ze({type:p.type,env:e.env},{type:l[m].type,env:t.env},n);e.env=g,t.env=h,f.add(m);break}for(let p of _){let m=p.type.implicitParameters;for(let g of m)for(let h=0;h<l.length;h++)if(!f.has(h)&&g.type.id===l[h].type.id){let{expectedEnv:d,givenEnv:v}=Ze({type:g.type,env:e.env},{type:l[h].type,env:t.env},n);e.env=d,t.env=v,f.add(h);break}}if(c.length===1){let p=c[0],m=[];for(let g=0;g<l.length;g++)f.has(g)||m.push(l[g]);if(V(p.type)&&p.type.isEffectsRow){let g=Ir(m),h=ee(g),d=X(e.env,p.type.name),v=d[d.length-1];if(v)e.env=Be(e.env,v,{...v,value:[h]});else{let{env:T}=me({env:e.env,variable:{name:p.type.name,value:[h],type:h.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=T}}}}let{expectedEnv:o,givenEnv:a}=Ze({type:r.return.type,env:e.env},{type:i.return.type,env:t.env},n);e.env=o,t.env=a}else if(!(He(e.type)&&!He(t.type))){if(e.type.tag!==t.type.tag)throw new Error(`Cannot unify incompatible types:
|
|
150
150
|
Expected: "${A(e.type)}"
|
|
151
|
-
Given: "${A(t.type)}"`)}}}return{expectedEnv:e.env,givenEnv:t.env}}function Xs(e,t,n,r,i){if(e.length===0&&t.length===0)return;let o=[],a=[],s=[];for(let _ of e)_.isEffectRowSpread?ot(_.type)?a.push(_):V(_.type)&&_.type.isEffectsRow&&s.push(_):o.push(_);if(s.length>1)throw new Error(`Ambiguous effect row unification: multiple unsolved effect row variables (${s.map(_=>_.label).join(", ")}). At most one effect row spread can be unsolved during type unification.`);let l=[];for(let _ of t)_.isEffectRowSpread?ot(_.type)&&l.push(..._.type.implicitParameters):l.push(_);let u=new Set;for(let _ of o)for(let c=0;c<l.length;c++)if(!u.has(c)&&_.type.id===l[c].type.id){let{expectedEnv:f,givenEnv:p}=Ze({type:_.type,env:n.env},{type:l[c].type,env:r.env},i);n.env=f,r.env=p,u.add(c);break}for(let _ of a){let c=_.type.implicitParameters;for(let f of c)for(let p=0;p<l.length;p++)if(!u.has(p)&&f.type.id===l[p].type.id){let{expectedEnv:m,givenEnv:g}=Ze({type:f.type,env:n.env},{type:l[p].type,env:r.env},i);n.env=m,r.env=g,u.add(p);break}}if(s.length===1){let _=s[0],c=[];for(let f=0;f<l.length;f++)u.has(f)||c.push(l[f]);if(V(_.type)&&_.type.isEffectsRow){let f=Ir(c),p=ee(f),m=X(n.env,_.type.name),g=m[m.length-1];if(g)n.env=Be(n.env,g,{...g,value:[p]});else{let{env:h}=me({env:n.env,variable:{name:_.type.name,value:[p],type:p.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});n.env=h}}}}function Qs(e,t){let n=new Map;for(let i of t.requiredTraits??[])n.set(i.traitType.id,i.traitType);let r=Yn(e,t);if(r)for(let i of r.requiredTraits)n.set(i.id,i);return[...n.values()]}function Ou(e,t){let n=new Map;for(let i of t.negativeTraits??[])n.set(i.traitType.id,i.traitType);let r=Yn(e,t);if(r)for(let i of r.negativeTraits)n.set(i.id,i);return[...n.values()]}function Zs(e){let t=[];for(let n of e)n.isEffectRowSpread&&ot(n.type)?t.push(...Zs(n.type.implicitParameters)):(n.isEffectRowSpread&&V(n.type)&&n.type.isEffectsRow,t.push(n));return t}function q(e,t,n=!1,r=new Set){let i=e.type.id,o=t.type.id;if(i&&o&&(_e(e.type)||ge(e.type)||it(e.type))&&(_e(t.type)||ge(t.type)||it(t.type))){let a=`${i}:${o}`;if(r.has(a))return!0;r.add(a)}if(go(e.type)&&go(t.type))return e.type.tag===t.type.tag;if((vt(e.type)||e.type.tag==="u8"||e.type.tag==="i8"||e.type.tag==="u16"||e.type.tag==="i16"||e.type.tag==="u32"||e.type.tag==="i32"||e.type.tag==="u64"||e.type.tag==="i64"||e.type.tag==="usize"||e.type.tag==="isize"||Xn(e.type))&&vt(t.type))return!(n&&!vt(e.type));if((Nt(e.type)||e.type.tag==="f32"||e.type.tag==="f64")&&Nt(t.type))return!(n&&!Nt(e.type));if((Et(e.type)||Qe(e.type)&&Kn(e.type.childType)||Ie(e.type)&&(Kn(e.type.childType)||ki(e.type.childType))||Cr(e.type)&&e.type.typeName==="str")&&Et(t.type))return!0;if(Xn(e.type)&&Xn(t.type))return e.type.tag===t.type.tag;if(Lt(e.type)&&Lt(t.type))return!0;if(xt(e.type)&&xt(t.type))return q({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n,r);if(ke(e.type)&&ke(t.type))return At({value:e.type.length,env:e.env},{value:t.type.length,env:t.env})&&q({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n,r);if(Qe(e.type)&&Qe(t.type))return q({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n,r);if(we(e.type)&&we(t.type)){if(e.type.fields.length!==t.type.fields.length)return!1;for(let a=0;a<e.type.fields.length;a++){let s=e.type.fields[a],l=t.type.fields[a];if(!q({type:s.type,env:e.env},{type:l.type,env:t.env},n,r))return!1}return!0}if(_e(e.type)&&_e(t.type)){if(e.type.fields.length!==t.type.fields.length||e.type.id!==t.type.id&&!Fe(e.type)&&!Fe(t.type)&&!(e.type.functionValue&&t.type.functionValue&&e.type.functionValue.funcId===t.type.functionValue.funcId))return!1;if(e.type.id===t.type.id)return!0;for(let a=0;a<e.type.fields.length;a++){let s=e.type.fields[a],l=t.type.fields[a];if(s.label!==l.label||!q({type:s.type,env:e.env},{type:l.type,env:t.env},n,r))return!1}return!0}if(ge(e.type)&&ge(t.type)){if(e.type.id===t.type.id)return!0;if(e.type.variants.length!==t.type.variants.length)return!1;for(let a=0;a<e.type.variants.length;a++){let s=e.type.variants[a],l=t.type.variants[a];if(s.name!==l.name||s.fields?.length!==l.fields?.length)return!1;if(s.fields)for(let u=0;u<s.fields.length;u++){let _=s.fields[u],c=l.fields[u];if(_.label!==c.label||!q({type:_.type,env:e.env},{type:c.type,env:t.env},n,r))return!1}}return e.type.requiredVariantNames&&(t.type.selectedVariantName&&!e.type.requiredVariantNames.includes(t.type.selectedVariantName)||!t.type.selectedVariantName)?!1:!e.type.selectedVariantName}if(it(e.type)&&it(t.type)){if(e.type.fields.length!==t.type.fields.length||e.type.id!==t.type.id&&!Fe(e.type)&&!Fe(t.type))return!1;if(e.type.id===t.type.id)return!0;for(let a=0;a<e.type.fields.length;a++){let s=e.type.fields[a],l=t.type.fields[a];if(s.label!==l.label||!q({type:s.type,env:e.env},{type:l.type,env:t.env},n,r))return!1}return!0}if(Te(e.type)&&Te(t.type)){for(let a of e.type.fields){let s=t.type.fields.find(l=>l.label===a.label);if(!s||!q({type:a.type,env:e.env},{type:s.type,env:t.env},n,r))return!1}return!0}if(De(e.type)){if(De(t.type)){if(kt(e.type))return!(!kt(t.type)||!Ru({type:e.type.isFn.callType,env:e.env},{type:t.type.isFn.callType,env:t.env},n));if(Kt(e.type)){if(!Kt(t.type)||!q({type:e.type.isFuture.outputType,env:e.env},{type:t.type.isFuture.outputType,env:t.env},n,r))return!1;let a=Zs(e.type.isFuture.effects),s=Zs(t.type.isFuture.effects);if(a.length>0&&s.length>0){if(a.length!==s.length)return!1;let l=new Set;for(let u of a){let _=!1;for(let c=0;c<s.length;c++)if(!l.has(c)&&q({type:u.type,env:e.env},{type:s[c].type,env:t.env},n,r)){l.add(c),_=!0;break}if(!_)return!1}}return!0}return e.type.id===t.type.id}return He(t.type)&&t.type.baseType&&t.type.baseType.trait&&De(e.type)?q({type:e.type,env:e.env},{type:t.type.baseType.trait,env:t.env},n,r):!1}if(G(e.type)&&G(t.type))return Ru({type:e.type,env:e.env},{type:t.type,env:t.env},n);if(He(e.type)&&He(t.type))return Mu(e.type,t.type);if(Ie(e.type)&&Ie(t.type))return q({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},!0,r);if(wt(e.type)&&wt(t.type))return q({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n,r);if(bt(e.type)&&bt(t.type))return q({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n,r);if(e.type.tag==="void"&&t.type.tag==="void")return!0;if(Ce(e.type)&&Ce(t.type)){for(let{traitType:a}of e.type.requiredTraits)if(!t.type.requiredTraits.find(({traitType:l})=>q({type:a,env:e.env},{type:l,env:t.env},n,r)))return!1;if(e.type.negativeTraits&&e.type.negativeTraits.length>0){for(let{traitType:a}of e.type.negativeTraits)if(t.type.requiredTraits.find(({traitType:l})=>q({type:a,env:e.env},{type:l,env:t.env},n,r)))return!1}return!0}if(V(e.type)){if(Ce(t.type))return!0;if(V(t.type)){if(e.type===t.type)return!0;if(e.type.id===t.type.id)return e.type.resolvedConcreteType?t.type.resolvedConcreteType?q({type:e.type.resolvedConcreteType,env:e.env},{type:t.type.resolvedConcreteType,env:t.env},n,r):!1:!0;let a=Qs(e.env,e.type),s=Qs(t.env,t.type);if(n&&a.length!==s.length)return!1;for(let u of a)if(!s.find(c=>q({type:u,env:e.env},{type:c,env:t.env},n,r)))return!1;let l=Ou(e.env,e.type);if(l.length>0){for(let u of l)if(s.find(c=>q({type:u,env:e.env},{type:c,env:t.env},n,r)))return!1}if(e.type.resolvedConcreteType&&t.type.resolvedConcreteType){if(!q({type:e.type.resolvedConcreteType,env:e.env},{type:t.type.resolvedConcreteType,env:t.env},n,r))return!1}else if(n&&(e.type.resolvedConcreteType||t.type.resolvedConcreteType))return!1;return!0}else{if(e.type.resolvedConcreteType)return q({type:e.type.resolvedConcreteType,env:e.env},t,n,r);let a=Qs(e.env,e.type);if(a.length===0)return!n;if(a.length>0){for(let _ of a)if(!St({targetType:t.type,traitType:_,env:e.env}))break;let l=Ou(e.env,e.type);if(l.length>0){for(let _ of l)if(St({targetType:t.type,traitType:_,env:e.env}))return!1}let u=!0;for(let _ of a)if(!St({targetType:t.type,traitType:_,env:e.env})){u=!1;break}if(u)return!0}let s=Ot(e.env,e.type);return e.type===s?!1:q({type:s,env:e.env},t,n,r)}}else if(V(t.type)){if(t.type.resolvedConcreteType&&q(e,{type:t.type.resolvedConcreteType,env:t.env},n,r))return!0;let a=Ot(t.env,t.type);return t.type===a?!1:q(e,{type:a,env:t.env},n,r)}return!1}function Ru(e,t,n=!1){if(e.type===t.type)return!0;if(e.type.parameters.length!==t.type.parameters.length||e.type.forallParameters.length!==t.type.forallParameters.length)return!1;try{let{expectedEnv:i,givenEnv:o}=Ze({type:e.type,env:e.env},{type:t.type,env:t.env});e.env=i,t.env=o}catch{return!1}for(let i=0;i<e.type.forallParameters.length;i++){let o=e.type.forallParameters[i],a=t.type.forallParameters[i];if(!q({type:o.type,env:e.env},{type:a.type,env:t.env},n))return!1}for(let i=0;i<e.type.parameters.length;i++){let o=e.type.parameters[i],a=t.type.parameters[i];if(o.isCompileTimeOnly!==a.isCompileTimeOnly||!q({type:o.type,env:e.env},{type:a.type,env:t.env},n))return!1}return q({type:e.type.return.type,env:e.env},{type:t.type.return.type,env:t.env},n)}function Ca(e){return E(e,["->","=>"])?!!(e.$?.isAnonymousFunctionDefinition===!0||F(e)&&F(e.func)&&(E(e.func,I.fn)||E(e.func,I.unsafe_fn)||E(e.func,I.Fn))||!e.$):!1}function ka(e,t){if(!F(e))return!1;if(t(e.func))return!0;for(let n of e.args)if(F(n)&&E(n,"=>")){for(let r of n.args)if(t(r))return!0}else if(t(n))return!0;return!1}function er(e){if(U(e))return dt(e,I.escape);if(F(e)){if(e.$?.macroExpansion)return er(e.$.macroExpansion);if(E(e,I.cond)||E(e,I.match))return ka(e,er);if(Ca(e)||F(e.func)&&e.func.$?.value!==void 0&&O(e.func.$.value)&&G(e.func.$.value.value)||F(e.func)&&e.func.$?.value!==void 0&&O(e.func.$.value)&&Wt(e.func.$.value.value))return!1;if(er(e.func))return!0;for(let t of e.args)if(er(t))return!0}return!1}function qi(e){if(U(e))return dt(e,I.return)||dt(e,I.escape);if(F(e)){if(E(e,I.return)||E(e,I.escape))return!0;if(e.$?.macroExpansion)return qi(e.$.macroExpansion);if(E(e,I.cond)||E(e,I.match))return ka(e,qi);if(Ca(e)||F(e.func)&&e.func.$?.value!==void 0&&O(e.func.$.value)&&G(e.func.$.value.value)||F(e.func)&&e.func.$?.value!==void 0&&O(e.func.$.value)&&Wt(e.func.$.value.value))return!1;if(qi(e.func))return!0;for(let t of e.args)if(qi(t))return!0}return!1}function un(e){if(F(e)){if(e.func.$?.type?.ioBuiltin==="io_await")return!0;if(e.$?.macroExpansion)return un(e.$.macroExpansion);if(E(e,I.cond)||E(e,I.match))return ka(e,un);if(e.func.$?.type?.ioBuiltin==="io_async"||Ca(e)||O(e.func.$?.value)&&G(e.func.$.value.value)||F(e.func)&&e.func.$?.value!==void 0&&O(e.func.$.value)&&Wt(e.func.$.value.value))return!1;if(un(e.func))return!0;for(let t of e.args)if(un(t))return!0}return!1}function Hi(e){if(U(e))return dt(e,I.break)||dt(e,I.return)||dt(e,I.escape);if(F(e)){if(E(e,I.return)||E(e,I.escape))return!0;if(e.$?.macroExpansion)return Hi(e.$.macroExpansion);if(E(e,I.cond)||E(e,I.match))return ka(e,Hi);if(Ca(e)||F(e.func)&&e.func.$?.value!==void 0&&O(e.func.$.value)&&G(e.func.$.value.value)||F(e.func)&&e.func.$?.value!==void 0&&O(e.func.$.value)&&Wt(e.func.$.value.value))return!1;if(Hi(e.func))return!0;for(let t of e.args)if(Hi(t))return!0}return!1}var H={tag:"Unit",type:Vn()};function Mo(e){if(e&&e.tag==="FnCall"&&E(e,":=")){let t=e.args[0];if(t&&t.tag==="Atom"&&t.token.type==="identifier"&&t.$){let n=t.token.value,r=X(t.$.env,n);if(r.length>0)return r[r.length-1].id}}}function wa(e,t){let n=[],r=new Map,i=new Map,o=new Map;if(vr(e,n,r,i,o,t),e.$?.deferredDropExpressions)for(let a of e.$.deferredDropExpressions)vr(a,n,r,i,o,t);return n.length===0&&r.clear(),{suspensionPoints:n,capturedVariables:Array.from(r.values()),hasSuspensions:n.length>0,variableIdRemapping:o}}function vr(e,t,n,r,i,o,a){switch(e.tag){case"Atom":if(e.$&&e.token.type==="identifier"){let s=e.token.value,l=e.$.type,u=X(e.$.env,s);if(u.length>0){let _=u[u.length-1];if(_&&!n.has(_.id)&&!_.isCompileTimeOnly){let c=`${_.name}:${_.frameLevel}`,f=r.get(c);if(f&&f!==_.id)i.set(_.id,f);else if(_.isOwningTheSameRcValueAs){let p=_.isOwningTheSameRcValueAs;if(!n.has(p.id)){let m={id:p.id,name:p.name,type:p.type,isOwningTheSameRcValueAs:void 0};n.set(p.id,m);let g=`${p.name}:${p.frameLevel}`;r.has(g)||r.set(g,p.id)}}else n.set(_.id,{id:_.id,name:s,type:l,isOwningTheSameRcValueAs:void 0}),r.has(c)||r.set(c,_.id)}}}break;case"FnCall":{if(E(e,I.while)){let s=t.length;vr(e.func,t,n,r,i,o,e);for(let u of e.args)vr(u,t,n,r,i,o,e);let l=t.length;if(l>s)for(let u=s;u<l;u++)t[u].isInsideWhile=!0,t[u].whileNestingDepth=(t[u].whileNestingDepth??0)+1,t[u].enclosingWhileExpr||(t[u].enclosingWhileExpr=e);break}if(E(e,I.cond)){Pu(e,t,n,r,i,o);break}if(E(e,I.match)){Pu(e,t,n,r,i,o);break}if(o.detect(e,a,t),o.shouldSkipBody(e)){if(e.$?.deferredDupExpressions)for(let s of e.$.deferredDupExpressions)vr(s,t,n,r,i,o,e);break}vr(e.func,t,n,r,i,o,e);for(let s of e.args)vr(s,t,n,r,i,o,e);if(e.$?.deferredDropExpressions)for(let s of e.$.deferredDropExpressions)vr(s,t,n,r,i,o,e);break}}}function Pu(e,t,n,r,i,o){if(e.tag!=="FnCall")return;let a=t.length;vr(e.func,t,n,r,i,o,e);let s=new Map(r),l=[];for(let _ of e.args){let c=t.length;vr(_,t,n,r,i,o,e),l.push(t.slice(c))}r.clear();for(let[_,c]of s)r.set(_,c);let u=Math.max(...l.map(_=>_.length),0);if(u>0){t.splice(a);let _=a;for(let c=0;c<u;c++){let f;for(let p of l)if(c<p.length){f=p[c];break}f&&(f.index=t.length,f.isInsideCond=!0,c===0&&(f.needsOwnCondBranchField=!0),c>0&&(f.condBranchSourceIndex=_),t.push(f))}}}function zu(e){let n=wa(e,{detect(i,o,a){if(i.tag==="FnCall"&&fn(i)){let s=i.args[0];if(!s)return;let l=s.$?.type;if(l&&be(l)){let u=Dt(l);if(!u)return;let _=u.isFuture.outputType,c;if(s.tag==="Atom"&&s.token.type==="identifier"&&s.$){let p=s.token.value,m=X(s.$.env,p);if(m.length>0){let g=m[m.length-1];g.isOwningTheSameRcValueAs?c=g.isOwningTheSameRcValueAs.id:c=g.id}}let f=Mo(o);a.push({index:a.length,expr:i,resultType:_,futureType:u,targetVariableId:f,futureVariableId:c})}}},shouldSkipBody(i){return Rt(i)}}),r=n.capturedVariables.map(i=>({id:i.id,name:i.name,type:i.type,kind:"local",isOwningTheSameRcValueAs:void 0}));return{awaitPoints:n.suspensionPoints,capturedVariables:r,hasAwaits:n.hasSuspensions,variableIdRemapping:n.variableIdRemapping}}function Rt(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="io_async"}function fn(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="io_await"}function Uu(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="io_state"}function Fa(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="io_spawn"}function Bu(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="join_handle_await"}function je(e){return U(e)&&e.token.type==="identifier"||e.token.type==="operator"}function Oo(e,t,n){if(!e.$?.variableName)return;let r=X(t,e.$.variableName);if(!r.length)return;let i=r[r.length-1],o=new Set;for(;i&&i.isOwningTheSameRcValueAs;){if(o.has(i.id))return;o.add(i.id),i=i.isOwningTheSameRcValueAs}if(i&&i.isOwningTheRcValue)return i}function Gr(e){let t=e.$?.env;if(!t)return;let n;if(e.$?.pathCollection)for(let r of e.$.pathCollection)r.length>0&&typeof r[0]=="string"&&(n=r[0]);else U(e)&&(n=e.token.value);if(n){let r=X(t,n),i=r[r.length-1];if(i?.isImplicit)throw y({token:e.token,errorMessage:`Cannot use implicit variable "${i.name}" in assignment. Implicit variables must be passed via using() parameters.`})}}var La=!0;function Gu({variablesToDrop:e,env:t,context:n}){let r=[],i=t;for(let o of e){let a=Jt(`${k.___drop[0]}(${o.name})`),s=S({expr:a,env:i,context:{...n,expectedType:{env:i,type:H.type}}});r.push(s),s.$&&s.$.env&&(i=s.$.env)}return{deferredDropExpressions:r.length>0?r:void 0,env:i}}function Ro(e,t,n){if(F(e)&&Rt(e))return;if(e.$?.deferredDupExpressions)for(let s of e.$.deferredDupExpressions)Ro(s,t,n);if(F(e)&&F(e.func)&&E(e.func,".",2)&&U(e.func.args[0])&&U(e.func.args[1])&&e.func.args[1].token.value===k.___dup[0]&&e.args.length===0&&e.$?.env){let s=e.func.args[0].token.value,l=X(e.$.env,s);if(l.length>0){let u=l[l.length-1];t.has(u.id)||t.set(u.id,[]),t.get(u.id).push(e)}return}if(F(e)&&E(e,I.while))return;function i(s){if(nt(s.$?.controlFlow))return!0;if(F(s)&&E(s,I.begin)){let l=s.args[s.args.length-1];if(nt(l?.$?.controlFlow)||F(l)&&E(l,I.return))return!0}return!!(F(s)&&E(s,I.return))}function o(s){if(F(s)&&E(s,I.tuple,0))return!0;if(F(s)&&E(s,I.begin)){if(s.args.length===0)return!0;if(s.args.length===1){let l=s.args[0];if(F(l)&&E(l,I.tuple,0))return!0}}return!1}function a(s,l){let u=[],_=[],c=[];for(let p=l;p<s.args.length;p++){let m=s.args[p];if(F(m)&&E(m,"=>",2)){let g=m.args[1],h=Wu(g);u.push(h),_.push(i(g)),c.push(o(g))}}let f=new Set;for(let p of u){for(let m of p.dupCalls.keys())f.add(m);for(let m of p.varsWithPartialBranchDups)n.add(m)}if(u.length>0)for(let p of f){let m=[],g=[];for(let h=0;h<u.length;h++){let d=u[h],v=d.dupCalls.has(p),T=_[h];if(v){let $=d.dupCalls.get(p);T?m.push(...$):g.push(...$)}}for(let h of m)t.has(p)||t.set(p,[]),h.__isEarlyReturnDup=!0,t.get(p).push(h);if(g.length>0){let h=0,d=0;for(let v=0;v<u.length;v++)_[v]||(h++,u[v].dupCalls.has(p)&&d++);if(d===h){t.has(p)||t.set(p,[]);for(let v of g)t.get(p).push(v)}else n.add(p)}}}if(F(e)&&E(e,I.cond)){a(e,0);return}if(F(e)&&E(e,I.match)){e.args[0]&&Ro(e.args[0],t,n),a(e,1);return}if(F(e)){Ro(e.func,t,n);for(let s of e.args)Ro(s,t,n)}}function Wu(e){let t=new Map,n=new Set;return Ro(e,t,n),{dupCalls:t,varsWithPartialBranchDups:n}}function Aa(e){return F(e)&&E(e,I.tuple,0)}function Js(e,t){if(e.$?.deferredDupExpressions&&(e.$.deferredDupExpressions=e.$.deferredDupExpressions.filter(n=>!t.has(n)),e.$.deferredDupExpressions.length===0&&(e.$.deferredDupExpressions=void 0)),F(e)){Js(e.func,t);for(let n of e.args)Js(n,t)}}function ht({expr:e,env:t,context:n,variablesToAdd:r=[],isEvaluatingFunctionBodyBeginBlock:i=!1}){if(F(e)&&E(e,"_")&&!E(e,I.begin)){let $=e;$.args.some(L=>F(L)&&E(L,":"))||($.func={...$.func,token:{...$.func.token,value:I.begin[0]}})}if(!F(e)||!E(e,I.begin)){let $={tag:"FnCall",func:{tag:"Atom",token:{...e.token,value:I.begin[0]}},args:[Ae(e)],token:{...e.token,value:I.begin[0]}};gr(e,$),e=e}let o=e.args,a=n.expectedType;if(o.length===0)return e.$={env:t,type:H.type,value:H,pathCollection:[]},e;t=Pe(t,void 0,!0);for(let $=0;$<r.length;$++){let b=r[$],{env:L}=me({env:t,variable:b});t=L}let s=o[o.length-1],l,u=!1;for(let $=0;$<o.length;$++){let b=o[$];if(U(b)&&dt(b,I.return)||F(b)&&E(b,I.return)){if($!==o.length-1&&!($===o.length-2&&Aa(o[o.length-1])))throw y({token:b.token,errorMessage:'The "return" keyword can only be used as the last expression.'});if(F(b)&&he(b,I.return,1),!n.isEvaluatingFunctionBodyOrAsyncBlock)throw y({token:b.token,errorMessage:'The "return" keyword can only be used inside a function body or async block.'});if(l=b,U(b)){b.$={env:t,type:H.type,value:H,pathCollection:[],controlFlow:Br("return")},s=b;break}else{he(b,I.return,1);let L=b.args[0],C=S({expr:L,env:t,context:{...n,expectedType:n.isEvaluatingFunctionBodyOrAsyncBlock.kind==="function-body"?{type:n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type,env:t}:n.expectedType}});if(!C.$)throw y({token:L.token,errorMessage:`Return expression is not evaluated correctly:
|
|
151
|
+
Given: "${A(t.type)}"`)}}}return{expectedEnv:e.env,givenEnv:t.env}}function Xs(e,t,n,r,i){if(e.length===0&&t.length===0)return;let o=[],a=[],s=[];for(let _ of e)_.isEffectRowSpread?ot(_.type)?a.push(_):V(_.type)&&_.type.isEffectsRow&&s.push(_):o.push(_);if(s.length>1)throw new Error(`Ambiguous effect row unification: multiple unsolved effect row variables (${s.map(_=>_.label).join(", ")}). At most one effect row spread can be unsolved during type unification.`);let l=[];for(let _ of t)_.isEffectRowSpread?ot(_.type)&&l.push(..._.type.implicitParameters):l.push(_);let u=new Set;for(let _ of o)for(let c=0;c<l.length;c++)if(!u.has(c)&&_.type.id===l[c].type.id){let{expectedEnv:f,givenEnv:p}=Ze({type:_.type,env:n.env},{type:l[c].type,env:r.env},i);n.env=f,r.env=p,u.add(c);break}for(let _ of a){let c=_.type.implicitParameters;for(let f of c)for(let p=0;p<l.length;p++)if(!u.has(p)&&f.type.id===l[p].type.id){let{expectedEnv:m,givenEnv:g}=Ze({type:f.type,env:n.env},{type:l[p].type,env:r.env},i);n.env=m,r.env=g,u.add(p);break}}if(s.length===1){let _=s[0],c=[];for(let f=0;f<l.length;f++)u.has(f)||c.push(l[f]);if(V(_.type)&&_.type.isEffectsRow){let f=Ir(c),p=ee(f),m=X(n.env,_.type.name),g=m[m.length-1];if(g)n.env=Be(n.env,g,{...g,value:[p]});else{let{env:h}=me({env:n.env,variable:{name:_.type.name,value:[p],type:p.type,isCompileTimeOnly:!0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});n.env=h}}}}function Qs(e,t){let n=new Map;for(let i of t.requiredTraits??[])n.set(i.traitType.id,i.traitType);let r=Yn(e,t);if(r)for(let i of r.requiredTraits)n.set(i.id,i);return[...n.values()]}function Ou(e,t){let n=new Map;for(let i of t.negativeTraits??[])n.set(i.traitType.id,i.traitType);let r=Yn(e,t);if(r)for(let i of r.negativeTraits)n.set(i.id,i);return[...n.values()]}function Zs(e){let t=[];for(let n of e)n.isEffectRowSpread&&ot(n.type)?t.push(...Zs(n.type.implicitParameters)):(n.isEffectRowSpread&&V(n.type)&&n.type.isEffectsRow,t.push(n));return t}function q(e,t,n=!1,r=new Set){let i=e.type.id,o=t.type.id;if(i&&o&&(_e(e.type)||ge(e.type)||it(e.type))&&(_e(t.type)||ge(t.type)||it(t.type))){let a=`${i}:${o}`;if(r.has(a))return!0;r.add(a)}if(go(e.type)&&go(t.type))return e.type.tag===t.type.tag;if((vt(e.type)||e.type.tag==="u8"||e.type.tag==="i8"||e.type.tag==="u16"||e.type.tag==="i16"||e.type.tag==="u32"||e.type.tag==="i32"||e.type.tag==="u64"||e.type.tag==="i64"||e.type.tag==="usize"||e.type.tag==="isize"||Xn(e.type))&&vt(t.type))return!(n&&!vt(e.type));if((Nt(e.type)||e.type.tag==="f32"||e.type.tag==="f64")&&Nt(t.type))return!(n&&!Nt(e.type));if((Et(e.type)||Qe(e.type)&&Kn(e.type.childType)||Ie(e.type)&&(Kn(e.type.childType)||ki(e.type.childType))||Cr(e.type)&&e.type.typeName==="str")&&Et(t.type))return!0;if(Xn(e.type)&&Xn(t.type))return e.type.tag===t.type.tag;if(Lt(e.type)&&Lt(t.type))return!0;if(xt(e.type)&&xt(t.type))return q({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n,r);if(ke(e.type)&&ke(t.type))return At({value:e.type.length,env:e.env},{value:t.type.length,env:t.env})&&q({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n,r);if(Qe(e.type)&&Qe(t.type))return q({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n,r);if(we(e.type)&&we(t.type)){if(e.type.fields.length!==t.type.fields.length)return!1;for(let a=0;a<e.type.fields.length;a++){let s=e.type.fields[a],l=t.type.fields[a];if(!q({type:s.type,env:e.env},{type:l.type,env:t.env},n,r))return!1}return!0}if(_e(e.type)&&_e(t.type)){if(e.type.fields.length!==t.type.fields.length||e.type.id!==t.type.id&&!Fe(e.type)&&!Fe(t.type)&&!(e.type.functionValue&&t.type.functionValue&&e.type.functionValue.funcId===t.type.functionValue.funcId))return!1;if(e.type.id===t.type.id)return!0;for(let a=0;a<e.type.fields.length;a++){let s=e.type.fields[a],l=t.type.fields[a];if(s.label!==l.label||!q({type:s.type,env:e.env},{type:l.type,env:t.env},n,r))return!1}return!0}if(ge(e.type)&&ge(t.type)){if(e.type.id===t.type.id)return!0;if(e.type.variants.length!==t.type.variants.length)return!1;for(let a=0;a<e.type.variants.length;a++){let s=e.type.variants[a],l=t.type.variants[a];if(s.name!==l.name||s.fields?.length!==l.fields?.length)return!1;if(s.fields)for(let u=0;u<s.fields.length;u++){let _=s.fields[u],c=l.fields[u];if(_.label!==c.label||!q({type:_.type,env:e.env},{type:c.type,env:t.env},n,r))return!1}}return e.type.requiredVariantNames&&(t.type.selectedVariantName&&!e.type.requiredVariantNames.includes(t.type.selectedVariantName)||!t.type.selectedVariantName)?!1:!e.type.selectedVariantName}if(it(e.type)&&it(t.type)){if(e.type.fields.length!==t.type.fields.length||e.type.id!==t.type.id&&!Fe(e.type)&&!Fe(t.type))return!1;if(e.type.id===t.type.id)return!0;for(let a=0;a<e.type.fields.length;a++){let s=e.type.fields[a],l=t.type.fields[a];if(s.label!==l.label||!q({type:s.type,env:e.env},{type:l.type,env:t.env},n,r))return!1}return!0}if(Te(e.type)&&Te(t.type)){for(let a of e.type.fields){let s=t.type.fields.find(l=>l.label===a.label);if(!s||!q({type:a.type,env:e.env},{type:s.type,env:t.env},n,r))return!1}return!0}if(De(e.type)){if(De(t.type)){if(kt(e.type))return!(!kt(t.type)||!Ru({type:e.type.isFn.callType,env:e.env},{type:t.type.isFn.callType,env:t.env},n));if(Kt(e.type)){if(!Kt(t.type)||!q({type:e.type.isFuture.outputType,env:e.env},{type:t.type.isFuture.outputType,env:t.env},n,r))return!1;let a=Zs(e.type.isFuture.effects),s=Zs(t.type.isFuture.effects);if(a.length>0&&s.length>0){if(a.length!==s.length)return!1;let l=new Set;for(let u of a){let _=!1;for(let c=0;c<s.length;c++)if(!l.has(c)&&q({type:u.type,env:e.env},{type:s[c].type,env:t.env},n,r)){l.add(c),_=!0;break}if(!_)return!1}}return!0}return e.type.id===t.type.id}return He(t.type)&&t.type.baseType&&t.type.baseType.trait&&De(e.type)?q({type:e.type,env:e.env},{type:t.type.baseType.trait,env:t.env},n,r):!1}if(G(e.type)&&G(t.type))return Ru({type:e.type,env:e.env},{type:t.type,env:t.env},n);if(He(e.type)&&He(t.type))return Mu(e.type,t.type);if(Ie(e.type)&&Ie(t.type))return q({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},!0,r);if(wt(e.type)&&wt(t.type))return q({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n,r);if(bt(e.type)&&bt(t.type))return q({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n,r);if(e.type.tag==="void"&&t.type.tag==="void")return!0;if(Ce(e.type)&&Ce(t.type)){for(let{traitType:a}of e.type.requiredTraits)if(!t.type.requiredTraits.find(({traitType:l})=>q({type:a,env:e.env},{type:l,env:t.env},n,r)))return!1;if(e.type.negativeTraits&&e.type.negativeTraits.length>0){for(let{traitType:a}of e.type.negativeTraits)if(t.type.requiredTraits.find(({traitType:l})=>q({type:a,env:e.env},{type:l,env:t.env},n,r)))return!1}return!0}if(V(e.type)){if(Ce(t.type))return!0;if(V(t.type)){if(e.type===t.type)return!0;if(e.type.id===t.type.id)return e.type.resolvedConcreteType?t.type.resolvedConcreteType?q({type:e.type.resolvedConcreteType,env:e.env},{type:t.type.resolvedConcreteType,env:t.env},n,r):!1:!0;let a=Qs(e.env,e.type),s=Qs(t.env,t.type);if(n&&a.length!==s.length)return!1;for(let u of a)if(!s.find(c=>q({type:u,env:e.env},{type:c,env:t.env},n,r)))return!1;let l=Ou(e.env,e.type);if(l.length>0){for(let u of l)if(s.find(c=>q({type:u,env:e.env},{type:c,env:t.env},n,r)))return!1}if(e.type.resolvedConcreteType&&t.type.resolvedConcreteType){if(!q({type:e.type.resolvedConcreteType,env:e.env},{type:t.type.resolvedConcreteType,env:t.env},n,r))return!1}else if(n&&(e.type.resolvedConcreteType||t.type.resolvedConcreteType))return!1;return!0}else{if(e.type.resolvedConcreteType)return q({type:e.type.resolvedConcreteType,env:e.env},t,n,r);let a=Qs(e.env,e.type);if(a.length===0)return!n;if(a.length>0){for(let _ of a)if(!St({targetType:t.type,traitType:_,env:e.env}))break;let l=Ou(e.env,e.type);if(l.length>0){for(let _ of l)if(St({targetType:t.type,traitType:_,env:e.env}))return!1}let u=!0;for(let _ of a)if(!St({targetType:t.type,traitType:_,env:e.env})){u=!1;break}if(u)return!0}let s=Ot(e.env,e.type);return e.type===s?!1:q({type:s,env:e.env},t,n,r)}}else if(V(t.type)){if(t.type.resolvedConcreteType&&q(e,{type:t.type.resolvedConcreteType,env:t.env},n,r))return!0;let a=Ot(t.env,t.type);return t.type===a?!1:q(e,{type:a,env:t.env},n,r)}return!1}function Ru(e,t,n=!1){if(e.type===t.type)return!0;if(e.type.parameters.length!==t.type.parameters.length||e.type.forallParameters.length!==t.type.forallParameters.length)return!1;try{let{expectedEnv:i,givenEnv:o}=Ze({type:e.type,env:e.env},{type:t.type,env:t.env});e.env=i,t.env=o}catch{return!1}for(let i=0;i<e.type.forallParameters.length;i++){let o=e.type.forallParameters[i],a=t.type.forallParameters[i];if(!q({type:o.type,env:e.env},{type:a.type,env:t.env},n))return!1}for(let i=0;i<e.type.parameters.length;i++){let o=e.type.parameters[i],a=t.type.parameters[i];if(o.isCompileTimeOnly!==a.isCompileTimeOnly||!q({type:o.type,env:e.env},{type:a.type,env:t.env},n))return!1}return q({type:e.type.return.type,env:e.env},{type:t.type.return.type,env:t.env},n)}function Ca(e){return E(e,["->","=>"])?!!(e.$?.isAnonymousFunctionDefinition===!0||F(e)&&F(e.func)&&(E(e.func,I.fn)||E(e.func,I.unsafe_fn)||E(e.func,I.Fn))||!e.$):!1}function ka(e,t){if(!F(e))return!1;if(t(e.func))return!0;for(let n of e.args)if(F(n)&&E(n,"=>")){for(let r of n.args)if(t(r))return!0}else if(t(n))return!0;return!1}function er(e){if(U(e))return dt(e,I.escape);if(F(e)){if(e.$?.macroExpansion)return er(e.$.macroExpansion);if(E(e,I.cond)||E(e,I.match))return ka(e,er);if(Ca(e)||F(e.func)&&e.func.$?.value!==void 0&&O(e.func.$.value)&&G(e.func.$.value.value)||F(e.func)&&e.func.$?.value!==void 0&&O(e.func.$.value)&&Wt(e.func.$.value.value))return!1;if(er(e.func))return!0;for(let t of e.args)if(er(t))return!0}return!1}function qi(e){if(U(e))return dt(e,I.return)||dt(e,I.escape);if(F(e)){if(E(e,I.return)||E(e,I.escape))return!0;if(e.$?.macroExpansion)return qi(e.$.macroExpansion);if(E(e,I.cond)||E(e,I.match))return ka(e,qi);if(Ca(e)||F(e.func)&&e.func.$?.value!==void 0&&O(e.func.$.value)&&G(e.func.$.value.value)||F(e.func)&&e.func.$?.value!==void 0&&O(e.func.$.value)&&Wt(e.func.$.value.value))return!1;if(qi(e.func))return!0;for(let t of e.args)if(qi(t))return!0}return!1}function un(e){if(F(e)){if(e.func.$?.type?.ioBuiltin==="io_await")return!0;if(e.$?.macroExpansion)return un(e.$.macroExpansion);if(E(e,I.cond)||E(e,I.match))return ka(e,un);if(e.func.$?.type?.ioBuiltin==="io_async"||Ca(e)||O(e.func.$?.value)&&G(e.func.$.value.value)||F(e.func)&&e.func.$?.value!==void 0&&O(e.func.$.value)&&Wt(e.func.$.value.value))return!1;if(un(e.func))return!0;for(let t of e.args)if(un(t))return!0}return!1}function Hi(e){if(U(e))return dt(e,I.break)||dt(e,I.return)||dt(e,I.escape);if(F(e)){if(E(e,I.return)||E(e,I.escape))return!0;if(e.$?.macroExpansion)return Hi(e.$.macroExpansion);if(E(e,I.cond)||E(e,I.match))return ka(e,Hi);if(Ca(e)||F(e.func)&&e.func.$?.value!==void 0&&O(e.func.$.value)&&G(e.func.$.value.value)||F(e.func)&&e.func.$?.value!==void 0&&O(e.func.$.value)&&Wt(e.func.$.value.value))return!1;if(Hi(e.func))return!0;for(let t of e.args)if(Hi(t))return!0}return!1}var H={tag:"Unit",type:Vn()};function Mo(e){if(e&&e.tag==="FnCall"&&E(e,":=")){let t=e.args[0];if(t&&t.tag==="Atom"&&t.token.type==="identifier"&&t.$){let n=t.token.value,r=X(t.$.env,n);if(r.length>0)return r[r.length-1].id}}}function wa(e,t){let n=[],r=new Map,i=new Map,o=new Map;if(vr(e,n,r,i,o,t),e.$?.deferredDropExpressions)for(let a of e.$.deferredDropExpressions)vr(a,n,r,i,o,t);return n.length===0&&r.clear(),{suspensionPoints:n,capturedVariables:Array.from(r.values()),hasSuspensions:n.length>0,variableIdRemapping:o}}function vr(e,t,n,r,i,o,a){switch(e.tag){case"Atom":if(e.$&&e.token.type==="identifier"){let s=e.token.value,l=e.$.type,u=X(e.$.env,s);if(u.length>0){let _=u[u.length-1];if(_&&!n.has(_.id)&&!_.isCompileTimeOnly){let c=`${_.name}:${_.frameLevel}`,f=r.get(c);if(f&&f!==_.id)i.set(_.id,f);else if(_.isOwningTheSameRcValueAs){let p=_.isOwningTheSameRcValueAs;if(!n.has(p.id)){let m={id:p.id,name:p.name,type:p.type,isOwningTheSameRcValueAs:void 0};n.set(p.id,m);let g=`${p.name}:${p.frameLevel}`;r.has(g)||r.set(g,p.id)}}else n.set(_.id,{id:_.id,name:s,type:l,isOwningTheSameRcValueAs:void 0}),r.has(c)||r.set(c,_.id)}}}break;case"FnCall":{if(E(e,I.while)){let s=t.length;vr(e.func,t,n,r,i,o,e);for(let u of e.args)vr(u,t,n,r,i,o,e);let l=t.length;if(l>s)for(let u=s;u<l;u++)t[u].isInsideWhile=!0,t[u].whileNestingDepth=(t[u].whileNestingDepth??0)+1,t[u].enclosingWhileExpr||(t[u].enclosingWhileExpr=e);break}if(E(e,I.cond)){Pu(e,t,n,r,i,o);break}if(E(e,I.match)){Pu(e,t,n,r,i,o);break}if(o.detect(e,a,t),o.shouldSkipBody(e)){if(e.$?.deferredDupExpressions)for(let s of e.$.deferredDupExpressions)vr(s,t,n,r,i,o,e);break}vr(e.func,t,n,r,i,o,e);for(let s of e.args)vr(s,t,n,r,i,o,e);if(e.$?.deferredDropExpressions)for(let s of e.$.deferredDropExpressions)vr(s,t,n,r,i,o,e);break}}}function Pu(e,t,n,r,i,o){if(e.tag!=="FnCall")return;let a=t.length;vr(e.func,t,n,r,i,o,e);let s=new Map(r),l=[];for(let _ of e.args){let c=t.length;vr(_,t,n,r,i,o,e),l.push(t.slice(c))}r.clear();for(let[_,c]of s)r.set(_,c);let u=Math.max(...l.map(_=>_.length),0);if(u>0){t.splice(a);let _=a;for(let c=0;c<u;c++){let f;for(let p of l)if(c<p.length){f=p[c];break}f&&(f.index=t.length,f.isInsideCond=!0,c===0&&(f.needsOwnCondBranchField=!0),c>0&&(f.condBranchSourceIndex=_),t.push(f))}}}function zu(e){let n=wa(e,{detect(i,o,a){if(i.tag==="FnCall"&&fn(i)){let s=i.args[0];if(!s)return;let l=s.$?.type;if(l&&be(l)){let u=Dt(l);if(!u)return;let _=u.isFuture.outputType,c;if(s.tag==="Atom"&&s.token.type==="identifier"&&s.$){let p=s.token.value,m=X(s.$.env,p);if(m.length>0){let g=m[m.length-1];g.isOwningTheSameRcValueAs?c=g.isOwningTheSameRcValueAs.id:c=g.id}}let f=Mo(o);a.push({index:a.length,expr:i,resultType:_,futureType:u,targetVariableId:f,futureVariableId:c})}}},shouldSkipBody(i){return Rt(i)}}),r=n.capturedVariables.map(i=>({id:i.id,name:i.name,type:i.type,kind:"local",isOwningTheSameRcValueAs:void 0}));return{awaitPoints:n.suspensionPoints,capturedVariables:r,hasAwaits:n.hasSuspensions,variableIdRemapping:n.variableIdRemapping}}function Rt(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="io_async"}function fn(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="io_await"}function Uu(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="io_state"}function Fa(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="io_spawn"}function Bu(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="join_handle_await"}function je(e){return U(e)&&e.token.type==="identifier"||e.token.type==="operator"}function Oo(e,t,n){if(!e.$?.variableName)return;let r=X(t,e.$.variableName);if(!r.length)return;let i=r[r.length-1],o=new Set;for(;i&&i.isOwningTheSameRcValueAs;){if(o.has(i.id))return;o.add(i.id),i=i.isOwningTheSameRcValueAs}if(i&&i.isOwningTheRcValue)return i}function Gr(e){let t=e.$?.env;if(!t)return;let n;if(e.$?.pathCollection)for(let r of e.$.pathCollection)r.length>0&&typeof r[0]=="string"&&(n=r[0]);else U(e)&&(n=e.token.value);if(n){let r=X(t,n),i=r[r.length-1];if(i?.isImplicit)throw y({token:e.token,errorMessage:`Cannot use implicit variable "${i.name}" in assignment. Implicit variables must be passed via using() parameters.`})}}var La=!0;function Gu({variablesToDrop:e,env:t,context:n}){let r=[],i=t;for(let o of e){let a=Jt(`${k.___drop[0]}(${o.name})`),s=S({expr:a,env:i,context:{...n,expectedType:{env:i,type:H.type}}});r.push(s),s.$&&s.$.env&&(i=s.$.env)}return{deferredDropExpressions:r.length>0?r:void 0,env:i}}function Ro(e,t,n){if(F(e)&&Rt(e))return;if(e.$?.deferredDupExpressions)for(let s of e.$.deferredDupExpressions)Ro(s,t,n);if(F(e)&&F(e.func)&&E(e.func,".",2)&&U(e.func.args[0])&&U(e.func.args[1])&&e.func.args[1].token.value===k.___dup[0]&&e.args.length===0&&e.$?.env){let s=e.func.args[0].token.value,l=X(e.$.env,s);if(l.length>0){let u=l[l.length-1];t.has(u.id)||t.set(u.id,[]),t.get(u.id).push(e)}return}if(F(e)&&E(e,I.while))return;function i(s){if(nt(s.$?.controlFlow))return!0;if(F(s)&&E(s,I.begin)){let l=s.args[s.args.length-1];if(nt(l?.$?.controlFlow)||F(l)&&E(l,I.return))return!0}return!!(F(s)&&E(s,I.return))}function o(s){if(F(s)&&E(s,I.tuple,0))return!0;if(F(s)&&E(s,I.begin)){if(s.args.length===0)return!0;if(s.args.length===1){let l=s.args[0];if(F(l)&&E(l,I.tuple,0))return!0}}return!1}function a(s,l){let u=[],_=[],c=[];for(let p=l;p<s.args.length;p++){let m=s.args[p];if(F(m)&&E(m,"=>",2)){let g=m.args[1],h=Wu(g);u.push(h),_.push(i(g)),c.push(o(g))}}let f=new Set;for(let p of u){for(let m of p.dupCalls.keys())f.add(m);for(let m of p.varsWithPartialBranchDups)n.add(m)}if(u.length>0)for(let p of f){let m=[],g=[];for(let h=0;h<u.length;h++){let d=u[h],v=d.dupCalls.has(p),T=_[h];if(v){let $=d.dupCalls.get(p);T?m.push(...$):g.push(...$)}}for(let h of m)t.has(p)||t.set(p,[]),h.__isEarlyReturnDup=!0,t.get(p).push(h);if(g.length>0){let h=0,d=0;for(let v=0;v<u.length;v++)_[v]||(h++,u[v].dupCalls.has(p)&&d++);if(d===h){t.has(p)||t.set(p,[]);for(let v of g)t.get(p).push(v)}else n.add(p)}}}if(F(e)&&E(e,I.cond)){a(e,0);return}if(F(e)&&E(e,I.match)){e.args[0]&&Ro(e.args[0],t,n),a(e,1);return}if(F(e)){Ro(e.func,t,n);for(let s of e.args)Ro(s,t,n)}}function Wu(e){let t=new Map,n=new Set;return Ro(e,t,n),{dupCalls:t,varsWithPartialBranchDups:n}}function Aa(e){return F(e)&&E(e,I.tuple,0)}function Js(e,t){if(e.$?.deferredDupExpressions&&(e.$.deferredDupExpressions=e.$.deferredDupExpressions.filter(n=>!t.has(n)),e.$.deferredDupExpressions.length===0&&(e.$.deferredDupExpressions=void 0)),F(e)){Js(e.func,t);for(let n of e.args)Js(n,t)}}function ht({expr:e,env:t,context:n,variablesToAdd:r=[],isEvaluatingFunctionBodyBeginBlock:i=!1}){if(F(e)&&E(e,"_")&&!E(e,I.begin)){let $=e;$.args.some(L=>F(L)&&E(L,":"))||($.func={...$.func,token:{...$.func.token,value:I.begin[0]}})}if(!F(e)||!E(e,I.begin)){let $={tag:"FnCall",func:{tag:"Atom",token:{...e.token,value:I.begin[0]}},args:[Ae(e)],token:{...e.token,value:I.begin[0]}};gr(e,$),e=e}let o=e.args,a=n.expectedType;if(o.length===0)return e.$={env:t,type:H.type,value:H,pathCollection:[]},e;t=ze(t,void 0,!0);for(let $=0;$<r.length;$++){let b=r[$],{env:L}=me({env:t,variable:b});t=L}let s=o[o.length-1],l,u=!1;for(let $=0;$<o.length;$++){let b=o[$];if(U(b)&&dt(b,I.return)||F(b)&&E(b,I.return)){if($!==o.length-1&&!($===o.length-2&&Aa(o[o.length-1])))throw y({token:b.token,errorMessage:'The "return" keyword can only be used as the last expression.'});if(F(b)&&he(b,I.return,1),!n.isEvaluatingFunctionBodyOrAsyncBlock)throw y({token:b.token,errorMessage:'The "return" keyword can only be used inside a function body or async block.'});if(l=b,U(b)){b.$={env:t,type:H.type,value:H,pathCollection:[],controlFlow:Br("return")},s=b;break}else{he(b,I.return,1);let L=b.args[0],C=S({expr:L,env:t,context:{...n,expectedType:n.isEvaluatingFunctionBodyOrAsyncBlock.kind==="function-body"?{type:n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type,env:t}:n.expectedType}});if(!C.$)throw y({token:L.token,errorMessage:`Return expression is not evaluated correctly:
|
|
152
152
|
${w(L)}`});if(n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"&&V(n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type)&&n.functionReturnImplConcreteType){let R=C.$.type;if(n.functionReturnImplConcreteType.length>0){let N=n.functionReturnImplConcreteType[0];if(!q({type:N.concreteType,env:N.env},{type:R,env:t}))throw lt([{token:b.token,errorMessage:`All return statements must return the same concrete type for Impl(...).
|
|
153
153
|
Impl(...) uses static dispatch and requires the same concrete type across all returns.
|
|
154
154
|
Consider using Dyn(...) for dynamic dispatch if different concrete types are needed.`},{token:N.token,errorMessage:`First return has concrete type: ${A(N.concreteType)}`},{token:b.token,errorMessage:`Conflicting return has concrete type: ${A(R)}`}])}else n.functionReturnImplConcreteType.push({concreteType:R,env:t,token:b.token})}Ge(C,!0),t=C.$.env,b.$={env:t,type:C.$.type,value:C.$.value,pathCollection:C.$.pathCollection,variableName:C.$.variableName,controlFlow:Br("return")},s=b;break}}else if(U(b)&&dt(b,I.break)){if($!==o.length-1&&!($===o.length-2&&Aa(o[o.length-1])))throw y({token:b.token,errorMessage:'The "break" keyword can only be used as the last expression.'});if(!n.isEvaluatingLoopBody)throw y({token:b.token,errorMessage:'The "break" keyword can only be used inside a loop.'});b.$={env:t,type:H.type,value:H,pathCollection:[],controlFlow:Br("break")},s=b;break}else if(U(b)&&dt(b,I.continue)){if($!==o.length-1&&!($===o.length-2&&Aa(o[o.length-1])))throw y({token:b.token,errorMessage:'The "continue" keyword can only be used as the last expression.'});if(!n.isEvaluatingLoopBody)throw y({token:b.token,errorMessage:'The "continue" keyword can only be used inside a loop.'});b.$={env:t,type:H.type,value:H,pathCollection:[],controlFlow:Br("continue")},s=b;break}else if(F(b)&&E(b,I.escape)){if($!==o.length-1&&!($===o.length-2&&Aa(o[o.length-1])))throw y({token:b.token,errorMessage:'The "escape" keyword can only be used as the last expression.'});if(!n.enclosingFunctionReturnType)throw y({token:b.token,errorMessage:'The "escape" keyword can only be used inside a function that has an enclosing function.'});l=b,he(b,I.escape,1);let L=b.args[0],C=S({expr:L,env:t,context:{...n,expectedType:{type:n.enclosingFunctionReturnType,env:t}}});if(!C.$)throw y({token:L.token,errorMessage:`Escape expression is not evaluated correctly:
|
|
155
155
|
${w(L)}`});if(b.args[0]=C,!V(n.enclosingFunctionReturnType)&&!q({type:n.enclosingFunctionReturnType,env:t},{type:C.$.type,env:t}))throw y({token:L.token,errorMessage:`Incompatible type for \`escape\` argument:
|
|
156
156
|
- Expected (enclosing function return type): ${A(n.enclosingFunctionReturnType)}
|
|
157
157
|
- Got: ${A(C.$.type)}`});Ge(C,!0),t=C.$.env,b.$={env:t,type:C.$.type,value:C.$.value,pathCollection:C.$.pathCollection,variableName:C.$.variableName,controlFlow:Br("escape")},s=b;break}else{let L=S({expr:b,env:t,context:{...n,expectedType:$===o.length-1?a:void 0}});if(L.$?.env&&(t=L.$?.env),$<o.length-1&&!u&&(L.$?.value===void 0||F(L)&&(E(L,"=")||E(L,":="))&&!L.$.isCompileTimeOnlyAssignment)&&(u=!0),nt(L.$?.controlFlow)){s=L;break}}}if(!s.$)throw y({token:s.token,errorMessage:`Last expression in "begin" is not evaluated correctly:
|
|
158
|
-
${w(s)}`});let _=s.$.type;if(et(s.$.controlFlow,"return")){if(n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body")try{Ze({type:n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type,env:t},{type:_,env:t})}catch{if(!q({type:n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type,env:t},{type:_,env:t}))throw y({token:s.token,errorMessage:`Return type mismatch. Expected type "${A(n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type)}", but got "${A(_)}".`})}else if(n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="async-block"&&n.expectedType)try{Ze({type:n.expectedType.type,env:n.expectedType.env},{type:_,env:t})}catch{if(!q({type:n.expectedType.type,env:n.expectedType.env},{type:_,env:t}))throw y({token:s.token,errorMessage:`Return type mismatch. Expected type "${A(n.expectedType.type)}", but got "${A(_)}".`})}}if(l){let $=F(l)&&E(l,I.return,1)?l.args[0]:l;Gr($)}else Gr(s);let c,f=s;F(s)&&E(s,I.return,1)&&(f=s.args[0]);let p=f?f.$?.variableName:void 0;if(p){let $=X(t,p);$.length&&(c=$[$.length-1])}let m;c?.isOwningTheRcValue&&c.frameLevel===t.frames.length-1&&!c.consumedAtToken?(Le(c.type)&&!(V(c.type)&&!c.type.resolvedConcreteType&&c.type.requiredTraits.length===0)&&(m=c),t=Be(t,c,{...c,consumedAtToken:s.token})):c&&f&&(Yt(f,n),t=f.$.env);let g=ji(t),h=[];if(La){if(i&&t.frames.length>=2){let N={...t,frames:t.frames.slice(0,-1)},B=ji(N);g=[...g,...B]}let $=new Map,b=new Set,L=new Map,C=-1;if(F(e))for(let N=0;N<e.args.length;N++){let B=e.args[N];C<0&&qi(B)&&(C=N);let D=Wu(B);for(let[x,z]of D.dupCalls){$.has(x)||$.set(x,[]);let re=$.get(x);for(let j of z)re.includes(j)||(re.push(j),L.set(j,N))}for(let x of D.varsWithPartialBranchDups)b.add(x)}let R=new Set;for(let N of g){let B=N;for(;B.isOwningTheSameRcValueAs;)B=B.isOwningTheSameRcValueAs;let D=B.id,x=$.get(D),z=!ft(B.type)&&Le(B.type),re=b.has(D),j=!1;if(C>=0&&x&&x.length>0)for(let W of x){if(W.__isEarlyReturnDup)continue;let ce=L.get(W);if(ce!==void 0&&ce>C){j=!0;break}}if(x&&x.length>0&&!z&&!re&&!j){let W=0,le=[],ce=[];for(let ve of x){let Y=ve;Y.__isEarlyReturnDup?le.push(ve):Y.__branchGroup?(W++,ce.push(Y.__branchGroup)):(W++,le.push(ve))}if(W<=1){for(let ve of ce)for(let Y of ve)R.add(Y);for(let ve of le)R.add(ve);x.length=0,t=Be(t,N,{...N,consumedAtToken:s.token})}else h.push(N)}else h.push(N)}if(F(e))for(let N of e.args)Js(N,R)}let d,v;if((La?h:g).length>0){let $=Gu({variablesToDrop:La?h:g,env:t,context:{...n,expectedType:void 0}});d=$.deferredDropExpressions,t=$.env}if(La&&m){let $=Be(t,m,{...m,consumedAtToken:void 0});try{v=Gu({variablesToDrop:[m],env:$,context:{...n,expectedType:void 0}}).deferredDropExpressions}catch{}}l&&l.$&&(l.$.deferredDropExpressions=d);let T=t.frames[t.frames.length-1];return t=_t(t),e.$={env:t,type:s.$.type,value:u?void 0:s.$.value,pathCollection:[],controlFlow:s.$.controlFlow,deferredDropExpressions:d,consumedVariableDropExpressions:v,poppedEnvFrame:T},c&&f?.$?.deferredDupExpressions&&f.$.deferredDupExpressions.length>0?Ge(e,!0,c):c?.consumedAtToken?Ge(e,!0,c):Ge(e,!0),e}function Ia({beginExprs:e,env:t,context:n,allowPartialModule:r=!1}){let i=ba(t),o=[],a;t=
|
|
158
|
+
${w(s)}`});let _=s.$.type;if(et(s.$.controlFlow,"return")){if(n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body")try{Ze({type:n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type,env:t},{type:_,env:t})}catch{if(!q({type:n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type,env:t},{type:_,env:t}))throw y({token:s.token,errorMessage:`Return type mismatch. Expected type "${A(n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type)}", but got "${A(_)}".`})}else if(n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="async-block"&&n.expectedType)try{Ze({type:n.expectedType.type,env:n.expectedType.env},{type:_,env:t})}catch{if(!q({type:n.expectedType.type,env:n.expectedType.env},{type:_,env:t}))throw y({token:s.token,errorMessage:`Return type mismatch. Expected type "${A(n.expectedType.type)}", but got "${A(_)}".`})}}if(l){let $=F(l)&&E(l,I.return,1)?l.args[0]:l;Gr($)}else Gr(s);let c,f=s;F(s)&&E(s,I.return,1)&&(f=s.args[0]);let p=f?f.$?.variableName:void 0;if(p){let $=X(t,p);$.length&&(c=$[$.length-1])}let m;c?.isOwningTheRcValue&&c.frameLevel===t.frames.length-1&&!c.consumedAtToken?(Le(c.type)&&!(V(c.type)&&!c.type.resolvedConcreteType&&c.type.requiredTraits.length===0)&&(m=c),t=Be(t,c,{...c,consumedAtToken:s.token})):c&&f&&(Yt(f,n),t=f.$.env);let g=ji(t),h=[];if(La){if(i&&t.frames.length>=2){let N={...t,frames:t.frames.slice(0,-1)},B=ji(N);g=[...g,...B]}let $=new Map,b=new Set,L=new Map,C=-1;if(F(e))for(let N=0;N<e.args.length;N++){let B=e.args[N];C<0&&qi(B)&&(C=N);let D=Wu(B);for(let[x,z]of D.dupCalls){$.has(x)||$.set(x,[]);let re=$.get(x);for(let j of z)re.includes(j)||(re.push(j),L.set(j,N))}for(let x of D.varsWithPartialBranchDups)b.add(x)}let R=new Set;for(let N of g){let B=N;for(;B.isOwningTheSameRcValueAs;)B=B.isOwningTheSameRcValueAs;let D=B.id,x=$.get(D),z=!ft(B.type)&&Le(B.type),re=b.has(D),j=!1;if(C>=0&&x&&x.length>0)for(let W of x){if(W.__isEarlyReturnDup)continue;let ce=L.get(W);if(ce!==void 0&&ce>C){j=!0;break}}if(x&&x.length>0&&!z&&!re&&!j){let W=0,le=[],ce=[];for(let ve of x){let Y=ve;Y.__isEarlyReturnDup?le.push(ve):Y.__branchGroup?(W++,ce.push(Y.__branchGroup)):(W++,le.push(ve))}if(W<=1){for(let ve of ce)for(let Y of ve)R.add(Y);for(let ve of le)R.add(ve);x.length=0,t=Be(t,N,{...N,consumedAtToken:s.token})}else h.push(N)}else h.push(N)}if(F(e))for(let N of e.args)Js(N,R)}let d,v;if((La?h:g).length>0){let $=Gu({variablesToDrop:La?h:g,env:t,context:{...n,expectedType:void 0}});d=$.deferredDropExpressions,t=$.env}if(La&&m){let $=Be(t,m,{...m,consumedAtToken:void 0});try{v=Gu({variablesToDrop:[m],env:$,context:{...n,expectedType:void 0}}).deferredDropExpressions}catch{}}l&&l.$&&(l.$.deferredDropExpressions=d);let T=t.frames[t.frames.length-1];return t=_t(t),e.$={env:t,type:s.$.type,value:u?void 0:s.$.value,pathCollection:[],controlFlow:s.$.controlFlow,deferredDropExpressions:d,consumedVariableDropExpressions:v,poppedEnvFrame:T},c&&f?.$?.deferredDupExpressions&&f.$.deferredDupExpressions.length>0?Ge(e,!0,c):c?.consumedAtToken?Ge(e,!0,c):Ge(e,!0),e}function Ia({beginExprs:e,env:t,context:n,allowPartialModule:r=!1}){let i=ba(t),o=[],a;t=ze(t);for(let l=0;l<e.length;l++){let u=e[l];try{if(F(u)&&E(u,I.export)){let _=u.args;for(let c=0;c<_.length;c++){let f=_[c];if(F(f)&&E(f,"...")){let p=f.args[0],m=f.args[1],g=S({expr:p,env:t,context:{...n}});if(!g.$)throw y({token:p.token,errorMessage:`Failed to evaluate the extended struct expression:
|
|
159
159
|
${w(p)}`});let h=g.$.type;if(!Te(h))throw y({token:p.token,errorMessage:`Expected struct type for export, got:
|
|
160
160
|
${A(h)}`});let d=g.$.value,v=new Set;if(m)if(F(m)&&E(m,":",2)&&dt(m.args[0],"exclude")&&(m=m.args[1]),U(m)){let T=m.token.value,$=h.fields.find(b=>b.label===T);if(!$)throw y({token:m.token,errorMessage:`Label "${T}" is not found in the extended module type.`});v.add(T),m.$={env:t,type:$.type,value:$.assignedValue,pathCollection:[]}}else if(F(m)&&E(m,I.tuple))for(let T of m.args){if(!U(T))throw y({token:T.token,errorMessage:`Expected identifier for excluded label, got:
|
|
161
161
|
${w(T)}`});let $=T.token.value,b=h.fields.find(L=>L.label===$);if(!b)throw y({token:T.token,errorMessage:`Label "${$}" is not found in the extended module type.`});v.add($),T.$={env:t,type:b.type,value:b.assignedValue,pathCollection:[]}}else throw y({token:m.token,errorMessage:`Expected identifier or tuple for excluded labels, got:
|
|
@@ -164,7 +164,7 @@ ${w(f)}`});p=f.token.value,m=p}else if(F(f)&&E(f,":",2)){let v=f.args[0],T=f.arg
|
|
|
164
164
|
${w(v)}`});if(!je(v))throw y({token:v.token,errorMessage:`Expected identifier for export, got:
|
|
165
165
|
${w(v)}`});if(p=v.token.value,!U(T))throw y({token:T.token,errorMessage:`Expected identifier for export, got:
|
|
166
166
|
${w(T)}`});if(!je(T))throw y({token:T.token,errorMessage:`Expected identifier for export, got:
|
|
167
|
-
${w(T)}`});m=T.token.value}let g=X(t,m);if(g.length===0)throw y({token:f.token,errorMessage:`Variable "${m}" is not defined in the module.`});let h=g[g.length-1];if(i.fields.findIndex(v=>v.label===m)>=0)throw y({token:f.token,errorMessage:`Variable "${m}" is already exported in the module.`});if(!h.isCompileTimeOnly)throw y({token:f.token,errorMessage:`Variable "${m}" is not a compile-time variable and cannot be exported.`});i.fields.push({label:p,type:h.type,assignedValue:h.isCompileTimeOnly?h.value?.[0]:void 0,defaultValue:void 0,exprs:{expr:f,labelExpr:void 0,typeExpr:void 0,assignedValueExpr:void 0,defaultValueExpr:void 0}}),o.push(h.value?.[0]),f.$={env:t,type:h.type,value:h.value?.[0],pathCollection:[]}}}}else{let _=S({expr:u,env:t,context:{...n,expectedType:void 0}});_.$?.env&&(t=_.$?.env)}}catch(_){if(r){a=_;break}else throw _}}try{a||(t=_t(t))}catch(l){if(r)a=l;else throw l}return{moduleValue:_a({...i},o),moduleType:i,env:t,partialModuleError:a}}function Sa({functionType:e,specializedEnv:t,SelfType:n}){let r=e.parameters.map(u=>{if(!u.exprs.typeExpr)return u;let _=Ae(u.exprs.typeExpr),c=S({expr:_,env:t,context:{isEvaluatingGenericImplSpecialization:!0,stdPath:"",isEvaluatingFunctionType:!0,SelfType:n}});return O(c.$?.value)?{...u,type:c.$.value.value,exprs:{...u.exprs}}:u}),i=e.return.type,o=Ae(e.return.typeExpr),a=S({expr:o,env:t,context:{isEvaluatingGenericImplSpecialization:!0,stdPath:"",isEvaluatingFunctionType:!0,SelfType:n}});O(a.$?.value)&&(i=a.$.value.value);let s=e.SelfType;n&&(s=n);let l={...e.parametersFrame,variables:e.parametersFrame.variables.map(u=>{let _=r.find(f=>f.label===u.name),c=_?_.type:u.type;return c!==u.type?{...u,type:c}:u})};return{...e,env:t,forallParameters:[],parameters:r,parametersFrame:l,return:{...e.return,type:i},SelfType:s}}var Po=new Map;function ay({traitExpr:e,traitType:t}){if(!e||!F(e))return{};let n=e.func;if(F(n)){let r=n.args.map(o=>Ae(o)),i;if(t.functionValue&&G(t.functionValue.type)){let o=t.functionValue.type;o.parameters.length>0?i=o.parameters.map(a=>a.label):o.forallParameters.length>0&&(i=o.forallParameters.map(a=>a.label))}return{traitTypeArgExprs:r,traitFunctionParamNames:i}}if(!t.functionValue){let r=[],i=[];for(let o of e.args)if(F(o)&&E(o,":",2)){let a=o.args[0],s=o.args[1];if(U(a)){let l=a.token.value,u=t.fields.find(_=>_.label===l);u&&!G(u.type)&&(r.push(Ae(s)),i.push(l))}}if(r.length>0)return{traitTypeArgExprs:r,traitFunctionParamNames:i}}return{}}function Yu({fieldExprs:e,env:t,context:n,receiverType:r}){let i=[],o=Oe(t),a=[],s=!1,l=r?.trait;r?.trait&&(r.trait={...r.trait,fields:[...r.trait.fields]}),t=
|
|
167
|
+
${w(T)}`});m=T.token.value}let g=X(t,m);if(g.length===0)throw y({token:f.token,errorMessage:`Variable "${m}" is not defined in the module.`});let h=g[g.length-1];if(i.fields.findIndex(v=>v.label===m)>=0)throw y({token:f.token,errorMessage:`Variable "${m}" is already exported in the module.`});if(!h.isCompileTimeOnly)throw y({token:f.token,errorMessage:`Variable "${m}" is not a compile-time variable and cannot be exported.`});i.fields.push({label:p,type:h.type,assignedValue:h.isCompileTimeOnly?h.value?.[0]:void 0,defaultValue:void 0,exprs:{expr:f,labelExpr:void 0,typeExpr:void 0,assignedValueExpr:void 0,defaultValueExpr:void 0}}),o.push(h.value?.[0]),f.$={env:t,type:h.type,value:h.value?.[0],pathCollection:[]}}}}else{let _=S({expr:u,env:t,context:{...n,expectedType:void 0}});_.$?.env&&(t=_.$?.env)}}catch(_){if(r){a=_;break}else throw _}}try{a||(t=_t(t))}catch(l){if(r)a=l;else throw l}return{moduleValue:_a({...i},o),moduleType:i,env:t,partialModuleError:a}}function Sa({functionType:e,specializedEnv:t,SelfType:n}){let r=e.parameters.map(u=>{if(!u.exprs.typeExpr)return u;let _=Ae(u.exprs.typeExpr),c=S({expr:_,env:t,context:{isEvaluatingGenericImplSpecialization:!0,stdPath:"",isEvaluatingFunctionType:!0,SelfType:n}});return O(c.$?.value)?{...u,type:c.$.value.value,exprs:{...u.exprs}}:u}),i=e.return.type,o=Ae(e.return.typeExpr),a=S({expr:o,env:t,context:{isEvaluatingGenericImplSpecialization:!0,stdPath:"",isEvaluatingFunctionType:!0,SelfType:n}});O(a.$?.value)&&(i=a.$.value.value);let s=e.SelfType;n&&(s=n);let l={...e.parametersFrame,variables:e.parametersFrame.variables.map(u=>{let _=r.find(f=>f.label===u.name),c=_?_.type:u.type;return c!==u.type?{...u,type:c}:u})};return{...e,env:t,forallParameters:[],parameters:r,parametersFrame:l,return:{...e.return,type:i},SelfType:s}}var Po=new Map;function ay({traitExpr:e,traitType:t}){if(!e||!F(e))return{};let n=e.func;if(F(n)){let r=n.args.map(o=>Ae(o)),i;if(t.functionValue&&G(t.functionValue.type)){let o=t.functionValue.type;o.parameters.length>0?i=o.parameters.map(a=>a.label):o.forallParameters.length>0&&(i=o.forallParameters.map(a=>a.label))}return{traitTypeArgExprs:r,traitFunctionParamNames:i}}if(!t.functionValue){let r=[],i=[];for(let o of e.args)if(F(o)&&E(o,":",2)){let a=o.args[0],s=o.args[1];if(U(a)){let l=a.token.value,u=t.fields.find(_=>_.label===l);u&&!G(u.type)&&(r.push(Ae(s)),i.push(l))}}if(r.length>0)return{traitTypeArgExprs:r,traitFunctionParamNames:i}}return{}}function Yu({fieldExprs:e,env:t,context:n,receiverType:r}){let i=[],o=Oe(t),a=[],s=!1,l=r?.trait;r?.trait&&(r.trait={...r.trait,fields:[...r.trait.fields]}),t=ze(t);for(let u of e){if(F(u)&&E(u,I.begin))throw y({token:u.token,errorMessage:'impl receiverType, ... no longer accepts begin blocks. Use "impl { ... }" for anonymous modules.'});if(F(u)&&(E(u,"::",2)||E(u,":=",2)))throw y({token:u.token,errorMessage:'impl fields must use ":". "::" and ":=" are not allowed here.'});if(F(u)&&E(u,":",2)){let c=u.args[0],f=u.args[1];if(!U(c)||!je(c))throw y({token:c.token,errorMessage:`Expected identifier for impl field name, got:
|
|
168
168
|
${w(c)}`});let p=c.token.value,m=S({expr:f,env:t,context:{...n,expectedType:void 0,SelfType:r}});if(!m.$?.type)throw y({token:f.token,errorMessage:`Failed to evaluate impl field value for "${p}".`});t=m.$.env;let g=m.$.type,h=m.$.value;if(!h)throw y({token:f.token,errorMessage:`impl field "${p}" must be a compile-time value.`});ne(h)&&!h.funcName&&(h.funcName=p,h.funcId+=`_${p}`);let{env:d}=me({env:t,variable:{name:p,type:g,isCompileTimeOnly:!0,value:[h],token:c.token,initializedAtToken:c.token,consumedAtToken:void 0,isOwningTheRcValue:!1}});t=d,o.fields.push({label:p,type:g,assignedValue:h,defaultValue:void 0,exprs:{expr:u}}),a.push(h),s=!0,r?.trait&&r.trait.fields.push({label:p,type:g,assignedValue:h,defaultValue:void 0,exprs:{expr:u}});continue}let _=S({expr:u,env:t,context:{...n,expectedType:void 0,ReceiverType:r}});if(!_.$||!Tt(_.$.value))throw y({token:u.token,errorMessage:`Expected trait value in impl field list, got:
|
|
169
169
|
${w(u)}`});t=_.$.env,i.push({traitValue:_.$.value,sourceExpr:u,isAnonymousTrait:!1})}if(t=_t(t),r&&(r.trait=l),s){let u=Fi({...o,receiverType:r},a);i.unshift({traitValue:u,sourceExpr:void 0,isAnonymousTrait:!0})}return{env:t,traitEntries:i}}var tr=new Map,mi=new Map;function zo(e){for(let[t,n]of tr.entries()){let r=n.filter(i=>i.sourceModulePath!==e);r.length===0?tr.delete(t):tr.set(t,r)}}function sy(e){for(let[t,n]of mi.entries()){let r=n.filter(i=>i.modulePath!==e);r.length===0?mi.delete(t):mi.set(t,r)}}function el(){Po.clear(),tr.clear(),mi.clear()}function Na(e){return e.functionValue?e.functionValue.funcId:e.typeName||e.id}function qu(e){if("functionValue"in e){let t=e.functionValue;if(t)return t.funcId}return e.id}function Hu(e,t){if(!t.traitType.typeName){let r=t.traitType.fields.filter(i=>i.label&&G(i.type)).map(i=>i.label);if(r.length>0){let i=qu(t.receiverTypePattern);if(i){for(let[o,a]of tr.entries())for(let s of a)if(!(s.traitType.typeName||qu(s.receiverTypePattern)!==i)){for(let u of s.traitType.fields)if(u.label&&G(u.type)&&r.includes(u.label))throw y({token:t.expr.token,errorMessage:`Method "${u.label}" is already defined for type "${A(t.receiverTypePattern)}".
|
|
170
170
|
Cannot define duplicate method names across impl blocks. Use a different name (e.g., "comptime_${u.label}") for the comptime variant.`})}}}}let n=tr.get(e);n||(n=[],tr.set(e,n)),n.push(t)}function ly({receiverType:e,traitType:t,currentModulePath:n,expr:r}){let i=e.id,a=(mi.get(i)||[]).find(s=>s.traitTypeId===t.id);if(a)throw y({token:r.token,errorMessage:`Trait "${t.typeName??t.id}" is already implemented for type "${A(e)}".
|
|
@@ -172,24 +172,24 @@ First implementation was in: ${a.modulePath||"unknown"}`})}function uy({receiver
|
|
|
172
172
|
At least one of the trait or the type must be defined in this module.
|
|
173
173
|
Trait defined in: ${t.definedInModulePath||"unknown"}
|
|
174
174
|
Type defined in: ${e.definedInModulePath||"unknown"}
|
|
175
|
-
Current module: ${n}`})}function xa({concreteType:e,traitType:t,env:n}){let r=Na(t),i=tr.get(r);if(!(!i||i.length===0)){for(let o of i)if(Da({concreteType:e,impl:o,env:n}).matched)return o}}function nr({concreteType:e,methodName:t,env:n}){if(V(e)){let i=Ot(n,e);V(i)||(e=i)}let r=[];for(let[i,o]of tr.entries())for(let a of o){let s=Da({concreteType:e,impl:a,env:n});if(!s.matched)continue;let l=a.traitType,u=a.traitValue,_=l.fields.findIndex(c=>c.label===t&&G(c.type));if(_>=0){let c=l.fields[_];if(G(c.type)){let f=u.fields[_],p=wr(e);if(ne(f)&&(s.valueSubstitutions.size>0||s.substitutions.size>0)&&!p){let g=a.definitionEnv,h=
|
|
175
|
+
Current module: ${n}`})}function xa({concreteType:e,traitType:t,env:n}){let r=Na(t),i=tr.get(r);if(!(!i||i.length===0)){for(let o of i)if(Da({concreteType:e,impl:o,env:n}).matched)return o}}function nr({concreteType:e,methodName:t,env:n}){if(V(e)){let i=Ot(n,e);V(i)||(e=i)}let r=[];for(let[i,o]of tr.entries())for(let a of o){let s=Da({concreteType:e,impl:a,env:n});if(!s.matched)continue;let l=a.traitType,u=a.traitValue,_=l.fields.findIndex(c=>c.label===t&&G(c.type));if(_>=0){let c=l.fields[_];if(G(c.type)){let f=u.fields[_],p=wr(e);if(ne(f)&&(s.valueSubstitutions.size>0||s.substitutions.size>0)&&!p){let g=a.definitionEnv,h=ze(g);for(let[b,L]of s.substitutions){let{env:C}=me({env:h,variable:{name:b,type:tt(),isCompileTimeOnly:!0,value:[ee(L)],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});h=C}for(let[b,L]of s.valueSubstitutions){let{env:C}=me({env:h,variable:{name:b,type:L.type,isCompileTimeOnly:!0,value:[L],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});h=C}if(a.traitTypeArgExprs&&a.traitFunctionParamNames&&a.traitTypeArgExprs.length===a.traitFunctionParamNames.length)for(let b=0;b<a.traitTypeArgExprs.length;b++){let L=a.traitTypeArgExprs[b],C=a.traitFunctionParamNames[b],R=S({expr:Ae(L),env:h,context:{isEvaluatingGenericImplSpecialization:!0,stdPath:""}});if(R.$&&O(R.$.value)){let{env:N}=me({env:h,variable:{name:C,type:tt(),isCompileTimeOnly:!0,value:[R.$.value],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});h=N}}let d=Sa({functionType:c.type,specializedEnv:h,SelfType:s.substitutions.get("Self")});h=ze(h,d.parametersFrame);let v=Ae(f.body),T=ht({expr:v,env:h,context:{isEvaluatingGenericImplSpecialization:!0,expectedType:{type:d.return.type,env:h},stdPath:"",isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:d,value:f,evaluationEnv:h},functionReturnImplConcreteType:[],SelfType:s.substitutions.get("Self")},variablesToAdd:[],isEvaluatingFunctionBodyBeginBlock:!0}),$={...f,specializedType:d,body:T,funcId:`${f.funcId}_specialized_${[...s.substitutions.entries()].map(([b,L])=>`${b}_${A(L)}`).join("_")}_${[...s.valueSubstitutions.entries()].map(([b,L])=>`${b}_${Me(L)}`).join("_")}`,funcName:f.funcName?`${f.funcName}_specialized`:void 0};r.push({type:d,value:$})}else if(p){let g=a.definitionEnv,h=ze(g);for(let[v,T]of s.substitutions){let{env:$}=me({env:h,variable:{name:v,type:tt(),isCompileTimeOnly:!0,value:[ee(T)],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});h=$}for(let[v,T]of s.valueSubstitutions){let{env:$}=me({env:h,variable:{name:v,type:T.type,isCompileTimeOnly:!0,value:[T],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});h=$}let d=Sa({functionType:c.type,specializedEnv:h,SelfType:s.substitutions.get("Self")});r.push({type:d,value:void 0})}else if(ne(f)){let g={...f,specializedType:c.type};r.push({type:c.type,value:g})}else if(!ne(f)&&(s.substitutions.size>0||s.valueSubstitutions.size>0)){let g=a.definitionEnv,h=ze(g);for(let[v,T]of s.substitutions){let{env:$}=me({env:h,variable:{name:v,type:tt(),isCompileTimeOnly:!0,value:[ee(T)],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});h=$}for(let[v,T]of s.valueSubstitutions){let{env:$}=me({env:h,variable:{name:v,type:T.type,isCompileTimeOnly:!0,value:[T],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});h=$}let d=Sa({functionType:c.type,specializedEnv:h,SelfType:s.substitutions.get("Self")});r.push({type:d,value:f})}else r.push({type:c.type,value:f})}}}return r}function Va({concreteType:e,propertyName:t,env:n}){if(V(e)){let r=Ot(n,e);V(r)||(e=r)}for(let[r,i]of tr.entries())for(let o of i){let a;try{a=Da({concreteType:e,impl:o,env:n})}catch{continue}if(!a.matched)continue;let s=o.traitType,l=s.fields.findIndex(c=>c.label===t&&!G(c.type));if(l<0)continue;if(o.traitTypeArgExprs&&o.traitFunctionParamNames&&o.traitTypeArgExprs.length===o.traitFunctionParamNames.length){let c=o.definitionEnv,f=ze(c);for(let[p,m]of a.substitutions){let{env:g}=me({env:f,variable:{name:p,type:tt(),isCompileTimeOnly:!0,value:[ee(m)],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});f=g}for(let p=0;p<o.traitTypeArgExprs.length;p++){let m=o.traitTypeArgExprs[p];if(o.traitFunctionParamNames[p]===t)try{let h=Ae(m),d=S({expr:h,env:f,context:{stdPath:"",isEvaluatingGenericImplSpecialization:!0}});if(d.$&&O(d.$.value))return{type:d.$.value.type,value:d.$.value}}catch{}}}let u=s.fields[l],_=o.traitValue.fields[l]??u.assignedValue;if(!(!_||!O(_))){if(!V(_.value))return{type:_.type,value:_};for(let c of o.forallParameters)if(c.kind==="type"&&c.someType===_.value){let f=a.substitutions.get(c.name);if(f){let p=ee(f);return{type:p.type,value:p}}}}}}function Ku({concreteType:e,traitType:t,methodName:n,env:r}){let i=Na(t),o=tr.get(i);if(!(!o||o.length===0))for(let a of o){let s=Da({concreteType:e,impl:a,env:r});if(!s.matched)continue;let l=a.traitType,u=a.traitValue,_=l.fields.findIndex(c=>c.label===n&&G(c.type));if(_>=0){let c=l.fields[_];if(G(c.type)){let f=u.fields[_];if(ne(f)&&(s.valueSubstitutions.size>0||s.substitutions.size>0)){let p=a.definitionEnv,m=ze(p);for(let[T,$]of s.substitutions){let{env:b}=me({env:m,variable:{name:T,type:tt(),isCompileTimeOnly:!0,value:[ee($)],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});m=b}for(let[T,$]of s.valueSubstitutions){let{env:b}=me({env:m,variable:{name:T,type:$.type,isCompileTimeOnly:!0,value:[$],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});m=b}let g=Sa({functionType:c.type,specializedEnv:m,SelfType:s.substitutions.get("Self")});m=ze(m,g.parametersFrame);let h=Ae(f.body),d=ht({expr:h,env:m,context:{isEvaluatingGenericImplSpecialization:!0,expectedType:{type:g.return.type,env:m},stdPath:"",isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:g,value:f,evaluationEnv:m},functionReturnImplConcreteType:[],SelfType:s.substitutions.get("Self")},variablesToAdd:[],isEvaluatingFunctionBodyBeginBlock:!0}),v={...f,specializedType:g,body:d,funcId:`${f.funcId}_specialized_${[...s.substitutions.entries()].map(([T,$])=>`${T}_${A($)}`).join("_")}_${[...s.valueSubstitutions.entries()].map(([T,$])=>`${T}_${Me($)}`).join("_")}`,funcName:f.funcName?`${f.funcName}_specialized`:void 0};return{type:g,value:v}}else if(ne(f)){let p={...f,specializedType:c.type};return{type:c.type,value:p}}else return{type:c.type,value:f}}}}}function Da({concreteType:e,impl:t,env:n}){let r={matched:!1,substitutions:new Map,valueSubstitutions:new Map};if(V(e)){let o=Ot(n,e);if(V(o))return r;e=o}let i=ze(n);for(let o of t.forallParameters)if(o.kind==="type"){let{env:a}=me({env:i,variable:{name:o.name,type:tt(),isCompileTimeOnly:!0,value:[ee(o.someType)],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});i=a}else{let{env:a}=me({env:i,variable:{name:o.name,type:o.type,isCompileTimeOnly:!0,value:[o.unknownValue],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});i=a}try{let{expectedEnv:o}=Ze({type:t.receiverTypePattern,env:i},{type:e,env:n});for(let{someType:l,traitType:u,traitExpr:_}of t.whereConstraints){let c=ju(o,l);if(!c)return r;let f=u;if(_)try{let p=Ae(_),m=S({expr:p,env:o,context:{stdPath:"",isEvaluatingGenericImplSpecialization:!0}});m.$&&O(m.$.value)&&De(m.$.value.value)&&(f=m.$.value.value)}catch{}if(f.isNegatedConstraint){if(V(c)){if(!fy(c,f,n))return r;continue}if(St({targetType:c,traitType:f,env:n}))return r;continue}if(V(c)){if(!cy(c,f,n))return r;continue}if(!St({targetType:c,traitType:f,env:o}))return r}let a=new Map,s=new Map;for(let l of t.forallParameters)if(l.kind==="type"){let u=ju(o,l.someType);u&&!V(u)&&a.set(l.name,u)}else{let u=X(o,l.name),_=u[u.length-1];if(_&&_.value&&!de(_.value[0])){let c={..._.value[0],type:l.type};s.set(l.name,c)}}return a.set("Self",e),{matched:!0,substitutions:a,valueSubstitutions:s}}catch{return r}}function cy(e,t,n){if(!t.typeName)return!1;for(let o of e.requiredTraits)if(o.traitType.id===t.id)return!0;let i=Yn(n,e);if(i){for(let o of i.requiredTraits)if(o.id===t.id)return!0}for(let o of e.trait.fields)if(Tt(o.assignedValue)&&o.assignedValue.type.id===t.id)return!0;return!1}function fy(e,t,n){if(!t.typeName)return!1;if(e.negativeTraits){for(let o of e.negativeTraits)if(o.traitType.id===t.id)return!0}let i=Yn(n,e);if(i){for(let o of i.negativeTraits)if(o.id===t.id)return!0}return!1}function py({receiverTypePattern:e,traitType:t,whereConstraints:n,env:r,errorToken:i}){if(t.selfConstraints&&t.selfConstraints.length>0)for(let o of t.selfConstraints){if(St({targetType:e,traitType:o,env:r}))continue;let a=new Set;for(let s of n)s.traitType.typeName===o.typeName&&!s.traitType.isNegatedConstraint&&a.add(s.someType.name);throw y({token:i,errorMessage:`Generic impl receiver type "${A(e)}" does not satisfy constraint "${o.typeName??A(o)}" required by trait "${t.typeName??A(t)}".
|
|
176
176
|
Consider adding "where(T <: ${o.typeName??A(o)})" to the impl.`})}if(t.negativeSelfConstraints&&t.negativeSelfConstraints.length>0){for(let o of t.negativeSelfConstraints)if(St({targetType:e,traitType:o,env:r}))throw y({token:i,errorMessage:`Generic impl receiver type "${A(e)}" implements "${o.typeName??A(o)}" but trait "${t.typeName??A(t)}" requires it to NOT implement this trait.
|
|
177
|
-
Consider adding "where(T <: !(${o.typeName??A(o)}))" to the impl.`})}}function ju(e,t){for(let n=e.frames.length-1;n>=0;n--){let r=e.frames[n];for(let i of r.variables)if(i.name===t.name&&i.value&&O(i.value[0]))return i.value[0].value}return t}function Uo(e){let t=Po.get(e);if(t){for(let n of t)n.fields=n.fields.filter(r=>r.sourceModulePath!==e);Po.delete(e),sy(e)}}function dy(e,t){let n=Po.get(e);n||(n=new Set,Po.set(e,n)),n.add(t)}function my(e,t,n){let r=e.type.receiverType;if(!(!r||!r.trait))if(e.type.typeName&&(_y({receiverType:r,traitType:e.type,currentModulePath:n,expr:t}),ly({receiverType:r,traitType:e.type,currentModulePath:n,expr:t}),uy({receiverType:r,traitType:e.type,currentModulePath:n,expr:t})),n&&dy(n,r.trait),e.type.typeName){let i={label:"",type:
|
|
177
|
+
Consider adding "where(T <: !(${o.typeName??A(o)}))" to the impl.`})}}function ju(e,t){for(let n=e.frames.length-1;n>=0;n--){let r=e.frames[n];for(let i of r.variables)if(i.name===t.name&&i.value&&O(i.value[0]))return i.value[0].value}return t}function Uo(e){let t=Po.get(e);if(t){for(let n of t)n.fields=n.fields.filter(r=>r.sourceModulePath!==e);Po.delete(e),sy(e)}}function dy(e,t){let n=Po.get(e);n||(n=new Set,Po.set(e,n)),n.add(t)}function my(e,t,n){let r=e.type.receiverType;if(!(!r||!r.trait))if(e.type.typeName&&(_y({receiverType:r,traitType:e.type,currentModulePath:n,expr:t}),ly({receiverType:r,traitType:e.type,currentModulePath:n,expr:t}),uy({receiverType:r,traitType:e.type,currentModulePath:n,expr:t})),n&&dy(n,r.trait),e.type.typeName){let i={label:"",type:hn(1),assignedValue:e,sourceModulePath:n,exprs:{expr:t}};r.trait.fields.push(i)}else for(let i=0;i<e.type.fields.length;i++){let o=e.type.fields[i],a=e.fields[i];if(o.label&&G(o.type)&&r.trait.fields.find(u=>u.label===o.label&&G(u.type)))throw y({token:t.token,errorMessage:`Method "${o.label}" is already defined for type "${A(r)}".
|
|
178
178
|
Cannot define duplicate method names across impl blocks. Use a different name (e.g., "comptime_${o.label}") for the comptime variant.`});let s={label:o.label,type:o.type,assignedValue:a,sourceModulePath:n,exprs:{expr:t}};r.trait.fields.push(s)}}function Xu({expr:e,env:t,context:n}){if(!E(e,I.impl))throw y({token:e.token,errorMessage:`Expected "impl", got:
|
|
179
|
-
${w(e)}`});if(e.args.length===1&&F(e.args[0])&&E(e.args[0],I.begin)){let $=e.args[0].args,{moduleType:b,moduleValue:L,env:C}=Ia({beginExprs:$,env:t,context:{...n,expectedType:void 0,SelfType:n.SelfType}});return t=C,e.$={env:t,type:b,value:L,pathCollection:[]},e}let r=e.args,i=0,o,a;if(r[i]&&F(r[i])&&E(r[i],I.forall)&&(o=r[i],i++),r[i]&&F(r[i])&&E(r[i],I.where)){if(!o)throw y({token:r[i].token,errorMessage:"impl where(...) requires forall(...) and may appear before or after the receiver type."});a=r[i],i++}if(!r[i])throw y({token:e.token,errorMessage:"impl requires a receiver type and at least one field."});let s=r[i];if(i++,r[i]&&F(r[i])&&E(r[i],I.where)){if(!o)throw y({token:r[i].token,errorMessage:"impl where(...) requires forall(...) and may appear before or after the receiver type."});if(a)throw y({token:r[i].token,errorMessage:"impl supports only a single where(...) clause."});a=r[i],i++}let l=r.slice(i);if(l.length===0)throw y({token:e.token,errorMessage:"impl requires at least one field after the receiver type."});if(!o){let $=S({expr:s,env:t,context:{...n}});if(!$.$||!$.$.value||!O($.$.value))throw y({token:s.token,errorMessage:"Expected type for receiver type argument."});t=$.$.env;let b=$.$.value.value,L=Qe(b)||ke(b),{env:C,traitEntries:R}=Yu({fieldExprs:l,env:t,context:{...n},receiverType:b});if(t=C,R.length===0)throw y({token:e.token,errorMessage:"impl requires at least one trait or member field."});for(let B of R){let D=B.traitValue,x=D.type;if(B.isAnonymousTrait||Qu({targetType:b,traitType:x,env:t,errorToken:e.token}),L){let z=Na(x),re={forallParameters:[],whereConstraints:[],receiverTypePattern:b,traitType:x,traitValue:D,expr:e,sourceModulePath:n.currentModulePath,definitionEnv:t};Hu(z,re)}else my(D,e,n.currentModulePath)}let N=R[0].traitValue;return e.$={env:t,type:N.type,value:N,pathCollection:[]},e}let _=o.args,c=[];t=
|
|
179
|
+
${w(e)}`});if(e.args.length===1&&F(e.args[0])&&E(e.args[0],I.begin)){let $=e.args[0].args,{moduleType:b,moduleValue:L,env:C}=Ia({beginExprs:$,env:t,context:{...n,expectedType:void 0,SelfType:n.SelfType}});return t=C,e.$={env:t,type:b,value:L,pathCollection:[]},e}let r=e.args,i=0,o,a;if(r[i]&&F(r[i])&&E(r[i],I.forall)&&(o=r[i],i++),r[i]&&F(r[i])&&E(r[i],I.where)){if(!o)throw y({token:r[i].token,errorMessage:"impl where(...) requires forall(...) and may appear before or after the receiver type."});a=r[i],i++}if(!r[i])throw y({token:e.token,errorMessage:"impl requires a receiver type and at least one field."});let s=r[i];if(i++,r[i]&&F(r[i])&&E(r[i],I.where)){if(!o)throw y({token:r[i].token,errorMessage:"impl where(...) requires forall(...) and may appear before or after the receiver type."});if(a)throw y({token:r[i].token,errorMessage:"impl supports only a single where(...) clause."});a=r[i],i++}let l=r.slice(i);if(l.length===0)throw y({token:e.token,errorMessage:"impl requires at least one field after the receiver type."});if(!o){let $=S({expr:s,env:t,context:{...n}});if(!$.$||!$.$.value||!O($.$.value))throw y({token:s.token,errorMessage:"Expected type for receiver type argument."});t=$.$.env;let b=$.$.value.value,L=Qe(b)||ke(b),{env:C,traitEntries:R}=Yu({fieldExprs:l,env:t,context:{...n},receiverType:b});if(t=C,R.length===0)throw y({token:e.token,errorMessage:"impl requires at least one trait or member field."});for(let B of R){let D=B.traitValue,x=D.type;if(B.isAnonymousTrait||Qu({targetType:b,traitType:x,env:t,errorToken:e.token}),L){let z=Na(x),re={forallParameters:[],whereConstraints:[],receiverTypePattern:b,traitType:x,traitValue:D,expr:e,sourceModulePath:n.currentModulePath,definitionEnv:t};Hu(z,re)}else my(D,e,n.currentModulePath)}let N=R[0].traitValue;return e.$={env:t,type:N.type,value:N,pathCollection:[]},e}let _=o.args,c=[];t=ze(t);for(let $ of _){let b,L;if(F($)&&E($,":",2)){let x=$.args[0];if(!U(x))throw y({token:x.token,errorMessage:`Expected identifier for forall parameter name, got: ${w(x)}`});b=x.token.value,L=$.args[1]}else if(U($))b=$.token.value;else throw y({token:$.token,errorMessage:`Expected parameter name or "name : Type" for forall parameter, got: ${w($)}`});let C;if(L){let x=S({expr:L,env:t,context:{...n}});if(x.$?.env&&(t=x.$.env),!x.$||!x.$.value||!O(x.$.value))throw y({token:L.token,errorMessage:`Expected type for forall parameter type, got: ${w(L)}`});C=x.$.value.value}let R=!C||Xl(C),N=C||tt(),B=K(N,{variableName:b,env:t,context:n}),{env:D}=me({env:t,variable:{name:b,type:N,isCompileTimeOnly:!0,value:[B],token:$.token,initializedAtToken:$.token,consumedAtToken:void 0,isOwningTheRcValue:!1}});if(t=D,R){let x=B.value;c.push({kind:"type",name:b,someType:x})}else c.push({kind:"value",name:b,type:N,unknownValue:B})}let f=new Map;if(a)for(let $ of a.args){if(!F($)||!E($,"<:",2))throw y({token:$.token,errorMessage:`Expected constraint in the form "T <: Module", got: ${w($)}`});let b=S({expr:$,env:t,context:{...n,isInsideWhereClause:!0}});b.$?.env&&(t=b.$.env);let L=$.args[0],C=$.args[1],R=S({expr:L,env:t,context:{...n}});if(!R.$||!R.$.value||!O(R.$.value)||!V(R.$.value.value))throw y({token:L.token,errorMessage:`In a where clause, the left-hand side of <: must be a type parameter (SomeType), got: ${w(L)}`});t=R.$.env;let N=[];if(F(C)&&E(C,I.tuple))for(let B of C.args)F(B)&&E(B,"!")&&B.args.length===1?N.push({expr:B.args[0],isNegated:!0}):N.push({expr:B,isNegated:!1});else F(C)&&E(C,"!")&&C.args.length===1?N.push({expr:C.args[0],isNegated:!0}):N.push({expr:C,isNegated:!1});for(let{expr:B}of N){let D=S({expr:B,env:t,context:{...n}});if(!D.$||!D.$.value||!O(D.$.value)||!De(D.$.value.value))throw y({token:B.token,errorMessage:"Expected trait type for right-hand side expression."});t=D.$.env;let x=D.$.value.value;f.set(x.id,Ae(B))}}let p=[];for(let $ of c){if($.kind!=="type")continue;let{someType:b}=$,L=Yn(t,b);if(L){for(let C of L.requiredTraits)p.push({someType:b,traitType:C,traitExpr:f.get(C.id)});for(let C of L.negativeTraits){let R={...C,isNegatedConstraint:!0};p.push({someType:b,traitType:R,traitExpr:f.get(C.id)})}}}let m=S({expr:s,env:t,context:{...n}});if(!m.$||!m.$.value||!O(m.$.value))throw y({token:s.token,errorMessage:"Expected type for receiver type pattern."});t=m.$.env;let g=m.$.value.value,{env:h,traitEntries:d}=Yu({fieldExprs:l,env:t,context:{...n},receiverType:g});if(t=h,d.length===0)throw y({token:e.token,errorMessage:"impl requires at least one trait or member field."});let v=[];for(let $ of d){let b=$.traitValue,L=b.type;py({receiverTypePattern:g,traitType:L,whereConstraints:p,env:t,errorToken:e.token});let{traitTypeArgExprs:C,traitFunctionParamNames:R}=$.isAnonymousTrait?{}:ay({traitExpr:$.sourceExpr,traitType:L});v.push({traitType:L,traitValue:b,traitTypeArgExprs:C,traitFunctionParamNames:R})}t=_t(t);for(let $ of v){let b=Na($.traitType),L={forallParameters:c,whereConstraints:p,receiverTypePattern:g,traitType:$.traitType,traitValue:$.traitValue,expr:e,sourceModulePath:n.currentModulePath,definitionEnv:t,traitTypeArgExprs:$.traitTypeArgExprs,traitFunctionParamNames:$.traitFunctionParamNames};Hu(b,L)}let T=v[0].traitValue;return e.$={env:t,type:T.type,value:T,pathCollection:[]},e}var tl=new Set;function Ju(e){if(!e||_e(e)&&e.isReferenceSemantics)return!1;switch(e.tag){case"comptime_int":case"comptime_float":case"comptime_string":case"Type":case"Module":case"Trait":case"Expr":case"ComptimeList":return!0;case"Iso":case"Arc":case"Dyn":case"void":case"Union":case"char":case"short":case"ushort":case"int":case"uint":case"long":case"ulong":case"longlong":case"ulonglong":case"longdouble":return!1;case"unit":case"bool":case"usize":case"isize":case"u8":case"i8":case"u16":case"i16":case"u32":case"i32":case"u64":case"i64":case"f32":case"f64":case"Function":return!0}if(He(e))return!0}function e_(e){if(!e)return!1;if(_e(e)&&e.isReferenceSemantics)return!0;switch(e.tag){case"comptime_int":case"comptime_float":case"comptime_string":case"Type":case"Module":case"Trait":case"Expr":case"ComptimeList":return!1;case"Iso":case"Arc":case"Dyn":case"void":case"char":case"short":case"ushort":case"int":case"uint":case"long":case"ulong":case"longlong":case"ulonglong":case"longdouble":return!0;case"unit":case"bool":case"usize":case"isize":case"u8":case"i8":case"u16":case"i16":case"u32":case"i32":case"u64":case"i64":case"f32":case"f64":case"Function":case"Union":return!0}}function Zu(e,t,n){if(!t.associatedTypeConstraints||t.associatedTypeConstraints.length===0)return!0;for(let r of t.associatedTypeConstraints){let i;if(e.trait)for(let o of e.trait.fields){if(o.label===r.label&&o.assignedValue&&O(o.assignedValue)){i=o.assignedValue.value;break}if(o.assignedValue&&Tt(o.assignedValue)){let a=o.assignedValue;if(a.type.id===t.id){for(let s=0;s<a.type.fields.length;s++)if(a.type.fields[s].label===r.label){let u=a.fields[s];u&&O(u)&&(i=u.value);break}}if(i)break}}if(!i){let o=Va({concreteType:e,propertyName:r.label,env:n});o&&O(o.value)&&(i=o.value.value)}if(!i||!q({type:r.constraintType,env:n},{type:i,env:n}))return!1}return!0}function St({targetType:e,traitType:t,env:n}){let r=xn(n,"Comptime");if(r&&t.id===r.id){let l=Ju(e);if(l!==void 0)return l}let i=xn(n,"Runtime");if(i&&t.id===i.id){let l=e_(e);if(l!==void 0)return l}let o={...t,receiverType:e},a=e.trait;if(a)for(let l of a.fields){if(!l.assignedValue||!Tt(l.assignedValue))continue;let _=l.assignedValue.type;if(q({type:o,env:n},{type:_,env:n})&&Zu(e,t,n))return!0}if(Ce(e)){for(let{traitType:l}of e.requiredTraits){if(l.id===t.id)return!0;if(l.selfConstraints){for(let u of l.selfConstraints)if(u.id===t.id)return!0}}for(let{traitType:l}of e.negativeTraits)if(l.id===t.id)return!1}if(V(e)){let l=!1,u=!1;for(let c of e.requiredTraits)c.traitType.id===t.id&&(l=!0);let _=Yn(n,e);if(_){for(let c of _.requiredTraits)c.id===t.id&&(l=!0);for(let c of _.negativeTraits)c.id===t.id&&(u=!0)}if(e.negativeTraits)for(let c of e.negativeTraits)c.traitType.id===t.id&&(u=!0);if(l)return!u;if(u)return!1}if(V(e)){let l=Ot(n,e);if(V(l))return!1;e=l}let s=`${e.id}:${t.id}`;if(tl.has(s))return!1;tl.add(s);try{return xa({concreteType:e,traitType:t,env:n})===void 0?!1:Zu(e,t,n)}finally{tl.delete(s)}}function Qu({targetType:e,traitType:t,env:n,errorToken:r}){if(t.selfConstraints&&t.selfConstraints.length>0){for(let i of t.selfConstraints)if(!St({targetType:e,traitType:i,env:n}))throw y({token:r,errorMessage:`Type "${A(e)}" does not implement required constraint "${i.typeName??A(i)}" from trait "${t.typeName??A(t)}"'s where clause.`})}if(t.negativeSelfConstraints&&t.negativeSelfConstraints.length>0){for(let i of t.negativeSelfConstraints)if(St({targetType:e,traitType:i,env:n}))throw y({token:r,errorMessage:`Type "${A(e)}" implements "${i.typeName??A(i)}" but the trait "${t.typeName??A(t)}"'s where clause requires it to NOT implement this trait.`})}}function Jn(e,t){let n=Ju(e);if(n!==void 0)return n;let r=xn(t,"Comptime");return r?St({targetType:e,traitType:r,env:t}):!1}function Ar(e,t){let n=e_(e);if(n!==void 0)return n;let r=xn(t,"Runtime");return r?St({targetType:e,traitType:r,env:t}):!1}function xo(e,t){if(!e)return!1;let n=xn(t,"Send");return n?St({targetType:e,traitType:n,env:t}):!1}function ri(e,t){if(!e)return!1;let n=xn(t,"Acyclic");return n?St({targetType:e,traitType:n,env:t}):!1}function ui(e,t){return Jn(e,t)&&!Ar(e,t)}function Wt(e){if(!e)return!1;if(V(e)||Ce(e)){for(let{traitType:t}of e.requiredTraits)if(kt(t))return!0}return!1}function nn(e){if(kt(e))return e;if(V(e)||Ce(e)){for(let{traitType:t}of e.requiredTraits)if(kt(t))return t}}function be(e){if(!e)return!1;if(V(e)||Ce(e)){for(let{traitType:t}of e.requiredTraits)if(Kt(t))return!0}return!1}function Dt(e){if(Kt(e))return e;if(V(e)||Ce(e)){for(let{traitType:t}of e.requiredTraits)if(Kt(t))return t}}function Ta(e,t,n,r){if(!Fe(e)&&!Jn(e,t)&&!Ar(e,t))throw y({token:n,errorMessage:`Type ${A(e)} has incompatible field contexts and cannot be used in any evaluation context.
|
|
180
180
|
|
|
181
181
|
This typically happens when a struct/enum/array/tuple contains fields with conflicting availability:
|
|
182
182
|
- Compile-time only fields (e.g., comptime_int, Type, Module)
|
|
183
183
|
- Runtime only fields (e.g., *(T), [T], void, C-compatible types)
|
|
184
184
|
|
|
185
|
-
Consider restructuring the type to avoid mixing incompatible field types.`})}function an(e,t=!0,n){switch(e.tag){case"ComptimeInt":case"ComptimeFloat":case"U8":case"I8":case"U16":case"I16":case"U32":case"I32":case"U64":case"I64":case"F32":case"F64":case"Usize":case"Isize":return e;case"Bool":return e;case"Unit":return e;case"ComptimeString":return e;case"Type":return e;case"Function":return e;case"Expr":return e;case"Unknown":return e;case"Ptr":{if(t)return e;let r=e;if(n){let a=n.get(r.targetValue);if(a)return{...r,targetValue:a,targetIndex:r.targetIndex}}let o=[an(r.targetValue[0],t,n)];return n&&n.set(r.targetValue,o),{...r,targetValue:o,targetIndex:r.targetIndex}}case"Tuple":{let r=e;return{...r,fields:r.fields.map(i=>an(i,t,n))}}case"Struct":{let r=e;return{...r,fields:r.fields.map(i=>an(i,t,n))}}case"Enum":{let r=e;return{...r,fields:r.fields.map(i=>an(i,t,n))}}case"Array":{let r=e;return{...r,elements:r.elements.map(i=>an(i,t,n))}}case"Slice":{if(t)return e;let r=e;if(n){let a=n.get(r.sourceArray);if(a)return{...r,sourceArray:a}}let o=[an(r.sourceArray[0],t,n)];return n&&n.set(r.sourceArray,o),{...r,sourceArray:o}}case"ComptimeList":{let r=e;return{...r,elements:r.elements.map(i=>an(i,t,n))}}case"Module":{let r=e;return{...r,fields:r.fields.map(i=>i?an(i,t,n):void 0)}}case"Trait":{let r=e;return{...r,fields:r.fields.map(i=>i?an(i,t,n):void 0)}}default:return e}}function nl({modulePath:e,inputString:t}){return{functionDeclarationFrameLevel:-1,frames:[],modulePath:e,inputString:t}}function at(){let e=nl({modulePath:"",inputString:""});return
|
|
186
|
-
Typeof "${a.name}": ${A(a.type)}`})));if(o.length>0)throw lt(o.map(a=>({token:a.token,errorMessage:`Variable "${a.name}" is undefined.`})))}return{functionDeclarationFrameLevel:e.functionDeclarationFrameLevel,frames:e.frames.slice(0,-1),modulePath:e.modulePath,inputString:e.inputString}}function Be(e,t,n){let r=e.frames.map(i=>{let o=i.variables.map(a=>a.id===t.id?n:a);return{...i,variables:o}});return{functionDeclarationFrameLevel:e.functionDeclarationFrameLevel,frames:r,modulePath:e.modulePath,inputString:e.inputString}}function i_(e){return{id:e.id,name:e.name,type:A(e.type),typeId:e.type.id,value:Me(e.value?.[0]),isCompileTimeOnly:e.isCompileTimeOnly,isUndefined:!e.initializedAtToken,isOwningTheRcValue:!!e.isOwningTheRcValue,isOwningTheSameRcValueAs:e.isOwningTheSameRcValueAs?.name,isReassignable:!!e.isReassignable,isConsumed:!!e.consumedAtToken}}function o_({env:e,context:t,methodName:n,type:r}){let i=[];if(!r.trait)return i;let o=r.trait.fields.find(a=>a.label===n&&G(a.type));if(o&&G(o.type)){let a=o.assignedValue;de(a)&&(a=K(o.type,{variableName:o.label,env:e,context:t})),i.push({type:o.type,value:a})}for(let a of r.trait.fields)if(a.label===""&&a.assignedValue&&Tt(a.assignedValue)){let s=a.assignedValue,l=s.type,u=l.fields.findIndex(_=>_.label===n&&G(_.type));if(u>=0){let _=l.fields[u];if(G(_.type)){let c=s.fields[u],f=_.type;ne(c)&&c.specializedType&&(f=c.specializedType),i.push({type:f,value:c})}}}if(i.length===0){let a=nr({concreteType:r,methodName:n,env:e});i.push(...a)}return i}function il({env:e,context:t,methodName:n,receiverType:r,isInfixOperatorCall:i}){let o=[],a=r;for(;Ie(a);)a=a.childType;function s(f,p){let m=f.fields.find(g=>g.label===n&&(G(g.type)||De(g.type)));if(m){let g;if(G(m.type)){if(de(p))g=K(m.type,{variableName:m.label,env:e,context:t});else if(Tt(p)){let h=f.fields.findIndex(d=>d.label===m.label);g=p.fields[h]}o.push({type:m.type,value:g})}else if(Te(m.type)){let h=m.assignedValue;We(h)&&l(h)}}if(!m)for(let g of f.fields)De(g.type)&&g.assignedValue&&s(g.type,g.assignedValue)}function l(f){let p=f.type.fields.findIndex(m=>m.label==="Call");if(p>=0){let m=f.type.fields[p];if(m.assignedValue){let g=m.assignedValue;
|
|
187
|
-
${a instanceof yn||a instanceof Sn?a.toString():a instanceof Error?a.message:String(a)}`)}}getProgram(){return this.program}getTokens(){return this.tokens}evaluateProgram(t,n){let r=nl({modulePath:this.modulePath,inputString:this.inputString});if(!Cy(this.tokens,"@skip_prelude")&&!by){let l="file://"+$y.join(t,"prelude.yo"),{moduleValue:u,moduleError:_}=n(l);if(_)throw _;if(u&&Te(u.type)){r=Pe(r);for(let c=0;c<u.type.fields.length;c++){let f=u.type.fields[c],p=u.fields[c],{env:m}=me({env:r,variable:{name:f.label,type:f.type,value:p?[p]:void 0,isCompileTimeOnly:!0,initializedAtToken:f.exprs.labelExpr?.token??f.exprs.expr.token,consumedAtToken:void 0,token:f.exprs.labelExpr?.token??f.exprs.expr.token,isOwningTheRcValue:!1}});r=m}}n_(r)}let{moduleValue:o,env:a,partialModuleError:s}=Ia({beginExprs:this.program,env:r,context:{isExecuting:!0,expectedType:void 0,SelfType:void 0,loadModule:n.bind(this),stdPath:t,currentModulePath:this.modulePath},allowPartialModule:this.allowPartialModule});r=a,this.moduleValue=o,this.moduleError=s}getModuleValue(){if(!this.moduleValue)throw new Error("Module value is not set");return this.moduleValue}getModuleError(){return this.parser.getParserError()??this.moduleError}};function g$(...e){process.env.NODE_ENV!=="production"&&process.env.DEBUG&&console.log(...e)}import{existsSync as Rh}from"fs";import*as ia from"path";function ky(e){switch(e){case"x86_64":case"aarch64":return 64;case"x86":case"arm":case"wasm32":return 32}}var s_={darwin:"macos",linux:"linux",win32:"windows",freebsd:"freebsd"},l_={x64:"x86_64",arm64:"aarch64",ia32:"x86",arm:"arm"},Oa;function wy(){if(Oa)return Oa;let e=s_[process.platform];if(!e)throw new Error(`Unsupported host platform: ${process.platform}. Supported: ${Object.keys(s_).join(", ")}`);let t=l_[process.arch];if(!t)throw new Error(`Unsupported host architecture: ${process.arch}. Supported: ${Object.keys(l_).join(", ")}`);return Oa={platform:e,arch:t},Oa}function f_(e){switch(e){case"linux":return"gnu";case"windows":return"msvc";case"wasi":case"emscripten":return"wasm";case"macos":case"freebsd":return}}function Fy(e,t,n){return n?`${e}-${t}-${n}`:`${e}-${t}`}function p_(e,t,n){return{arch:e,os:t,abi:n,pointerSizeBits:ky(e),triple:Fy(e,t,n)}}function Wr(){let e=wy(),t=f_(e.platform);return p_(e.arch,e.platform,t)}var u_=new Set(["x86_64","aarch64","x86","arm","wasm32"]),__=new Set(["linux","macos","windows","freebsd","wasi","emscripten"]),c_=new Set(["gnu","musl","msvc","none","wasm"]);function d_(e){let n=(e.startsWith("wasm-")?`wasm32-${e.slice(5)}`:e).split("-");if(n.length<2||n.length>3)throw new Error(`Invalid target triple "${e}". Expected format: <arch>-<os> or <arch>-<os>-<abi>. Example: x86_64-linux-gnu`);let r=n[0],i=n[1],o=n[2];if(!u_.has(r))throw new Error(`Unknown architecture "${r}" in target triple "${e}". Supported: ${[...u_].join(", ")}`);if(!__.has(i))throw new Error(`Unknown OS "${i}" in target triple "${e}". Supported: ${[...__].join(", ")}`);let a=r,s=i,l;if(o!==void 0)if(o==="none")l=void 0;else if(c_.has(o))l=o;else throw new Error(`Unknown ABI "${o}" in target triple "${e}". Supported: ${[...c_].join(", ")}`);else l=f_(s);return p_(a,s,l)}var ol;function Wo(){return ol||(ol=Wr()),ol}function Pt(e){return e.os==="windows"}function yi(e){return e.os==="linux"}function qn(e){return e.os==="macos"}function Hn(e){return e.arch==="wasm32"||e.os==="wasi"||e.os==="emscripten"}function m_(e){return e.os==="wasi"}function y_(e){for(let t in e.types){let{type:n}=e.types[t];n.cInclude&&e.cIncludes.add(n.cInclude)}for(let t in e.externFunctions){let{type:n}=e.externFunctions[t];n.cInclude&&e.cIncludes.add(n.cInclude)}}function g_(e){let t=Pt(e.targetInfo);t?(e.emitter.emitHeaderLine("#ifndef WIN32_LEAN_AND_MEAN"),e.emitter.emitHeaderLine("#define WIN32_LEAN_AND_MEAN"),e.emitter.emitHeaderLine("#endif"),e.emitter.emitHeaderLine("#ifndef _WINSOCKAPI_"),e.emitter.emitHeaderLine("#define _WINSOCKAPI_"),e.emitter.emitHeaderLine("#endif")):(e.emitter.emitHeaderLine("#define _DEFAULT_SOURCE"),e.emitter.emitHeaderLine("#define _GNU_SOURCE // Needed for sched_getcpu() on Linux")),e.emitter.emitHeaderLine("");for(let n of e.cIncludes)e.emitter.emitHeaderLine(`#include ${n}`);t?(e.emitter.emitHeaderLine("#include <windows.h>"),e.emitter.emitHeaderLine("#include <bcrypt.h>"),e.emitter.emitHeaderLine("#include <io.h>"),e.emitter.emitHeaderLine("#include <sys/stat.h>")):(e.emitter.emitHeaderLine("#include <unistd.h>"),e.emitter.emitHeaderLine("#include <sys/stat.h>"),e.emitter.emitHeaderLine("#include <sys/random.h>")),e.emitter.emitHeaderLine(""),e.allocator==="mimalloc"?(e.emitter.emitHeaderLine("// Mimalloc compatibility layer - try mimalloc first, fallback to stdlib"),e.emitter.emitHeaderLine("#ifdef __has_include"),e.emitter.emitHeaderLine(" #if __has_include(<mimalloc.h>)"),e.emitter.emitHeaderLine(" #include <mimalloc.h>"),e.emitter.emitHeaderLine(" #define __yo_malloc mi_malloc"),e.emitter.emitHeaderLine(" #define __yo_calloc mi_calloc"),e.emitter.emitHeaderLine(" #define __yo_realloc mi_realloc"),e.emitter.emitHeaderLine(" #define __yo_free mi_free"),e.emitter.emitHeaderLine(" #define __yo_aligned_alloc mi_aligned_alloc"),e.emitter.emitHeaderLine(" #define __yo_aligned_free mi_free"),e.emitter.emitHeaderLine(" #else"),e.emitter.emitHeaderLine(" #define __yo_malloc malloc"),e.emitter.emitHeaderLine(" #define __yo_calloc calloc"),e.emitter.emitHeaderLine(" #define __yo_realloc realloc"),e.emitter.emitHeaderLine(" #define __yo_free free"),t?(e.emitter.emitHeaderLine(" static inline void* __yo_aligned_alloc(size_t alignment, size_t size) { return _aligned_malloc(size, alignment); }"),e.emitter.emitHeaderLine(" #define __yo_aligned_free _aligned_free")):(e.emitter.emitHeaderLine(" #define __yo_aligned_alloc aligned_alloc"),e.emitter.emitHeaderLine(" #define __yo_aligned_free free")),e.emitter.emitHeaderLine(" #endif"),e.emitter.emitHeaderLine("#else"),e.emitter.emitHeaderLine(" // Fallback for older compilers without __has_include"),e.emitter.emitHeaderLine(" #define __yo_malloc malloc"),e.emitter.emitHeaderLine(" #define __yo_calloc calloc"),e.emitter.emitHeaderLine(" #define __yo_realloc realloc"),e.emitter.emitHeaderLine(" #define __yo_free free"),t?(e.emitter.emitHeaderLine(" static inline void* __yo_aligned_alloc(size_t alignment, size_t size) { return _aligned_malloc(size, alignment); }"),e.emitter.emitHeaderLine(" #define __yo_aligned_free _aligned_free")):(e.emitter.emitHeaderLine(" #define __yo_aligned_alloc aligned_alloc"),e.emitter.emitHeaderLine(" #define __yo_aligned_free free")),e.emitter.emitHeaderLine("#endif")):(e.emitter.emitHeaderLine("// Using libc allocator"),e.emitter.emitHeaderLine("#define __yo_malloc malloc"),e.emitter.emitHeaderLine("#define __yo_calloc calloc"),e.emitter.emitHeaderLine("#define __yo_realloc realloc"),e.emitter.emitHeaderLine("#define __yo_free free"),t?(e.emitter.emitHeaderLine("static inline void* __yo_aligned_alloc(size_t alignment, size_t size) { return _aligned_malloc(size, alignment); }"),e.emitter.emitHeaderLine("#define __yo_aligned_free _aligned_free")):(e.emitter.emitHeaderLine("#define __yo_aligned_alloc aligned_alloc"),e.emitter.emitHeaderLine("#define __yo_aligned_free free"))),e.emitter.emitHeaderLine("")}function Sr(e){let{emitter:t,indent:n,resultCode:r,debugLabel:i}=e;r!==void 0&&t.emitLine(`${n}sm->result = ${r};`),i&&t.emitLine(`${n}ASYNC_DEBUG("${i}: Setting state to COMPLETED\\n");`),t.emitLine(`${n}sm->state = -1; // -1 = completed`),t.emitLine(""),t.emitLine(`${n}void (*continuation_fn)(void*) = (void (*)(void*))sm->continuation_fn;`),t.emitLine(`${n}void* continuation_sm = sm->continuation_sm;`),t.emitLine(""),t.emitLine(`${n}if (continuation_fn != NULL) {`),i&&t.emitLine(`${n} ASYNC_DEBUG("${i}: Spawning continuation: resume_fn=%p, sm=%p\\n", (void*)continuation_fn, continuation_sm);`),t.emitLine(""),t.emitLine(`${n} sm->continuation_fn = NULL;`),t.emitLine(`${n} sm->continuation_sm = NULL;`),t.emitLine(""),t.emitLine(`${n} __yo_async_spawn_task(continuation_fn, continuation_sm);`),t.emitLine(`${n}}`),t.emitLine(""),t.emitLine(`${n}__yo_decr_rc((void*)sm);`),t.emitLine(""),t.emitLine(`${n}return;`)}function Mn(e){let{emitter:t,indent:n,resultCode:r,debugLabel:i}=e;r!==void 0&&t.emitLine(`${n}sm->result = ${r};`),i&&t.emitLine(`${n}ASYNC_DEBUG("${i}: Setting state to ESCAPED (effect handler escape)\\n");`),t.emitLine(`${n}sm->state = -2; // -2 = escaped`),t.emitLine(""),t.emitLine(`${n}void (*continuation_fn)(void*) = (void (*)(void*))sm->continuation_fn;`),t.emitLine(`${n}void* continuation_sm = sm->continuation_sm;`),t.emitLine(""),t.emitLine(`${n}if (continuation_fn != NULL) {`),i&&t.emitLine(`${n} ASYNC_DEBUG("${i}: Spawning continuation for escaped future: resume_fn=%p, sm=%p\\n", (void*)continuation_fn, continuation_sm);`),t.emitLine(""),t.emitLine(`${n} sm->continuation_fn = NULL;`),t.emitLine(`${n} sm->continuation_sm = NULL;`),t.emitLine(""),t.emitLine(`${n} __yo_async_spawn_task(continuation_fn, continuation_sm);`),t.emitLine(`${n}}`),t.emitLine(""),t.emitLine(`${n}__yo_decr_rc((void*)sm);`),t.emitLine(""),t.emitLine(`${n}return;`)}var gi=[...k.__yo_op_add,...k.__yo_op_sub,...k.__yo_op_mul,...k.__yo_op_div,...k.__yo_op_mod,...k.__yo_op_neg,...k.__yo_op_eq,...k.__yo_op_neq,...k.__yo_op_lt,...k.__yo_op_lte,...k.__yo_op_gt,...k.__yo_op_gte,...k.__yo_op_not,...k.__yo_op_bit_and,...k.__yo_op_bit_or,...k.__yo_op_bit_xor,...k.__yo_op_bit_complement,...k.__yo_op_bit_left_shift,...k.__yo_op_bit_right_shift,...k.__yo_ptr_add,...k.__yo_ptr_sub,...k.__yo_ptr_diff,...k.__yo_ptr_eq,...k.__yo_ptr_neq,...k.__yo_ptr_lt,...k.__yo_ptr_lte,...k.__yo_ptr_gt,...k.__yo_ptr_gte,...k.__yo_slice_len,...k.__yo_slice_new,...k.__yo_as,...k.__yo_getrandom,...k.__yo_arc4random_buf,...k.__yo_bcrypt_gen_random,...k.__yo_getentropy,...k.__yo_maybe_uninit_new,...k.__yo_maybe_uninit_as_ptr,...k.__yo_maybe_uninit_assume_init,...k.__yo_noop,...k.__yo_return_self,...k.__yo_ms_sleep],h_=new Set(["bool","usize","isize","u8","i8","u16","i16","u32","i32","u64","i64","f32","f64","char","short","ushort","int","uint","long","ulong","longlong","ulonglong","longdouble"]);function te(e,t=!1){let n=new Set(["auto","break","case","char","const","continue","default","do","double","else","enum","extern","float","for","goto","if","inline","int","long","register","restrict","return","short","signed","sizeof","static","struct","switch","typedef","union","unsigned","void","volatile","while","_Alignas","_Alignof","_Atomic","_Bool","_Complex","_Generic","_Imaginary","_Noreturn","_Static_assert","_Thread_local","errno","stdin","stdout","stderr","NULL","true","false"]),r=e.replace(/[^a-zA-Z0-9_]/g,i=>`_u${i.charCodeAt(0)}_`);return!t&&n.has(r)&&(r="__yo_c_reserved_"+r),r}function P(e,t){if(!e)return"int32_t";if(e.isExtern&&e.externName)return e.externName;switch(e.tag){case"unit":return"void";case"void":return"void";case"bool":return"bool";case"usize":return"size_t";case"isize":return"intptr_t";case"u8":return"uint8_t";case"i8":return"int8_t";case"u16":return"uint16_t";case"i16":return"int16_t";case"u32":return"uint32_t";case"i32":return"int32_t";case"u64":return"uint64_t";case"i64":return"int64_t";case"f32":return"float";case"f64":return"double";case"comptime_int":return"int32_t";case"comptime_float":return"double";case"comptime_string":return"uint8_t*";case"char":return"char";case"short":return"short";case"ushort":return"unsigned short";case"int":return"int";case"uint":return"unsigned int";case"long":return"long";case"ulong":return"unsigned long";case"longlong":return"long long";case"ulonglong":return"unsigned long long";case"longdouble":return"long double";case"Tuple":case"Struct":case"Union":case"Enum":{if(e.tag==="Enum"){let i=qt(e);if(i)return P(i,t)}let n;switch(e.tag){case"Tuple":n="tuple";break;case"Struct":n="struct";break;case"Union":n="union";break;case"Enum":n="enum";break;default:throw new Error("Unreachable")}let r=t.types[e.id]?.cName;if(!r)throw new Error(`No C type name found for ${n} ${A(e)}`);return(e.tag==="Struct"||e.tag==="Enum")&&_e(e)&&e.isReferenceSemantics?`${r}*`:r}case"Function":return"void*";case"Dyn":{let n=t.types[e.id]?.cName;if(!n)throw new Error(`No C type name found for dynamic dispatch type ${A(e)}`);return n}case"Array":{let n=e,r=n.childType,i=n.length;if(Ue(i)){let o=P(r,t),a=`Array_${te(o)}_${i.value}`;return t.arrayStructTypes.has(a)||t.arrayStructTypes.set(a,{childType:o,length:typeof i.value=="bigint"?Number(i.value):i.value}),a}break}case"Slice":{let n=e,i=`Slice_${te(P(n.childType,t))}`;return t.sliceStructTypes.has(i)||t.sliceStructTypes.set(i,{childType:P(n.childType,t)}),i}case"SomeType":{let n=e;if(be(n)){if(n.resolvedConcreteType?.isExtern)return`${P(n.resolvedConcreteType,t)}*`;let r=t.types[n.id]?.cName;if(r)return`${r}*`;if(n.resolvedConcreteType&&V(n.resolvedConcreteType)&&be(n.resolvedConcreteType)){let o=n.resolvedConcreteType,a=t.types[o.id]?.cName;if(a)return`${a}*`}if(n.resolvedConcreteType&&_e(n.resolvedConcreteType)){let o=n.resolvedConcreteType.id;for(let[a,s]of Object.entries(t.types))if(V(s.type)&&be(s.type)&&s.type.resolvedConcreteType&&_e(s.type.resolvedConcreteType)&&s.type.resolvedConcreteType.id===o)return`${s.cName}*`}let i=Dt(n);if(i){let o=t.types[i.id]?.cName;if(o)return`${o}*`}throw new Error(`Impl(Future) type has no registered concrete type. SomeType ID: ${n.id}, FutureModule: ${i?.id??"none"}. Ensure async blocks are properly analyzed and their state machine types are registered.
|
|
185
|
+
Consider restructuring the type to avoid mixing incompatible field types.`})}function an(e,t=!0,n){switch(e.tag){case"ComptimeInt":case"ComptimeFloat":case"U8":case"I8":case"U16":case"I16":case"U32":case"I32":case"U64":case"I64":case"F32":case"F64":case"Usize":case"Isize":return e;case"Bool":return e;case"Unit":return e;case"ComptimeString":return e;case"Type":return e;case"Function":return e;case"Expr":return e;case"Unknown":return e;case"Ptr":{if(t)return e;let r=e;if(n){let a=n.get(r.targetValue);if(a)return{...r,targetValue:a,targetIndex:r.targetIndex}}let o=[an(r.targetValue[0],t,n)];return n&&n.set(r.targetValue,o),{...r,targetValue:o,targetIndex:r.targetIndex}}case"Tuple":{let r=e;return{...r,fields:r.fields.map(i=>an(i,t,n))}}case"Struct":{let r=e;return{...r,fields:r.fields.map(i=>an(i,t,n))}}case"Enum":{let r=e;return{...r,fields:r.fields.map(i=>an(i,t,n))}}case"Array":{let r=e;return{...r,elements:r.elements.map(i=>an(i,t,n))}}case"Slice":{if(t)return e;let r=e;if(n){let a=n.get(r.sourceArray);if(a)return{...r,sourceArray:a}}let o=[an(r.sourceArray[0],t,n)];return n&&n.set(r.sourceArray,o),{...r,sourceArray:o}}case"ComptimeList":{let r=e;return{...r,elements:r.elements.map(i=>an(i,t,n))}}case"Module":{let r=e;return{...r,fields:r.fields.map(i=>i?an(i,t,n):void 0)}}case"Trait":{let r=e;return{...r,fields:r.fields.map(i=>i?an(i,t,n):void 0)}}default:return e}}function nl({modulePath:e,inputString:t}){return{functionDeclarationFrameLevel:-1,frames:[],modulePath:e,inputString:t}}function at(){let e=nl({modulePath:"",inputString:""});return ze(e)}function rl(e){let t=new Map,n=[...e.frames.flatMap(o=>o.variables)];for(let o of n)if(o.value&&!t.has(o.value)){let a=an(o.value[0],!1,t);t.has(o.value)||t.set(o.value,[a])}let r=o=>{if(!o.value)return{...o};let a=t.get(o.value);if(a)return{...o,value:a};let s=an(o.value[0],!1,t);return{...o,value:[s]}},i=o=>({...o,variables:o.variables.map(r),whereClauseConstraints:yy(o.whereClauseConstraints)});return{...e,frames:e.frames.map(i)}}function yy(e){let t=new Map;for(let[n,r]of e)t.set(n,{someType:r.someType,requiredTraits:[...r.requiredTraits],negativeTraits:[...r.negativeTraits]});return t}function rr({env:e,someType:t,traitType:n,isNegated:r}){let i=e.frames.length-1,o=e.frames[i];if(!o)return e;let a=t.id,s=o.whereClauseConstraints.get(a);s||(s={someType:t,requiredTraits:[],negativeTraits:[]},o.whereClauseConstraints.set(a,s));let l=r?s.negativeTraits:s.requiredTraits;return l.some(u=>u.id===n.id)||l.push(n),e}function Yn(e,t){let n=[],r=[],i=new Set,o=new Set,a=!1,s=new Set;for(let l of e.frames)for(let u of l.variables){let _=u.value?.[0];O(_)&&V(_.value)&&_.value.id===t.id&&s.add(u.name)}for(let l of e.frames)for(let u of l.whereClauseConstraints.values())if(!(u.someType.id!==t.id&&!s.has(u.someType.name))){a=!0;for(let _ of u.requiredTraits)i.has(_.id)||(i.add(_.id),n.push(_));for(let _ of u.negativeTraits)o.has(_.id)||(o.add(_.id),r.push(_))}if(a)return{requiredTraits:n,negativeTraits:r}}var t_=null;function n_(e){t_=e}function r_(){t_=null}var gy="__yo_self";function me({env:e,variable:t,deltaFrame:n,variableId:r,addToBeginBlockFrame:i,allowVariableShadowing:o}){let a=e.frames.length-1+(n??0);if(i){let p=Ty(e);p>=0&&(a=p)}if(t.name!==gy){let p=X(e,t.name);if(p.length>0&&!o){let m=p[p.length-1];throw lt([{token:t.token,errorMessage:`Failed to define variable "${t.name}":`},{token:m.token,errorMessage:`Variable "${t.name}" is already defined here (variable shadowing is not allowed):`}])}}let s=e.frames[a];if(!s)throw console.trace(`Frame at level ${a} does not exist in the environment.`),new Error(`Frame at level ${a} does not exist in the environment.`);let l=ut(e.modulePath,t.name)?t.name:r??ii(e.modulePath,t.name),u={...t,frameLevel:a,id:l},_=hy({frame:s,variable:u}),c=e.frames.slice();return c[a]=_,{env:{functionDeclarationFrameLevel:e.functionDeclarationFrameLevel,frames:c,modulePath:e.modulePath,inputString:e.inputString},variable:u}}function hy({frame:e,variable:t}){if(t.name==="_")return e;if(e.variables.some(r=>r.name===t.name))throw lt([{token:t.token,errorMessage:`Failed to define variable "${t.name}":`},{token:e.variables.find(r=>r.name===t.name).token,errorMessage:`Variable "${t.name}" is already defined here in the same scope:`}]);let n=e.variables.findIndex(r=>r.name===t.name&&!r.initializedAtToken);if(n>-1){let r=e.variables.slice();return r[n]=t,{id:e.id,variables:r,isBeginBlockFrame:e.isBeginBlockFrame,whereClauseConstraints:new Map(e.whereClauseConstraints)}}return{id:e.id,variables:[...e.variables,t],isBeginBlockFrame:e.isBeginBlockFrame,whereClauseConstraints:new Map(e.whereClauseConstraints)}}function vy(e,t,n){let r=e.variables.filter(i=>i.name===t);return n?r.filter(n):r}function X(e,t,n){let r=[];for(let i=0;i<e.frames.length;i++){let o=e.frames[i],a=vy(o,t,n);r.push(...a)}return n?r.filter(n):r}function pn(e,t){let n=[];for(let r=0;r<e.frames.length;r++){let o=e.frames[r].variables.filter(t);n.push(...o)}return n}function Bo(e,t){for(let n=e.frames.length-1;n>=0;n--)if(e.frames[n].variables.some(t))return n;return-1}function ze(e,t={id:ii(e.modulePath,"frame"),variables:[],isBeginBlockFrame:!1,whereClauseConstraints:new Map},n){let r=n?{...t,isBeginBlockFrame:!0}:t;return{functionDeclarationFrameLevel:e.functionDeclarationFrameLevel,frames:[...e.frames,r],modulePath:e.modulePath,inputString:e.inputString}}function _t(e,t=!1){let n=e.frames.length-1,r=e.frames[n];if(!t){let i=ji(e),o=r.variables.filter(a=>!a.initializedAtToken);if(i.length>0)throw lt(i.map(a=>({token:a.token,errorMessage:`Variable "${a.name}" was not consumed. It is supposed to be consumed before going out of scope.
|
|
186
|
+
Typeof "${a.name}": ${A(a.type)}`})));if(o.length>0)throw lt(o.map(a=>({token:a.token,errorMessage:`Variable "${a.name}" is undefined.`})))}return{functionDeclarationFrameLevel:e.functionDeclarationFrameLevel,frames:e.frames.slice(0,-1),modulePath:e.modulePath,inputString:e.inputString}}function Be(e,t,n){let r=e.frames.map(i=>{let o=i.variables.map(a=>a.id===t.id?n:a);return{...i,variables:o}});return{functionDeclarationFrameLevel:e.functionDeclarationFrameLevel,frames:r,modulePath:e.modulePath,inputString:e.inputString}}function i_(e){return{id:e.id,name:e.name,type:A(e.type),typeId:e.type.id,value:Me(e.value?.[0]),isCompileTimeOnly:e.isCompileTimeOnly,isUndefined:!e.initializedAtToken,isOwningTheRcValue:!!e.isOwningTheRcValue,isOwningTheSameRcValueAs:e.isOwningTheSameRcValueAs?.name,isReassignable:!!e.isReassignable,isConsumed:!!e.consumedAtToken}}function o_({env:e,context:t,methodName:n,type:r}){let i=[];if(!r.trait)return i;let o=r.trait.fields.find(a=>a.label===n&&G(a.type));if(o&&G(o.type)){let a=o.assignedValue;de(a)&&(a=K(o.type,{variableName:o.label,env:e,context:t})),i.push({type:o.type,value:a})}for(let a of r.trait.fields)if(a.label===""&&a.assignedValue&&Tt(a.assignedValue)){let s=a.assignedValue,l=s.type,u=l.fields.findIndex(_=>_.label===n&&G(_.type));if(u>=0){let _=l.fields[u];if(G(_.type)){let c=s.fields[u],f=_.type;ne(c)&&c.specializedType&&(f=c.specializedType),i.push({type:f,value:c})}}}if(i.length===0){let a=nr({concreteType:r,methodName:n,env:e});i.push(...a)}return i}function il({env:e,context:t,methodName:n,receiverType:r,isInfixOperatorCall:i}){let o=[],a=r;for(;Ie(a);)a=a.childType;function s(f,p){let m=f.fields.find(g=>g.label===n&&(G(g.type)||De(g.type)));if(m){let g;if(G(m.type)){if(de(p))g=K(m.type,{variableName:m.label,env:e,context:t});else if(Tt(p)){let h=f.fields.findIndex(d=>d.label===m.label);g=p.fields[h]}o.push({type:m.type,value:g})}else if(Te(m.type)){let h=m.assignedValue;We(h)&&l(h)}}if(!m)for(let g of f.fields)De(g.type)&&g.assignedValue&&s(g.type,g.assignedValue)}function l(f){let p=f.type.fields.findIndex(m=>m.label==="Call");if(p>=0){let m=f.type.fields[p];if(m.assignedValue){let g=m.assignedValue;vn(g)?g.fields.forEach(h=>{o.push({type:h.type,value:h})}):o.push({type:g.type,value:g})}}}function u(f){return f.filter(m=>{if(G(m.type)){if(m.type.parameters.length===0)return!1;let h=m.type.parameters[0].type;if(!i&&Ie(h)){let v=h.childType,T=r;if((vt(r)||Nt(r)||Et(r))&&(T=yt({type:r,expectedType:void 0,expr:void 0,env:e})),q({type:v,env:m.type.env},{type:T,env:e},!0))return m.needsPointerConversion=!0,!0}if(Fe(h)||Fe(h)&&!Fe(r)||V(r)&&r.resolvedConcreteType&&!be(r)&&!Fe(h)&&q({type:h,env:m.type.env},{type:r.resolvedConcreteType,env:e},!0))return!0;if(!Fe(h)&&Fe(r))return!1;if(vt(r)||Nt(r)||Et(r)){let v=yt({type:r,expectedType:void 0,expr:void 0,env:e});if(q({type:h,env:m.type.env},{type:v,env:e},!0))return!0}if(Ce(r)&&m.value===void 0){if(m.type.parameters.length>0&&m.type.SelfType){let T=m.type.parameters[0];if(T){let $=T.type;if(!ft($)&&!Ce($)&&!Ie($))return!1}}let v=m.type.return.type;if(pr(v,m.type.SelfType))return!1}return q({type:h,env:m.type.env},{type:r,env:e},!0)}return!0})}function _(f,p,m=new Set){if(m.has(f.id))return;m.add(f.id);let g=f.fields.find(h=>h.label===p&&G(h.type));if(g&&G(g.type)){let h=g.assignedValue;de(h)&&(h=K(g.type,{variableName:g.label,env:e,context:t})),o.push({type:g.type,value:h});return}for(let h of f.fields)De(h.type)&&h.assignedValue&&s(h.type,h.assignedValue)}if(r!==a&&r.trait){let f=r.trait.fields.find(p=>p.label===n&&G(p.type));if(f&&G(f.type)){let p=f.assignedValue;de(p)&&(p=K(f.type,{variableName:f.label,env:e,context:t})),o.push({type:f.type,value:p})}else _(r.trait,n);for(let p of r.trait.fields)if(p.label===""&&p.assignedValue&&Tt(p.assignedValue)){let m=p.assignedValue,g=m.type,h=g.fields.findIndex(d=>d.label===n&&G(d.type));if(h>=0){let d=g.fields[h];if(G(d.type)){let v=m.fields[h],T=d.type;ne(v)&&v.specializedType&&(T=v.specializedType),o.push({type:T,value:v})}}}}if(o.length===0&&r!==a){let f=nr({concreteType:r,methodName:n,env:e});o.push(...f)}let c=V(a)&&a.resolvedConcreteType&&!be(a);if(a.trait&&!Ce(a)&&!c){let f=a.trait.fields.find(p=>p.label===n&&(G(p.type)||Te(p.type)));if(f&&G(f.type)){let p=f.assignedValue;de(p)&&(p=K(f.type,{variableName:f.label,env:e,context:t})),o.push({type:f.type,value:p})}else if(f&&Te(f.type)){let p=f.assignedValue;We(p)&&l(p)}else _(a.trait,n);for(let p of a.trait.fields)if(p.label===""&&p.assignedValue&&Tt(p.assignedValue)){let m=p.assignedValue,g=m.type,h=g.fields.findIndex(d=>d.label===n&&G(d.type));if(h>=0){let d=g.fields[h];if(G(d.type)){let v=m.fields[h],T=d.type;ne(v)&&v.specializedType&&(T=v.specializedType),o.push({type:T,value:v})}}}if(o.length===0){let p=nr({concreteType:a,methodName:n,env:e});o.push(...p)}}if(vt(a)||Nt(a)||Et(a)){let f=yt({type:a,expectedType:void 0,expr:void 0,env:e});if(f.trait){let p=f.trait.fields.find(m=>m.label===n&&G(m.type));if(p&&G(p.type)){let m=p.assignedValue;de(m)&&(m=K(p.type,{variableName:p.label,env:e,context:t})),o.push({type:p.type,value:m})}else _(f.trait,n);for(let m of f.trait.fields)if(m.label===""&&m.assignedValue&&Tt(m.assignedValue)){let g=m.assignedValue,h=g.type,d=h.fields.findIndex(v=>v.label===n&&G(v.type));if(d>=0){let v=h.fields[d];if(G(v.type)){let T=g.fields[d],$=v.type;ne(T)&&T.specializedType&&($=T.specializedType),o.push({type:$,value:T})}}}if(o.length===0){let m=nr({concreteType:f,methodName:n,env:e});o.push(...m)}}}if(V(a)){if(a.resolvedConcreteType?.trait&&!be(a)){let f=a.resolvedConcreteType,p=f.trait,m=p?.fields.find(g=>g.label===n&&G(g.type));if(m&&G(m.type)){let g=m.assignedValue||K(m.type,{variableName:m.label,env:e,context:t});o.push({type:m.type,value:g})}if(o.length===0){for(let g of p?.fields??[])if(g.label===""&&g.assignedValue&&Tt(g.assignedValue)){let h=g.assignedValue,d=h.type,v=d.fields.findIndex(T=>T.label===n&&G(T.type));if(v>=0){let T=d.fields[v];if(G(T.type)){let $=h.fields[v],b=T.type;ne($)&&$.specializedType&&(b=$.specializedType),o.push({type:b,value:$});break}}}}if(o.length===0){let g=nr({concreteType:f,methodName:n,env:e});o.push(...g)}}if(!(o.length>0)){let f=[],p=new Set;for(let g of a.requiredTraits??[])p.has(g.traitType.id)||(p.add(g.traitType.id),f.push(g.traitType));let m=Yn(e,a);if(m)for(let g of m.requiredTraits)p.has(g.id)||(p.add(g.id),f.push(g));if(V(a))for(let g=e.frames.length-1;g>=0;g--){let h=e.frames[g];for(let d of h.whereClauseConstraints.values())if(q({type:d.someType,env:e},{type:a,env:e},!1))for(let v of d.requiredTraits)p.has(v.id)||(p.add(v.id),f.push(v))}for(let g of f){let h=g.fields.find(d=>d.label===n&&G(d.type));if(h&&G(h.type)){let d={...h.type,SelfType:a},v=!1;if(d.parameters.length>0&&Ie(d.parameters[0].type)){let $=d.parameters[0].type.childType;(V($)&&$.name==="Self"||q({type:$,env:d.env},{type:r,env:e},!0))&&(v=!0)}let T=K(d,{variableName:h.label,env:e,context:t});o.push({type:d,value:T,needsPointerConversion:v})}}if(o.length===0){for(let g of a.trait.fields)if(g.label===""&&g.assignedValue&&O(g.assignedValue)&&De(g.assignedValue.value)){let d=g.assignedValue.value.fields.find(v=>v.label===n&&G(v.type));if(d&&G(d.type)){let v=K(d.type,{variableName:d.label,env:e,context:t});o.push({type:d.type,value:v})}}}}}if(Ce(a)){let f=a.trait.fields.find(m=>m.label===n&&(G(m.type)||De(m.type)));if(f&&G(f.type)){let m=f.assignedValue||K(f.type,{variableName:f.label,env:e,context:t});o.push({type:f.type,value:m})}let p=a.requiredTraits;for(let{traitType:m}of p){let g=m.fields.find(h=>h.label===n&&(G(h.type)||De(h.type)));g&&G(g.type)&&g.type.parameters.length>0&&(Fe(g.type.parameters[0].type)||Fe(r)||q({type:g.type.parameters[0].type,env:g.type.env},{type:r,env:e},!0))&&o.push({type:g.type,value:void 0})}}return o.length>0,u(o)}function a_(e){let t=e.frames.map(n=>({...n,variables:n.variables.filter(r=>!r.isImplicit)}));return{...e,frames:t}}function Ma(e){let t=e.frames.map((n,r)=>{if(r===0)return n;let i=n.variables.filter(o=>!(!o.isCompileTimeOnly||o.isImplicit));return{...n,variables:i}});return{functionDeclarationFrameLevel:e.functionDeclarationFrameLevel,frames:t,modulePath:e.modulePath,inputString:e.inputString}}function ji(e){return e.frames.length===0?[]:e.frames[e.frames.length-1].variables.filter(r=>{if(r.consumedAtToken||!r.isOwningTheRcValue||!Le(r.type))return!1;let i=r.type;return!(V(i)&&!i.resolvedConcreteType&&i.requiredTraits.length===0)}).reverse()}function Ty(e){for(let t=e.frames.length-1;t>=0;t--)if(e.frames[t]?.isBeginBlockFrame)return t;return-1}var by=process.env.YO_SKIP_PRELUDE==="1"||process.env.YO_SKIP_PRELUDE==="true";function Cy(e,t){return e.some(n=>(n.type==="single_line_comment"||n.type==="multi_line_comment")&&n.value.includes(t))}var Go=class{constructor({modulePath:t,stdPath:n,loadModule:r,inputString:i,allowPartialModule:o=!1}){if(this.modulePath=t,this.allowPartialModule=o,!this.modulePath.match(/^file:\/\//))throw new Error(`Invalid file protocol: ${this.modulePath}. Only file:// is supported for now. `);try{if(this.inputString=i??Ey(t.replace(/^file:\/\//,""),"utf-8"),this.parser=new Ci({modulePath:t,inputString:this.inputString}),this.program=this.parser.getProgram(),this.tokens=this.parser.getTokens(),!this.allowPartialModule&&this.parser.getParserError())throw this.parser.getParserError();this.evaluateProgram(n,r)}catch(a){throw new Error(`Failed to import module "${t}":
|
|
187
|
+
${a instanceof gn||a instanceof Sn?a.toString():a instanceof Error?a.message:String(a)}`)}}getProgram(){return this.program}getTokens(){return this.tokens}evaluateProgram(t,n){let r=nl({modulePath:this.modulePath,inputString:this.inputString});if(!Cy(this.tokens,"@skip_prelude")&&!by){let l="file://"+$y.join(t,"prelude.yo"),{moduleValue:u,moduleError:_}=n(l);if(_)throw _;if(u&&Te(u.type)){r=ze(r);for(let c=0;c<u.type.fields.length;c++){let f=u.type.fields[c],p=u.fields[c],{env:m}=me({env:r,variable:{name:f.label,type:f.type,value:p?[p]:void 0,isCompileTimeOnly:!0,initializedAtToken:f.exprs.labelExpr?.token??f.exprs.expr.token,consumedAtToken:void 0,token:f.exprs.labelExpr?.token??f.exprs.expr.token,isOwningTheRcValue:!1}});r=m}}n_(r)}let{moduleValue:o,env:a,partialModuleError:s}=Ia({beginExprs:this.program,env:r,context:{isExecuting:!0,expectedType:void 0,SelfType:void 0,loadModule:n.bind(this),stdPath:t,currentModulePath:this.modulePath},allowPartialModule:this.allowPartialModule});r=a,this.moduleValue=o,this.moduleError=s}getModuleValue(){if(!this.moduleValue)throw new Error("Module value is not set");return this.moduleValue}getModuleError(){return this.parser.getParserError()??this.moduleError}};function g$(...e){process.env.NODE_ENV!=="production"&&process.env.DEBUG&&console.log(...e)}import{existsSync as Rh}from"fs";import*as ia from"path";function ky(e){switch(e){case"x86_64":case"aarch64":return 64;case"x86":case"arm":case"wasm32":return 32}}var s_={darwin:"macos",linux:"linux",win32:"windows",freebsd:"freebsd"},l_={x64:"x86_64",arm64:"aarch64",ia32:"x86",arm:"arm"},Oa;function wy(){if(Oa)return Oa;let e=s_[process.platform];if(!e)throw new Error(`Unsupported host platform: ${process.platform}. Supported: ${Object.keys(s_).join(", ")}`);let t=l_[process.arch];if(!t)throw new Error(`Unsupported host architecture: ${process.arch}. Supported: ${Object.keys(l_).join(", ")}`);return Oa={platform:e,arch:t},Oa}function f_(e){switch(e){case"linux":return"gnu";case"windows":return"msvc";case"wasi":case"emscripten":return"wasm";case"macos":case"freebsd":return}}function Fy(e,t,n){return n?`${e}-${t}-${n}`:`${e}-${t}`}function p_(e,t,n){return{arch:e,os:t,abi:n,pointerSizeBits:ky(e),triple:Fy(e,t,n)}}function Wr(){let e=wy(),t=f_(e.platform);return p_(e.arch,e.platform,t)}var u_=new Set(["x86_64","aarch64","x86","arm","wasm32"]),__=new Set(["linux","macos","windows","freebsd","wasi","emscripten"]),c_=new Set(["gnu","musl","msvc","none","wasm"]);function d_(e){let n=(e.startsWith("wasm-")?`wasm32-${e.slice(5)}`:e).split("-");if(n.length<2||n.length>3)throw new Error(`Invalid target triple "${e}". Expected format: <arch>-<os> or <arch>-<os>-<abi>. Example: x86_64-linux-gnu`);let r=n[0],i=n[1],o=n[2];if(!u_.has(r))throw new Error(`Unknown architecture "${r}" in target triple "${e}". Supported: ${[...u_].join(", ")}`);if(!__.has(i))throw new Error(`Unknown OS "${i}" in target triple "${e}". Supported: ${[...__].join(", ")}`);let a=r,s=i,l;if(o!==void 0)if(o==="none")l=void 0;else if(c_.has(o))l=o;else throw new Error(`Unknown ABI "${o}" in target triple "${e}". Supported: ${[...c_].join(", ")}`);else l=f_(s);return p_(a,s,l)}var ol;function Wo(){return ol||(ol=Wr()),ol}function Pt(e){return e.os==="windows"}function yi(e){return e.os==="linux"}function qn(e){return e.os==="macos"}function Hn(e){return e.arch==="wasm32"||e.os==="wasi"||e.os==="emscripten"}function m_(e){return e.os==="wasi"}function y_(e){for(let t in e.types){let{type:n}=e.types[t];n.cInclude&&e.cIncludes.add(n.cInclude)}for(let t in e.externFunctions){let{type:n}=e.externFunctions[t];n.cInclude&&e.cIncludes.add(n.cInclude)}}function g_(e){let t=Pt(e.targetInfo);t?(e.emitter.emitHeaderLine("#ifndef WIN32_LEAN_AND_MEAN"),e.emitter.emitHeaderLine("#define WIN32_LEAN_AND_MEAN"),e.emitter.emitHeaderLine("#endif"),e.emitter.emitHeaderLine("#ifndef _WINSOCKAPI_"),e.emitter.emitHeaderLine("#define _WINSOCKAPI_"),e.emitter.emitHeaderLine("#endif")):(e.emitter.emitHeaderLine("#define _DEFAULT_SOURCE"),e.emitter.emitHeaderLine("#define _GNU_SOURCE // Needed for sched_getcpu() on Linux")),e.emitter.emitHeaderLine("");for(let n of e.cIncludes)e.emitter.emitHeaderLine(`#include ${n}`);t?(e.emitter.emitHeaderLine("#include <windows.h>"),e.emitter.emitHeaderLine("#include <bcrypt.h>"),e.emitter.emitHeaderLine("#include <io.h>"),e.emitter.emitHeaderLine("#include <sys/stat.h>")):(e.emitter.emitHeaderLine("#include <unistd.h>"),e.emitter.emitHeaderLine("#include <sys/stat.h>"),e.emitter.emitHeaderLine("#include <sys/random.h>")),e.emitter.emitHeaderLine(""),e.allocator==="mimalloc"?(e.emitter.emitHeaderLine("// Mimalloc compatibility layer - try mimalloc first, fallback to stdlib"),e.emitter.emitHeaderLine("#ifdef __has_include"),e.emitter.emitHeaderLine(" #if __has_include(<mimalloc.h>)"),e.emitter.emitHeaderLine(" #include <mimalloc.h>"),e.emitter.emitHeaderLine(" #define __yo_malloc mi_malloc"),e.emitter.emitHeaderLine(" #define __yo_calloc mi_calloc"),e.emitter.emitHeaderLine(" #define __yo_realloc mi_realloc"),e.emitter.emitHeaderLine(" #define __yo_free mi_free"),e.emitter.emitHeaderLine(" #define __yo_aligned_alloc mi_aligned_alloc"),e.emitter.emitHeaderLine(" #define __yo_aligned_free mi_free"),e.emitter.emitHeaderLine(" #else"),e.emitter.emitHeaderLine(" #define __yo_malloc malloc"),e.emitter.emitHeaderLine(" #define __yo_calloc calloc"),e.emitter.emitHeaderLine(" #define __yo_realloc realloc"),e.emitter.emitHeaderLine(" #define __yo_free free"),t?(e.emitter.emitHeaderLine(" static inline void* __yo_aligned_alloc(size_t alignment, size_t size) { return _aligned_malloc(size, alignment); }"),e.emitter.emitHeaderLine(" #define __yo_aligned_free _aligned_free")):(e.emitter.emitHeaderLine(" #define __yo_aligned_alloc aligned_alloc"),e.emitter.emitHeaderLine(" #define __yo_aligned_free free")),e.emitter.emitHeaderLine(" #endif"),e.emitter.emitHeaderLine("#else"),e.emitter.emitHeaderLine(" // Fallback for older compilers without __has_include"),e.emitter.emitHeaderLine(" #define __yo_malloc malloc"),e.emitter.emitHeaderLine(" #define __yo_calloc calloc"),e.emitter.emitHeaderLine(" #define __yo_realloc realloc"),e.emitter.emitHeaderLine(" #define __yo_free free"),t?(e.emitter.emitHeaderLine(" static inline void* __yo_aligned_alloc(size_t alignment, size_t size) { return _aligned_malloc(size, alignment); }"),e.emitter.emitHeaderLine(" #define __yo_aligned_free _aligned_free")):(e.emitter.emitHeaderLine(" #define __yo_aligned_alloc aligned_alloc"),e.emitter.emitHeaderLine(" #define __yo_aligned_free free")),e.emitter.emitHeaderLine("#endif")):(e.emitter.emitHeaderLine("// Using libc allocator"),e.emitter.emitHeaderLine("#define __yo_malloc malloc"),e.emitter.emitHeaderLine("#define __yo_calloc calloc"),e.emitter.emitHeaderLine("#define __yo_realloc realloc"),e.emitter.emitHeaderLine("#define __yo_free free"),t?(e.emitter.emitHeaderLine("static inline void* __yo_aligned_alloc(size_t alignment, size_t size) { return _aligned_malloc(size, alignment); }"),e.emitter.emitHeaderLine("#define __yo_aligned_free _aligned_free")):(e.emitter.emitHeaderLine("#define __yo_aligned_alloc aligned_alloc"),e.emitter.emitHeaderLine("#define __yo_aligned_free free"))),e.emitter.emitHeaderLine("")}function Sr(e){let{emitter:t,indent:n,resultCode:r,debugLabel:i}=e;r!==void 0&&t.emitLine(`${n}sm->result = ${r};`),i&&t.emitLine(`${n}ASYNC_DEBUG("${i}: Setting state to COMPLETED\\n");`),t.emitLine(`${n}sm->state = -1; // -1 = completed`),t.emitLine(""),t.emitLine(`${n}void (*continuation_fn)(void*) = (void (*)(void*))sm->continuation_fn;`),t.emitLine(`${n}void* continuation_sm = sm->continuation_sm;`),t.emitLine(""),t.emitLine(`${n}if (continuation_fn != NULL) {`),i&&t.emitLine(`${n} ASYNC_DEBUG("${i}: Spawning continuation: resume_fn=%p, sm=%p\\n", (void*)continuation_fn, continuation_sm);`),t.emitLine(""),t.emitLine(`${n} sm->continuation_fn = NULL;`),t.emitLine(`${n} sm->continuation_sm = NULL;`),t.emitLine(""),t.emitLine(`${n} __yo_async_spawn_task(continuation_fn, continuation_sm);`),t.emitLine(`${n}}`),t.emitLine(""),t.emitLine(`${n}__yo_decr_rc((void*)sm);`),t.emitLine(""),t.emitLine(`${n}return;`)}function Mn(e){let{emitter:t,indent:n,resultCode:r,debugLabel:i}=e;r!==void 0&&t.emitLine(`${n}sm->result = ${r};`),i&&t.emitLine(`${n}ASYNC_DEBUG("${i}: Setting state to ESCAPED (effect handler escape)\\n");`),t.emitLine(`${n}sm->state = -2; // -2 = escaped`),t.emitLine(""),t.emitLine(`${n}void (*continuation_fn)(void*) = (void (*)(void*))sm->continuation_fn;`),t.emitLine(`${n}void* continuation_sm = sm->continuation_sm;`),t.emitLine(""),t.emitLine(`${n}if (continuation_fn != NULL) {`),i&&t.emitLine(`${n} ASYNC_DEBUG("${i}: Spawning continuation for escaped future: resume_fn=%p, sm=%p\\n", (void*)continuation_fn, continuation_sm);`),t.emitLine(""),t.emitLine(`${n} sm->continuation_fn = NULL;`),t.emitLine(`${n} sm->continuation_sm = NULL;`),t.emitLine(""),t.emitLine(`${n} __yo_async_spawn_task(continuation_fn, continuation_sm);`),t.emitLine(`${n}}`),t.emitLine(""),t.emitLine(`${n}__yo_decr_rc((void*)sm);`),t.emitLine(""),t.emitLine(`${n}return;`)}var gi=[...k.__yo_op_add,...k.__yo_op_sub,...k.__yo_op_mul,...k.__yo_op_div,...k.__yo_op_mod,...k.__yo_op_neg,...k.__yo_op_eq,...k.__yo_op_neq,...k.__yo_op_lt,...k.__yo_op_lte,...k.__yo_op_gt,...k.__yo_op_gte,...k.__yo_op_not,...k.__yo_op_bit_and,...k.__yo_op_bit_or,...k.__yo_op_bit_xor,...k.__yo_op_bit_complement,...k.__yo_op_bit_left_shift,...k.__yo_op_bit_right_shift,...k.__yo_ptr_add,...k.__yo_ptr_sub,...k.__yo_ptr_diff,...k.__yo_ptr_eq,...k.__yo_ptr_neq,...k.__yo_ptr_lt,...k.__yo_ptr_lte,...k.__yo_ptr_gt,...k.__yo_ptr_gte,...k.__yo_slice_len,...k.__yo_slice_new,...k.__yo_as,...k.__yo_getrandom,...k.__yo_arc4random_buf,...k.__yo_bcrypt_gen_random,...k.__yo_getentropy,...k.__yo_maybe_uninit_new,...k.__yo_maybe_uninit_as_ptr,...k.__yo_maybe_uninit_assume_init,...k.__yo_noop,...k.__yo_return_self,...k.__yo_ms_sleep],h_=new Set(["bool","usize","isize","u8","i8","u16","i16","u32","i32","u64","i64","f32","f64","char","short","ushort","int","uint","long","ulong","longlong","ulonglong","longdouble"]);function te(e,t=!1){let n=new Set(["auto","break","case","char","const","continue","default","do","double","else","enum","extern","float","for","goto","if","inline","int","long","register","restrict","return","short","signed","sizeof","static","struct","switch","typedef","union","unsigned","void","volatile","while","_Alignas","_Alignof","_Atomic","_Bool","_Complex","_Generic","_Imaginary","_Noreturn","_Static_assert","_Thread_local","errno","stdin","stdout","stderr","NULL","true","false"]),r=e.replace(/[^a-zA-Z0-9_]/g,i=>`_u${i.charCodeAt(0)}_`);return!t&&n.has(r)&&(r="__yo_c_reserved_"+r),r}function P(e,t){if(!e)return"int32_t";if(e.isExtern&&e.externName)return e.externName;switch(e.tag){case"unit":return"void";case"void":return"void";case"bool":return"bool";case"usize":return"size_t";case"isize":return"intptr_t";case"u8":return"uint8_t";case"i8":return"int8_t";case"u16":return"uint16_t";case"i16":return"int16_t";case"u32":return"uint32_t";case"i32":return"int32_t";case"u64":return"uint64_t";case"i64":return"int64_t";case"f32":return"float";case"f64":return"double";case"comptime_int":return"int32_t";case"comptime_float":return"double";case"comptime_string":return"uint8_t*";case"char":return"char";case"short":return"short";case"ushort":return"unsigned short";case"int":return"int";case"uint":return"unsigned int";case"long":return"long";case"ulong":return"unsigned long";case"longlong":return"long long";case"ulonglong":return"unsigned long long";case"longdouble":return"long double";case"Tuple":case"Struct":case"Union":case"Enum":{if(e.tag==="Enum"){let i=qt(e);if(i)return P(i,t)}let n;switch(e.tag){case"Tuple":n="tuple";break;case"Struct":n="struct";break;case"Union":n="union";break;case"Enum":n="enum";break;default:throw new Error("Unreachable")}let r=t.types[e.id]?.cName;if(!r)throw new Error(`No C type name found for ${n} ${A(e)}`);return(e.tag==="Struct"||e.tag==="Enum")&&_e(e)&&e.isReferenceSemantics?`${r}*`:r}case"Function":return"void*";case"Dyn":{let n=t.types[e.id]?.cName;if(!n)throw new Error(`No C type name found for dynamic dispatch type ${A(e)}`);return n}case"Array":{let n=e,r=n.childType,i=n.length;if(Ue(i)){let o=P(r,t),a=`Array_${te(o)}_${i.value}`;return t.arrayStructTypes.has(a)||t.arrayStructTypes.set(a,{childType:o,length:typeof i.value=="bigint"?Number(i.value):i.value}),a}break}case"Slice":{let n=e,i=`Slice_${te(P(n.childType,t))}`;return t.sliceStructTypes.has(i)||t.sliceStructTypes.set(i,{childType:P(n.childType,t)}),i}case"SomeType":{let n=e;if(be(n)){if(n.resolvedConcreteType?.isExtern)return`${P(n.resolvedConcreteType,t)}*`;let r=t.types[n.id]?.cName;if(r)return`${r}*`;if(n.resolvedConcreteType&&V(n.resolvedConcreteType)&&be(n.resolvedConcreteType)){let o=n.resolvedConcreteType,a=t.types[o.id]?.cName;if(a)return`${a}*`}if(n.resolvedConcreteType&&_e(n.resolvedConcreteType)){let o=n.resolvedConcreteType.id;for(let[a,s]of Object.entries(t.types))if(V(s.type)&&be(s.type)&&s.type.resolvedConcreteType&&_e(s.type.resolvedConcreteType)&&s.type.resolvedConcreteType.id===o)return`${s.cName}*`}let i=Dt(n);if(i){let o=t.types[i.id]?.cName;if(o)return`${o}*`}throw new Error(`Impl(Future) type has no registered concrete type. SomeType ID: ${n.id}, FutureModule: ${i?.id??"none"}. Ensure async blocks are properly analyzed and their state machine types are registered.
|
|
188
188
|
resolvedConcreteType: ${n.resolvedConcreteType?.id??"none"}
|
|
189
|
-
registered type IDs: ${Object.keys(t.types).filter(o=>o.startsWith("sometype")).join(", ")}`)}return Wt(n)&&n.resolvedConcreteType||n.resolvedConcreteType?P(n.resolvedConcreteType,t):"void*"}case"Ptr":{let r=e.childType;if(Qe(r)){let a=P(r.childType,t),s=`Slice_${te(a)}`;return t.sliceStructTypes.has(s)||t.sliceStructTypes.set(s,{childType:a}),`${s}*`}let i=P(r,t);return ft(r)?`${i}*`:ge(r)&&qt(r)?`${i}*`:`${i}*`}case"Iso":{let n=e,r=n.childType,i=P(r,t),o=i.replace(/\*/g,"").trim(),a=`Iso_${te(o)}`;return t.isoTypes||(t.isoTypes=new Map),t.isoTypes.has(a)||t.isoTypes.set(a,{childTypeCName:i,isoType:n}),a}case"Arc":{let n=e,r=n.childType,i=P(r,t),o=i.replace(/\*/g,"").trim(),a=`Arc_${te(o)}`;return t.arcTypes||(t.arcTypes=new Map),t.arcTypes.has(a)||t.arcTypes.set(a,{childTypeCName:i,arcType:n}),a}}return`// Unknown type: ${A(e)}`}function st(e,t,n){let r=te(t);return`${P(e,n)} ${r}`}function Bt(e,t,n){let r=n.types[e.id]?.cName;if(!r)throw new Error(`No C type name found for enum ${e.typeName} (${A(e)})`);return`${r.toUpperCase()}_${t.toUpperCase()}`}function Yr(e){return e.type.return.isCompileTimeOnly}function Ki(e){let t=e.body,n=null;return F(t)&&E(t,"begin")&&t.args.length===1&&F(t.args[0])&&E(t.args[0],gi)?n=t.args[0].func.token.value:F(t)&&E(t,gi)&&(n=t.func.token.value),n&&k.__yo_as.includes(n)?null:n}function qt(e){if(e.variants.length!==2)return null;let t=null,n=null;for(let r of e.variants)if(!r.fields||r.fields.length===0){if(t)return null;t=r}else if(r.fields.length===1){let i=r.fields[0].type;if(Ie(i)){if(n)return null;n=r}else return null}else return null;return t&&n&&n.fields?n.fields[0].type:null}function Fn(e){for(let t of e.variants)if(t.fields&&t.fields.length>0)return!1;return e.variants.length>0}function Ee(e,t){if(!t)return te(e);let n=X(t,e);if(n.length>0){let r=n[n.length-1];return te(r.name,r.type.isExtern==="c")}return te(e)}function Ra(e){if(F(e)&&e.args.length>=1){let t=e.args[0];if(t&&U(t))return t.token.value}if(F(e)&&e.args.length===0&&F(e.func)&&E(e.func,".",2)&&U(e.func.args[0])&&U(e.func.args[1])&&e.func.args[1].token.value===k.___dup[0])return e.func.args[0].token.value}function In(e){if(F(e)&&e.args.length===0&&F(e.func)&&E(e.func,".",2)&&U(e.func.args[1])&&e.func.args[1].token.value===k.___drop[0]&&U(e.func.args[0]))return e.func.args[0].token.value;if(!F(e)||!E(e,k.___drop)||e.args.length<1)return;let t=e.args[0];if(!(!t||!U(t)))return t.token.value}function Yo(e){if(e){if(Rt(e))return e;if(F(e)){let t=e;for(let n of t.args){let r=Yo(n);if(r)return r}}}}var al;function v_(e){al=e}function M(e,t,n){if(!al)throw new Error("Internal Error: generateExpr function is not set.");return al(e,t,n)}function Nr(e,t,n){let r=V(t)&&t.resolvedConcreteType?t.resolvedConcreteType:t;if(!Le(r))return"";if(ke(r)){let i=r.length;if(!Ue(i))return"/* Error: array has non-constant length */";let o=n.emitter;o.emitLine(`for (size_t i = 0; i < ${i.value}; i++) {`);let a=Nr(`(${e}).data[i]`,r.childType,n);return a&&o.emitLine(` ${a};`),o.emitLine("}"),""}if(we(r)){let i=n.emitter;for(let o=0;o<r.fields.length;o++){let a=r.fields[o].type,s=V(a)&&a.resolvedConcreteType?a.resolvedConcreteType:a;if(Le(s)){let l=Nr(`(${e})._${o}`,a,n);l&&i.emitLine(`${l};`)}}return""}if(Ce(r))return`__yo_decr_rc((void*)(${e}).data)`;if(ft(r))return`__yo_decr_rc((void*)(${e}))`;if(wt(r))return`__yo_decr_rc_atomic((void*)(${e}))`;if(bt(r))return`__yo_decr_rc_atomic((void*)(${e}))`;if(_e(r)||ge(r)){let i=Tr(r,n);if(i)return`${i}(${e})`}return""}function Xi(e,t,n){let r=V(t)&&t.resolvedConcreteType?t.resolvedConcreteType:t;if(ke(r)){let i=r.length;if(!Ue(i))return"/* Error: array has non-constant length */";let o=`temp_dup_${Ye("")}`,a=`i_${Ye("")}`,s=P(r,n),l=n.emitter;l.emitLine(`${s} ${o} = ${e};`),l.emitLine(`for (size_t ${a} = 0; ${a} < ${i.value}; ${a}++) {`);let u=Xi(`${o}.data[${a}]`,r.childType,n);return l.emitLine(` ${o}.data[${a}] = ${u};`),l.emitLine("}"),o}if(we(r)){let i=n.emitter,o=`temp_dup_tuple_${Ye("")}`,a=P(r,n);i.emitLine(`${a} ${o} = ${e};`);for(let s=0;s<r.fields.length;s++){let l=r.fields[s].type,u=V(l)&&l.resolvedConcreteType?l.resolvedConcreteType:l;if(Le(u)){let _=Xi(`${o}._${s}`,l,n);i.emitLine(`${o}._${s} = ${_};`)}}return o}if(Ce(r))return`((${P(r,n)}){ .data = __yo_incr_rc((void*)(${e}).data), .vtable = (${e}).vtable })`;if(ft(r))return`((${P(r,n)})__yo_incr_rc((void*)(${e})))`;if(wt(r))return`((${P(r,n)})__yo_incr_rc_atomic((void*)(${e})))`;if(bt(r))return`((${P(r,n)})__yo_incr_rc_atomic((void*)(${e})))`;if(_e(r)||ge(r)){let i=On(r,n);if(i)return`${i}(${e})`}return e}function Tr(e,t){if(_e(e)||ge(e)||Ce(e)||V(e)||wt(e)||bt(e)){let n=e.trait.fields.find(r=>r.label===k.___drop[0]);if(n&&n.assignedValue&&ne(n.assignedValue))return t.functions[n.assignedValue.funcId]?.cName}}function On(e,t){if(_e(e)||ge(e)||Ce(e)||V(e)||wt(e)||bt(e)){let n=e.trait.fields.find(r=>r.label===k.___dup[0]);if(n&&n.assignedValue&&ne(n.assignedValue))return t.functions[n.assignedValue.funcId]?.cName}}function Ct(e,t,n){let r=n.emitter;if(e.$?.deferredDropExpressions)for(let i of e.$.deferredDropExpressions){let o=M(i,t,n);o&&r.emitLine(`${t}${o};`)}}function rt(e,t,n){let r=n.emitter;if(e.$?.deferredDupExpressions){for(let i of e.$.deferredDupExpressions)if(F(i)){let o=M(i,t,n);o&&r.emitLine(`${t}${o};`)}}}function Qt(e,t,n){if(Ue(e)){let r=(typeof e.value=="bigint",e.value.toString());return e.tag==="F32"?(r.includes(".")?r:r+".0")+"f":e.tag==="F64"||e.tag==="ComptimeFloat"?r.includes(".")?r:r+".0":e.tag==="U64"||e.tag==="Usize"?r+"ULL":e.tag==="I64"||e.tag==="Isize"?r+"LL":e.tag==="U32"?r+"U":r}else{if(
|
|
189
|
+
registered type IDs: ${Object.keys(t.types).filter(o=>o.startsWith("sometype")).join(", ")}`)}return Wt(n)&&n.resolvedConcreteType||n.resolvedConcreteType?P(n.resolvedConcreteType,t):"void*"}case"Ptr":{let r=e.childType;if(Qe(r)){let a=P(r.childType,t),s=`Slice_${te(a)}`;return t.sliceStructTypes.has(s)||t.sliceStructTypes.set(s,{childType:a}),`${s}*`}let i=P(r,t);return ft(r)?`${i}*`:ge(r)&&qt(r)?`${i}*`:`${i}*`}case"Iso":{let n=e,r=n.childType,i=P(r,t),o=i.replace(/\*/g,"").trim(),a=`Iso_${te(o)}`;return t.isoTypes||(t.isoTypes=new Map),t.isoTypes.has(a)||t.isoTypes.set(a,{childTypeCName:i,isoType:n}),a}case"Arc":{let n=e,r=n.childType,i=P(r,t),o=i.replace(/\*/g,"").trim(),a=`Arc_${te(o)}`;return t.arcTypes||(t.arcTypes=new Map),t.arcTypes.has(a)||t.arcTypes.set(a,{childTypeCName:i,arcType:n}),a}}return`// Unknown type: ${A(e)}`}function st(e,t,n){let r=te(t);return`${P(e,n)} ${r}`}function Bt(e,t,n){let r=n.types[e.id]?.cName;if(!r)throw new Error(`No C type name found for enum ${e.typeName} (${A(e)})`);return`${r.toUpperCase()}_${t.toUpperCase()}`}function Yr(e){return e.type.return.isCompileTimeOnly}function Ki(e){let t=e.body,n=null;return F(t)&&E(t,"begin")&&t.args.length===1&&F(t.args[0])&&E(t.args[0],gi)?n=t.args[0].func.token.value:F(t)&&E(t,gi)&&(n=t.func.token.value),n&&k.__yo_as.includes(n)?null:n}function qt(e){if(e.variants.length!==2)return null;let t=null,n=null;for(let r of e.variants)if(!r.fields||r.fields.length===0){if(t)return null;t=r}else if(r.fields.length===1){let i=r.fields[0].type;if(Ie(i)){if(n)return null;n=r}else return null}else return null;return t&&n&&n.fields?n.fields[0].type:null}function Fn(e){for(let t of e.variants)if(t.fields&&t.fields.length>0)return!1;return e.variants.length>0}function Ee(e,t){if(!t)return te(e);let n=X(t,e);if(n.length>0){let r=n[n.length-1];return te(r.name,r.type.isExtern==="c")}return te(e)}function Ra(e){if(F(e)&&e.args.length>=1){let t=e.args[0];if(t&&U(t))return t.token.value}if(F(e)&&e.args.length===0&&F(e.func)&&E(e.func,".",2)&&U(e.func.args[0])&&U(e.func.args[1])&&e.func.args[1].token.value===k.___dup[0])return e.func.args[0].token.value}function In(e){if(F(e)&&e.args.length===0&&F(e.func)&&E(e.func,".",2)&&U(e.func.args[1])&&e.func.args[1].token.value===k.___drop[0]&&U(e.func.args[0]))return e.func.args[0].token.value;if(!F(e)||!E(e,k.___drop)||e.args.length<1)return;let t=e.args[0];if(!(!t||!U(t)))return t.token.value}function Yo(e){if(e){if(Rt(e))return e;if(F(e)){let t=e;for(let n of t.args){let r=Yo(n);if(r)return r}}}}var al;function v_(e){al=e}function M(e,t,n){if(!al)throw new Error("Internal Error: generateExpr function is not set.");return al(e,t,n)}function Nr(e,t,n){let r=V(t)&&t.resolvedConcreteType?t.resolvedConcreteType:t;if(!Le(r))return"";if(ke(r)){let i=r.length;if(!Ue(i))return"/* Error: array has non-constant length */";let o=n.emitter;o.emitLine(`for (size_t i = 0; i < ${i.value}; i++) {`);let a=Nr(`(${e}).data[i]`,r.childType,n);return a&&o.emitLine(` ${a};`),o.emitLine("}"),""}if(we(r)){let i=n.emitter;for(let o=0;o<r.fields.length;o++){let a=r.fields[o].type,s=V(a)&&a.resolvedConcreteType?a.resolvedConcreteType:a;if(Le(s)){let l=Nr(`(${e})._${o}`,a,n);l&&i.emitLine(`${l};`)}}return""}if(Ce(r))return`__yo_decr_rc((void*)(${e}).data)`;if(ft(r))return`__yo_decr_rc((void*)(${e}))`;if(wt(r))return`__yo_decr_rc_atomic((void*)(${e}))`;if(bt(r))return`__yo_decr_rc_atomic((void*)(${e}))`;if(_e(r)||ge(r)){let i=Tr(r,n);if(i)return`${i}(${e})`}return""}function Xi(e,t,n){let r=V(t)&&t.resolvedConcreteType?t.resolvedConcreteType:t;if(ke(r)){let i=r.length;if(!Ue(i))return"/* Error: array has non-constant length */";let o=`temp_dup_${Ye("")}`,a=`i_${Ye("")}`,s=P(r,n),l=n.emitter;l.emitLine(`${s} ${o} = ${e};`),l.emitLine(`for (size_t ${a} = 0; ${a} < ${i.value}; ${a}++) {`);let u=Xi(`${o}.data[${a}]`,r.childType,n);return l.emitLine(` ${o}.data[${a}] = ${u};`),l.emitLine("}"),o}if(we(r)){let i=n.emitter,o=`temp_dup_tuple_${Ye("")}`,a=P(r,n);i.emitLine(`${a} ${o} = ${e};`);for(let s=0;s<r.fields.length;s++){let l=r.fields[s].type,u=V(l)&&l.resolvedConcreteType?l.resolvedConcreteType:l;if(Le(u)){let _=Xi(`${o}._${s}`,l,n);i.emitLine(`${o}._${s} = ${_};`)}}return o}if(Ce(r))return`((${P(r,n)}){ .data = __yo_incr_rc((void*)(${e}).data), .vtable = (${e}).vtable })`;if(ft(r))return`((${P(r,n)})__yo_incr_rc((void*)(${e})))`;if(wt(r))return`((${P(r,n)})__yo_incr_rc_atomic((void*)(${e})))`;if(bt(r))return`((${P(r,n)})__yo_incr_rc_atomic((void*)(${e})))`;if(_e(r)||ge(r)){let i=On(r,n);if(i)return`${i}(${e})`}return e}function Tr(e,t){if(_e(e)||ge(e)||Ce(e)||V(e)||wt(e)||bt(e)){let n=e.trait.fields.find(r=>r.label===k.___drop[0]);if(n&&n.assignedValue&&ne(n.assignedValue))return t.functions[n.assignedValue.funcId]?.cName}}function On(e,t){if(_e(e)||ge(e)||Ce(e)||V(e)||wt(e)||bt(e)){let n=e.trait.fields.find(r=>r.label===k.___dup[0]);if(n&&n.assignedValue&&ne(n.assignedValue))return t.functions[n.assignedValue.funcId]?.cName}}function Ct(e,t,n){let r=n.emitter;if(e.$?.deferredDropExpressions)for(let i of e.$.deferredDropExpressions){let o=M(i,t,n);o&&r.emitLine(`${t}${o};`)}}function rt(e,t,n){let r=n.emitter;if(e.$?.deferredDupExpressions){for(let i of e.$.deferredDupExpressions)if(F(i)){let o=M(i,t,n);o&&r.emitLine(`${t}${o};`)}}}function Qt(e,t,n){if(Ue(e)){let r=(typeof e.value=="bigint",e.value.toString());return e.tag==="F32"?(r.includes(".")?r:r+".0")+"f":e.tag==="F64"||e.tag==="ComptimeFloat"?r.includes(".")?r:r+".0":e.tag==="U64"||e.tag==="Usize"?r+"ULL":e.tag==="I64"||e.tag==="Isize"?r+"LL":e.tag==="U32"?r+"U":r}else{if(Pe(e))return e.value?"true":"false";if(xe(e)){let r=n?.$?.convertedRuntimeType||n?.$?.type;if(r&&Cr(r)&&r.fields.length===1){let i=r.fields[0].type;if(Qe(i)){let o=P(r,t),a=JSON.stringify(e.value),s=Buffer.byteLength(e.value,"utf8");return`(${o}){ .data = (uint8_t*)${a}, .length = ${s} }`}}if(r&&Qe(r)){let i=P(r,t),o=JSON.stringify(e.value),a=Buffer.byteLength(e.value,"utf8");return`(${i}){ .data = (uint8_t*)${o}, .length = ${a} }`}return JSON.stringify(e.value)}else if(It(e)){let r=e.type;if(qt(r)){let l=r.variants.find(u=>u.name===e.variantName);if(!l)return`// Error: Variant ${e.variantName} not found in enum`;if(!l.fields||l.fields.length===0)return"NULL";if(l.fields.length===1&&e.fields.length===1)return Qt(e.fields[0],t)}if(Fn(r))return Bt(r,e.variantName,t);let a=t.types[r.id]?.cName;if(!a)return`// Error: No C type name found for enum ${A(r)}`;let s=Bt(r,e.variantName,t);if(!e.fields||e.fields.length===0)return`(${a}){ .tag = ${s} }`;{let l=r.variants.find(_=>_.name===e.variantName);if(!l||!l.fields)return`// Error: Variant ${e.variantName} not found or has no fields`;let u=e.fields.map((_,c)=>{let f=l.fields[c];if(f&&!fe(f.type)){let p=te(f.label),m=Qt(_,t);return`.${p} = ${m}`}return null}).filter(_=>_!==null);return u.length===0?`(${a}){ .tag = ${s} }`:`(${a}){ .tag = ${s}, .data = { .${e.variantName} = { ${u.join(", ")} } } }`}}else if(vn(e)){let r=e.type,i=t.types[r.id]?.cName;if(!i)return`// Error: No C type name found for tuple ${A(r)}
|
|
190
190
|
`;let o=e.fields.map((a,s)=>{let l=Qt(a,t);return`._${s} = ${l}`});return`(${i}){ ${o.join(", ")} }`}else if(bn(e)){let r=e.type;if(r&&_e(r)){let i=t.types[r.id]?.cName;if(!i)return`// Error: No C type name found for struct ${A(r)}
|
|
191
191
|
`;if(r.isNewtype&&r.fields.length===1&&e.fields.length===1){let o=Qt(e.fields[0],t);return`((${i})(${o}))`}if(r.isReferenceSemantics){let o=e.fields.map(s=>Qt(s,t));return`${`__yo_new_${i}`}(${o.join(", ")})`}else{let o=e.fields.map((a,s)=>{let l=a,u=we(r)?`_${s}`:te(r.fields[s].label),_=Qt(l,t);return`.${u} = ${_}`});return`(${i}){ ${o.join(", ")} }`}}}else if(zn(e)){let r=e.type,i=P(r,t),o=e.elements.map(a=>Qt(a,t));return`(${i}){ .data = { ${o.join(", ")} } }`}else if(ne(e)){let r=t.functions[e.funcId]?.cName;return r||`// Error: No C function name found for function value with ID ${e.funcId}
|
|
192
|
-
`}else if(O(e)){let r=e.value;if(r)return t.types[r.id]?t.types[r.id].cName:`/* Error: No C type name found for type ${A(r)} */`}else if(wi(e)){let r=e.targetValue[0];if(r){let i=n?.$?.convertedRuntimeType||n?.$?.type;if(i&&Ie(i)){let o=i.childType,a=Qt(r,t,{$:{type:o,convertedRuntimeType:o}});if(a&&!a.startsWith("/*")&&!a.startsWith("//"))return`(&${a})`}}return`/* Error: Cannot generate pointer value ${Me(e)} */`}}return`/* skip generating: ${Me(e)} */`}function Qi(e,t,n){if(e===t)return!0;if(e.tag==="FnCall"){if(n&&n(e))return!1;if(Qi(e.func,t,n))return!0;for(let r of e.args)if(Qi(r,t,n))return!0}return!1}function Ly(e,t,n){for(let r=0;r<t.length;r++)if(Qi(e,t[r].expr,n))return r;return-1}function T_(e,t,n){let r=[],i=n?.shouldSkipBody;if(e.tag!=="FnCall"||!E(e,"begin"))return t.length===0?[{stateNumber:0,expressions:[e],suspensionPoint:null}]:[{stateNumber:0,expressions:[e],suspensionPoint:t[0]??null}];let o=e.args,a=[],s=[];for(let l of o){let u=Ly(l,t,i),_=n?.handleReturnStatements&&(dt(l,"return")||E(l,"return"));if(u!==-1){if(s.push(l),a.push(s),s=[],n?.handleSequentialSuspensions)for(let c=u+1;c<t.length&&Qi(l,t[c].expr,i);c++)a.push([])}else if(_){s.push(l),a.push(s),s=[];break}else s.push(l)}s.length>0&&a.push(s);for(let l=0;l<a.length;l++){let u=a[l],_=l<t.length?t[l]:null;r.push({stateNumber:l,expressions:u,suspensionPoint:_})}return r}function ll(e,t){let r=T_(e,t,{shouldSkipBody:Rt,handleReturnStatements:!0,handleSequentialSuspensions:!0}).map(i=>({stateNumber:i.stateNumber,expressions:i.expressions,awaitPoint:i.suspensionPoint}));return r.length>0&&r[r.length-1].awaitPoint!==null&&r.push({stateNumber:r.length,expressions:[],awaitPoint:null}),r}function Ay(e,t){return Qi(e,t,Rt)}function E_(e,t,n,r=!1){let i=n.emitter;for(let o=0;o<e.expressions.length;o++){let a=e.expressions[o],s=o===e.expressions.length-1,l=e.awaitPoint&&Ay(a,e.awaitPoint.expr),u=e.awaitPoint&&a.tag==="FnCall"&&(E(a,I.while)||E(a,I.cond)||E(a,I.match))&&un(a);if((l||u)&&e.awaitPoint)to(a,e.awaitPoint,e.stateNumber,t,n);else if(s&&r){let _=M(a,t,n);_&&(i.emitLine(`${t}// Store final expression result`),i.emitLine(`${t}sm->result = ${_};`))}else{let _=M(a,t,n);!_||!a.$||ut(a.$.env.modulePath,_)||i.emitLine(`${t}${_};`)}}}function to(e,t,n,r,i){let o=i.emitter;if(e.tag==="FnCall"&&fn(e)){let a=e.args[0];if(!a){o.emitLine(`${r}// Error: await without argument`);return}if(t.futureVariableId===void 0){let s=M(a,r,i);o.emitLine(`${r}// Store pattern-matched Future for await ${t.index}`),o.emitLine(`${r}sm->await_future_${t.index} = ${s};`)}else o.emitLine(`${r}// Prepare for await (future already stored in state machine variable)`);return}if(e.tag==="FnCall"&&E(e,":=")){let a=e.args[0],s=e.args[1];if(!a||!s){o.emitLine(`${r}// Error: Invalid assignment expression`);return}if(s.tag==="FnCall"&&fn(s)){let l=s.args[0];if(!l){o.emitLine(`${r}// Error: await without argument`);return}let u=a.token?.value;if(!u||!a.$){o.emitLine(`${r}// Error: Invalid variable name`);return}if(t.futureVariableId===void 0){let _=M(l,r,i);o.emitLine(`${r}// Store Future for await (variable: ${u})`),o.emitLine(`${r}sm->await_future_${t.index} = ${_};`)}else o.emitLine(`${r}// Store Future for await (variable: ${u}) - future already in state machine`);return}if(s.tag==="FnCall"&&E(s,I.cond)){let l;if(a.tag==="Atom"&&a.token.type==="identifier"&&a.$){let u=a.token.value,_=X(a.$.env,u);_.length>0&&(l=_[_.length-1].id)}qo(s,t,r,i,l);return}if(s.tag==="FnCall"&&E(s,I.match)){let l;if(a.tag==="Atom"&&a.token.type==="identifier"&&a.$){let u=a.token.value,_=X(a.$.env,u);_.length>0&&(l=_[_.length-1].id)}Ho(s,t,r,i,l);return}}if(e.tag==="FnCall"&&E(e,"=")){let a=e.args[0],s=e.args[1];if(a&&s){if(s.tag==="FnCall"&&E(s,I.cond)){let l=M(a,r,i);qo(s,t,r,i,void 0,l||void 0);return}if(s.tag==="FnCall"&&E(s,I.match)){let l=M(a,r,i);Ho(s,t,r,i,void 0,l||void 0);return}}}if(e.tag==="FnCall"&&E(e,I.cond)){qo(e,t,r,i);return}if(e.tag==="FnCall"&&E(e,I.match)){Ho(e,t,r,i);return}if(e.tag==="FnCall"&&E(e,I.while)){ul(e,t,r,i);return}o.emitLine(`${r}// ERROR: Unsupported pattern for await expression`),o.emitLine(`${r}// Expression type: ${e.tag}, function: ${e.tag==="FnCall"?e.func.tag==="Atom"?e.func.token?.value:e.func.tag:"N/A"}`)}function qo(e,t,n,r,i,o){let a=r.emitter;if(e.tag!=="FnCall"||!E(e,I.cond)){a.emitLine(`${n}// Error: Expected cond expression`);return}let s=e.args;if(s.length===0){a.emitLine(`${n}// Error: cond must have at least one branch`);return}let l=[],u=-1;for(let h=0;h<s.length;h++){let d=s[h];if(d.tag==="FnCall"&&E(d,"=>")){let v=d.args[0];if(v&&!(Re(v.$?.value)&&v.$.value.value===!1)){u=h;break}}}let _=!1;if(u>=0){let h=s[u];if(h.tag==="FnCall"&&E(h,"=>")){let d=h.args[0];d&&Re(d.$?.value)&&d.$.value.value===!0&&(_=!0)}}if(_&&u>=0){let h=s[u],d=F(h)?h.args[1]:void 0;if(d)if(qr(d)){let b=eo(d,t,n,r),L=r.asyncWhileLoopInfo?.get(t.index);if(L&&b.length>0){let R=r.asyncCondBranchInfo?.get(t.index)?.branches.some(N=>N.hasAwait&&N.remainingExprs&&N.remainingExprs.length>0)??!1;L.condBranchPostWhileExprs={branchIndex:u,condBranchFieldIndex:t.index,exprs:b,deferredDropExpressions:d.$?.deferredDropExpressions,skipCondBranchCheck:R},l.push({index:u,value:d,hasAwait:!0,remainingExprs:[],deferredDropExpressions:d.$?.deferredDropExpressions})}else l.push({index:u,value:d,hasAwait:!0,remainingExprs:b,deferredDropExpressions:d.$?.deferredDropExpressions})}else{if(Zi(e,d,r,i,o))Ji(d,n,r);else if(F(d)&&E(d,I.begin)){let b=d.args;for(let L=0;L<b.length;L++){let C=b[L],R=M(C,n,r);if(R==="break"&&t.isInsideWhile)a.emitLine(`${n}sm->while_loop_${t.index}_active = false;`),a.emitLine(`${n}goto while_loop_${t.index}_end;`);else{let N=R==="break"||R==="continue"||R?.includes("return");R&&(N||C.$&&!ut(C.$.env.modulePath,R))&&a.emitLine(`${n}${R};`)}}if(d.$?.deferredDropExpressions)for(let L of d.$.deferredDropExpressions){let C=M(L,n,r);C&&a.emitLine(`${n}${C};`)}}else{let b=M(d,n,r);if(b==="break"&&t.isInsideWhile)a.emitLine(`${n}sm->while_loop_${t.index}_active = false;`),a.emitLine(`${n}goto while_loop_${t.index}_end;`);else{let L=b==="break"||b==="continue"||b?.includes("return");b&&(L||d.$&&!ut(d.$.env.modulePath,b))&&a.emitLine(`${n}${b};`)}}l.push({index:u,value:d,hasAwait:!1})}r.asyncCondBranchInfo||(r.asyncCondBranchInfo=new Map),(r.asyncCondBranchInfo.get(t.index)?.branches.some($=>$.hasAwait&&$.remainingExprs&&$.remainingExprs.length>0)??!1)||r.asyncCondBranchInfo.set(t.index,{branches:l,targetVariableId:i,targetAssignmentCode:o});return}let c=!1,f=0,p=n;for(let h=0;h<s.length;h++){let d=s[h];if(d.tag!=="FnCall"||!E(d,"=>")){a.emitLine(`${p}// Error: Expected => pair in cond`);continue}let v=d.args[0],T=d.args[1];if(!v||!T){a.emitLine(`${p}// Error: Invalid pair in cond`);continue}if(Re(v.$?.value)&&v.$.value.value===!1)continue;c&&(a.emitLine(`${p}else {`),f++,p+=" ");let $=h===s.length-1&&v.tag==="Atom"&&v.token?.value==="true"?null:M(v,p,r);$?a.emitLine(`${p}if (${$}) {`):a.emitLine(`${p}{`),c=!0;let b=`${p} `;if(qr(T)){a.emitLine(`${b}sm->cond_branch_${t.index} = ${h};`);let C=eo(T,t,b,r),R=r.asyncWhileLoopInfo?.get(t.index);if(R&&C.length>0){let B=r.asyncCondBranchInfo?.get(t.index)?.branches.some(D=>D.hasAwait&&D.remainingExprs&&D.remainingExprs.length>0)??!1;R.condBranchPostWhileExprs={branchIndex:h,condBranchFieldIndex:t.index,exprs:C,deferredDropExpressions:T.$?.deferredDropExpressions,skipCondBranchCheck:B},l.push({index:h,value:T,hasAwait:!0,remainingExprs:[],deferredDropExpressions:T.$?.deferredDropExpressions})}else l.push({index:h,value:T,hasAwait:!0,remainingExprs:C,deferredDropExpressions:T.$?.deferredDropExpressions})}else{if(Zi(e,T,r,i,o))Ji(T,b,r);else if(F(T)&&E(T,I.begin)){let C=T.args;for(let R=0;R<C.length;R++){let N=C[R],B=M(N,b,r);if(B==="break"&&t.isInsideWhile)a.emitLine(`${b}sm->while_loop_${t.index}_active = false;`),a.emitLine(`${b}goto while_loop_${t.index}_end;`);else{let D=B==="break"||B==="continue"||B?.includes("return");B&&(D||N.$&&!ut(N.$.env.modulePath,B))&&a.emitLine(`${b}${B};`)}}if(T.$?.deferredDropExpressions)for(let R of T.$.deferredDropExpressions){let N=M(R,b,r);N&&a.emitLine(`${b}${N};`)}}else{let C=M(T,b,r);if(C==="break"&&t.isInsideWhile)a.emitLine(`${b}sm->while_loop_${t.index}_active = false;`),a.emitLine(`${b}goto while_loop_${t.index}_end;`);else{let R=C==="break"||C==="continue"||C?.includes("return");C&&(R||T.$&&!ut(T.$.env.modulePath,C))&&a.emitLine(`${b}${C};`)}}l.push({index:h,value:T,hasAwait:!1})}a.emitLine(`${p}}`)}for(let h=0;h<f;h++)p=p.slice(0,-2),a.emitLine(`${p}}`);r.asyncCondBranchInfo||(r.asyncCondBranchInfo=new Map),(r.asyncCondBranchInfo.get(t.index)?.branches.some(h=>h.hasAwait&&h.remainingExprs&&h.remainingExprs.length>0)??!1)||r.asyncCondBranchInfo.set(t.index,{branches:l,targetVariableId:i,targetAssignmentCode:o})}function Zi(e,t,n,r,i){return!r&&!i&&n.asyncBodyReturnExpr!==void 0&&e===n.asyncBodyReturnExpr&&!!n.inAsyncStateMachine&&!$_(t)}function Ji(e,t,n){let r=n.emitter,i=fe(e.$?.type);if(F(e)&&E(e,I.begin)){let o=e.args;for(let s=0;s<o.length-1;s++){let l=o[s],u=M(l,t,n);u&&l.$&&!ut(l.$.env.modulePath,u)&&r.emitLine(`${t}${u};`)}let a=o[o.length-1];if(a&&!i){let s=M(a,t,n);s&&r.emitLine(`${t}sm->result = ${s};`)}if(e.$?.deferredDropExpressions)for(let s of e.$.deferredDropExpressions){let l=M(s,t,n);l&&r.emitLine(`${t}${l};`)}}else if(!i){let o=M(e,t,n);o&&r.emitLine(`${t}sm->result = ${o};`)}if(r.emitLine(`${t}// Drop local variables before early completion`),n.pendingDeferredDrops)for(let o of n.pendingDeferredDrops){let a=M(o,t,n);a&&a.includes("sm->")&&r.emitLine(`${t}${a};`)}Sr({emitter:r,indent:t,resultCode:void 0,debugLabel:n.currentFunctionName}),r.emitLine(`${t}return;`)}function qr(e){if(e.tag==="FnCall"&&fn(e))return!0;if(e.tag==="FnCall"){for(let t of e.args)if(qr(t))return!0}return!1}function $_(e){if(dt(e,"return")||E(e,"return"))return!0;if(e.tag==="FnCall"){for(let t of e.args)if($_(t))return!0}return!1}function Ho(e,t,n,r,i,o){let a=r.emitter;if(e.tag!=="FnCall"||!E(e,I.match)){a.emitLine(`${n}// Error: Expected match expression`);return}let s=e.args[0],l=e.args.slice(1);if(!s||l.length===0){a.emitLine(`${n}// Error: match must have a value and at least one case`);return}let u=M(s,n,r),_=s.$?.type;if(!_){a.emitLine(`${n}// Error: match value has no type`);return}if(e.$?.isPrimitiveMatch){Sy(e,l,u,t,n,r,i,o);return}if(!ge(_)){a.emitLine(`${n}// Error: match requires an enum type or primitive type`);return}let c=_,f=r.types[c.id]?.cName;if(!f){a.emitLine(`${n}// Error: enum type has no C name`);return}let p=qt(c);if(p){let m=-1,g=-1,h;for(let d=0;d<l.length;d++){let v=l[d];if(F(v)&&E(v,"=>",2)){let T=v.args[0];if(T&&F(T)&&E(T,"."))m=d;else if(T&&F(T)){let $=T.func;$&&F($)&&E($,".")&&(g=d,T.args.length>0&&U(T.args[0])&&(h=T.args[0].token.value))}}}if(a.emitLine(`${n}if (${u} != NULL) {`),g>=0){let d=l[g];if(!F(d))a.emitLine(`${n} // Error: Expected => in case`);else{let v=d.args[1];if(h){let T=r,$=!1,b;if(T.stateMachineVariables){for(let[L,C]of T.stateMachineVariables)if(C.name===h){$=!0,b=L;break}}if($&&b){let L=rn(b,"local",T.stateMachineFieldAliases);a.emitLine(`${n} sm->${L} = ${u};`)}else a.emitLine(`${n} ${P(p,r)} ${h} = ${u};`)}if(a.emitLine(`${n} sm->cond_branch_${t.index} = ${g};`),qr(v)){let T=eo(v,t,n+" ",r);if(T.length>0){let $=r;$.asyncCondBranchInfo||($.asyncCondBranchInfo=new Map);let b=$.asyncCondBranchInfo.get(t.index)||{branches:[]};b.branches.push({index:g,value:v,hasAwait:!0,remainingExprs:T,deferredDropExpressions:v.$?.deferredDropExpressions}),$.asyncCondBranchInfo.set(t.index,b)}}else if(Zi(e,v,r,i,o))Ji(v,n+" ",r);else{let T=M(v,n+" ",r);if(i){let $=te(`var_${i}`);T&&a.emitLine(`${n} sm->${$} = ${T};`)}else o?T&&a.emitLine(`${n} ${o} = ${T};`):T&&v.$&&!ut(v.$.env.modulePath,T)&&a.emitLine(`${n} ${T};`)}}}if(a.emitLine(`${n}} else {`),m>=0){let d=l[m];if(!F(d))a.emitLine(`${n} // Error: Expected => in case`);else{let v=d.args[1];if(a.emitLine(`${n} sm->cond_branch_${t.index} = ${m};`),qr(v)){let T=eo(v,t,n+" ",r);if(T.length>0){let $=r;$.asyncCondBranchInfo||($.asyncCondBranchInfo=new Map);let b=$.asyncCondBranchInfo.get(t.index)||{branches:[]};b.branches.push({index:m,value:v,hasAwait:!0,remainingExprs:T,deferredDropExpressions:v.$?.deferredDropExpressions}),$.asyncCondBranchInfo.set(t.index,b)}}else if(Zi(e,v,r,i,o))Ji(v,n+" ",r);else{let T=M(v,n+" ",r);if(i){let $=te(`var_${i}`);T&&a.emitLine(`${n} sm->${$} = ${T};`)}else o?T&&a.emitLine(`${n} ${o} = ${T};`):T&&v.$&&!ut(v.$.env.modulePath,T)&&a.emitLine(`${n} ${T};`)}}}a.emitLine(`${n}}`)}else{a.emitLine(`${n}switch (${u}.tag) {`);let m=!1;for(let g=0;g<l.length;g++){let h=l[g];if(!F(h)||!E(h,"=>",2))continue;let d=h.args[0],v=h.args[1],T=U(d)&&d.token.value==="_",$;if(!T){if(F(d)&&E(d,".",1))$=d.args[0].token.value;else if(F(d)){let b=d.func;b&&F(b)&&E(b,".",1)&&($=b.args[0].token.value)}}if(!T&&!$){a.emitLine(`${n} // Error: Could not extract variant name`);continue}if(T)m=!0,a.emitLine(`${n} default: {`);else{let b=`${f.toUpperCase()}_${$.toUpperCase()}`;a.emitLine(`${n} case ${b}: {`)}if(a.emitLine(`${n} sm->cond_branch_${t.index} = ${g};`),F(d)&&d.args.length>=1){let b=d.func;if(b&&F(b)&&E(b,".")){let L=c.variants.find(C=>C.name===$);if(L&&L.fields)for(let C=0;C<Math.min(d.args.length,L.fields.length);C++){let R=d.args[C],N=L.fields[C];if(U(R)&&N){let B=R.token.value,D=te(B),x=r,z=!1,re;if(x.stateMachineVariables){for(let[le,ce]of x.stateMachineVariables)if(ce.name===B){z=!0,re=le;break}}let j=te(N.label,N.type.isExtern==="c"),W=`${u}.data.${$}.${j}`;if(z&&re){let le=rn(re,"local",x.stateMachineFieldAliases);a.emitLine(`${n} sm->${le} = ${W};`)}else{let le=P(N.type,r);a.emitLine(`${n} ${le} ${D} = ${W};`)}}}}}if(qr(v)){let b=eo(v,t,n+" ",r);if(b.length>0){let L=r;L.asyncCondBranchInfo||(L.asyncCondBranchInfo=new Map);let C=L.asyncCondBranchInfo.get(t.index)||{branches:[]};C.branches.push({index:g,value:v,hasAwait:!0,remainingExprs:b,deferredDropExpressions:v.$?.deferredDropExpressions}),L.asyncCondBranchInfo.set(t.index,C)}}else if(Zi(e,v,r,i,o))Ji(v,n+" ",r);else{let b=M(v,n+" ",r);if(i){let L=te(`var_${i}`);b&&a.emitLine(`${n} sm->${L} = ${b};`)}else o?b&&a.emitLine(`${n} ${o} = ${b};`):b&&v.$&&!ut(v.$.env.modulePath,b)&&a.emitLine(`${n} ${b};`)}a.emitLine(`${n} break;`),a.emitLine(`${n} }`)}m||a.emitLine(`${n} default: break;`),a.emitLine(`${n}}`)}}function Iy(e){return F(e)?E(e,"|",2):!1}function sl(e){if(!Iy(e))return[e];if(e.tag!=="FnCall")return[e];let t=e.args[0],n=e.args[1];return[...sl(t),...sl(n)]}function Sy(e,t,n,r,i,o,a,s){let l=o.emitter,u=[];l.emitLine(`${i}switch (${n}) {`);for(let _=0;_<t.length;_++){let c=t[_];if(!F(c)||!E(c,"=>",2))continue;let f=c.args[0],p=c.args[1];if(dt(f,"_"))l.emitLine(`${i} default:`);else{let m=f.$?.primitivePatternValues;if(m&&m.length>0){for(let g of m)if(g!==void 0){let h=Qt(g,o);l.emitLine(`${i} case ${h}:`)}}else{let g=sl(f);for(let h of g){let d=h.$?.value;if(d!==void 0){let v=Qt(d,o);l.emitLine(`${i} case ${v}:`)}}}}if(l.emitLine(`${i} sm->cond_branch_${r.index} = ${_};`),qr(p)){let m=eo(p,r,i+" ",o);u.push({index:_,value:p,hasAwait:!0,remainingExprs:m,deferredDropExpressions:p.$?.deferredDropExpressions})}else{if(Zi(e,p,o,a,s))Ji(p,i+" ",o);else{let m=M(p,i+" ",o);if(a){let g=te(`var_${a}`);m&&l.emitLine(`${i} sm->${g} = ${m};`)}else s?m&&l.emitLine(`${i} ${s} = ${m};`):m&&p.$&&!ut(p.$.env.modulePath,m)&&l.emitLine(`${i} ${m};`)}u.push({index:_,value:p,hasAwait:!1})}l.emitLine(`${i} break;`)}l.emitLine(`${i}}`),o.asyncCondBranchInfo||(o.asyncCondBranchInfo=new Map),o.asyncCondBranchInfo.set(r.index,{branches:u,targetVariableId:a,targetAssignmentCode:s})}function eo(e,t,n,r){let i=r.emitter,o=[];if(e.tag!=="FnCall"||!E(e,"begin"))return i.emitLine(`${n}// Error: Expected begin block in cond branch with await`),o;let a=e.args,s=!1;for(let l of a){if(s){o.push(l);continue}if(qr(l))if(s=!0,l.tag==="FnCall"&&E(l,":=")){let u=l.args[1];if(u&&u.tag==="FnCall"&&fn(u)){let _=u.args[0];if(_){let c=M(_,n,r);i.emitLine(`${n}// Store Future for await ${t.index} (cond branch)`),i.emitLine(`${n}sm->await_future_${t.index} = ${c};`)}}}else if(l.tag==="FnCall"&&fn(l)){let u=l.args[0];if(u)if(t.futureVariableId===void 0){let _=M(u,n,r);i.emitLine(`${n}// Store Future for await ${t.index} (cond branch)`),i.emitLine(`${n}sm->await_future_${t.index} = ${_};`)}else i.emitLine(`${n}// Await will use Future from sm->var_${t.futureVariableId}`)}else if(l.tag==="FnCall"&&E(l,I.cond)){let u=l===a[a.length-1],_=r.asyncBodyReturnExpr;u&&r.asyncBodyReturnExpr!==void 0&&(r.asyncBodyReturnExpr=l),qo(l,t,n,r),r.asyncBodyReturnExpr=_}else if(l.tag==="FnCall"&&E(l,I.match)){let u=l===a[a.length-1],_=r.asyncBodyReturnExpr;u&&r.asyncBodyReturnExpr!==void 0&&(r.asyncBodyReturnExpr=l),Ho(l,t,n,r),r.asyncBodyReturnExpr=_}else l.tag==="FnCall"&&E(l,I.while)&&ul(l,t,n,r);else{let u=M(l,n,r);u&&l.$&&!ut(l.$.env.modulePath,u)&&i.emitLine(`${n}${u};`)}}return o}function ul(e,t,n,r){let i=r.emitter;if(e.tag!=="FnCall"||!E(e,"while")){i.emitLine(`${n}// Error: Expected while expression`);return}let o=e.args;if(o.length<2||o.length>3){i.emitLine(`${n}// Error: while must have 2 or 3 arguments (condition, [step,] body)`);return}let a=o[0],s=o.length===3?o[1]:void 0,l=o.length===3?o[2]:o[1],u=xy(l),_;u?(_=r.asyncNextWhileLoopIndex??t.index+1,r.asyncNextWhileLoopIndex=_+1):_=t.index,i.emitLine(`${n}sm->while_loop_${_}_active = true;`),i.emitLine(`${n}while_loop_${_}_start:`);let c=M(a,n,r);i.emitLine(`${n}if (!(${c})) {`),i.emitLine(`${n} sm->while_loop_${_}_active = false;`),i.emitLine(`${n} goto while_loop_${_}_end;`),i.emitLine(`${n}}`);let f=Ny(l,t,n,r,_);if(i.emitLine(`${n}while_loop_${_}_end:`),r.asyncWhileLoopInfo||(r.asyncWhileLoopInfo=new Map),u){let p=r.asyncWhileLoopInfo.get(t.index);p&&(p.outerWhileLoop={whileLoopIndex:_,conditionExpr:a,stepExpr:s,bodyExpr:l,bodyExprsAfterAwait:f})}else r.asyncWhileLoopInfo.set(t.index,{conditionExpr:a,stepExpr:s,bodyExpr:l,bodyExprsAfterAwait:f})}function Ny(e,t,n,r,i){let o=r.emitter,a=[],s=[];e.tag==="FnCall"&&E(e,"begin")?s=e.args:s=[e];let l=-1;for(let p=0;p<s.length;p++){let m=s[p];if(un(m)){l=p;break}}if(l===-1)return o.emitLine(`${n}// Error: Expected await in while loop body but none found`),a;let u=r.smWhileBreakInfo,_=r.smWhileContinueInfo,c=r.smWhileBodyDrops;r.smWhileBreakInfo={label:`while_loop_${i}_end`,activeIndex:i},r.smWhileContinueInfo={label:`while_loop_${i}_start`,emitDropsBeforeGoto:!0},r.smWhileBodyDrops=[...e.$?.deferredDropExpressions??[]];for(let p=0;p<l;p++){let m=s[p],g=M(m,n,r);g&&m.$&&!ut(m.$.env.modulePath,g)&&o.emitLine(`${n}${g};`)}r.smWhileBreakInfo=u,r.smWhileContinueInfo=_,r.smWhileBodyDrops=c;let f=s[l];if(F(f)&&E(f,I.while)&&un(f)){ul(f,t,n,r);for(let p=l+1;p<s.length;p++)a.push(s[p]);return a}if(F(f)&&E(f,":=")){let p=f.args[1];if(p&&p.tag==="FnCall"&&fn(p)){let m=p.args[0];if(m){let g=M(m,n,r);o.emitLine(`${n}// Store Future for await ${t.index} (while loop body)`),o.emitLine(`${n}sm->await_future_${t.index} = ${g};`)}}}else if(f.tag==="FnCall"&&fn(f)){let p=f.args[0];if(p&&t.futureVariableId===void 0){let m=M(p,n,r);o.emitLine(`${n}// Store Future for await ${t.index} (while loop body)`),o.emitLine(`${n}sm->await_future_${t.index} = ${m};`)}}else if(F(f)&&E(f,I.cond)){qo(f,t,n,r,void 0);for(let p=l+1;p<s.length;p++)a.push(s[p]);return a}else if(F(f)&&E(f,I.match)){Ho(f,t,n,r);for(let p=l+1;p<s.length;p++)a.push(s[p]);return a}for(let p=l+1;p<s.length;p++)a.push(s[p]);return a}function xy(e){let t=e.tag==="FnCall"&&E(e,"begin")?e.args:[e];for(let n of t)if(n.tag==="FnCall"&&E(n,I.while)&&un(n))return!0;return!1}function hi(e,t,n){if(e)switch(e.tag){case"Atom":if(e.$&&e.token.type==="identifier"){let r=e.token.value,i=X(e.$.env,r);if(i.length>0){let o=i[i.length-1];if(o&&!o.isCompileTimeOnly){let a=n.get(o.id)??o.id,s=o.isOwningTheSameRcValueAs?o.isOwningTheSameRcValueAs.id:a;t.add(s)}}}break;case"FnCall":if(Rt(e)){if(e.$?.deferredDupExpressions)for(let r of e.$.deferredDupExpressions)hi(r,t,n);break}hi(e.func,t,n);for(let r of e.args)hi(r,t,n);if(e.$?.deferredDropExpressions)for(let r of e.$.deferredDropExpressions)hi(r,t,n);if(e.$?.deferredDupExpressions)for(let r of e.$.deferredDupExpressions)hi(r,t,n);break}}function Pa(e,t){let{awaitPoints:n,capturedVariables:r,variableIdRemapping:i}=t;if(n.length===0)return{crossBoundaryIds:new Set,awaitFutureTempVarAliases:new Map,variableSegments:new Map};let o=new Set,a=ll(e,n);for(let c of a)(c.awaitPoint?.isInsideCond||c.awaitPoint?.isInsideWhile)&&o.add(c.stateNumber);let s=new Map;for(let c of a){let f=new Set;for(let p of c.expressions)hi(p,f,i);for(let p of f){let m=s.get(p);m||(m=new Set,s.set(p,m)),m.add(c.stateNumber)}}let l=-1;if(e.$?.deferredDropExpressions){let c=new Set;for(let f of e.$.deferredDropExpressions)hi(f,c,i);for(let f of c){let p=s.get(f);p||(p=new Set,s.set(f,p)),p.add(l)}}let u=new Set;for(let c of r){if(c.kind==="outer")continue;let f=s.get(c.id);if(!f)u.add(c.id);else if(f.size>1)u.add(c.id);else if(f.has(l))u.add(c.id);else{let p=f.values().next().value;o.has(p)&&u.add(c.id)}}let _=new Map;for(let c of n){if(c.futureVariableId!==void 0)continue;let f=c.expr;if(!F(f))continue;let p=f.args[0];if(!p)continue;let m=p.$?.variableName;if(!m)continue;let g=r.find(h=>h.kind==="local"&&(h.name===m||h.id===m));g&&(_.set(g.id,`await_future_${c.index}`),u.delete(g.id))}return{crossBoundaryIds:u,awaitFutureTempVarAliases:_,variableSegments:s}}function za(e,t,n,r,i){let o={slotAliases:new Map,slots:[]},a=n.filter(f=>f.kind==="local"&&e.has(f.id)&&!r.has(f.id)&&!Le(f.type));if(a.length<2)return o;let s=new Map;for(let f of a){let p=t.get(f.id);if(!p||p.size===0)continue;let m=[...p].filter(d=>d>=0);if(m.length===0)continue;let g=Math.min(...m),h=Math.max(...m);s.set(f.id,[g,h])}if(s.size<2)return o;let l=new Map;for(let[f]of s){let p=a.find(h=>h.id===f);if(!p)continue;let m=P(p.type,i),g=l.get(m);g||(g=[],l.set(m,g)),g.push(f)}let u=new Map,_=[],c=0;for(let[f,p]of l){if(p.length<2)continue;let m=new Map;for(let d of p)m.set(d,new Set);for(let d=0;d<p.length;d++)for(let v=d+1;v<p.length;v++){let[T,$]=s.get(p[d]),[b,L]=s.get(p[v]);T<=L&&b<=$&&(m.get(p[d]).add(p[v]),m.get(p[v]).add(p[d]))}let g=new Map;for(let d of p){let v=new Set;for(let $ of m.get(d))g.has($)&&v.add(g.get($));let T=0;for(;v.has(T);)T++;g.set(d,T)}let h=new Map;for(let[d,v]of g){let T=h.get(v);T||(T=[],h.set(v,T)),T.push(d)}for(let[,d]of h){if(d.length<2)continue;let v=`slot_${c}`,T=d.map($=>a.find(b=>b.id===$)?.name??$);for(let $ of d)u.set($,v);_.push({fieldName:v,cType:f,variableNames:T}),c++}}return{slotAliases:u,slots:_}}function cl(e,t){if(e.futureVariableId){let n=t.capturedVariables.find(r=>r.id===e.futureVariableId);if(n)return n.kind==="outer"?n.name:`var_${n.id}`}return`await_future_${e.index}`}function jo(e){return!e||!V(e)?!1:e.resolvedConcreteType&&V(e.resolvedConcreteType)&&e.resolvedConcreteType.isExtern?!0:e.requiredTraits.some(t=>oa(t.traitType))}function rn(e,t,n){if(t==="outer")return`__capture.${te(e)}`;let r=n?.get(e);return r||te(`var_${e}`)}function C_(e,t,n,r,i,o,a,s){let l=s.emitter,_=Dt(o).isFuture.outputType,c=fe(_);s.asyncCondBranchInfo=new Map,s.asyncWhileLoopInfo=new Map,s.asyncNextWhileLoopIndex=i.awaitPoints.length;let f=ll(e,i.awaitPoints),p=e.tag==="FnCall"&&E(e,"begin")?e.args:[e],m=p.length>0?p[p.length-1]:void 0;l.emitLine(`// Resume function for async block ${t}`),l.emitLine(`void ${r}(${n}* sm) {`),l.emitLine(` ASYNC_DEBUG("${t}_resume: state=%d\\n", sm->state);`),l.emitLine(" switch (sm->state) {");let g=[];for(let h=0;h<f.length;h++){let d=f[h];if(!d)continue;let v=d.stateNumber,T=h===f.length-1;if(l.emitLine(`
|
|
192
|
+
`}else if(O(e)){let r=e.value;if(r)return t.types[r.id]?t.types[r.id].cName:`/* Error: No C type name found for type ${A(r)} */`}else if(wi(e)){let r=e.targetValue[0];if(r){let i=n?.$?.convertedRuntimeType||n?.$?.type;if(i&&Ie(i)){let o=i.childType,a=Qt(r,t,{$:{type:o,convertedRuntimeType:o}});if(a&&!a.startsWith("/*")&&!a.startsWith("//"))return`(&${a})`}}return`/* Error: Cannot generate pointer value ${Me(e)} */`}}return`/* skip generating: ${Me(e)} */`}function Qi(e,t,n){if(e===t)return!0;if(e.tag==="FnCall"){if(n&&n(e))return!1;if(Qi(e.func,t,n))return!0;for(let r of e.args)if(Qi(r,t,n))return!0}return!1}function Ly(e,t,n){for(let r=0;r<t.length;r++)if(Qi(e,t[r].expr,n))return r;return-1}function T_(e,t,n){let r=[],i=n?.shouldSkipBody;if(e.tag!=="FnCall"||!E(e,"begin"))return t.length===0?[{stateNumber:0,expressions:[e],suspensionPoint:null}]:[{stateNumber:0,expressions:[e],suspensionPoint:t[0]??null}];let o=e.args,a=[],s=[];for(let l of o){let u=Ly(l,t,i),_=n?.handleReturnStatements&&(dt(l,"return")||E(l,"return"));if(u!==-1){if(s.push(l),a.push(s),s=[],n?.handleSequentialSuspensions)for(let c=u+1;c<t.length&&Qi(l,t[c].expr,i);c++)a.push([])}else if(_){s.push(l),a.push(s),s=[];break}else s.push(l)}s.length>0&&a.push(s);for(let l=0;l<a.length;l++){let u=a[l],_=l<t.length?t[l]:null;r.push({stateNumber:l,expressions:u,suspensionPoint:_})}return r}function ll(e,t){let r=T_(e,t,{shouldSkipBody:Rt,handleReturnStatements:!0,handleSequentialSuspensions:!0}).map(i=>({stateNumber:i.stateNumber,expressions:i.expressions,awaitPoint:i.suspensionPoint}));return r.length>0&&r[r.length-1].awaitPoint!==null&&r.push({stateNumber:r.length,expressions:[],awaitPoint:null}),r}function Ay(e,t){return Qi(e,t,Rt)}function E_(e,t,n,r=!1){let i=n.emitter;for(let o=0;o<e.expressions.length;o++){let a=e.expressions[o],s=o===e.expressions.length-1,l=e.awaitPoint&&Ay(a,e.awaitPoint.expr),u=e.awaitPoint&&a.tag==="FnCall"&&(E(a,I.while)||E(a,I.cond)||E(a,I.match))&&un(a);if((l||u)&&e.awaitPoint)to(a,e.awaitPoint,e.stateNumber,t,n);else if(s&&r){let _=M(a,t,n);_&&(i.emitLine(`${t}// Store final expression result`),i.emitLine(`${t}sm->result = ${_};`))}else{let _=M(a,t,n);!_||!a.$||ut(a.$.env.modulePath,_)||i.emitLine(`${t}${_};`)}}}function to(e,t,n,r,i){let o=i.emitter;if(e.tag==="FnCall"&&fn(e)){let a=e.args[0];if(!a){o.emitLine(`${r}// Error: await without argument`);return}if(t.futureVariableId===void 0){let s=M(a,r,i);o.emitLine(`${r}// Store pattern-matched Future for await ${t.index}`),o.emitLine(`${r}sm->await_future_${t.index} = ${s};`)}else o.emitLine(`${r}// Prepare for await (future already stored in state machine variable)`);return}if(e.tag==="FnCall"&&E(e,":=")){let a=e.args[0],s=e.args[1];if(!a||!s){o.emitLine(`${r}// Error: Invalid assignment expression`);return}if(s.tag==="FnCall"&&fn(s)){let l=s.args[0];if(!l){o.emitLine(`${r}// Error: await without argument`);return}let u=a.token?.value;if(!u||!a.$){o.emitLine(`${r}// Error: Invalid variable name`);return}if(t.futureVariableId===void 0){let _=M(l,r,i);o.emitLine(`${r}// Store Future for await (variable: ${u})`),o.emitLine(`${r}sm->await_future_${t.index} = ${_};`)}else o.emitLine(`${r}// Store Future for await (variable: ${u}) - future already in state machine`);return}if(s.tag==="FnCall"&&E(s,I.cond)){let l;if(a.tag==="Atom"&&a.token.type==="identifier"&&a.$){let u=a.token.value,_=X(a.$.env,u);_.length>0&&(l=_[_.length-1].id)}qo(s,t,r,i,l);return}if(s.tag==="FnCall"&&E(s,I.match)){let l;if(a.tag==="Atom"&&a.token.type==="identifier"&&a.$){let u=a.token.value,_=X(a.$.env,u);_.length>0&&(l=_[_.length-1].id)}Ho(s,t,r,i,l);return}}if(e.tag==="FnCall"&&E(e,"=")){let a=e.args[0],s=e.args[1];if(a&&s){if(s.tag==="FnCall"&&E(s,I.cond)){let l=M(a,r,i);qo(s,t,r,i,void 0,l||void 0);return}if(s.tag==="FnCall"&&E(s,I.match)){let l=M(a,r,i);Ho(s,t,r,i,void 0,l||void 0);return}}}if(e.tag==="FnCall"&&E(e,I.cond)){qo(e,t,r,i);return}if(e.tag==="FnCall"&&E(e,I.match)){Ho(e,t,r,i);return}if(e.tag==="FnCall"&&E(e,I.while)){ul(e,t,r,i);return}o.emitLine(`${r}// ERROR: Unsupported pattern for await expression`),o.emitLine(`${r}// Expression type: ${e.tag}, function: ${e.tag==="FnCall"?e.func.tag==="Atom"?e.func.token?.value:e.func.tag:"N/A"}`)}function qo(e,t,n,r,i,o){let a=r.emitter;if(e.tag!=="FnCall"||!E(e,I.cond)){a.emitLine(`${n}// Error: Expected cond expression`);return}let s=e.args;if(s.length===0){a.emitLine(`${n}// Error: cond must have at least one branch`);return}let l=[],u=-1;for(let h=0;h<s.length;h++){let d=s[h];if(d.tag==="FnCall"&&E(d,"=>")){let v=d.args[0];if(v&&!(Pe(v.$?.value)&&v.$.value.value===!1)){u=h;break}}}let _=!1;if(u>=0){let h=s[u];if(h.tag==="FnCall"&&E(h,"=>")){let d=h.args[0];d&&Pe(d.$?.value)&&d.$.value.value===!0&&(_=!0)}}if(_&&u>=0){let h=s[u],d=F(h)?h.args[1]:void 0;if(d)if(qr(d)){let b=eo(d,t,n,r),L=r.asyncWhileLoopInfo?.get(t.index);if(L&&b.length>0){let R=r.asyncCondBranchInfo?.get(t.index)?.branches.some(N=>N.hasAwait&&N.remainingExprs&&N.remainingExprs.length>0)??!1;L.condBranchPostWhileExprs={branchIndex:u,condBranchFieldIndex:t.index,exprs:b,deferredDropExpressions:d.$?.deferredDropExpressions,skipCondBranchCheck:R},l.push({index:u,value:d,hasAwait:!0,remainingExprs:[],deferredDropExpressions:d.$?.deferredDropExpressions})}else l.push({index:u,value:d,hasAwait:!0,remainingExprs:b,deferredDropExpressions:d.$?.deferredDropExpressions})}else{if(Zi(e,d,r,i,o))Ji(d,n,r);else if(F(d)&&E(d,I.begin)){let b=d.args;for(let L=0;L<b.length;L++){let C=b[L],R=M(C,n,r);if(R==="break"&&t.isInsideWhile)a.emitLine(`${n}sm->while_loop_${t.index}_active = false;`),a.emitLine(`${n}goto while_loop_${t.index}_end;`);else{let N=R==="break"||R==="continue"||R?.includes("return");R&&(N||C.$&&!ut(C.$.env.modulePath,R))&&a.emitLine(`${n}${R};`)}}if(d.$?.deferredDropExpressions)for(let L of d.$.deferredDropExpressions){let C=M(L,n,r);C&&a.emitLine(`${n}${C};`)}}else{let b=M(d,n,r);if(b==="break"&&t.isInsideWhile)a.emitLine(`${n}sm->while_loop_${t.index}_active = false;`),a.emitLine(`${n}goto while_loop_${t.index}_end;`);else{let L=b==="break"||b==="continue"||b?.includes("return");b&&(L||d.$&&!ut(d.$.env.modulePath,b))&&a.emitLine(`${n}${b};`)}}l.push({index:u,value:d,hasAwait:!1})}r.asyncCondBranchInfo||(r.asyncCondBranchInfo=new Map),(r.asyncCondBranchInfo.get(t.index)?.branches.some($=>$.hasAwait&&$.remainingExprs&&$.remainingExprs.length>0)??!1)||r.asyncCondBranchInfo.set(t.index,{branches:l,targetVariableId:i,targetAssignmentCode:o});return}let c=!1,f=0,p=n;for(let h=0;h<s.length;h++){let d=s[h];if(d.tag!=="FnCall"||!E(d,"=>")){a.emitLine(`${p}// Error: Expected => pair in cond`);continue}let v=d.args[0],T=d.args[1];if(!v||!T){a.emitLine(`${p}// Error: Invalid pair in cond`);continue}if(Pe(v.$?.value)&&v.$.value.value===!1)continue;c&&(a.emitLine(`${p}else {`),f++,p+=" ");let $=h===s.length-1&&v.tag==="Atom"&&v.token?.value==="true"?null:M(v,p,r);$?a.emitLine(`${p}if (${$}) {`):a.emitLine(`${p}{`),c=!0;let b=`${p} `;if(qr(T)){a.emitLine(`${b}sm->cond_branch_${t.index} = ${h};`);let C=eo(T,t,b,r),R=r.asyncWhileLoopInfo?.get(t.index);if(R&&C.length>0){let B=r.asyncCondBranchInfo?.get(t.index)?.branches.some(D=>D.hasAwait&&D.remainingExprs&&D.remainingExprs.length>0)??!1;R.condBranchPostWhileExprs={branchIndex:h,condBranchFieldIndex:t.index,exprs:C,deferredDropExpressions:T.$?.deferredDropExpressions,skipCondBranchCheck:B},l.push({index:h,value:T,hasAwait:!0,remainingExprs:[],deferredDropExpressions:T.$?.deferredDropExpressions})}else l.push({index:h,value:T,hasAwait:!0,remainingExprs:C,deferredDropExpressions:T.$?.deferredDropExpressions})}else{if(Zi(e,T,r,i,o))Ji(T,b,r);else if(F(T)&&E(T,I.begin)){let C=T.args;for(let R=0;R<C.length;R++){let N=C[R],B=M(N,b,r);if(B==="break"&&t.isInsideWhile)a.emitLine(`${b}sm->while_loop_${t.index}_active = false;`),a.emitLine(`${b}goto while_loop_${t.index}_end;`);else{let D=B==="break"||B==="continue"||B?.includes("return");B&&(D||N.$&&!ut(N.$.env.modulePath,B))&&a.emitLine(`${b}${B};`)}}if(T.$?.deferredDropExpressions)for(let R of T.$.deferredDropExpressions){let N=M(R,b,r);N&&a.emitLine(`${b}${N};`)}}else{let C=M(T,b,r);if(C==="break"&&t.isInsideWhile)a.emitLine(`${b}sm->while_loop_${t.index}_active = false;`),a.emitLine(`${b}goto while_loop_${t.index}_end;`);else{let R=C==="break"||C==="continue"||C?.includes("return");C&&(R||T.$&&!ut(T.$.env.modulePath,C))&&a.emitLine(`${b}${C};`)}}l.push({index:h,value:T,hasAwait:!1})}a.emitLine(`${p}}`)}for(let h=0;h<f;h++)p=p.slice(0,-2),a.emitLine(`${p}}`);r.asyncCondBranchInfo||(r.asyncCondBranchInfo=new Map),(r.asyncCondBranchInfo.get(t.index)?.branches.some(h=>h.hasAwait&&h.remainingExprs&&h.remainingExprs.length>0)??!1)||r.asyncCondBranchInfo.set(t.index,{branches:l,targetVariableId:i,targetAssignmentCode:o})}function Zi(e,t,n,r,i){return!r&&!i&&n.asyncBodyReturnExpr!==void 0&&e===n.asyncBodyReturnExpr&&!!n.inAsyncStateMachine&&!$_(t)}function Ji(e,t,n){let r=n.emitter,i=fe(e.$?.type);if(F(e)&&E(e,I.begin)){let o=e.args;for(let s=0;s<o.length-1;s++){let l=o[s],u=M(l,t,n);u&&l.$&&!ut(l.$.env.modulePath,u)&&r.emitLine(`${t}${u};`)}let a=o[o.length-1];if(a&&!i){let s=M(a,t,n);s&&r.emitLine(`${t}sm->result = ${s};`)}if(e.$?.deferredDropExpressions)for(let s of e.$.deferredDropExpressions){let l=M(s,t,n);l&&r.emitLine(`${t}${l};`)}}else if(!i){let o=M(e,t,n);o&&r.emitLine(`${t}sm->result = ${o};`)}if(r.emitLine(`${t}// Drop local variables before early completion`),n.pendingDeferredDrops)for(let o of n.pendingDeferredDrops){let a=M(o,t,n);a&&a.includes("sm->")&&r.emitLine(`${t}${a};`)}Sr({emitter:r,indent:t,resultCode:void 0,debugLabel:n.currentFunctionName}),r.emitLine(`${t}return;`)}function qr(e){if(e.tag==="FnCall"&&fn(e))return!0;if(e.tag==="FnCall"){for(let t of e.args)if(qr(t))return!0}return!1}function $_(e){if(dt(e,"return")||E(e,"return"))return!0;if(e.tag==="FnCall"){for(let t of e.args)if($_(t))return!0}return!1}function Ho(e,t,n,r,i,o){let a=r.emitter;if(e.tag!=="FnCall"||!E(e,I.match)){a.emitLine(`${n}// Error: Expected match expression`);return}let s=e.args[0],l=e.args.slice(1);if(!s||l.length===0){a.emitLine(`${n}// Error: match must have a value and at least one case`);return}let u=M(s,n,r),_=s.$?.type;if(!_){a.emitLine(`${n}// Error: match value has no type`);return}if(e.$?.isPrimitiveMatch){Sy(e,l,u,t,n,r,i,o);return}if(!ge(_)){a.emitLine(`${n}// Error: match requires an enum type or primitive type`);return}let c=_,f=r.types[c.id]?.cName;if(!f){a.emitLine(`${n}// Error: enum type has no C name`);return}let p=qt(c);if(p){let m=-1,g=-1,h;for(let d=0;d<l.length;d++){let v=l[d];if(F(v)&&E(v,"=>",2)){let T=v.args[0];if(T&&F(T)&&E(T,"."))m=d;else if(T&&F(T)){let $=T.func;$&&F($)&&E($,".")&&(g=d,T.args.length>0&&U(T.args[0])&&(h=T.args[0].token.value))}}}if(a.emitLine(`${n}if (${u} != NULL) {`),g>=0){let d=l[g];if(!F(d))a.emitLine(`${n} // Error: Expected => in case`);else{let v=d.args[1];if(h){let T=r,$=!1,b;if(T.stateMachineVariables){for(let[L,C]of T.stateMachineVariables)if(C.name===h){$=!0,b=L;break}}if($&&b){let L=rn(b,"local",T.stateMachineFieldAliases);a.emitLine(`${n} sm->${L} = ${u};`)}else a.emitLine(`${n} ${P(p,r)} ${h} = ${u};`)}if(a.emitLine(`${n} sm->cond_branch_${t.index} = ${g};`),qr(v)){let T=eo(v,t,n+" ",r);if(T.length>0){let $=r;$.asyncCondBranchInfo||($.asyncCondBranchInfo=new Map);let b=$.asyncCondBranchInfo.get(t.index)||{branches:[]};b.branches.push({index:g,value:v,hasAwait:!0,remainingExprs:T,deferredDropExpressions:v.$?.deferredDropExpressions}),$.asyncCondBranchInfo.set(t.index,b)}}else if(Zi(e,v,r,i,o))Ji(v,n+" ",r);else{let T=M(v,n+" ",r);if(i){let $=te(`var_${i}`);T&&a.emitLine(`${n} sm->${$} = ${T};`)}else o?T&&a.emitLine(`${n} ${o} = ${T};`):T&&v.$&&!ut(v.$.env.modulePath,T)&&a.emitLine(`${n} ${T};`)}}}if(a.emitLine(`${n}} else {`),m>=0){let d=l[m];if(!F(d))a.emitLine(`${n} // Error: Expected => in case`);else{let v=d.args[1];if(a.emitLine(`${n} sm->cond_branch_${t.index} = ${m};`),qr(v)){let T=eo(v,t,n+" ",r);if(T.length>0){let $=r;$.asyncCondBranchInfo||($.asyncCondBranchInfo=new Map);let b=$.asyncCondBranchInfo.get(t.index)||{branches:[]};b.branches.push({index:m,value:v,hasAwait:!0,remainingExprs:T,deferredDropExpressions:v.$?.deferredDropExpressions}),$.asyncCondBranchInfo.set(t.index,b)}}else if(Zi(e,v,r,i,o))Ji(v,n+" ",r);else{let T=M(v,n+" ",r);if(i){let $=te(`var_${i}`);T&&a.emitLine(`${n} sm->${$} = ${T};`)}else o?T&&a.emitLine(`${n} ${o} = ${T};`):T&&v.$&&!ut(v.$.env.modulePath,T)&&a.emitLine(`${n} ${T};`)}}}a.emitLine(`${n}}`)}else{a.emitLine(`${n}switch (${u}.tag) {`);let m=!1;for(let g=0;g<l.length;g++){let h=l[g];if(!F(h)||!E(h,"=>",2))continue;let d=h.args[0],v=h.args[1],T=U(d)&&d.token.value==="_",$;if(!T){if(F(d)&&E(d,".",1))$=d.args[0].token.value;else if(F(d)){let b=d.func;b&&F(b)&&E(b,".",1)&&($=b.args[0].token.value)}}if(!T&&!$){a.emitLine(`${n} // Error: Could not extract variant name`);continue}if(T)m=!0,a.emitLine(`${n} default: {`);else{let b=`${f.toUpperCase()}_${$.toUpperCase()}`;a.emitLine(`${n} case ${b}: {`)}if(a.emitLine(`${n} sm->cond_branch_${t.index} = ${g};`),F(d)&&d.args.length>=1){let b=d.func;if(b&&F(b)&&E(b,".")){let L=c.variants.find(C=>C.name===$);if(L&&L.fields)for(let C=0;C<Math.min(d.args.length,L.fields.length);C++){let R=d.args[C],N=L.fields[C];if(U(R)&&N){let B=R.token.value,D=te(B),x=r,z=!1,re;if(x.stateMachineVariables){for(let[le,ce]of x.stateMachineVariables)if(ce.name===B){z=!0,re=le;break}}let j=te(N.label,N.type.isExtern==="c"),W=`${u}.data.${$}.${j}`;if(z&&re){let le=rn(re,"local",x.stateMachineFieldAliases);a.emitLine(`${n} sm->${le} = ${W};`)}else{let le=P(N.type,r);a.emitLine(`${n} ${le} ${D} = ${W};`)}}}}}if(qr(v)){let b=eo(v,t,n+" ",r);if(b.length>0){let L=r;L.asyncCondBranchInfo||(L.asyncCondBranchInfo=new Map);let C=L.asyncCondBranchInfo.get(t.index)||{branches:[]};C.branches.push({index:g,value:v,hasAwait:!0,remainingExprs:b,deferredDropExpressions:v.$?.deferredDropExpressions}),L.asyncCondBranchInfo.set(t.index,C)}}else if(Zi(e,v,r,i,o))Ji(v,n+" ",r);else{let b=M(v,n+" ",r);if(i){let L=te(`var_${i}`);b&&a.emitLine(`${n} sm->${L} = ${b};`)}else o?b&&a.emitLine(`${n} ${o} = ${b};`):b&&v.$&&!ut(v.$.env.modulePath,b)&&a.emitLine(`${n} ${b};`)}a.emitLine(`${n} break;`),a.emitLine(`${n} }`)}m||a.emitLine(`${n} default: break;`),a.emitLine(`${n}}`)}}function Iy(e){return F(e)?E(e,"|",2):!1}function sl(e){if(!Iy(e))return[e];if(e.tag!=="FnCall")return[e];let t=e.args[0],n=e.args[1];return[...sl(t),...sl(n)]}function Sy(e,t,n,r,i,o,a,s){let l=o.emitter,u=[];l.emitLine(`${i}switch (${n}) {`);for(let _=0;_<t.length;_++){let c=t[_];if(!F(c)||!E(c,"=>",2))continue;let f=c.args[0],p=c.args[1];if(dt(f,"_"))l.emitLine(`${i} default:`);else{let m=f.$?.primitivePatternValues;if(m&&m.length>0){for(let g of m)if(g!==void 0){let h=Qt(g,o);l.emitLine(`${i} case ${h}:`)}}else{let g=sl(f);for(let h of g){let d=h.$?.value;if(d!==void 0){let v=Qt(d,o);l.emitLine(`${i} case ${v}:`)}}}}if(l.emitLine(`${i} sm->cond_branch_${r.index} = ${_};`),qr(p)){let m=eo(p,r,i+" ",o);u.push({index:_,value:p,hasAwait:!0,remainingExprs:m,deferredDropExpressions:p.$?.deferredDropExpressions})}else{if(Zi(e,p,o,a,s))Ji(p,i+" ",o);else{let m=M(p,i+" ",o);if(a){let g=te(`var_${a}`);m&&l.emitLine(`${i} sm->${g} = ${m};`)}else s?m&&l.emitLine(`${i} ${s} = ${m};`):m&&p.$&&!ut(p.$.env.modulePath,m)&&l.emitLine(`${i} ${m};`)}u.push({index:_,value:p,hasAwait:!1})}l.emitLine(`${i} break;`)}l.emitLine(`${i}}`),o.asyncCondBranchInfo||(o.asyncCondBranchInfo=new Map),o.asyncCondBranchInfo.set(r.index,{branches:u,targetVariableId:a,targetAssignmentCode:s})}function eo(e,t,n,r){let i=r.emitter,o=[];if(e.tag!=="FnCall"||!E(e,"begin"))return i.emitLine(`${n}// Error: Expected begin block in cond branch with await`),o;let a=e.args,s=!1;for(let l of a){if(s){o.push(l);continue}if(qr(l))if(s=!0,l.tag==="FnCall"&&E(l,":=")){let u=l.args[1];if(u&&u.tag==="FnCall"&&fn(u)){let _=u.args[0];if(_){let c=M(_,n,r);i.emitLine(`${n}// Store Future for await ${t.index} (cond branch)`),i.emitLine(`${n}sm->await_future_${t.index} = ${c};`)}}}else if(l.tag==="FnCall"&&fn(l)){let u=l.args[0];if(u)if(t.futureVariableId===void 0){let _=M(u,n,r);i.emitLine(`${n}// Store Future for await ${t.index} (cond branch)`),i.emitLine(`${n}sm->await_future_${t.index} = ${_};`)}else i.emitLine(`${n}// Await will use Future from sm->var_${t.futureVariableId}`)}else if(l.tag==="FnCall"&&E(l,I.cond)){let u=l===a[a.length-1],_=r.asyncBodyReturnExpr;u&&r.asyncBodyReturnExpr!==void 0&&(r.asyncBodyReturnExpr=l),qo(l,t,n,r),r.asyncBodyReturnExpr=_}else if(l.tag==="FnCall"&&E(l,I.match)){let u=l===a[a.length-1],_=r.asyncBodyReturnExpr;u&&r.asyncBodyReturnExpr!==void 0&&(r.asyncBodyReturnExpr=l),Ho(l,t,n,r),r.asyncBodyReturnExpr=_}else l.tag==="FnCall"&&E(l,I.while)&&ul(l,t,n,r);else{let u=M(l,n,r);u&&l.$&&!ut(l.$.env.modulePath,u)&&i.emitLine(`${n}${u};`)}}return o}function ul(e,t,n,r){let i=r.emitter;if(e.tag!=="FnCall"||!E(e,"while")){i.emitLine(`${n}// Error: Expected while expression`);return}let o=e.args;if(o.length<2||o.length>3){i.emitLine(`${n}// Error: while must have 2 or 3 arguments (condition, [step,] body)`);return}let a=o[0],s=o.length===3?o[1]:void 0,l=o.length===3?o[2]:o[1],u=xy(l),_;u?(_=r.asyncNextWhileLoopIndex??t.index+1,r.asyncNextWhileLoopIndex=_+1):_=t.index,i.emitLine(`${n}sm->while_loop_${_}_active = true;`),i.emitLine(`${n}while_loop_${_}_start:`);let c=M(a,n,r);i.emitLine(`${n}if (!(${c})) {`),i.emitLine(`${n} sm->while_loop_${_}_active = false;`),i.emitLine(`${n} goto while_loop_${_}_end;`),i.emitLine(`${n}}`);let f=Ny(l,t,n,r,_);if(i.emitLine(`${n}while_loop_${_}_end:`),r.asyncWhileLoopInfo||(r.asyncWhileLoopInfo=new Map),u){let p=r.asyncWhileLoopInfo.get(t.index);p&&(p.outerWhileLoop={whileLoopIndex:_,conditionExpr:a,stepExpr:s,bodyExpr:l,bodyExprsAfterAwait:f})}else r.asyncWhileLoopInfo.set(t.index,{conditionExpr:a,stepExpr:s,bodyExpr:l,bodyExprsAfterAwait:f})}function Ny(e,t,n,r,i){let o=r.emitter,a=[],s=[];e.tag==="FnCall"&&E(e,"begin")?s=e.args:s=[e];let l=-1;for(let p=0;p<s.length;p++){let m=s[p];if(un(m)){l=p;break}}if(l===-1)return o.emitLine(`${n}// Error: Expected await in while loop body but none found`),a;let u=r.smWhileBreakInfo,_=r.smWhileContinueInfo,c=r.smWhileBodyDrops;r.smWhileBreakInfo={label:`while_loop_${i}_end`,activeIndex:i},r.smWhileContinueInfo={label:`while_loop_${i}_start`,emitDropsBeforeGoto:!0},r.smWhileBodyDrops=[...e.$?.deferredDropExpressions??[]];for(let p=0;p<l;p++){let m=s[p],g=M(m,n,r);g&&m.$&&!ut(m.$.env.modulePath,g)&&o.emitLine(`${n}${g};`)}r.smWhileBreakInfo=u,r.smWhileContinueInfo=_,r.smWhileBodyDrops=c;let f=s[l];if(F(f)&&E(f,I.while)&&un(f)){ul(f,t,n,r);for(let p=l+1;p<s.length;p++)a.push(s[p]);return a}if(F(f)&&E(f,":=")){let p=f.args[1];if(p&&p.tag==="FnCall"&&fn(p)){let m=p.args[0];if(m){let g=M(m,n,r);o.emitLine(`${n}// Store Future for await ${t.index} (while loop body)`),o.emitLine(`${n}sm->await_future_${t.index} = ${g};`)}}}else if(f.tag==="FnCall"&&fn(f)){let p=f.args[0];if(p&&t.futureVariableId===void 0){let m=M(p,n,r);o.emitLine(`${n}// Store Future for await ${t.index} (while loop body)`),o.emitLine(`${n}sm->await_future_${t.index} = ${m};`)}}else if(F(f)&&E(f,I.cond)){qo(f,t,n,r,void 0);for(let p=l+1;p<s.length;p++)a.push(s[p]);return a}else if(F(f)&&E(f,I.match)){Ho(f,t,n,r);for(let p=l+1;p<s.length;p++)a.push(s[p]);return a}for(let p=l+1;p<s.length;p++)a.push(s[p]);return a}function xy(e){let t=e.tag==="FnCall"&&E(e,"begin")?e.args:[e];for(let n of t)if(n.tag==="FnCall"&&E(n,I.while)&&un(n))return!0;return!1}function hi(e,t,n){if(e)switch(e.tag){case"Atom":if(e.$&&e.token.type==="identifier"){let r=e.token.value,i=X(e.$.env,r);if(i.length>0){let o=i[i.length-1];if(o&&!o.isCompileTimeOnly){let a=n.get(o.id)??o.id,s=o.isOwningTheSameRcValueAs?o.isOwningTheSameRcValueAs.id:a;t.add(s)}}}break;case"FnCall":if(Rt(e)){if(e.$?.deferredDupExpressions)for(let r of e.$.deferredDupExpressions)hi(r,t,n);break}hi(e.func,t,n);for(let r of e.args)hi(r,t,n);if(e.$?.deferredDropExpressions)for(let r of e.$.deferredDropExpressions)hi(r,t,n);if(e.$?.deferredDupExpressions)for(let r of e.$.deferredDupExpressions)hi(r,t,n);break}}function Pa(e,t){let{awaitPoints:n,capturedVariables:r,variableIdRemapping:i}=t;if(n.length===0)return{crossBoundaryIds:new Set,awaitFutureTempVarAliases:new Map,variableSegments:new Map};let o=new Set,a=ll(e,n);for(let c of a)(c.awaitPoint?.isInsideCond||c.awaitPoint?.isInsideWhile)&&o.add(c.stateNumber);let s=new Map;for(let c of a){let f=new Set;for(let p of c.expressions)hi(p,f,i);for(let p of f){let m=s.get(p);m||(m=new Set,s.set(p,m)),m.add(c.stateNumber)}}let l=-1;if(e.$?.deferredDropExpressions){let c=new Set;for(let f of e.$.deferredDropExpressions)hi(f,c,i);for(let f of c){let p=s.get(f);p||(p=new Set,s.set(f,p)),p.add(l)}}let u=new Set;for(let c of r){if(c.kind==="outer")continue;let f=s.get(c.id);if(!f)u.add(c.id);else if(f.size>1)u.add(c.id);else if(f.has(l))u.add(c.id);else{let p=f.values().next().value;o.has(p)&&u.add(c.id)}}let _=new Map;for(let c of n){if(c.futureVariableId!==void 0)continue;let f=c.expr;if(!F(f))continue;let p=f.args[0];if(!p)continue;let m=p.$?.variableName;if(!m)continue;let g=r.find(h=>h.kind==="local"&&(h.name===m||h.id===m));g&&(_.set(g.id,`await_future_${c.index}`),u.delete(g.id))}return{crossBoundaryIds:u,awaitFutureTempVarAliases:_,variableSegments:s}}function za(e,t,n,r,i){let o={slotAliases:new Map,slots:[]},a=n.filter(f=>f.kind==="local"&&e.has(f.id)&&!r.has(f.id)&&!Le(f.type));if(a.length<2)return o;let s=new Map;for(let f of a){let p=t.get(f.id);if(!p||p.size===0)continue;let m=[...p].filter(d=>d>=0);if(m.length===0)continue;let g=Math.min(...m),h=Math.max(...m);s.set(f.id,[g,h])}if(s.size<2)return o;let l=new Map;for(let[f]of s){let p=a.find(h=>h.id===f);if(!p)continue;let m=P(p.type,i),g=l.get(m);g||(g=[],l.set(m,g)),g.push(f)}let u=new Map,_=[],c=0;for(let[f,p]of l){if(p.length<2)continue;let m=new Map;for(let d of p)m.set(d,new Set);for(let d=0;d<p.length;d++)for(let v=d+1;v<p.length;v++){let[T,$]=s.get(p[d]),[b,L]=s.get(p[v]);T<=L&&b<=$&&(m.get(p[d]).add(p[v]),m.get(p[v]).add(p[d]))}let g=new Map;for(let d of p){let v=new Set;for(let $ of m.get(d))g.has($)&&v.add(g.get($));let T=0;for(;v.has(T);)T++;g.set(d,T)}let h=new Map;for(let[d,v]of g){let T=h.get(v);T||(T=[],h.set(v,T)),T.push(d)}for(let[,d]of h){if(d.length<2)continue;let v=`slot_${c}`,T=d.map($=>a.find(b=>b.id===$)?.name??$);for(let $ of d)u.set($,v);_.push({fieldName:v,cType:f,variableNames:T}),c++}}return{slotAliases:u,slots:_}}function cl(e,t){if(e.futureVariableId){let n=t.capturedVariables.find(r=>r.id===e.futureVariableId);if(n)return n.kind==="outer"?n.name:`var_${n.id}`}return`await_future_${e.index}`}function jo(e){return!e||!V(e)?!1:e.resolvedConcreteType&&V(e.resolvedConcreteType)&&e.resolvedConcreteType.isExtern?!0:e.requiredTraits.some(t=>oa(t.traitType))}function rn(e,t,n){if(t==="outer")return`__capture.${te(e)}`;let r=n?.get(e);return r||te(`var_${e}`)}function C_(e,t,n,r,i,o,a,s){let l=s.emitter,_=Dt(o).isFuture.outputType,c=fe(_);s.asyncCondBranchInfo=new Map,s.asyncWhileLoopInfo=new Map,s.asyncNextWhileLoopIndex=i.awaitPoints.length;let f=ll(e,i.awaitPoints),p=e.tag==="FnCall"&&E(e,"begin")?e.args:[e],m=p.length>0?p[p.length-1]:void 0;l.emitLine(`// Resume function for async block ${t}`),l.emitLine(`void ${r}(${n}* sm) {`),l.emitLine(` ASYNC_DEBUG("${t}_resume: state=%d\\n", sm->state);`),l.emitLine(" switch (sm->state) {");let g=[];for(let h=0;h<f.length;h++){let d=f[h];if(!d)continue;let v=d.stateNumber,T=h===f.length-1;if(l.emitLine(`
|
|
193
193
|
state_${v}:`),l.emitLine(` case ${v}: { // State ${v}`),l.emitLine(` ASYNC_DEBUG("${t}: Entering state ${v}\\n");`),v>0&&i.awaitPoints[v-1]){let x=i.awaitPoints[v-1],z=cl(x,i);x.isInsideCond&&l.emitLine(` if (sm->${z} != NULL) {`);let re=fe(x.resultType)||V(x.resultType)&&!x.resultType.resolvedConcreteType;if(l.emitLine(" // Check if the awaited Future was aborted"),l.emitLine(` if (sm->${z}->state == -2) {`),l.emitLine(` __yo_decr_rc((void*)sm->${z});`),l.emitLine(` sm->${z} = NULL;`),Mn({emitter:l,indent:" ",debugLabel:t}),l.emitLine(" }"),x&&!re){l.emitLine(` // Extract result from await ${v-1}`),l.emitLine(` int state_before_read = sm->${z}->state;`),l.emitLine(` ASYNC_DEBUG("${t}: Reading result from await ${v-1}, state=%d\\n", state_before_read);`);let W=!!x.isInsideCond,le;if(W?le=`sm->await_result_${v-1}`:x.targetVariableId&&(le=`sm->${rn(x.targetVariableId,"local",s.stateMachineFieldAliases)}`),le)if(Le(x.resultType)){let ce=On(x.resultType,s);ce?l.emitLine(` ${le} = ${ce}(sm->${z}->result);`):(l.emitLine(" /* Warning: No ___dup function found for result type, shallow copy may cause use-after-free */"),l.emitLine(` ${le} = sm->${z}->result;`))}else l.emitLine(` ${le} = sm->${z}->result;`);if(W&&x.targetVariableId){let ce=rn(x.targetVariableId,"local",s.stateMachineFieldAliases);l.emitLine(` sm->${ce} = sm->await_result_${v-1};`)}l.emitLine("")}if(!x.futureVariableId){let W=x.expr;if(W.tag==="FnCall"){let ce=W.args[0]?.$?.type;ce&&(V(ce)||Ce(ce))&&(l.emitLine(` if (sm->${z} != NULL) { __yo_decr_rc((void*)sm->${z}); sm->${z} = NULL; }`),l.emitLine(""))}}let j=s;if(x){let W=j.asyncCondBranchInfo?.get(x.index);if(W&&W.branches.some(ce=>ce.hasAwait)){let ce=W.condBranchFieldIndex??x.index,ve=ce===-1;l.emitLine(" // Execute remaining code from chosen cond branch"),ve||l.emitLine(` switch (sm->cond_branch_${ce}) {`);let Y=d.awaitPoint?.isInsideCond??!1;for(let Z of W.branches)if(Z.hasAwait){if(ve||l.emitLine(` case ${Z.index}: {`),l.emitLine(` ASYNC_DEBUG("${t}: Executing remaining code from branch ${Z.index}\\n");`),Z.remainingExprs&&Z.remainingExprs.length>0){let se=s.inAsyncStateMachine,Se=s.stateMachineVariables,pe=s.variableIdRemapping,Ve=s.pendingDeferredDrops;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let Ke=j.asyncWhileLoopInfo?.get(x.index);s.pendingDeferredDrops=[...Z.deferredDropExpressions??[],...Ke?.bodyExpr.$?.deferredDropExpressions??[],...e.$?.deferredDropExpressions??[]];let J=new Map;for(let ye of i.capturedVariables)J.set(ye.id,ye);if(a)for(let ye of a.fields)J.set(ye.label,{id:ye.label,name:ye.label,type:ye.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=J;let Q=!1,oe=[],ue=W.targetAssignmentCode;for(let ye=0;ye<Z.remainingExprs.length;ye++){let ie=Z.remainingExprs[ye],Ne=ye===Z.remainingExprs.length-1;if(Q){oe.push(ie);continue}if(Y&&un(ie)){Q=!0,_l(ie,d.awaitPoint,i," ",s);continue}let $e=M(ie," ",s);!$e||!ie.$||ut(ie.$.env.modulePath,$e)||(Ne&&ue?l.emitLine(` ${ue} = ${$e};`):l.emitLine(` ${$e};`))}if(Z.remainingExprs.length===0&&ue&&l.emitLine(` ${ue} = sm->await_result_${x.index};`),Q&&d.awaitPoint){let ye=d.awaitPoint.index;j.asyncCondBranchInfo||(j.asyncCondBranchInfo=new Map);let ie=j.asyncCondBranchInfo.get(ye);if(ie)ie.chainedBranches||(ie.chainedBranches=[]),ie.chainedBranches.push({branches:[{index:Z.index,value:Z.value,hasAwait:oe.length>0||oe.some(Ne=>un(Ne)),remainingExprs:oe,deferredDropExpressions:Z.deferredDropExpressions}],condBranchFieldIndex:ce});else{let Ne={branches:[{index:Z.index,value:Z.value,hasAwait:oe.length>0||oe.some($e=>un($e)),remainingExprs:oe,deferredDropExpressions:Z.deferredDropExpressions}],condBranchFieldIndex:ce};j.asyncCondBranchInfo.set(ye,Ne)}}else if(Z.deferredDropExpressions)for(let ye of Z.deferredDropExpressions){let ie=M(ye," ",s);ie&&ie.includes("sm->")&&l.emitLine(` ${ie};`)}s.inAsyncStateMachine=se,s.stateMachineVariables=Se,s.variableIdRemapping=pe,s.pendingDeferredDrops=Ve}ve||(l.emitLine(" break;"),l.emitLine(" }"))}if(ve||l.emitLine(" }"),W.chainedBranches){for(let Z of W.chainedBranches)for(let se of Z.branches)if(se.hasAwait&&se.remainingExprs&&se.remainingExprs.length>0){let Se=s.inAsyncStateMachine,pe=s.stateMachineVariables,Ve=s.variableIdRemapping,Ke=s.pendingDeferredDrops;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let J=j.asyncWhileLoopInfo?.get(x.index);s.pendingDeferredDrops=[...se.deferredDropExpressions??[],...J?.bodyExpr.$?.deferredDropExpressions??[],...e.$?.deferredDropExpressions??[]];let Q=new Map;for(let ie of i.capturedVariables)Q.set(ie.id,ie);if(a)for(let ie of a.fields)Q.set(ie.label,{id:ie.label,name:ie.label,type:ie.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Q;let oe=d.awaitPoint?.isInsideCond??!1,ue=!1,ye=[];for(let ie of se.remainingExprs){if(ue){ye.push(ie);continue}if(oe&&un(ie)){ue=!0,_l(ie,d.awaitPoint,i," ",s);continue}let Ne=M(ie," ",s);!Ne||!ie.$||ut(ie.$.env.modulePath,Ne)||l.emitLine(` ${Ne};`)}if(ue&&d.awaitPoint){let ie=d.awaitPoint.index;j.asyncCondBranchInfo||(j.asyncCondBranchInfo=new Map);let Ne=j.asyncCondBranchInfo.get(ie);Ne?(Ne.chainedBranches||(Ne.chainedBranches=[]),Ne.chainedBranches.push({branches:[{index:se.index,value:se.value,hasAwait:ye.length>0||ye.some($e=>un($e)),remainingExprs:ye,deferredDropExpressions:se.deferredDropExpressions}],condBranchFieldIndex:Z.condBranchFieldIndex})):j.asyncCondBranchInfo.set(ie,{branches:[{index:se.index,value:se.value,hasAwait:ye.length>0||ye.some($e=>un($e)),remainingExprs:ye,deferredDropExpressions:se.deferredDropExpressions}],condBranchFieldIndex:Z.condBranchFieldIndex})}else if(se.deferredDropExpressions)for(let ie of se.deferredDropExpressions){let Ne=M(ie," ",s);Ne&&Ne.includes("sm->")&&l.emitLine(` ${Ne};`)}s.inAsyncStateMachine=Se,s.stateMachineVariables=pe,s.variableIdRemapping=Ve,s.pendingDeferredDrops=Ke}}if(W.targetVariableId){let Z=rn(W.targetVariableId,"local",s.stateMachineFieldAliases);l.emitLine(" // Assign cond result to target variable"),l.emitLine(` sm->${Z} = sm->await_result_${x.index};`)}l.emitLine("")}x.isInsideCond&&l.emitLine(" }");let le=j.asyncWhileLoopInfo?.get(x.index);if(le){if(l.emitLine(" // Execute remaining code from while loop body and continue loop"),l.emitLine(` if (sm->while_loop_${x.index}_active) {`),le.bodyExprsAfterAwait&&le.bodyExprsAfterAwait.length>0){let pe=s.inAsyncStateMachine,Ve=s.stateMachineVariables,Ke=s.variableIdRemapping,J=s.pendingDeferredDrops;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping,s.pendingDeferredDrops=[...le.bodyExpr.$?.deferredDropExpressions??[],...e.$?.deferredDropExpressions??[]];let Q=new Map;for(let ie of i.capturedVariables)Q.set(ie.id,ie);if(a)for(let ie of a.fields)Q.set(ie.label,{id:ie.label,name:ie.label,type:ie.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Q;let oe=s.smWhileBreakInfo,ue=s.smWhileContinueInfo,ye=s.smWhileBodyDrops;s.smWhileBreakInfo={label:`after_while_loop_${x.index}`,activeIndex:x.index},s.smWhileContinueInfo={label:`while_loop_${x.index}_continue`},s.smWhileBodyDrops=[...le.bodyExpr.$?.deferredDropExpressions??[]];for(let ie of le.bodyExprsAfterAwait){let Ne=M(ie," ",s);!Ne||!ie.$||ut(ie.$.env.modulePath,Ne)||l.emitLine(` ${Ne};`)}s.smWhileBreakInfo=oe,s.smWhileContinueInfo=ue,s.smWhileBodyDrops=ye,s.inAsyncStateMachine=pe,s.stateMachineVariables=Ve,s.variableIdRemapping=Ke,s.pendingDeferredDrops=J}l.emitLine(` while_loop_${x.index}_continue:`);{let pe=le.bodyExpr.$?.deferredDropExpressions??[];if(pe.length>0){let Ve=s.inAsyncStateMachine,Ke=s.stateMachineVariables,J=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let Q=new Map;for(let oe of i.capturedVariables)Q.set(oe.id,oe);if(a)for(let oe of a.fields)Q.set(oe.label,{id:oe.label,name:oe.label,type:oe.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Q;for(let oe of pe){let ue=M(oe," ",s);ue&&ue.includes("sm->")&&l.emitLine(` ${ue};`)}s.inAsyncStateMachine=Ve,s.stateMachineVariables=Ke,s.variableIdRemapping=J}}if(l.emitLine(` ASYNC_DEBUG("${t}: Re-evaluating while loop condition\\n");`),le.stepExpr){let pe=s.inAsyncStateMachine,Ve=s.stateMachineVariables,Ke=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let J=new Map;for(let oe of i.capturedVariables)J.set(oe.id,oe);if(a)for(let oe of a.fields)J.set(oe.label,{id:oe.label,name:oe.label,type:oe.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=J;let Q=M(le.stepExpr," ",s);Q&&l.emitLine(` ${Q};`),s.inAsyncStateMachine=pe,s.stateMachineVariables=Ve,s.variableIdRemapping=Ke}let ce=s.inAsyncStateMachine,ve=s.stateMachineVariables,Y=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let Z=new Map;for(let pe of i.capturedVariables)Z.set(pe.id,pe);if(a)for(let pe of a.fields)Z.set(pe.label,{id:pe.label,name:pe.label,type:pe.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Z;let se=M(le.conditionExpr," ",s);s.inAsyncStateMachine=ce,s.stateMachineVariables=ve,s.variableIdRemapping=Y,l.emitLine(` if (!(${se})) {`),l.emitLine(` sm->while_loop_${x.index}_active = false;`),l.emitLine(` ASYNC_DEBUG("${t}: While loop condition false, exiting loop\\n");`),l.emitLine(" } else {"),l.emitLine(` ASYNC_DEBUG("${t}: While loop condition true, continuing iteration\\n");`);let Se=x.index;if(l.emitLine(" // Loop back by transitioning to while loop state"),l.emitLine(` sm->state = ${Se};`),l.emitLine(` goto while_loop_${Se}_start;`),l.emitLine(" }"),l.emitLine(" }"),l.emitLine(""),l.emitLine(` after_while_loop_${x.index}:`),le.condBranchPostWhileExprs){let pe=le.condBranchPostWhileExprs,Ve=pe.condBranchFieldIndex,Ke=pe.branchIndex;pe.skipCondBranchCheck?(l.emitLine(" // Execute post-while-loop code from cond branch (unconditional)"),l.emitLine(" {")):(l.emitLine(" // Execute post-while-loop code from cond branch"),l.emitLine(` if (sm->cond_branch_${Ve} == ${Ke}) {`));let J=s.inAsyncStateMachine,Q=s.stateMachineVariables,oe=s.variableIdRemapping,ue=s.pendingDeferredDrops;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping,s.pendingDeferredDrops=[...e.$?.deferredDropExpressions??[]];let ye=new Map;for(let Xe of i.capturedVariables)ye.set(Xe.id,Xe);if(a)for(let Xe of a.fields)ye.set(Xe.label,{id:Xe.label,name:Xe.label,type:Xe.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=ye;let ie=d.awaitPoint!=null,Ne=!1,$e=[];for(let Xe=0;Xe<pe.exprs.length;Xe++){let ct=pe.exprs[Xe];if(Ne){$e.push(ct);continue}if(ie&&un(ct)){Ne=!0,_l(ct,d.awaitPoint,i," ",s);continue}let qe=M(ct," ",s);!qe||!ct.$||ut(ct.$.env.modulePath,qe)||l.emitLine(` ${qe};`)}if(Ne&&d.awaitPoint){let Xe=d.awaitPoint.index;j.asyncCondBranchInfo||(j.asyncCondBranchInfo=new Map);let ct=pe.skipCondBranchCheck?-1:pe.condBranchFieldIndex,qe=j.asyncCondBranchInfo.get(Xe);qe?(qe.chainedBranches||(qe.chainedBranches=[]),qe.chainedBranches.push({branches:[{index:pe.branchIndex,value:pe.exprs[0],hasAwait:$e.length>0||$e.some(Gt=>un(Gt)),remainingExprs:$e,deferredDropExpressions:pe.deferredDropExpressions}],condBranchFieldIndex:ct})):j.asyncCondBranchInfo.set(Xe,{branches:[{index:pe.branchIndex,value:pe.exprs[0],hasAwait:$e.length>0||$e.some(Gt=>un(Gt)),remainingExprs:$e,deferredDropExpressions:pe.deferredDropExpressions}],condBranchFieldIndex:ct})}if(!Ne&&pe.deferredDropExpressions)for(let Xe of pe.deferredDropExpressions){let ct=M(Xe," ",s);ct&&ct.includes("sm->")&&l.emitLine(` ${ct};`)}l.emitLine(" }"),s.inAsyncStateMachine=J,s.stateMachineVariables=Q,s.variableIdRemapping=oe,s.pendingDeferredDrops=ue}if(le.outerWhileLoop){let pe=le.outerWhileLoop,Ve=pe.whileLoopIndex;if(l.emitLine(" // Execute remaining code from outer while loop body"),l.emitLine(` if (sm->while_loop_${Ve}_active) {`),pe.bodyExprsAfterAwait.length>0){let Ke=s.inAsyncStateMachine,J=s.stateMachineVariables,Q=s.variableIdRemapping,oe=s.pendingDeferredDrops;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping,s.pendingDeferredDrops=[...pe.bodyExpr.$?.deferredDropExpressions??[],...e.$?.deferredDropExpressions??[]];let ue=new Map;for(let $e of i.capturedVariables)ue.set($e.id,$e);if(a)for(let $e of a.fields)ue.set($e.label,{id:$e.label,name:$e.label,type:$e.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=ue;let ye=s.smWhileBreakInfo,ie=s.smWhileContinueInfo,Ne=s.smWhileBodyDrops;s.smWhileBreakInfo={label:`after_while_loop_${Ve}`,activeIndex:Ve},s.smWhileContinueInfo={label:`while_loop_${Ve}_continue`},s.smWhileBodyDrops=[...pe.bodyExpr.$?.deferredDropExpressions??[]];for(let $e of pe.bodyExprsAfterAwait){let Xe=M($e," ",s);!Xe||!$e.$||ut($e.$.env.modulePath,Xe)||l.emitLine(` ${Xe};`)}s.smWhileBreakInfo=ye,s.smWhileContinueInfo=ie,s.smWhileBodyDrops=Ne,s.inAsyncStateMachine=Ke,s.stateMachineVariables=J,s.variableIdRemapping=Q,s.pendingDeferredDrops=oe}l.emitLine(` while_loop_${Ve}_continue:`);{let Ke=pe.bodyExpr.$?.deferredDropExpressions??[];if(Ke.length>0){let J=s.inAsyncStateMachine,Q=s.stateMachineVariables,oe=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let ue=new Map;for(let ye of i.capturedVariables)ue.set(ye.id,ye);if(a)for(let ye of a.fields)ue.set(ye.label,{id:ye.label,name:ye.label,type:ye.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=ue;for(let ye of Ke){let ie=M(ye," ",s);ie&&ie.includes("sm->")&&l.emitLine(` ${ie};`)}s.inAsyncStateMachine=J,s.stateMachineVariables=Q,s.variableIdRemapping=oe}}if(pe.stepExpr){let Ke=s.inAsyncStateMachine,J=s.stateMachineVariables,Q=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let oe=new Map;for(let ye of i.capturedVariables)oe.set(ye.id,ye);if(a)for(let ye of a.fields)oe.set(ye.label,{id:ye.label,name:ye.label,type:ye.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=oe;let ue=M(pe.stepExpr," ",s);ue&&l.emitLine(` ${ue};`),s.inAsyncStateMachine=Ke,s.stateMachineVariables=J,s.variableIdRemapping=Q}{let Ke=s.inAsyncStateMachine,J=s.stateMachineVariables,Q=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let oe=new Map;for(let ye of i.capturedVariables)oe.set(ye.id,ye);if(a)for(let ye of a.fields)oe.set(ye.label,{id:ye.label,name:ye.label,type:ye.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=oe;let ue=M(pe.conditionExpr," ",s);s.inAsyncStateMachine=Ke,s.stateMachineVariables=J,s.variableIdRemapping=Q,l.emitLine(` if (!(${ue})) {`),l.emitLine(` sm->while_loop_${Ve}_active = false;`),l.emitLine(" } else {"),l.emitLine(` sm->state = ${x.index};`),l.emitLine(` goto while_loop_${Ve}_start;`),l.emitLine(" }")}l.emitLine(" }"),l.emitLine(""),l.emitLine(` after_while_loop_${Ve}:`)}}}}let $=s.inAsyncStateMachine,b=s.stateMachineVariables,L=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let C=new Map;for(let x of i.capturedVariables)C.set(x.id,x);if(a)for(let x of a.fields)C.set(x.label,{id:x.label,name:x.label,type:x.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=C;let R=s.pendingDeferredDrops;s.pendingDeferredDrops=[...e.$?.deferredDropExpressions??[]];let N=T&&!c&&d.expressions.length>0,B=d.expressions.length>0?d.expressions[d.expressions.length-1]:void 0,D=s.asyncBodyReturnExpr;if(!c&&B&&m&&B===m&&d.awaitPoint?s.asyncBodyReturnExpr=B:s.asyncBodyReturnExpr=void 0,E_(d," ",s,N),s.asyncBodyReturnExpr=D,s.pendingDeferredDrops=R,l.emitLine(""),d.awaitPoint){s.inAsyncStateMachine=$,s.stateMachineVariables=b,s.variableIdRemapping=L;let x=v+1;{let z=cl(d.awaitPoint,i),j=d.awaitPoint.expr.args?.[0],W=jo(j?.$?.type),le=d.awaitPoint?.isInsideCond;le&&(l.emitLine(" // Only await if the cond branch with await was taken"),l.emitLine(` if (sm->${z} != NULL) {`));let ce=d.awaitPoint?.isInsideWhile,ve=ce?s.asyncWhileLoopInfo?.get(d.awaitPoint.index):void 0;if(ce&&ve){let Y=d.awaitPoint.index;l.emitLine(" // Only await if while loop is still active (not broken)"),l.emitLine(` if (sm->while_loop_${Y}_active) {`)}if(l.emitLine(" // Transition to next state after await"),l.emitLine(` sm->state = ${x};`),l.emitLine(""),l.emitLine(" // Check if future is ready"),l.emitLine(` int future_state = sm->${z}->state;`),l.emitLine(" if (future_state == -1 || future_state == -2) { // -1 = completed, -2 = aborted"),l.emitLine(" // Already complete or aborted \u2014 yield once for fairness"),l.emitLine(" // Yield once to event loop for fairness (microtask yield)"),l.emitLine(` __yo_async_spawn_task((void (*)(void*))${r}, (void*)sm);`),l.emitLine(" return;"),l.emitLine(" }"),l.emitLine(""),W?l.emitLine(" // IO future: no extra ref needed (completion handler does not decr_rc)"):(l.emitLine(" // Future not complete \u2014 take event loop reference and start if cold"),l.emitLine(` __yo_incr_rc((void*)sm->${z}); // event loop reference`)),W||(l.emitLine(" if (future_state == 0) { // 0 = cold (not started)"),Dy(d.awaitPoint.expr,`sm->${z}`," ",s),l.emitLine(" // Cold future \u2014 start it via stored resume function pointer"),l.emitLine(` sm->${z}->__yo_resume_fn((void*)sm->${z});`),l.emitLine(""),l.emitLine(" // Re-check: may have completed synchronously"),l.emitLine(` future_state = sm->${z}->state;`),l.emitLine(" if (future_state == -1 || future_state == -2) {"),l.emitLine(" // Completed or aborted synchronously \u2014 yield for fairness"),l.emitLine(` __yo_async_spawn_task((void (*)(void*))${r}, (void*)sm);`),l.emitLine(" return;"),l.emitLine(" }"),l.emitLine(" }")),l.emitLine(""),l.emitLine(" // Still pending \u2014 register continuation and suspend"),l.emitLine(` sm->${z}->continuation_fn = (void (*)(void*))${r};`),l.emitLine(` sm->${z}->continuation_sm = (void*)sm;`),l.emitLine(" return;"),ce&&ve){let Y=d.awaitPoint.index;l.emitLine(" } else {"),l.emitLine(" // While loop was broken, jump to code after loop"),l.emitLine(` goto after_while_loop_${Y};`),l.emitLine(" }")}le&&(l.emitLine(" } else {"),l.emitLine(" // Non-await cond branch was taken, skip directly to next state"),l.emitLine(` sm->state = ${x};`),l.emitLine(` goto state_${x};`),l.emitLine(" }"))}}else if(T){if(!d.expressions.some(z=>k_(z))){if(e.$?.deferredDropExpressions){let z=new bi,re=s.emitter;s.emitter=z;for(let W of e.$.deferredDropExpressions){let le=M(W,"",s);le&&z.emitLine(`${le};`)}s.emitter=re;let j=z.print().trim();if(j){l.emitLine(" // Drop local variables before completion");for(let W of j.split(`
|
|
194
194
|
`)){let le=W.trim();le&&(l.emitLine(` ${le}`),g.push(le))}l.emitLine("")}}l.emitLine(" // Final state - complete the Future"),Sr({emitter:l,indent:" ",debugLabel:"Future %p completed"})}s.inAsyncStateMachine=$,s.stateMachineVariables=b,s.variableIdRemapping=L}else s.inAsyncStateMachine=$,s.stateMachineVariables=b,s.variableIdRemapping=L;l.emitLine(" }")}return l.emitLine(" }"),l.emitLine("}"),l.emitLine(""),g}function _l(e,t,n,r,i){let o=i.emitter,a=cl(t,n);if(e.tag==="FnCall"&&E(e,":=")){let s=e.args[1];if(s&&s.tag==="FnCall"&&fn(s)){let l=s.args[0];if(l){let u=M(l,r,i);o.emitLine(`${r}// Store Future for additional await in cond branch`),o.emitLine(`${r}sm->${a} = ${u};`)}}return}if(e.tag==="FnCall"&&fn(e)){let s=e.args[0];if(s){let l=M(s,r,i);o.emitLine(`${r}// Store Future for additional await in cond branch`),o.emitLine(`${r}sm->${a} = ${l};`)}return}if(e.tag==="FnCall"&&E(e,I.cond)){to(e,t,0,r,i);return}if(e.tag==="FnCall"&&E(e,I.match)){to(e,t,0,r,i);return}if(e.tag==="FnCall"&&E(e,I.while)){to(e,t,0,r,i);return}if(e.tag==="FnCall"&&E(e,I.begin)){to(e,t,0,r,i);return}o.emitLine(`${r}// Warning: unhandled await pattern in remaining expressions`)}function k_(e){if(dt(e,"return")||E(e,"return"))return!0;if(e.tag==="FnCall"){for(let t of e.args)if(k_(t))return!0}return!1}function Vy(e){let t=[];for(let n of e)if(n.isEffectRowSpread){let r=n.type;V(r)&&r.resolvedConcreteType&&(r=r.resolvedConcreteType),ot(r)&&t.push(...r.implicitParameters)}else t.push(n);return t}function Dy(e,t,n,r){let i=e.args?.[0];if(!i?.$?.type)return;let o=Dt(i.$.type);if(!o?.isFuture.effects?.length)return;let a=Vy(o.isFuture.effects),s=r.emitter,l=e.args?.find(u=>F(u)&&E(u,I.using));if(l){let u=l.args;for(let _=0;_<a.length&&_<u.length;_++){let c=a[_],f=u[_];if(G(c.type)){if(c.type.forallParameters.length>0)continue;let p=M(f,n,r),m=c.label;s.emitLine(`${n}${t}->__capture.${m} = (void*)${p};`)}else Te(c.type)&&b_(c.type,t,n,f.$?.value,r,e)}}else for(let u of a)if(G(u.type)){if(u.type.forallParameters.length>0)continue;let _=My(u.label,r,e);_&&s.emitLine(`${n}${t}->__capture.${u.label} = (void*)${_};`)}else Te(u.type)&&b_(u.type,t,n,void 0,r,e)}function b_(e,t,n,r,i,o){let a=i.emitter;for(let s of e.fields){if(!G(s.type))continue;let l;if(i.stateMachineVariables){for(let[,u]of i.stateMachineVariables)if(u.name===s.label&&u.kind==="outer"){l=`sm->__capture.${s.label}`;break}}if(!l&&r&&We(r)){let u=e.fields.indexOf(s),_=r.fields[u];if(_&&ne(_)){let c=i.functions[_.funcId];c&&(l=c.cName)}}if(!l&&i.currentEvidenceParams){for(let u of i.currentEvidenceParams.values())if(u.fieldLabel===s.label){l=u.cParamName;break}}if(!l){let u=o.$?.env??o.func.$?.env;if(u){let _=pn(u,c=>c.isImplicit===!0);for(let c=_.length-1;c>=0;c--){let f=_[c],p=f.value?.[f.value.length-1];if(p&&We(p)){let m=p.type.fields.findIndex(g=>g.label===s.label);if(m>=0){let g=p.fields[m];if(g&&ne(g)){let h=i.functions[g.funcId]?.cName;if(h){l=h;break}}}}}}}l&&a.emitLine(`${n}${t}->__capture.${s.label} = (void*)${l};`)}}function My(e,t,n){if(t.currentEvidenceParams){for(let r of t.currentEvidenceParams.values())if(r.fieldLabel===e)return r.cParamName}if(t.stateMachineVariables){for(let[,r]of t.stateMachineVariables)if(r.name===e&&r.kind==="outer")return`sm->__capture.${e}`}}var Oy=new Set(["__yo_mutex_init","__yo_mutex_destroy","__yo_mutex_lock","__yo_mutex_unlock","__yo_cond_init","__yo_cond_destroy","__yo_cond_wait","__yo_cond_signal","__yo_cond_broadcast","__yo_thread_join","__yo_thread_self"]);function w_(e){let t=e.emitter;t.emitDeclarationLine("// Function declarations"),t.emitDeclarationLine("/// Extern functions");for(let n in e.externFunctions){let{cName:r,type:i}=e.externFunctions[n];if(i.isExtern==="yo"){if(Oy.has(r))continue;fl(i,r,!0,e);continue}i.isExtern==="c"&&i.cInclude||r.startsWith("__atomic_")||r.startsWith("__sync_")||fl(i,r,!0,e)}t.emitDeclarationLine(""),e.usesAsync&&(t.emitDeclarationLine("/// Async runtime functions"),t.emitDeclarationLine("static void __yo_async_spawn_task(void (*resume_fn)(void*), void* state_machine);"),t.emitDeclarationLine("")),t.emitDeclarationLine("/// Object constructors"),Py(e),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Closure constructors"),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Capture dispose functions"),zy(e),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Dyn type constructors"),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Regular functions");for(let n in e.functions){let{cName:r,value:i}=e.functions[n],o=r==="__yo_user_main",a=i.body?.$?.effectAnalysis,s=a&&a.hasEffects;if(!o&&!i.type.isClosure&&i.specializedFunctionCaches?.length>0||!o&&!s&&!i.isModuleEffectMember&&!i.type.isClosure&&!i.specializedType&&(i.specializedFunctionCaches?.length??0)===0&&$t(i.specializedType??i.type).length===0&&[...i.type.implicitParameters,...i.type.parameters.filter(g=>g.isImplicit)].some(g=>G(g.type)))continue;let u=i.specializedType??i.type,_=$t(u).length>0;if(!o&&i.isIoAsyncStateMachineClosure||!o&&!s&&!_&&!i.isModuleEffectMember&&(_r(i.type)&&!i.type.isClosure||i.specializedFunctionCaches?.length>0&&!i.type.isClosure||Yr(i)||Ki(i)||i.isIoAsyncStateMachineClosure))continue;let c=i.specializedType??i.type,f=!s&&!i.isModuleEffectMember&&(c.parameters.some(g=>Fe(g.type))||c.forallParameters.length>0),p=Fe(c.return.type),m=V(c.return.type)&&c.return.type.requiredTraits.length>0;f||p&&!m&&!i.isModuleEffectMember||fl(c,r,!1,e,i.isModuleEffectMember?void 0:i.body,i.specializedType&&$t(c).length===0&&$t(i.type).some(g=>g.fieldFunctionType.forallParameters&&g.fieldFunctionType.forallParameters.length>0)?i.type:void 0)}t.emitDeclarationLine("/// Closure vtable instances"),t.emitDeclarationLine("")}function $t(e){let t=[],n=Ry(e.implicitParameters);for(let r of n)Te(r.type)?F_(r.label,r.type,[],t):G(r.type)&&t.push({implicitLabel:r.label,fieldLabel:r.label,fieldPath:[r.label],fieldFunctionType:r.type,cParamName:te(r.label)});return t}function F_(e,t,n,r){for(let i of t.fields)if(G(i.type)){let o=[...n,i.label],a=o.join("__");r.push({implicitLabel:e,fieldLabel:a,fieldPath:o,fieldFunctionType:i.type,cParamName:te(`${e}__${a}`)})}else Te(i.type)&&F_(e,i.type,[...n,i.label],r)}function Ry(e){let t=[];for(let n of e)if(n.isEffectRowSpread){let r=n.type;V(r)&&r.resolvedConcreteType&&(r=r.resolvedConcreteType),ot(r)&&t.push(...r.implicitParameters)}else t.push(n);return t}function Er(e,t,n,r,i){let o=r||P(e.return.type,n),a=e.parameters.filter(c=>!c.isCompileTimeOnly),s=[];e.isClosure&&s.push("void* closure_context");let l=a.map((c,f)=>{let p=te(c.label||`param${f}`);if(G(c.type))return Er(c.type,"(*)",n).replace(" (*)(",` (*${p})(`);{let m;return V(c.type)&&be(c.type)?c.type.resolvedConcreteType?m=P(c.type.resolvedConcreteType,n)+"*":m=P(c.type,n):m=P(c.type,n),`${m} ${p}`}});s.push(...l);let u=$t(i??e);for(let c of u)if(c.fieldFunctionType.forallParameters&&c.fieldFunctionType.forallParameters.length>0)s.push(`void* ${c.cParamName}`);else{let f=Er(c.fieldFunctionType,"(*)",n).replace(" (*)(",` (*${c.cParamName})(`);s.push(f)}let _=s.join(", ");return`${o} ${t}(${_})`}function fl(e,t,n,r,i,o){let a;if(i&&be(e.return.type)){let _=Yo(i);_?.$?.asyncStateMachineStructName?a=`${_.$.asyncStateMachineStructName}*`:i.$?.type&&V(i.$.type)&&be(i.$.type)&&(a=P(i.$.type,r))}if(i&&V(e.return.type)&&!be(e.return.type)&&i.$?.type&&(a=P(i.$.type,r)),!a&&i&&i.$?.type&&!be(e.return.type)){let _=P(e.return.type,r),c=P(i.$.type,r);_!==c&&(a=c)}let s=a?Er(e,t,r,a,o):Er(e,t,r,void 0,o),l=A(e),u=n?"extern ":"static ";r.emitter.emitDeclarationLine(`${u}${s}; // ${l}`)}function Py(e){let t=e.emitter;t.emitDeclarationLine("static void __yo_decr_rc(void* ptr); // Decrement reference count"),t.emitDeclarationLine("static void* __yo_incr_rc(void* ptr); // Increment reference count"),t.emitDeclarationLine("static void __yo_gc_register(void* ptr); // Register object for cycle detection"),t.emitDeclarationLine("static void __yo_gc_unregister(void* ptr); // Unregister object from cycle detection"),t.emitDeclarationLine("static void __yo_gc_collect(); // Trigger garbage collection"),t.emitDeclarationLine("static void __yo_gc_init_thread(); // Initialize thread-local GC state (for worker threads)"),t.emitDeclarationLine("static void __yo_cleanup_thread_gc(); // Clean up thread-local GC state"),t.emitDeclarationLine("static void __yo_init_process_cleanup(void); // Initialize process cleanup");for(let n in e.types){let{type:r,cName:i}=e.types[n];if(_e(r)&&r.isReferenceSemantics){if(r.fields.some(l=>Fe(l.type)))continue;let a=`__yo_new_${i}`,s=r.fields.map(l=>{let u=P(l.type,e),_=te(l.label);return`${u} ${_}`}).join(", ");t.emitDeclarationLine(`static ${i}* ${a}(${s}); // Constructor`)}}}function zy(e){let t=e.emitter;if(e.closureCaptureMap&&e.closureCaptureMap.size>0)for(let[n]of e.closureCaptureMap){let r=`__yo_dispose_closure_${n}`;t.emitDeclarationLine(`static void ${r}(void* closure_ptr);`)}}function L_(e){let t=new Set;for(let n in e.functions){let{value:r,cName:i}=e.functions[n],o=r.specializedType;if(Yr(r)||!o||!Pn(r.type)||Pn(o))continue;let a=o.parameters.some(u=>Fe(u.type)),s=Fe(o.return.type);a||s||$t(r.type).some(u=>u.fieldFunctionType.forallParameters&&u.fieldFunctionType.forallParameters.length>0)||t.has(n)||(t.add(n),e.emitter.emitDeclarationLine(`static ${Er(o,i,e)}; // specialized function: ${A(r.type)}`))}}function $r(e,t,n){let r=X(t,e);return r.length===0?!1:r[r.length-1].frameLevel<=n}function A_(e){return!!(e.$?.closureFunctionValue&&e.$?.type&&Wt(e.$.type))}function Uy(e,t,n,r,i,o=!1){let a=Object.values(i.types).find(p=>p.type===e);if(!a)return i.emitter.emitLine(`${r}/* Error: Capture type not found for closure */`),null;let s=a.cName,l=new Map;if(n.$?.deferredDupExpressions)for(let p of n.$.deferredDupExpressions){let m=Ra(p);m&&l.set(m,p)}let u=e.fields.map(p=>{if(p.isEffectParam)return"NULL";let m,g=p.exprs.expr;if(g.$?.deferredDupExpressions?.length&&(m=g.$.deferredDupExpressions[0]),!m){let d=[p.label];U(g)&&d.push(g.token.value);for(let v of d){let T=l.get(v);if(T){m=T;break}}}if(m)return M(m,r,i);let h={tag:"Atom",token:g.token,$:g.$};return M(h,r,i)}),_=`(${s}){ ${u.map((p,m)=>{let g=e.fields[m];return g?`.${g.label} = ${p}`:`/* Error: missing field at index ${m} */`}).join(", ")} }`,c=n.token.position.row!==void 0?`${Date.now()}_${n.token.position.row}`:`${Date.now()}_${Math.random().toString(36).substr(2,9)}`,f=`__capture_${t}_${c}`;return o?i.emitter.emitLine(`${r}${s} ${f} = ${_};`):(i.emitter.emitLine(`${r}${s}* ${f} = (${s}*)__yo_malloc(sizeof(${s}));`),i.emitter.emitLine(`${r}*${f} = ${_};`)),{captureTempVar:f,captureCName:s}}function I_(e,t,n){if(!e.$||!e.$.type||!e.$.closureFunctionValue)return"// Error: Missing closure metadata";let r=nn(e.$.type),i=r.isFn.callType,o=e.$.closureFunctionValue,a=e.$.captureType,s=n.functions[o.funcId]?.cName;if(!s)return"// Error: Closure implementation function not found in context";let l=Ce(e.$.type),u;if(l){let m=n.types[e.$.type.id];if(!m)return"// Error: Dyn closure type not found in context";u=m.cName}let _=a&&_e(a)&&a.fields.length>0,c=P(i.return.type,n),f=i.parameters.map(m=>P(m.type,n)).join(", "),p=`(${c} (*)(void*${f?", "+f:""}))${s}`;if(_&&a&&_e(a)){let m=!l,g=Uy(a,i.id,e,t,n,m);if(!g)return"// Error: Failed to allocate closure capture";let{captureTempVar:h}=g;if(l){let d=`__yo_create_${u}`,v=`__yo_dispose_${u}`;return`${d}(${h}, ${v}, ${p})`}else return n.implClosureCallMap.set(a.id,{functionCName:s,callTypeId:r.isFn.callType.id,callType:r.isFn.callType}),h}else if(l){let m=`__yo_create_${u}`,g=`__yo_dispose_${u}`;return`${m}(NULL, ${g}, ${p})`}else{if(e.$.type.tag==="SomeType"){let m=e.$.type;if(m.resolvedConcreteType)return n.implClosureCallMap.set(m.resolvedConcreteType.id,{functionCName:s,callTypeId:r.isFn.callType.id,callType:r.isFn.callType}),`(${P(m.resolvedConcreteType,n)}){}`}return"// Error: Impl(Fn(...)) without captures missing resolvedConcreteType"}}function pl(e,t,n){if(e.pendingDeferredDrops&&e.loopBodyDropsBaselineCount!==void 0){let r=e.loopBodyDropsBaselineCount,i=e.pendingDeferredDrops.length,o=e.pendingDeferredDrops.slice(0,i-r);for(let a of o){let s=M(a,t,n);s&&n.emitter.emitLine(`${t}${s};`)}}}function no(e,t,n=""){let r=t;if(e.token.value==="continue"){if(r.currentContinueLabel)return pl(r,n,t),`goto ${r.currentContinueLabel}`;if(r.currentLoopLabel)return pl(r,n,t),"continue";if(r.smWhileContinueInfo){if(r.smWhileContinueInfo.emitDropsBeforeGoto&&r.smWhileBodyDrops&&r.smWhileBodyDrops.length>0){let a=t.emitter;for(let s of r.smWhileBodyDrops){let l=M(s,n,t);l&&l.includes("sm->")&&a.emitLine(`${n}${l};`)}}if(r.smWhileContinueInfo.stepExpr){let a=t.emitter,s=M(r.smWhileContinueInfo.stepExpr,n,t);s&&a.emitLine(`${n}${s};`)}return`goto ${r.smWhileContinueInfo.label}`}return"continue"}if(e.token.value==="break"){if(r.currentLoopLabel)return pl(r,n,t),r.insideMatch?`goto ${r.currentLoopLabel}`:"break";if(r.smWhileBreakInfo){let{label:a,activeIndex:s}=r.smWhileBreakInfo;if(r.smWhileBodyDrops&&r.smWhileBodyDrops.length>0){let l=t.emitter;for(let u of r.smWhileBodyDrops){let _=M(u,n,t);_&&_.includes("sm->")&&l.emitLine(`${n}${_};`)}}return s!==void 0?(t.emitter.emitLine(`${n}sm->while_loop_${s}_active = false;`),`goto ${a}`):`goto ${a}`}return"break"}if(e.token.value==="return"){if(r.inAsyncStateMachine){let a=t.emitter,s=r.inAsyncStateMachine.futureType,u=Dt(s).isFuture.outputType,_=fe(u);if(e.$?.deferredDropExpressions)for(let f of e.$.deferredDropExpressions){let p=M(f,n,t);p&&p.includes("sm->")&&a.emitLine(`${n}${p};`)}if(r.pendingDeferredDrops&&r.pendingDeferredDrops.length>0){a.emitLine(`${n}// Drop local variables before early completion`);for(let f of r.pendingDeferredDrops){let p=M(f,n,t);p&&p.includes("sm->")&&a.emitLine(`${n}${p};`)}}a.emitLine(`${n}// Early return - complete the result Future`);let c=_?void 0:`(${P(u,t)}){0}`;return Sr({emitter:a,indent:n,resultCode:c,debugLabel:t.currentFunctionName}),""}return"return"}if(e.$?.type&&fe(e.$.type))return"";if((r.inAsyncStateMachine||r.inEffectStateMachine)&&r.stateMachineVariables){let a=e.token.value;if(r.localShadowedVariables?.has(a))return te(a);let s=!1;if(e.$?.env){let l=X(e.$.env,a);if(l.length>0){let u=l[l.length-1],_=u.isOwningTheSameRcValueAs?u.isOwningTheSameRcValueAs.id:u.id;r.variableIdRemapping?.has(_)&&(_=r.variableIdRemapping.get(_));let c=r.stateMachineVariables.get(_);if(c){let f=r.stateMachineFieldAliases?.get(_);if(f)return s=!0,`sm->${f}`;let p=c.kind==="outer"?`__capture.${a}`:`var_${c.id}`;return s=!0,`sm->${p}`}}}if(!s){for(let[l,u]of r.stateMachineVariables)if(u.name===a){let _=r.stateMachineFieldAliases?.get(l);if(_)return s=!0,`sm->${_}`;let c=u.kind==="outer"?`__capture.${a}`:`var_${l}`;return s=!0,`sm->${c}`}}if(e.$?.env){let l=X(e.$.env,a);if(l.length>0){let u=l[l.length-1];if(u.isOwningTheSameRcValueAs){let _=u.isOwningTheSameRcValueAs.name,c=u.isOwningTheSameRcValueAs.id;for(let[f,p]of r.stateMachineVariables)if(p.name===_||f===c)return`sm->${p.kind==="outer"?`__capture.${_}`:`var_${f}`}`}}}if(r.currentClosureCaptures&&r.currentClosureCaptures.includes(a)&&r.currentClosureCaptureFrameLevel!==void 0){let l=r.currentClosureCaptureTypeCName;return l?`((${l}*)closure_context)->${Ee(a,e.$?.env)}`:`closure_context->${Ee(a,e.$?.env)}`}if(e.$?.variableName){if(e.$?.env&&e.$?.value&&!de(e.$.value)){let l=X(e.$.env,e.$.variableName);if(l.length>0&&l[l.length-1].isCompileTimeOnly)return Qt(e.$.value,t,e)}return Ee(e.$.variableName,e.$.env)}}if(e.$?.variableName){if(e.$?.env&&e.$?.value&&!de(e.$.value)){let a=X(e.$.env,e.$.variableName);if(a.length>0&&a[a.length-1].isCompileTimeOnly)return Qt(e.$.value,t,e)}if(!(r.currentClosureCaptures&&r.currentClosureCaptures.includes(e.token.value)&&e.$?.env&&r.currentClosureCaptureFrameLevel!==void 0&&$r(e.token.value,e.$.env,r.currentClosureCaptureFrameLevel)))return Ee(e.$.variableName,e.$?.env)}if(e.$?.value&&!de(e.$.value))return Qt(e.$.value,t,e);let i=e.$?.env&&r.currentClosureCaptureFrameLevel!==void 0?$r(e.token.value,e.$.env,r.currentClosureCaptureFrameLevel):!1;if(r.currentClosureCaptures&&r.currentClosureCaptures.includes(e.token.value)&&r.currentClosureCaptureFrameLevel!==void 0&&(!e.$?.env||i)){let a=r.currentClosureCaptureTypeCName;return a?`((${a}*)closure_context)->${Ee(e.token.value,e.$?.env)}`:`closure_context->${Ee(e.token.value,e.$?.env)}`}if(r.currentFunctionName&&!r.currentClosureCaptures){let a=Object.values(r.functions).find(s=>s.cName===r.currentFunctionName);if(a&&a.value.type.isClosure){let s=Object.values(r.types).find(l=>G(l.type)&&l.type.isClosure&&l.type===a.value.type);if(s)return`((${`${s.cName}_capture`}*)closure_context->data)->${Ee(e.token.value,e.$?.env)}`}}if(e.$?.env){let a=X(e.$.env,e.token.value);if(a.length>0){let s=a[a.length-1];if(s.value?.[0]&&ne(s.value[0])){let l=t.functions[s.value[0].funcId]?.cName;if(l)return l}else if(G(s.type)&&(de(s.value?.[0])||s.value===void 0)){let l=Object.entries(t.functions).find(([u,_])=>_.value.funcName===e.token.value);if(l)return l[1].cName}}}return Ee(e.token.value,e.$?.env)}function S_(e,t,n){let r;if(Rt(e)){let d=e.$?.runtimeArgExprsInOrder?.[0]?.$?.closureFunctionValue;d&&ne(d)&&(r=d.body)}else r=e.args[0];if(!r)return"/* Error: async requires exactly 1 argument */";let i=e.$?.type;if(!i||!be(i))return"/* Error: async block must have Future type */";let o=Dt(i);if(!o)return"/* Error: Could not extract Future module type */";let a=e.$?.variableName||`async_block_${Date.now()}`,s=`${a}_state_t`,l=`${a}_resume`,u=`__yo_new_${a}`,_=`${a}_state_dispose`;n.types[i.id]={type:i,cName:s};let c=e.$?.awaitAnalysis;if(!c)throw new Error("Missing await analysis for async block. This should have been computed during evaluation.");let f=o.isFuture.outputType;if(V(f))if(f.resolvedConcreteType)f=f.resolvedConcreteType;else{let d=e.$?.runtimeArgExprsInOrder?.[0]?.$?.closureFunctionValue;if(d&&ne(d)){let v=d.type?.return?.type;if(v&&V(v)&&v.resolvedConcreteType)f=v.resolvedConcreteType;else if(d.body?.$?.type){let T=d.body.$.type;V(T)&&T.resolvedConcreteType?f=T.resolvedConcreteType:V(T)||(f=T)}}}let p=P(f,n),m=n.emitter;if(m.emitDeclarationLine(`void ${_}(void* sm_ptr); // Dispose function for state machine`),m.emitDeclarationLine(""),m.emitDeclarationLine(`void ${l}(${s}* sm);`),m.emitDeclarationLine(""),e.$?.captureType){let h=e.$.captureType,d=Object.values(n.types).find(T=>T.type===h),v=d?d.cName:`async_capture_${h.id}`;m.emitDeclarationLine(`${s}* ${u}(${v} __capture);`)}else m.emitDeclarationLine(`${s}* ${u}();`);m.emitDeclarationLine(""),n.deferredAsyncBlocks||(n.deferredAsyncBlocks=[]),n.deferredAsyncBlocks.push({bodyExpr:r,asyncBlockId:a,structName:s,resumeFunctionName:l,constructorName:u,disposeFunctionName:_,futureType:i,futureModuleType:o,resultType:f,resultTypeCName:p,captureType:e.$?.captureType,analysis:c});let g=e.$?.captureType;if(g){let h=Object.values(n.types).find(N=>N.type===g),d=h?h.cName:`async_capture_${g.id}`,v=n,T=v.currentClosureCaptures!==void 0||v.inAsyncStateMachine!==void 0||v.inEffectStateMachine!==void 0,$=!1,b=g.fields.map(N=>{if(N.isEffectParam)return`.${N.label} = NULL`;let B;if(!T&&e.$?.deferredDupExpressions)for(let x of e.$.deferredDupExpressions){let z;if(F(x)&&(x.args.length>0&&U(x.args[0])?z=x.args[0].token.value:x.args.length===0&&F(x.func)&&E(x.func,".")&&x.func.args.length>=2&&U(x.func.args[0])&&(z=x.func.args[0].token.value)),z===N.label){B=x;break}}if(B)return $=!0,B.$?.variableName?(M(B,t,n),`.${N.label} = ${B.$.variableName}`):`.${N.label} = ${M(B,t,n)}`;let D={tag:"Atom",token:N.exprs.expr.token,$:N.exprs.expr.$};return`.${N.label} = ${no(D,n)}`}).join(", "),L=`(${d}){${b}}`;if(!$){let N=On(g,n);N&&(L=`${N}(${L})`)}let C=e.$?.variableName||"async_result",R=`${u}(${L})`;if(C&&e.$?.type){let N=st(e.$.type,C,n);return n.emitter.emitLine(`${t}${N} = ${R};`),C}else return R}else{let h=e.$?.variableName||"async_result",d=`${u}()`;if(h&&e.$?.type){let v=st(e.$.type,h,n);return n.emitter.emitLine(`${t}${v} = ${d};`),h}else return d}}function N_(e,t){let n=t.emitter,{asyncBlockId:r,structName:i,resultType:o,resultTypeCName:a,captureType:s,analysis:l,crossBoundaryIds:u,awaitFutureTempVarAliases:_,overlappingSlotAliases:c,overlappingSlots:f}=e;if(n.emitDeclarationLine(`// State machine for async block ${r} - implements Future(${A(o)})`),n.emitDeclarationLine(`struct ${i}_struct {`),n.emitDeclarationLine(" __yo_ref_header_t header; // Reference counting header (must be first)"),n.emitDeclarationLine(" int state; // Current state (0 = cold, 1..N = intermediate, -1 = completed, -2 = aborted)"),fe(o)?n.emitDeclarationLine(" uint8_t result; // Dummy result for unit type"):n.emitDeclarationLine(` ${a} result; // The result value of type ${A(o)}`),n.emitDeclarationLine(" void (*continuation_fn)(void*); // Resume function of awaiting task"),n.emitDeclarationLine(" void* continuation_sm; // State machine of awaiting task"),n.emitDeclarationLine(""),n.emitDeclarationLine(" void (*__yo_resume_fn)(void*); // Resume function pointer (for lazy start at await/spawn)"),n.emitDeclarationLine(""),s){let h=Object.values(t.types).find(v=>v.type===s),d=h?h.cName:`async_capture_${s.id}`;n.emitDeclarationLine(" // Captured variables from outer scope"),n.emitDeclarationLine(` ${d} __capture;`),n.emitDeclarationLine("")}let p=l.capturedVariables.filter(h=>h.kind!=="outer");if(u&&(p=p.filter(h=>u.has(h.id)&&!_?.has(h.id)&&!c?.has(h.id))),p.length>0){n.emitDeclarationLine(" // Local variables");for(let h of p){let d=P(h.type,t),v=rn(h.id,"local");n.emitDeclarationLine(` ${d} ${v}; // ${h.name}`)}n.emitDeclarationLine("")}if(f&&f.length>0){n.emitDeclarationLine(" // Overlapping storage slots (Phase 2)");for(let h of f)n.emitDeclarationLine(` ${h.cType} ${h.fieldName}; // shared: ${h.variableNames.join(", ")}`);n.emitDeclarationLine("")}if(l.awaitPoints.length>0){let h=[];for(let d of l.awaitPoints)if(!(fe(d.resultType)||V(d.resultType)&&!d.resultType.resolvedConcreteType)&&d.isInsideCond){let $=d.resultType;if(d.futureType){let L=Dt(d.futureType);L&&($=L.isFuture.outputType)}let b=P($,t);h.push(` ${b} await_result_${d.index};`)}if(h.length>0){n.emitDeclarationLine(" // Await result temporaries");for(let d of h)n.emitDeclarationLine(d);n.emitDeclarationLine("")}}if(l.awaitPoints.length>0){let h=l.awaitPoints.filter(d=>d.futureVariableId===void 0);if(h.length>0){n.emitDeclarationLine(" // Future references for awaits");for(let d of h){let v=d.expr;if(v.tag!=="FnCall")continue;let $=v.args[0]?.$?.type;if(!$)throw new Error(`Internal error: await expression missing type info for future argument in async block ${r}`);let b=P($,t);n.emitDeclarationLine(` ${b} await_future_${d.index};`)}n.emitDeclarationLine("")}}let m=l.awaitPoints.filter(h=>h.needsOwnCondBranchField);if(m.length>0){n.emitDeclarationLine(" // Branch tracking for cond expressions with await");for(let h of m)n.emitDeclarationLine(` int cond_branch_${h.index}; // Which branch was taken in cond with await ${h.index}`);n.emitDeclarationLine("")}let g=l.awaitPoints.filter(h=>h.isInsideWhile);if(g.length>0){n.emitDeclarationLine(" // Loop state tracking for while loops with await");let h=l.awaitPoints.length;for(let d of g){n.emitDeclarationLine(` _Bool while_loop_${d.index}_active; // Whether while loop ${d.index} should continue`);let v=(d.whileNestingDepth??1)-1;for(let T=0;T<v;T++)n.emitDeclarationLine(` _Bool while_loop_${h}_active; // Whether outer while loop ${h} should continue`),h++}n.emitDeclarationLine("")}n.emitDeclarationLine("};"),n.emitDeclarationLine("")}function By(e){if(!e.deferredAsyncBlocks||e.deferredAsyncBlocks.length===0)return;let t=e.deferredAsyncBlocks,n=new Map;for(let l of t)n.set(l.structName,l);let r=new Map,i=new Map;for(let l of t)r.set(l.structName,new Set),i.set(l.structName,0);for(let l of t){let u=_=>{let c=r.get(_);c.has(l.structName)||(c.add(l.structName),i.set(l.structName,(i.get(l.structName)??0)+1))};for(let _ of l.analysis.capturedVariables){let c;try{c=P(_.type,e)}catch{continue}let f=n.get(c);f&&f.structName!==l.structName&&u(f.structName)}for(let _ of l.analysis.awaitPoints){if(_.futureVariableId!==void 0)continue;let c=_.expr;if(c.tag!=="FnCall")continue;let p=c.args[0]?.$?.type;if(!p)continue;let m;try{m=P(p,e)}catch{continue}let g=n.get(m);g&&g.structName!==l.structName&&u(g.structName)}}let o=[];for(let[l,u]of i.entries())u===0&&o.push(l);let a=[];for(;o.length>0;){let l=o.shift();a.push(l);let u=r.get(l);if(u)for(let _ of u){let c=(i.get(_)??0)-1;i.set(_,c),c===0&&o.push(_)}}let s=a.length===t.length?a.map(l=>n.get(l)).filter(Boolean):t;for(let l of s){let{crossBoundaryIds:u,awaitFutureTempVarAliases:_,variableSegments:c}=Pa(l.bodyExpr,l.analysis),{slotAliases:f,slots:p}=za(u,c,l.analysis.capturedVariables,_,e);N_({asyncBlockId:l.asyncBlockId,structName:l.structName,resultType:l.resultType,resultTypeCName:l.resultTypeCName,captureType:l.captureType,analysis:l.analysis,crossBoundaryIds:u,awaitFutureTempVarAliases:_,overlappingSlotAliases:f,overlappingSlots:p},e)}}function Gy(e,t,n,r,i,o,a,s,l,u){let _=u.emitter;if(_.emitLine(`// Dispose function for async block ${e} state machine`),_.emitLine("// Called by __yo_decr_rc when refcount hits 0 - do NOT call __yo_free here"),_.emitLine(`void ${n}(void* sm_ptr) {`),_.emitLine(` ${t}* sm = (${t}*)sm_ptr;`),_.emitLine(` ASYNC_DEBUG("${n}: Disposing state machine\\n");`),_.emitLine(""),i&&Le(i)){let c=Object.values(u.types).find(f=>f.type===i);if(!c)_.emitLine(" /* Error: capture struct type not found in context */");else{let f=c.cName,p=i.trait.fields.find(m=>m.label===k.___drop[0]);if(p&&p.assignedValue&&ne(p.assignedValue)){let m=u.functions[p.assignedValue.funcId]?.cName;m&&(_.emitLine(' ASYNC_DEBUG(" Dropping capture struct\\n");'),_.emitLine(` ${m}(sm->__capture);`))}else _.emitLine(` /* Warning: ___drop function not found for capture struct ${f} */`)}}if(_.emitLine(""),!fe(r)&&Le(r)){let c=P(r,u);_.emitLine(" // Drop result field if it was set (state == -1 means completed)"),_.emitLine(" int final_state = sm->state;"),_.emitLine(" if (final_state == -1) {"),_.emitLine(' ASYNC_DEBUG(" Dropping result field\\n");');let f=Tr(r,u);f?_.emitLine(` ${f}(sm->result);`):_.emitLine(` /* Warning: No ___drop function found for result type ${c} */`),_.emitLine(" }")}_.emitLine("");{let c=[];for(let f of o.capturedVariables){if(f.kind!=="local"||!s.has(f.id)||l.has(f.id)||f.isOwningTheSameRcValueAs!==void 0)continue;let m=`sm->${rn(f.id,"local")}`;if(Ce(f.type))c.push(` if ((${m}).data != NULL) { __yo_decr_rc((void*)(${m}).data); }`);else if(wt(f.type)||bt(f.type))c.push(` if (${m} != NULL) { __yo_decr_rc_atomic((void*)${m}); }`);else if(ft(f.type)||V(f.type)&&sn(f.type)){let g=Tr(f.type,u);g?c.push(` if (${m} != NULL) { ${g}(${m}); }`):c.push(` if (${m} != NULL) { __yo_decr_rc((void*)${m}); }`)}else if(Le(f.type)){let g=Tr(f.type,u);g&&c.push(` ${g}(${m});`)}}if(c.length>0){_.emitLine(" // Drop local variables on escape (state == -2)"),_.emitLine(" if (sm->state == -2) {");for(let f of c)_.emitLine(f);_.emitLine(" }")}}_.emitLine(" // Memory freed by __yo_decr_rc after this function returns"),_.emitLine("}")}function Wy(e,t,n,r,i,o,a,s,l,u){let _=u.emitter;if(l){let c=Object.values(u.types).find(p=>p.type===l),f=c?c.cName:`async_capture_${l.id}`;_.emitLine(`${t}* ${r}(${f} __capture) {`)}else _.emitLine(`${t}* ${r}() {`);_.emitLine(" // Allocate async block state machine (heap-backed, ref-counted)"),_.emitLine(` ${t}* sm = (${t}*)__yo_malloc(sizeof(${t}));`),_.emitLine(` memset(sm, 0, sizeof(${t}));`),_.emitLine(""),_.emitLine(" // Initialize reference counting header"),_.emitLine(" sm->header.ref_count = 1; // Caller owns initial reference"),_.emitLine(` GC_DEBUG("AsyncBlock ${t}: Created ptr=%p RC=1\\n", (void*)sm);`),_.emitLine(" sm->header.gc_flags = 0;"),_.emitLine(" sm->header.gc_mark = __YO_GC_UNMARKED;"),_.emitLine(" sm->header.gc_next = NULL;"),_.emitLine(" sm->header.gc_prev = NULL;"),_.emitLine(` sm->header.dispose_fn = (void(*)(void*))${i};`),_.emitLine(" sm->header.traverse_fn = NULL; // TODO: Add traverse for cycle detection if needed"),_.emitLine(""),_.emitLine(" sm->state = 0;"),_.emitLine(" sm->continuation_fn = NULL;"),_.emitLine(" sm->continuation_sm = NULL;"),_.emitLine(""),l&&(_.emitLine(" // Initialize captured variables"),_.emitLine(" sm->__capture = __capture;"),_.emitLine("")),_.emitLine(" // Initialize result (will be set when async block completes)"),fe(a)?_.emitLine(" // Result is unit type, no initialization needed"):_.emitLine(` memset(&sm->result, 0, sizeof(${s}));`),_.emitLine(""),_.emitLine(` sm->__yo_resume_fn = (void(*)(void*))${n};`),_.emitLine(""),_.emitLine(" return sm;"),_.emitLine("}"),_.emitLine("")}function x_(e){if(!e.deferredAsyncBlocks||e.deferredAsyncBlocks.length===0)return;let t=e.emitter;By(e),t.emitLine("// Deferred async block implementations");let n=0;for(;n<e.deferredAsyncBlocks.length;){let r=e.deferredAsyncBlocks[n],i=e.deferredAsyncBlocks.length,{bodyExpr:o,asyncBlockId:a,structName:s,resumeFunctionName:l,constructorName:u,disposeFunctionName:_,futureType:c,resultType:f,resultTypeCName:p,captureType:m,analysis:g}=r,h=e.stateMachineVariables,d=e.currentEvidenceParams,v=new Map,{crossBoundaryIds:T,awaitFutureTempVarAliases:$,variableSegments:b}=Pa(o,g),{slotAliases:L}=za(T,b,g.capturedVariables,$,e),C=g.capturedVariables.filter(x=>x.kind==="outer"||T.has(x.id)||$.has(x.id)||L.has(x.id)),R={...g,capturedVariables:C};for(let x of C)v.set(x.id,x);if(m)for(let x of m.fields)v.set(x.label,{id:x.label,name:x.label,type:x.type,kind:"outer",isOwningTheSameRcValueAs:void 0});e.stateMachineVariables=v;let N=e.stateMachineFieldAliases,B=new Map($);for(let[x,z]of L)B.set(x,z);e.stateMachineFieldAliases=B;let D=C_(o,a,s,l,R,c,m,e);if(e.stateMachineVariables=h,e.currentEvidenceParams=d,e.stateMachineFieldAliases=N,t.emitLine(""),Gy(a,s,_,f,m,R,D,T,$,e),t.emitLine(""),Wy(a,s,l,u,_,c,f,p,m,e),t.emitLine(""),e.deferredAsyncBlocks.length>i){let x=e.deferredAsyncBlocks.slice(i);for(let z of x){let{crossBoundaryIds:re,awaitFutureTempVarAliases:j,variableSegments:W}=Pa(z.bodyExpr,z.analysis),{slotAliases:le,slots:ce}=za(re,W,z.analysis.capturedVariables,j,e);N_({asyncBlockId:z.asyncBlockId,structName:z.structName,resultType:z.resultType,resultTypeCName:z.resultTypeCName,captureType:z.captureType,analysis:z.analysis,crossBoundaryIds:re,awaitFutureTempVarAliases:j,overlappingSlotAliases:le,overlappingSlots:ce},e)}}n++}}function V_(e){for(let t in e.functions){let{value:n}=e.functions[t];n.body&&D_(n.body,e)}}var Yy=["__yo_poll_","__yo_fs_event_","__yo_async_"];function qy(e){return Yy.some(t=>e.startsWith(t))}function D_(e,t){if(e&&F(e)){let n=e;if(Rt(e)){t.usesAsync=!0;let r=e.$?.type;if(r&&be(r)&&Dt(r)){let a=`${e.$?.variableName||`async_block_${Date.now()}`}_state_t`;e.$&&(e.$.asyncStateMachineStructName=a),t.types[r.id]={type:r,cName:a},t.emitter.emitDeclarationLine(`typedef struct ${a}_struct ${a}; // Forward declaration for async state machine`)}}if(Rt(e)){let r=e.$?.type;if(r&&be(r)&&Dt(r)){let o=e.$?.variableName||`io_async_block_${Date.now()}`,a=!!e.$?.awaitAnalysis,s=a?`${o}_state_t`:`${o}_sync_fut_t`;e.$&&(e.$.asyncStateMachineStructName=s),t.types[r.id]={type:r,cName:s},t.emitter.emitDeclarationLine(`typedef struct ${s}_struct ${s}; // Forward declaration for io.async ${a?"state machine":"sync future"}`)}}(fn(e)||Fa(e))&&(t.usesAsync=!0);{let r=n.func.$?.type;r&&"isExtern"in r&&r.isExtern==="yo"&&"externName"in r&&typeof r.externName=="string"&&qy(r.externName)&&(t.usesAsync=!0)}{let r=n.func.$?.type;r&&"isExtern"in r&&r.isExtern==="yo"&&"externName"in r&&typeof r.externName=="string"&&(r.externName==="__yo_thread_spawn"||r.externName==="__yo_worker_spawn")&&(t.usesParallelism=!0)}for(let r of n.args)D_(r,t)}}function M_(e,t,n){let r=e.$?.type;if(!r||!be(r))return"/* Error: io.async must return a Future type */";let i=Dt(r);if(!i)return"/* Error: Could not extract Future module type */";let o=i.isFuture.outputType;if(V(o))if(o.resolvedConcreteType)o=o.resolvedConcreteType;else{let R=e.$?.runtimeArgExprsInOrder?.[0]?.$?.closureFunctionValue;if(R&&ne(R)){let N=R.type?.return?.type;if(N&&V(N)&&N.resolvedConcreteType)o=N.resolvedConcreteType;else if(R.body?.$?.type){let B=R.body.$.type;V(B)&&B.resolvedConcreteType?o=B.resolvedConcreteType:V(B)||(o=B)}}}let a=P(o,n),s=e.$?.asyncStateMachineStructName;if(!s)return"/* Error: Missing sync future struct name */";let l=`${s}_dispose`,u=`${s}_resume`,_=n.emitter,c=e.$?.runtimeArgExprsInOrder?.[0];if(!c?.$)return"/* Error: Missing closure argument for io.async */";let f=M(c,t,n),p=c.$.type,m,g;if(V(p)&&p.resolvedConcreteType){let C=p.resolvedConcreteType,R=n.implClosureCallMap.get(C.id);R&&(m=R.functionCName);let N=n.types[C.id];N&&(g=N.cName)}if(!m||!g)return"/* Error: no closure function or capture type for io.async sync path */";_.emitDeclarationLine(`struct ${s}_struct {`),_.emitDeclarationLine(" __yo_ref_header_t header;"),_.emitDeclarationLine(" int state;"),fe(o)?_.emitDeclarationLine(" uint8_t result;"):_.emitDeclarationLine(` ${a} result;`),_.emitDeclarationLine(" void (*continuation_fn)(void*);"),_.emitDeclarationLine(" void* continuation_sm;"),_.emitDeclarationLine(" void (*__yo_resume_fn)(void*);"),_.emitDeclarationLine(` ${g} __capture;`),_.emitDeclarationLine("};"),_.emitDeclarationLine("");let h="";for(let C in n.functions){let R=n.functions[C];if(R.cName===m){let N=$t(R.value.type);N.length>0&&(h=", "+N.map(B=>`(void*)sm->__capture.${B.fieldPath.join(".")}`).join(", "));break}}_.emitDeclarationLine(`void ${u}(void* ptr) {`),_.emitDeclarationLine(` ${s}* sm = (${s}*)ptr;`),fe(o)?_.emitDeclarationLine(` ${m}(&sm->__capture${h});`):_.emitDeclarationLine(` sm->result = ${m}(&sm->__capture${h});`),h&&(_.emitDeclarationLine(" if (__yo_effect_escaped) {"),_.emitDeclarationLine(" __yo_effect_escaped = 0;"),_.emitDeclarationLine(" sm->state = -2;"),_.emitDeclarationLine(" __yo_decr_rc(ptr);"),_.emitDeclarationLine(" return;"),_.emitDeclarationLine(" }")),_.emitDeclarationLine(" sm->state = -1;"),_.emitDeclarationLine(" void (*continuation)(void*) = sm->continuation_fn;"),_.emitDeclarationLine(" if (continuation) {"),_.emitDeclarationLine(" void* cont_sm = sm->continuation_sm;"),_.emitDeclarationLine(" continuation(cont_sm);"),_.emitDeclarationLine(" }"),_.emitDeclarationLine(" __yo_decr_rc(ptr);"),_.emitDeclarationLine("}"),_.emitDeclarationLine("");let d=c.$.captureType,v=d&&Le(d)?Tr(d,n):void 0,T=d&&Le(d)?On(d,n):void 0,$=Tr(o,n);_.emitDeclarationLine(`void ${l}(void* ptr) {`),(v||$)&&(_.emitDeclarationLine(` ${s}* sm = (${s}*)ptr;`),v&&(_.emitDeclarationLine(" // Drop captured variables (future owns its references)"),_.emitDeclarationLine(` ${v}(sm->__capture);`)),$&&(_.emitDeclarationLine(" if (sm->state == -1) {"),_.emitDeclarationLine(` ${$}(sm->result);`),_.emitDeclarationLine(" }"))),_.emitDeclarationLine("}"),_.emitDeclarationLine("");let b=e.$?.variableName||"__io_async_result",L=st(r,b,n);return _.emitLine(`${t}${L} = (${s}*)__yo_malloc(sizeof(${s}));`),_.emitLine(`${t}memset(${b}, 0, sizeof(${s}));`),_.emitLine(`${t}${b}->header.ref_count = 1;`),_.emitLine(`${t}${b}->header.gc_flags = 0;`),_.emitLine(`${t}${b}->header.gc_mark = __YO_GC_UNMARKED;`),_.emitLine(`${t}${b}->header.gc_next = NULL;`),_.emitLine(`${t}${b}->header.gc_prev = NULL;`),_.emitLine(`${t}${b}->header.dispose_fn = (void(*)(void*))${l};`),_.emitLine(`${t}${b}->header.traverse_fn = NULL;`),_.emitLine(`${t}${b}->__capture = ${f};`),T&&_.emitLine(`${t}${b}->__capture = ${T}(${b}->__capture);`),_.emitLine(`${t}${b}->state = 0;`),_.emitLine(`${t}${b}->__yo_resume_fn = ${u};`),_.emitLine(`${t}${b}->continuation_fn = NULL;`),_.emitLine(`${t}${b}->continuation_sm = NULL;`),b}function O_(e,t){for(let i=0;i<e.fields.length;i++){let o=e.fields[i];ne(o)&&(xr(o.type,t),vi(o.body,t))}let n=new Set,r=!0;for(;r;){r=!1;for(let i in t.functions){if(n.has(i))continue;n.add(i),r=!0;let o=t.functions[i];if(xr(o.value.type,t),o.value.specializedType&&xr(o.value.specializedType,t),vi(o.value.body,t),o.value.calledComptimeFunctionCaches)for(let a of o.value.calledComptimeFunctionCaches)a.value&&a.value.type&&Mt(a.value.type,t),vi(a.body,t)}}}function xr(e,t){for(let n of e.parameters)Mt(n.type,t);for(let n of e.forallParameters)Mt(n.type,t);Mt(e.return.type,t)}function vi(e,t){if(e.$&&e.$.type&&Mt(e.$.type,t),e.$&&e.$.value&&ne(e.$.value)){let n=e.$.value;n.isControlFunction?(xr(n.type,t),Ht(n.body,t)):t.functions[n.funcId]||n.type.parameters.map(o=>o.type).some(o=>V(o)&&be(o)&&!o.resolvedConcreteType)||(t.functions[n.funcId]={value:n,cName:te(n.funcId)},xr(n.type,t),Ht(n.body,t))}if(e.$&&e.$.deferredDropExpressions&&e.$.deferredDropExpressions.length>0)for(let n of e.$.deferredDropExpressions)vi(n,t);if(e.$&&e.$.macroExpansion&&vi(e.$.macroExpansion,t),e.$&&e.$.runtimeDestructurings)for(let{type:n}of e.$.runtimeDestructurings)Mt(n,t);if(e.$&&e.$.captureType&&_e(e.$.captureType)){let n=e.$.captureType;if(!t.types[n.id]){t.types[n.id]={type:n,cName:`__yo_${n.id}`};for(let r of n.fields)Mt(r.type,t);for(let r of n.trait.fields)if(r.assignedValue&&ne(r.assignedValue)){let i=r.assignedValue;t.functions[i.funcId]||(t.functions[i.funcId]={value:i,cName:i.funcId},xr(i.type,t),Ht(i.body,t))}}}switch(e.tag){case"FnCall":if(E(e,I.test))break;vi(e.func,t);for(let n of e.args)vi(n,t);break;case"Atom":e.$?.value&&O(e.$.value)&&Mt(e.$.value.value,t);break}}function Mt(e,t){if(!t.types[e.id]){if(V(e)&&Wt(e)){if(e.resolvedConcreteType){Mt(e.resolvedConcreteType,t);return}let n=nn(e);n&&Mt(n,t);return}if(V(e)&&be(e)){let n=Dt(e);n&&Mt(n.isFuture.outputType,t);return}if(V(e)&&e.resolvedConcreteType){Mt(e.resolvedConcreteType,t);return}if(!Fe(e)){if(_e(e)||it(e)||ge(e)||we(e)||Ce(e)||Te(e)||De(e)||Qe(e)||wt(e)||bt(e)){let n=Qe(e)?P(e,t):e.isExtern==="c"&&e.externName?e.externName:`__yo_${e.id}`;if(t.types[e.id]={type:e,cName:n},_e(e))for(let r of e.fields)Mt(r.type,t);if(ge(e)){for(let r of e.variants)if(r.fields)for(let i of r.fields)Mt(i.type,t)}if(it(e))for(let r of e.fields)Mt(r.type,t);if(Ce(e)){let r=e;for(let i of r.requiredTraits)Mt(i.traitType,t)}if(wt(e)){let r=e;Mt(r.childType,t),P(r,t)}if(bt(e)){let r=e;Mt(r.childType,t),P(r,t)}if(Qe(e)&&Mt(e.childType,t),Te(e)||De(e)){for(let r of e.fields)Mt(r.type,t);for(let r of e.fields)if(r.assignedValue&&ne(r.assignedValue)){let i=r.assignedValue;t.functions[i.funcId]||(t.functions[i.funcId]={value:i,cName:te(i.funcId)},xr(i.type,t),Ht(i.body,t))}else if(r.assignedValue&&(We(r.assignedValue)||Tt(r.assignedValue))){let i=r.assignedValue;Ko(i,t)}}}else if(ke(e)){let n=e,r=n.childType,i=n.length;if(Ue(i)){Mt(r,t);let o=P(r,t),a=`Array_${te(o)}_${i.value}`;t.arrayStructTypes.has(a)||t.arrayStructTypes.set(a,{childType:o,length:typeof i.value=="bigint"?Number(i.value):i.value}),t.types[e.id]={type:e,cName:a}}}else if(Ie(e)){if(Mt(e.childType,t),Qe(e.childType)){let r=e.childType.childType;Mt(r,t);let i=P(r,t),o=`Slice_${te(i)}`;t.sliceStructTypes.has(o)||t.sliceStructTypes.set(o,{childType:i})}t.types[e.id]={type:e,cName:P(e,t)}}else h_.has(e.tag)&&(t.types[e.id]={type:e,cName:P(e,t)});e.trait&&Mt(e.trait,t)}}}function Ti(e){if(e.$&&e.$.value&&de(e.$.value)&&!(G(e.$.type)&&e.$.type.isExtern)){if(!fe(e.$.type))return!0}if(F(e)){if(Ti(e.func))return!0;for(let t of e.args)if(!(t.$?.type&&fe(t.$.type))&&Ti(t))return!0}if(e.$&&e.$.macroExpansion){if(e.$.type&&fe(e.$.type))return!1;if(Ti(e.$.macroExpansion))return!0}if(e.$?.deferredDupExpressions){for(let t of e.$.deferredDupExpressions)if(Ti(t))return!0}if(e.$?.deferredDropExpressions){for(let t of e.$.deferredDropExpressions)if(Ti(t))return!0}return!1}function Ko(e,t){for(let n=0;n<e.fields.length;n++){let r=e.fields[n],i=e.type.fields[n];if(ne(r)){let o=i.label;if(o==="main")t.functions[r.funcId]={value:r,cName:"__yo_user_main"};else if(t.isLibrary)if(t.currentModuleId&&r.funcId.startsWith(`fn_${t.currentModuleId}_`)){let s=te(o);t.functions[r.funcId]={value:r,cName:s},t.exportedFunctionLabels||(t.exportedFunctionLabels=new Map),t.exportedFunctionLabels.set(r.funcId,o)}else t.functions[r.funcId]={value:r,cName:te(r.funcId)};else t.functions[r.funcId]={value:r,cName:te(r.funcId)};Ht(r.body,t)}}}function R_(e,t){for(let n=0;n<e.fields.length;n++){let r=e.fields[n];r&&ne(r)?t.functions[r.funcId]||(r.isModuleEffectMember=!0,t.functions[r.funcId]={value:r,cName:te(r.funcId)},Ht(r.body,t)):r&&We(r)&&R_(r,t)}}function Ht(e,t){if(e.$?.value&&We(e.$.value)){let i=e.$.value;R_(i,t)}if(F(e)&&E(e,I.test)||F(e)&&E(e,k.comptime_expect_error))return;if(e.$&&e.$.macroExpansion&&Ht(e.$.macroExpansion,t),e.$?.effectAnalysis){let i=e.$.effectAnalysis.handlerValue;i&&ne(i)&&Ht(i.body,t)}if(e.$&&e.$.closureFunctionValue){let i=e.$.closureFunctionValue;t.functions[i.funcId]||(t.functions[i.funcId]={value:i,cName:te(i.funcId)},Ht(i.body,t))}if(F(e)&&e.$&&e.$.dynCallTraitValues&&e.$.dynCallTraitValues.length>0){let i=e.$.type,o=e.args[0];if(Ce(i)&&o&&o.$?.type){let a=o.$.type,s=e.$.dynCallTraitValues;if(s.length>0&&(ft(a)||$n(a))){let l=$n(a)?a.fields[0].type:a,u=`${l.id}_${i.id}`;t.dynImpls.set(u,{dynType:i,concreteType:l,dataType:a,traitValues:s})}}}if(F(e)){let i=e.func.$?.type,o=e.func.$?.value;if(e.func.token.value==="?=")return;if(G(i)){if(ne(o)&&o.isControlFunction){Ht(o.body,t);for(let a of e.args)Ht(a,t);return}if(ne(o)){if(o.type.return.isCompileTimeOnly||as(o)&&!o.specializedType)return;if(o.specializedType&&_r(o.specializedType)&&$t(o.specializedType).length===0){Ht(e.func,t);for(let s of e.args)Ht(s,t);return}if(!t.functions[o.funcId]){let a=!1;if(Ti(o.body)){let s=o.specializedType??o.type;if(a=s.implicitParameters.length>0&&($t(s).length>0||!_r(o.type)&&o.type.implicitParameters.length>0),!a)return}if(!a&&!($t(o.specializedType??o.type).length>0)&&(o.specializedType??o.type).parameters.map(_=>_.type).some(_=>V(_)&&be(_)&&!_.resolvedConcreteType))return;t.functions[o.funcId]={value:o,cName:te(o.funcId)},Ht(o.body,t)}}else if(i.isExtern==="c"){let a=i.externName?i.externName:U(e.func)?e.func.token.value:i.id;t.externFunctions[i.id]={type:i,cName:a}}else if(i.isExtern==="yo"){let a=i.externName;if(!(a&&a.startsWith("__yo_"))){let s=a?te(a):U(e.func)?te(e.func.token.value):te(i.id);t.externFunctions[i.id]={type:i,cName:s}}}}Ht(e.func,t);for(let a of e.args)Ht(a,t)}let n=e.$?.type,r=e.$?.value;if(G(n)){if(ne(r)&&r.isControlFunction){if(r.isModuleEffectMember=!0,t.functions[r.funcId]||(t.functions[r.funcId]={value:r,cName:te(r.funcId)}),r.specializedFunctionCaches)for(let i of r.specializedFunctionCaches){let o=i.specializedFunction;o&&!t.functions[o.funcId]&&(o.isModuleEffectMember=!0,t.functions[o.funcId]={value:o,cName:te(o.funcId)},Ht(o.body,t))}Ht(r.body,t);return}if(ne(r)){if(as(r)&&!r.specializedFunctionCaches||t.functions[r.funcId])return;if(Ti(r.body))return;t.functions[r.funcId]={value:r,cName:te(r.funcId)},Ht(r.body,t)}}if(O(e.$?.value)&&Mt(e.$.value.value,t),e.$?.deferredDupExpressions)for(let i of e.$.deferredDupExpressions)Ht(i,t);if(e.$?.deferredDropExpressions)for(let i of e.$.deferredDropExpressions)Ht(i,t);if(e.$?.dynCallTraitValues)for(let i of e.$.dynCallTraitValues)Ko(i,t)}function P_(e){let t=k.dispose[0];for(let n in e.types){let{type:r}=e.types[n];if(!_e(r)||!r.isReferenceSemantics)continue;let i=nr({concreteType:r,methodName:t,env:r.env});for(let o of i)if(o.value&&ne(o.value)){let a=o.value;if(e.functions[a.funcId])continue;a.funcName||(a.funcName=t),e.functions[a.funcId]={value:a,cName:te(a.funcId)},xr(a.type,e),Ht(a.body,e)}}}function z_(e){let t=e.emitter,n=new Set;for(let[,r]of e.dynImpls){let i=e.types[r.dynType.id]?.cName||`__yo_dyn_${r.dynType.id}`;n.has(i)||(n.add(i),t.emitLine(`${i} __yo_dup_${i}(${i} dyn) {`),t.emitLine(" if (dyn.data) {"),t.emitLine(" __yo_incr_rc(dyn.data);"),t.emitLine(" }"),t.emitLine(" return dyn;"),t.emitLine("}"),t.emitLine(""),t.emitLine(`void __yo_drop_${i}(${i} dyn) {`),t.emitLine(" if (dyn.data) {"),t.emitLine(" __yo_decr_rc(dyn.data);"),t.emitLine(" }"),t.emitLine("}"),t.emitLine(""))}}function U_(e){let t=e.emitter;if(e.dynImpls.size===0)return;t.emitLine(""),t.emitLine("// === Dyn Box Functions ==="),t.emitLine("// Constructor and dispose functions for dyn boxes"),t.emitLine("");let n=new Set;for(let[,r]of e.dynImpls){let i=V(r.concreteType)&&r.concreteType.resolvedConcreteType?r.concreteType.resolvedConcreteType:r.concreteType,a=`__yo_dyn_box_${e.types[i.id]?.cName||`unknown_${i.id}`}`;if(n.has(a))continue;n.add(a);let s=P(i,e);t.emitLine(`static ${a}* __yo_new_${a}(${s} value) {`),t.emitLine(` ${a}* box = (${a}*)__yo_malloc(sizeof(${a}));`),t.emitLine(" box->header.ref_count = 1;"),t.emitLine(" box->header.gc_flags = 0;"),t.emitLine(" box->header.gc_mark = __YO_GC_UNMARKED;"),t.emitLine(" box->header.gc_next = NULL;"),t.emitLine(" box->header.gc_prev = NULL;"),t.emitLine(` box->header.dispose_fn = __yo_dispose_${a};`),t.emitLine(" box->header.traverse_fn = NULL; // TODO: Set if value contains GC types"),t.emitLine(" box->value = value;"),t.emitLine(" return box;"),t.emitLine("}"),t.emitLine(""),t.emitLine(`static void __yo_dispose_${a}(void* ptr) {`),t.emitLine(` ${a}* box = (${a}*)ptr;`);let u=(V(r.concreteType)&&r.concreteType.resolvedConcreteType?r.concreteType.resolvedConcreteType:r.concreteType).trait?.fields.find(_=>_.label===k.___drop[0]);if(u&&u.assignedValue&&ne(u.assignedValue)){let _=e.functions[u.assignedValue.funcId]?.cName;_&&t.emitLine(` ${_}(box->value);`)}t.emitLine("}"),t.emitLine("")}}function B_(e){let t=e.emitter;if(e.dynImpls.size!==0){t.emitDeclarationLine(""),t.emitDeclarationLine("// === Dyn Wrapper Functions ==="),t.emitDeclarationLine("// Wrappers that unwrap boxed values and call impl methods"),t.emitDeclarationLine("");for(let[n,r]of e.dynImpls){let i=r.dataType,o=new Set([k.___dup[0],k.___drop[0],k.___dispose[0],k.dispose[0]]);for(let{traitType:a}of r.dynType.requiredTraits){if(!kt(a))continue;let s=a.isFn.callType,l=P(s.return.type,e),u=`__yo_wrap_${n}_call`,_=["void* self_ptr"];for(let c=0;c<s.parameters.length;c++){let f=s.parameters[c],p=P(f.type,e);_.push(`${p} arg${c+1}`)}if(t.emitDeclarationLine(`static ${l} ${u}(${_.join(", ")}) {`),$n(i)){let c=e.types[i.id]?.cName||`unknown_${i.id}`,f=te(i.fields[0].label);t.emitDeclarationLine(` ${c}* box = (${c}*)self_ptr;`);let p=i.fields[0].type,m=V(p)&&p.resolvedConcreteType?p.resolvedConcreteType:p,g=e.implClosureCallMap.get(m.id),h=(()=>{if(g)return g.functionCName;for(let[,v]of Object.entries(e.functions))if(v.value.closureInfo?.captureType?.id===m.id)return v.cName})(),d=[];if(h){d.push(`(void*)&box->${f}`);for(let v=0;v<s.parameters.length;v++)d.push(`arg${v+1}`);kr(s.return.type)?t.emitDeclarationLine(` ${h}(${d.join(", ")});`):t.emitDeclarationLine(` return ${h}(${d.join(", ")});`)}else{d.push(`box->${f}.data`);for(let v=0;v<s.parameters.length;v++)d.push(`arg${v+1}`);kr(s.return.type)?t.emitDeclarationLine(` box->${f}.call(${d.join(", ")});`):t.emitDeclarationLine(` return box->${f}.call(${d.join(", ")});`)}}else{t.emitDeclarationLine(" (void)self_ptr; /* Dyn(Fn): expected Box(...) data */");for(let c=0;c<s.parameters.length;c++)t.emitDeclarationLine(` (void)arg${c+1};`);kr(s.return.type)?t.emitDeclarationLine(" return;"):(t.emitDeclarationLine(` ${l} zero = (${l})0;`),t.emitDeclarationLine(" return zero;"))}t.emitDeclarationLine("}"),t.emitDeclarationLine("")}for(let a=0;a<r.dynType.requiredTraits.length;a++){let{traitType:s}=r.dynType.requiredTraits[a];if(kt(s))continue;let l=r.traitValues[a];if(!l){t.emitDeclarationLine(`/* Warning: Module value missing for module ${a} */`);continue}let _=l.type.fields;for(let c=0;c<_.length;c++){let f=_[c];if(f.label==="Self"||o.has(f.label))continue;let p=l.fields[c];if(!p||!ne(p)){t.emitDeclarationLine(`/* Warning: Module field ${f.label} is not a function value */`);continue}let m=f.type;if(!G(m)){t.emitDeclarationLine(`/* Warning: Module field ${f.label} is not a function type */`);continue}let g=p.funcId,h=e.functions[g]?.cName;if(!h){t.emitDeclarationLine(`/* Warning: Impl function for ${f.label} not found */`);continue}let d=`__yo_wrap_${n}_${f.label}`,v=P(m.return.type,e),T=["void* self_ptr"];for(let C=1;C<m.parameters.length;C++){let R=m.parameters[C],N=P(R.type,e);T.push(`${N} arg${C}`)}t.emitDeclarationLine(`static ${v} ${d}(${T.join(", ")}) {`);let $=m.parameters[0]?.type,b;if($n(i)){let C=e.types[i.id]?.cName||`unknown_${i.id}`,R=te(i.fields[0].label);t.emitDeclarationLine(` ${C}* box = (${C}*)self_ptr;`),$&&Ie($)?b=`&box->${R}`:b=`box->${R}`}else{let C=P(r.concreteType,e);t.emitDeclarationLine(` ${C} concrete_value = (${C})self_ptr;`),$&&Ie($)?b="&concrete_value":b="concrete_value"}let L=[b];for(let C=1;C<m.parameters.length;C++)L.push(`arg${C}`);kr(m.return.type)?t.emitDeclarationLine(` ${h}(${L.join(", ")});`):t.emitDeclarationLine(` return ${h}(${L.join(", ")});`),t.emitDeclarationLine("}"),t.emitDeclarationLine("")}}}}}function G_(e){let t=e.emitter;if(e.dynImpls.size===0)return;t.emitDeclarationLine(""),t.emitDeclarationLine("// === Dyn TypeId Statics ==="),t.emitDeclarationLine("// Unique static per concrete type \u2014 address is the runtime TypeId"),t.emitDeclarationLine("");let n=new Set;e.typeIdStatics||(e.typeIdStatics=new Map);for(let[,r]of e.dynImpls){let i=V(r.concreteType)&&r.concreteType.resolvedConcreteType?r.concreteType.resolvedConcreteType:r.concreteType,o=e.types[i.id]?.cName||`unknown_${i.id}`,a=`__yo_typeid_${o}`;!n.has(a)&&!e.typeIdStatics.has(i.id)&&(n.add(a),e.typeIdStatics.set(i.id,a),t.emitDeclarationLine(`static const char ${a} = 0; // TypeId for ${o}`))}t.emitDeclarationLine(""),t.emitDeclarationLine("// === Dyn Static Vtables ==="),t.emitDeclarationLine("// Static vtables for dynamic dispatch"),t.emitDeclarationLine("");for(let[r,i]of e.dynImpls){let o=e.types[i.dynType.id]?.cName||`__yo_dyn_${i.dynType.id}`,a=V(i.concreteType)&&i.concreteType.resolvedConcreteType?i.concreteType.resolvedConcreteType:i.concreteType,s=e.types[a.id]?.cName||`unknown_${a.id}`,l=`__yo_vtable_${r}`,u=`${o}_vtable`,_=`__yo_typeid_${s}`;t.emitDeclarationLine(`// Vtable for impl(${s}, ${i.dynType.requiredTraits.map(({traitType:p})=>p.typeName||"?").join(" + ")})`),t.emitDeclarationLine(`static const ${u} ${l} = {`),t.emitDeclarationLine(` .__yo_type_id = (uintptr_t)&${_},`);let c=new Set,f=new Set([k.___dup[0],k.___drop[0],k.___dispose[0],k.dispose[0]]);for(let{traitType:p}of i.dynType.requiredTraits){if(kt(p)){let m=`__yo_wrap_${r}_call`;t.emitDeclarationLine(` .call = ${m},`),c.add("call");continue}for(let m of p.fields)if(m.label!=="Self"&&!f.has(m.label)&&!c.has(m.label)&&(c.add(m.label),G(m.type))){let g=m.type;if(g.parameters.length>0){let h=g.parameters[0];if(h&&h.label==="self"){let d=`__yo_wrap_${r}_${m.label}`;t.emitDeclarationLine(` .${te(m.label)} = ${d},`)}}}}t.emitDeclarationLine("};"),t.emitDeclarationLine("")}}function W_(e,t){let r=Pt(t)?"__declspec(thread)":"_Thread_local";e.emitLine(`
|
|
195
195
|
// ============================================================================
|
|
@@ -11019,28 +11019,28 @@ typedef enum {
|
|
|
11019
11019
|
static int32_t __yo_argc;
|
|
11020
11020
|
static uint8_t** __yo_argv;
|
|
11021
11021
|
static Slice_uint8_t_u42_ __yo_args;
|
|
11022
|
-
`),fc(i),yl(i),V_(i),w_(i),lc(i),ac(i),U_(i),B_(i),G_(i),z_(i),x_(i),r.isLibrary||sc(i),cc(i),L_(i),_c(i),i.needsIntelAsmSyntax&&(this._needsIntelAsmSyntax=!0),i.usesParallelism&&(this._usesParallelism=!0)}print(){return this.emitter.print()}getExportedFunctionNames(){return this.exportedFunctionNames}get needsIntelAsmSyntax(){return this._needsIntelAsmSyntax}get usesParallelism(){return this._usesParallelism}};var pc=0;function dc(e){return e.$?.variableName?!0:(e.$?.value!==void 0,!1)}function Ba(e,t){if(F(e)){e.$?.variableName&&t.add(e.$.variableName);for(let n of e.args)Ba(n,t);e.func&&Ba(e.func,t)}}function mc(e,t,n){let r=n,i=r.pendingDeferredDrops;if(!(!i||e.size===0)){r.shortCircuitHandledDropVarNames||(r.shortCircuitHandledDropVarNames=new Set);for(let o of i){let a=In(o);if(a&&e.has(a)){let s=M(o,t,n);s&&n.emitter.emitLine(`${t}${s};`),r.shortCircuitHandledDropVarNames.add(a)}}}}function yc(e,t,n){if(e.args.length===0)return"true";if(e.args.length===1)return M(e.args[0],t,n);let r=[];for(let l of e.args){let u=l.$?.value;if(
|
|
11022
|
+
`),fc(i),yl(i),V_(i),w_(i),lc(i),ac(i),U_(i),B_(i),G_(i),z_(i),x_(i),r.isLibrary||sc(i),cc(i),L_(i),_c(i),i.needsIntelAsmSyntax&&(this._needsIntelAsmSyntax=!0),i.usesParallelism&&(this._usesParallelism=!0)}print(){return this.emitter.print()}getExportedFunctionNames(){return this.exportedFunctionNames}get needsIntelAsmSyntax(){return this._needsIntelAsmSyntax}get usesParallelism(){return this._usesParallelism}};var pc=0;function dc(e){return e.$?.variableName?!0:(e.$?.value!==void 0,!1)}function Ba(e,t){if(F(e)){e.$?.variableName&&t.add(e.$.variableName);for(let n of e.args)Ba(n,t);e.func&&Ba(e.func,t)}}function mc(e,t,n){let r=n,i=r.pendingDeferredDrops;if(!(!i||e.size===0)){r.shortCircuitHandledDropVarNames||(r.shortCircuitHandledDropVarNames=new Set);for(let o of i){let a=In(o);if(a&&e.has(a)){let s=M(o,t,n);s&&n.emitter.emitLine(`${t}${s};`),r.shortCircuitHandledDropVarNames.add(a)}}}}function yc(e,t,n){if(e.args.length===0)return"true";if(e.args.length===1)return M(e.args[0],t,n);let r=[];for(let l of e.args){let u=l.$?.value;if(Pe(u)){if(u.value===!1)return"false";continue}r.push(l)}if(r.length===0)return"true";if(r.length===1)return M(r[0],t,n);if(!r.slice(1).some(l=>dc(l)))return`(${r.map(u=>M(u,t,n)).join(" && ")})`;let o=`__yo_sc_${pc++}`;n.emitter.emitLine(`${t}bool ${o} = false;`);let a=t,s=r.length-1;for(let l=0;l<r.length;l++){let u=M(r[l],a,n);l<r.length-1?(n.emitter.emitLine(`${a}if (${u}) {`),a+=" "):n.emitter.emitLine(`${a}${o} = ${u};`)}for(let l=s-1;l>=0;l--){let u=r[l+1],_=new Set;Ba(u,_),mc(_,a,n),a=a.slice(2),n.emitter.emitLine(`${a}}`)}return o}function gc(e,t,n){if(e.args.length===0)return"false";if(e.args.length===1)return M(e.args[0],t,n);let r=[];for(let l of e.args){let u=l.$?.value;if(Pe(u)){if(u.value===!0)return"true";continue}r.push(l)}if(r.length===0)return"false";if(r.length===1)return M(r[0],t,n);if(!r.slice(1).some(l=>dc(l)))return`(${r.map(u=>M(u,t,n)).join(" || ")})`;let o=`__yo_sc_${pc++}`;n.emitter.emitLine(`${t}bool ${o} = true;`);let a=t,s=r.length-1;for(let l=0;l<r.length;l++){let u=M(r[l],a,n);l<r.length-1?(n.emitter.emitLine(`${a}if (!(${u})) {`),a+=" "):n.emitter.emitLine(`${a}${o} = ${u};`)}for(let l=s-1;l>=0;l--){let u=r[l+1],_=new Set;Ba(u,_),mc(_,a,n),a=a.slice(2),n.emitter.emitLine(`${a}}`)}return o}function hc(e,t,n){let r=e.args[0];if(!r)return"// Error: __yo_arc_dispose requires exactly 1 argument";let i=M(r,t,n),o=r.$?.type;return!o||!bt(o)?"// Error: __yo_arc_dispose requires an Arc type":`__yo_arc_dispose_${P(o,n)}(${i})`}function vl(e){let t=e.func.$?.value;return O(t)&&bt(t.value)&&e.args.length===1}function vc(e,t,n){if(!vl(e))return"/* Error: generateArcTypeCall called on non-Arc type call */";let i=(e.func.$?.value).value,o=i.childType,a=e.args[0],s=M(a,t,n),l=P(i,n),u=P(o,n);return n.arcTypes||(n.arcTypes=new Map),n.arcTypes.has(l)||n.arcTypes.set(l,{childTypeCName:u,arcType:i}),`__yo_create_arc_${l}(${s})`}function Tc(e,t,n){let r=e.$?.runtimeArgExprsInOrder,i=e.$?.type,o=e.$?.variableName;if(ke(i)&&r){let a=n,s=r.map(u=>{let _=M(u,t,n);if(u.$?.deferredDupExpressions&&u.$.deferredDupExpressions.length>0){rt(u,t,a);let c=u.$.deferredDupExpressions[0];if(F(c)&&c.$?.variableName)return Ee(c.$.variableName,c.$.env)}return _}).join(", "),l=P(i,n);if(o&&e.$?.type){let u=`(${l}){ .data = { ${s} } }`,_=st(e.$.type,o,n);return n.emitter.emitLine(`${t}${_} = ${u};`),o}else return`(${l}){ .data = { ${s} } }`}}function Ec(e,t,n){let r=n.emitter,i=e.args[0],o=e.args[1],a=i.$?.value;if(!a||!O(a)||!ke(a.value))return"/* ERROR: __yo_array_fill first argument must be an ArrayType */";let s=a.value,l=s.length;if(!Ue(l))return"/* ERROR: __yo_array_fill requires compile-time known array length */";let u=P(s,n),_=M(o,t,n),c=e.$?.variableName||`temp_array_${Date.now()}`,f=`i_${Ye(e.$?.env.modulePath??"")}`;return r.emitLine(`${t}${u} ${c};`),r.emitLine(`${t}for (int ${f} = 0; ${f} < ${l.value}; ${f}++) {`),r.emitLine(`${t} ${c}.data[${f}] = ${_};`),r.emitLine(`${t}}`),c}function $c(e,t,n){if(e.$?.isCompileTimeOnlyAssignment)return"";let r=e.args[0],i=e.args[1],o=!1;if(F(r)&&E(r,":",2)&&(o=!0,r=r.args[0]),F(r)&&E(r,I.comptime)||F(r)&&E(r,I.given))return"";if(r.$?.pathCollection&&r.$?.pathCollection.length>0){let l=r.$.pathCollection[0];if(l&&l.length>=2){let u=l[0];if(typeof u=="string"&&r.$?.env){let _=X(r.$.env,u);if(_.length>0&&_[_.length-1].isCompileTimeOnly)return""}}}if(U(r)&&r.$?.env){let l=r.token.value,u=X(r.$.env,l);if(u.length>0&&u[u.length-1].isCompileTimeOnly)return""}if(!r.$?.type)return`// Error: No type information for left-hand side ${w(r)}
|
|
11023
11023
|
`;let a=M(r,t,n),s=!1;if(e.$?.variableName){let l=e.$.variableName,u=n;if((u.inAsyncStateMachine||u.inEffectStateMachine)&&a.startsWith("sm->")){let c=u.stateMachineVariables?.get(l);if(!c&&u.stateMachineVariables){for(let[,f]of u.stateMachineVariables)if(f.name===l){c=f;break}}if(c&&c.kind!=="outer"){let f=`var_${c.id}`;fe(r.$.type)||n.emitter.emitLine(`${t}sm->${f} = ${a}; // Save old value for deferred drop`)}else s=!0}else{let c=st(r.$.type,l,n);ke(r.$.type)?n.emitter.emitLine(`${t}${c} = ${a}; // Save old value for later use`):fe(r.$.type)||n.emitter.emitLine(`${t}${c} = ${a}; // Save old value for later use`)}}if(ke(r.$.type)){let l=M(i,t,n),u=F(i)&&i.$?.closureFunctionValue&&i.$?.type&&Wt(i.$.type),_=n,c=l;if(!u&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){if(i.$?.variableName&&i.$?.type){let p=Ee(i.$.variableName,i.$.env);if(p!==l.trim()){let m=i.$.convertedRuntimeType||i.$.type,g=P(m,n);n.emitter.emitLine(`${t}${g} ${p} = ${l};`)}}rt(i,t,_);let f=i.$.deferredDupExpressions[0];F(f)&&f.$?.variableName&&(c=Ee(f.$.variableName,f.$.env))}if(o){let f=st(r.$.type,M(r,t,n),n);n.emitter.emitLine(`${t}${f} = ${c};`)}else n.emitter.emitLine(`${t}${a} = ${c};`)}else{let l=M(i,t,n),u=F(i)&&i.$?.closureFunctionValue&&i.$?.type&&Wt(i.$.type),_=n,c=l;if(!u&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){if(i.$?.variableName&&i.$?.type){let p=Ee(i.$.variableName,i.$.env);if(p!==l.trim()){let m=i.$.convertedRuntimeType||i.$.type,g=P(m,n);n.emitter.emitLine(`${t}${g} ${p} = ${l};`)}}rt(i,t,_);let f=i.$.deferredDupExpressions[0];F(f)&&f.$?.variableName&&(c=Ee(f.$.variableName,f.$.env))}if(!fe(r.$.type)){let f=r.$.type,p=i.$?.type,m,g=ut(i.$.env.modulePath,c.trim());g&&n.tempVarAsyncStructNames&&(m=n.tempVarAsyncStructNames.get(c.trim()));let h=o&&p&&be(f)&&be(p),d;g&&h?m?d=`${m}*`:d=P(p,n):h&&m?d=`${m}*`:d=P(h?p:f,n);let v=(_.inAsyncStateMachine||_.inEffectStateMachine)&&a.startsWith("sm->");n.emitter.emitLine(`${t}${o&&!v?d+" ":""}${a} = ${c};`)}}return s?"":e.$?.variableName??""}function Cc(e,t,n){let r=e.args[0];if(!r)return"// Error: await requires exactly 1 argument";let i=r.$?.type;if(!i||!be(i))return"// Error: await argument must be a Future type";let o=Dt(i);if(!o)return"// Error: could not extract Future module from type";let a=n;if(a.inAsyncStateMachine||a.inEffectStateMachine)return"";if(fn(e)){let s=M(r,t,n),l=P(i,n),u=o.isFuture.outputType;V(u)&&(u.resolvedConcreteType?u=u.resolvedConcreteType:e.$?.type&&!V(e.$.type)?u=e.$.type:e.$?.type&&V(e.$.type)&&e.$.type.resolvedConcreteType&&(u=e.$.type.resolvedConcreteType));let _=a.emitter,c=fe(u)||V(u)&&fe(e.$?.type??u),f=e.$?.variableName?`__sync_future_${e.$.variableName}`:"__sync_future",p=e.$?.variableName?`__pre_await_state_${e.$.variableName}`:"__pre_await_state";_.emitLine(`${t}// Synchronous await (io.await outside state machine)`),_.emitLine(`${t}${l} ${f} = ${s};`),_.emitLine(`${t}int ${p} = ${f}->state;`),jo(r.$?.type)||(_.emitLine(`${t}if (${p} == 0 && ${f}->__yo_resume_fn) {`),_g(e,f,t,n),_.emitLine(`${t} __yo_incr_rc((void*)${f}); // event loop reference`),_.emitLine(`${t} ${f}->__yo_resume_fn((void*)${f});`),_.emitLine(`${t}}`)),_.emitLine(`${t}{`),_.emitLine(`${t} int __await_state = ${f}->state;`),_.emitLine(`${t} while (__await_state != -1 && __await_state != -2) {`),_.emitLine(`${t} __yo_async_poll_step();`),_.emitLine(`${t} __await_state = ${f}->state;`),_.emitLine(`${t} }`),_.emitLine(`${t} if (__await_state == -2) {`);let g=Dt(i),h=g?.isFuture.effects?.some(d=>G(d.type)||Te(d.type)||d.isEffectRowSpread)??!1;if(h){_.emitLine(`${t} if (${p} == -2) {`),_.emitLine(`${t} fprintf(stderr, "panic: attempted to await an aborted Future\\n");`),_.emitLine(`${t} abort();`),_.emitLine(`${t} }`);let d=a.pendingDeferredDrops;if(d){let $=e.$?.variableName;a.pendingDeferredDrops=d.filter(b=>In(b)!==$)}dn(t+" ",a,e),a.pendingDeferredDrops=d;let v=ug(g,a),T=a.currentFunctionType?.return?.type;if(v)if(_.emitLine(`${t} __yo_effect_escaped = 0;`),T&&!fe(T)){let $=P(T,n);$!=="void"?(_.emitLine(`${t} ${$} _esc_result;`),_.emitLine(`${t} memcpy(&_esc_result, __yo_effect_escape_value, sizeof(${$}));`),_.emitLine(`${t} return _esc_result;`)):_.emitLine(`${t} return;`)}else _.emitLine(`${t} return;`);else if(_.emitLine(`${t} __yo_effect_escaped = 1;`),T&&!fe(T)){let $=P(T,n);_.emitLine(`${t} return (${$}){0};`)}else _.emitLine(`${t} return;`)}else _.emitLine(`${t} fprintf(stderr, "panic: attempted to await an aborted Future\\n");`),_.emitLine(`${t} abort();`);if(_.emitLine(`${t} }`),_.emitLine(`${t}}`),c)return"";{let d=e.$?.variableName||"__sync_await_result",v=P(u,n),T=st(u,d,n);if(h){if(_.emitLine(`${t}${T};`),_.emitLine(`${t}if (${f}->state == -1) {`),Le(u)){let $=On(u,n);$?_.emitLine(`${t} ${d} = ${$}(${f}->result);`):_.emitLine(`${t} ${d} = ${f}->result;`)}else _.emitLine(`${t} ${d} = ${f}->result;`);_.emitLine(`${t}} else {`),_.emitLine(`${t} ${d} = (${v}){0};`),_.emitLine(`${t}}`)}else if(Le(u)){let $=On(u,n);$?_.emitLine(`${t}${T} = ${$}(${f}->result);`):_.emitLine(`${t}${T} = ${f}->result;`)}else _.emitLine(`${t}${T} = ${f}->result;`);return d}}return"// Error: await should only be used inside async blocks"}function kc(e,t,n){let r=e.args[0];if(!r)return"// Error: io.state requires exactly 1 argument";let i=r.$?.type;if(!i||!be(i))return"// Error: io.state argument must be a Future type";let a=n.emitter,s=M(r,t,n),l=e.$?.variableName?`__raw_state_${e.$.variableName}`:"__raw_state",u=e.$?.variableName||"__io_state_result";return a.emitLine(`${t}int ${l} = ${s}->state;`),a.emitLine(`${t}int32_t ${u} = (${l} > 0) ? 1 : ${l};`),u}function wc(e,t,n){let i=n.emitter,o=F(e.func)?e.func.args[0]:e.args[0];if(!o)return"// Error: JoinHandle.await requires a self argument";let a=M(o,t,n),s=e.$?.type;if(!s||!ge(s))return"// Error: JoinHandle.await return type must be Option(T)";let l=P(s,n),_=s.variants.find(b=>b.name==="Some")?.fields?.[0]?.type,c=!_||fe(_),f=c?"uint8_t":_?P(_,n):"uint8_t",p=Bt(s,"Some",n),m=Bt(s,"None",n),g=e.$?.variableName||"jh",h=`__jh_future_${g}`,d=`__jh_header_${g}`,v=e.$?.variableName||"__jh_result",T=`__yo_jh_header_${g}`;i.emitLine(`${t}// JoinHandle.await \u2014 poll spawned task, return Option(T)`);let $=st(s,v,n);if(i.emitLine(`${t}${$};`),i.emitLine(`${t}{`),i.emitLine(`${t} void* ${h} = ${a}.__future;`),i.emitLine(`${t} struct ${T} {`),i.emitLine(`${t} __yo_ref_header_t header;`),i.emitLine(`${t} int state;`),i.emitLine(`${t} ${f} result;`),i.emitLine(`${t} void (*continuation_fn)(void*);`),i.emitLine(`${t} void* continuation_sm;`),i.emitLine(`${t} void (*__yo_resume_fn)(void*);`),i.emitLine(`${t} };`),i.emitLine(`${t} struct ${T}* ${d} = (struct ${T}*)${h};`),i.emitLine(`${t} int __jh_state = ${d}->state;`),i.emitLine(`${t} while (__jh_state != -1 && __jh_state != -2) {`),i.emitLine(`${t} __yo_async_poll_step();`),i.emitLine(`${t} __jh_state = ${d}->state;`),i.emitLine(`${t} }`),i.emitLine(`${t} if (__jh_state == -1) {`),c)i.emitLine(`${t} ${v} = (${l}){ .tag = ${p} };`);else if(_&&Le(_)){let b=On(_,n);b?i.emitLine(`${t} ${v} = (${l}){ .tag = ${p}, .data = { .Some = { .value = ${b}(${d}->result) } } };`):i.emitLine(`${t} ${v} = (${l}){ .tag = ${p}, .data = { .Some = { .value = ${d}->result } } };`)}else i.emitLine(`${t} ${v} = (${l}){ .tag = ${p}, .data = { .Some = { .value = ${d}->result } } };`);return i.emitLine(`${t} } else {`),i.emitLine(`${t} __yo_effect_escaped = 0;`),i.emitLine(`${t} ${v} = (${l}){ .tag = ${m} };`),i.emitLine(`${t} }`),i.emitLine(`${t}}`),v}function ug(e,t){let n=e.isFuture.effects;if(!n?.length)return!1;let r=Fc(n),i=t.currentEvidenceParams;for(let o of r)if(G(o.type)){let a=`${o.label}.${o.label}`;if(!i?.has(a))return!0}else if(Te(o.type)){let a=!1;if(i){for(let[s]of i)if(s.startsWith(`${o.label}.`)){a=!0;break}}if(!a)return!0}return!1}function Fc(e){let t=[];for(let n of e)if(n.isEffectRowSpread){let r=n.type;V(r)&&r.resolvedConcreteType&&(r=r.resolvedConcreteType),ot(r)&&t.push(...r.implicitParameters)}else t.push(n);return t}function _g(e,t,n,r){let i=e.args[0];if(!i?.$?.type)return;let o=Dt(i.$.type);if(!o?.isFuture.effects?.length)return;let a=Fc(o.isFuture.effects),s=r,l=s.emitter,u=e.args.find(_=>F(_)&&E(_,I.using));if(u){let _=u.args;for(let c=0;c<a.length&&c<_.length;c++){let f=a[c],p=_[c];if(G(f.type)){let m=M(p,n,r),g=f.label;l.emitLine(`${n} ${t}->__capture.${g} = (void*)${m};`)}else Te(f.type)&&bc(f.type,t,n,p.$?.value,s,e)}}else for(let _ of a)if(G(_.type)){let c=fg(_.label,s,e);c&&l.emitLine(`${n} ${t}->__capture.${_.label} = (void*)${c};`)}else Te(_.type)&&bc(_.type,t,n,void 0,s,e)}function bc(e,t,n,r,i,o){let a=i.emitter;for(let s of e.fields){if(!G(s.type))continue;let l;if(i.stateMachineVariables){for(let[,u]of i.stateMachineVariables)if(u.name===s.label&&u.kind==="outer"){l=`sm->__capture.${s.label}`;break}}if(!l&&r&&We(r)){let u=e.fields.indexOf(s),_=r.fields[u];if(_&&ne(_)){let c=i.functions[_.funcId];c&&(l=c.cName)}}if(!l&&i.currentEvidenceParams){for(let u of i.currentEvidenceParams.values())if(u.fieldLabel===s.label){l=u.cParamName;break}}l||(l=cg(s.label,e,i,o)),l&&a.emitLine(`${n} ${t}->__capture.${s.label} = (void*)${l};`)}}function cg(e,t,n,r){let i=r.$?.env??r.func.$?.env;if(!i)return;let o=pn(i,a=>a.isImplicit===!0);for(let a=o.length-1;a>=0;a--){let s=o[a],l=s.value?.[s.value.length-1];if(l&&We(l)){let u=l.type.fields.findIndex(_=>_.label===e);if(u>=0){let _=l.fields[u];if(_&&ne(_)){let c=n.functions[_.funcId]?.cName;if(c)return c}}}}}function fg(e,t,n){if(t.currentEvidenceParams){for(let r of t.currentEvidenceParams.values())if(r.fieldLabel===e)return r.cParamName}if(t.stateMachineVariables){for(let[,r]of t.stateMachineVariables)if(r.name===e&&r.kind==="outer")return`sm->__capture.${e}`}}function Lc(e,t,n){let r=e.$?.variableName,i=e.$?.type,o=n;if(r&&i){!fe(i)&&!nt(e.$?.controlFlow)&&n.emitter.emitLine(`${t}${P(i,n)} ${r};`),n.emitter.emitLine(`${t}{ // begin block`);let a=o.pendingDeferredDrops,s=e.$?.deferredDropExpressions??[];o.pendingDeferredDrops=[...s,...a??[]];let l=o.consumedVarPendingDrops,u=e.$?.consumedVariableDropExpressions??[];o.consumedVarPendingDrops=[...u,...l??[]];let _=[],c=!fe(i)&&!nt(e.$?.controlFlow);for(let f=0;f<e.args.length;f++){let p=e.args[f],m=M(p,t+" ",n);_.push(m);let g=f===e.args.length-1;m&&!(g&&c)&&(p.$&&ut(p.$.env.modulePath,m)||n.emitter.emitLine(`${t} ${m};`))}if(c){let f=e.args[e.args.length-1],p=_[_.length-1];if(f.$?.deferredDupExpressions&&f.$.deferredDupExpressions.length>0){if(f.$?.variableName){let g=f.$.variableName;f.$.variableName=void 0;let h=M(f,t+" ",n);f.$.variableName=g;let d=P(f.$.type,n),v=Ee(g,f.$.env);v!==h&&n.emitter.emitLine(`${t} ${d} ${v} = ${h};`),p=v}rt(f,t+" ",n);let m=f.$.deferredDupExpressions[0];F(m)&&m.$?.variableName&&(p=Ee(m.$.variableName,m.$.env))}n.emitter.emitLine(`${t} ${r} = ${p};`)}if(e.$?.deferredDropExpressions)for(let f of e.$.deferredDropExpressions){if(o.shortCircuitHandledDropVarNames){let m=In(f);if(m&&o.shortCircuitHandledDropVarNames.has(m)){o.shortCircuitHandledDropVarNames.delete(m);continue}}let p=M(f,t+" ",n);p&&n.emitter.emitLine(`${t} ${p};`)}return n.emitter.emitLine(`${t}} // end begin block`),o.pendingDeferredDrops=a,o.consumedVarPendingDrops=l,fe(i)||nt(e.$?.controlFlow)?"":r}else{n.emitter.emitLine(`${t}{ // begin block`);let a=o.pendingDeferredDrops,s=e.$?.deferredDropExpressions??[];o.pendingDeferredDrops=[...s,...a??[]];let l=o.consumedVarPendingDrops,u=e.$?.consumedVariableDropExpressions??[];if(o.consumedVarPendingDrops=[...u,...l??[]],e.args.map(c=>M(c,t+" ",n)).forEach(c=>{c&&n.emitter.emitLine(`${t} ${c};`)}),e.$?.deferredDropExpressions)for(let c of e.$.deferredDropExpressions){if(o.shortCircuitHandledDropVarNames){let p=In(c);if(p&&o.shortCircuitHandledDropVarNames.has(p)){o.shortCircuitHandledDropVarNames.delete(p);continue}}let f=M(c,t+" ",n);f&&n.emitter.emitLine(`${t} ${f};`)}return n.emitter.emitLine(`${t}} // end begin block`),o.pendingDeferredDrops=a,o.consumedVarPendingDrops=l,""}}function Ac(e,t,n){let r=e.args[0];if(F(r)&&E(r,I.comptime,1)||F(r)&&E(r,I.given,1))return"";if(!r.$?.type)return`// Error: No type information for left-hand side ${w(r)}
|
|
11024
|
-
`;let i=r.token.value,o=st(r.$.type,i,n);return n.emitter.emitLine(`${t}${o};`),""}function Ic(e,t,n){if(e.$){let r=e.$.variableName,i=e.$.type,o=i&&fe(i),a=-1;for(let c=0;c<e.args.length;c++){let f=e.args[c];if(F(f)&&E(f,"=>",2)){let p=f.args[0];if(p&&!(
|
|
11025
|
-
`;if(r.$?.env){let u=X(r.$.env,a);if(u.length>0&&u[u.length-1].isCompileTimeOnly)return""}let s=!1,l;if((o.inAsyncStateMachine||o.inEffectStateMachine)&&o.stateMachineVariables&&r.$?.env){let u=X(r.$.env,a);if(u.length>0){let _=u[u.length-1],c=_.isOwningTheSameRcValueAs?_.isOwningTheSameRcValueAs.id:_.id;o.stateMachineVariables.has(c)&&(s=!0,l=c)}}if(ke(r.$.type))if(F(i)&&E(i,I.array)){let u=M(i,t,n);if(s&&l){let _=rn(l,"local",o.stateMachineFieldAliases);n.emitter.emitLine(`${t}sm->${_} = ${u};`)}else if(!fe(r.$.type)){let _=st(r.$.type,a,n);n.emitter.emitLine(`${t}${_} = ${u};`)}}else{let u;if(i.$?.variableName){let _=Ee(i.$.variableName,i.$.env),c=M(i,t,n);if(!s){let f=st(i.$.type,_,n);_!==c&&n.emitter.emitLine(`${t}${f} = ${c};`)}u=_}else u=M(i,t,n);if(s&&l){let _=rn(l,"local",o.stateMachineFieldAliases);n.emitter.emitLine(`${t}sm->${_} = ${u};`)}else if(!fe(r.$.type)){let _=st(r.$.type,a,n);n.emitter.emitLine(`${t}${_} = ${u};`)}}else{let u,_=F(i)&&i.$?.closureFunctionValue&&i.$?.type&&Wt(i.$.type),c=F(i)&&Rt(i);if(i.$?.variableName){let f=Ee(i.$.variableName,i.$.env),p=Ee(a,r.$.env);if(f===p){if(u=M(i,t,n),!_&&!c&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){rt(i,t,o);let m=i.$.deferredDupExpressions[0];F(m)&&m.$?.variableName&&(u=Ee(m.$.variableName,m.$.env))}}else if(U(i)&&f===Ee(i.token.value,i.$.env)){if(u=M(i,t,n),!_&&!c&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){rt(i,t,o);let m=i.$.deferredDupExpressions[0];F(m)&&m.$?.variableName&&(u=Ee(m.$.variableName,m.$.env))}}else if(U(i)&&o.currentClosureCaptures&&o.currentClosureCaptures.includes(i.token.value)&&i.$?.env&&o.currentClosureCaptureFrameLevel!==void 0&&$r(i.token.value,i.$.env,o.currentClosureCaptureFrameLevel)){let m=o.currentClosureType;if(m&&m.isClosure){let g=Object.values(o.types).find(h=>h.type===m);g?u=`((${`${g.cName}_capture`}*)closure_context->data)->${Ee(i.token.value,i.$.env)}`:u=`closure_context->${Ee(i.token.value,i.$.env)}`}else u=`closure_context->${Ee(i.token.value,i.$.env)}`}else{let m=M(i,t,n);if(m.trim()!==f){let g=i.$.convertedRuntimeType||i.$.type,h=st(g,f,n);n.emitter.emitLine(`${t}${h} = ${m};`)}if(!_&&!c&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){rt(i,t,o);let g=i.$.deferredDupExpressions[0];F(g)&&g.$?.variableName?u=Ee(g.$.variableName,g.$.env):u=f}else u=f}}else if(u=M(i,t,n),!_&&!c&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){rt(i,t,o);let f=i.$.deferredDupExpressions[0];F(f)&&f.$?.variableName&&(u=Ee(f.$.variableName,f.$.env))}if(Qe(r.$.type)){let f=r.$.type;if(s&&l){let p=rn(l,"local",o.stateMachineFieldAliases);n.emitter.emitLine(`${t}sm->${p} = ${u};`)}else if(!fe(f)){let p=st(f,a,n);n.emitter.emitLine(`${t}${p} = ${u};`)}}else if(s&&l){let f=rn(l,"local",o.stateMachineFieldAliases);n.emitter.emitLine(`${t}sm->${f} = ${u};`)}else{let f=ut(i.$.env.modulePath,u.trim()),p;if(f&&n.tempVarAsyncStructNames){let m=n.tempVarAsyncStructNames.get(u.trim());m?p=`${m}*`:p=P(r.$.type,n)}else p=P(r.$.type,n);fe(r.$.type)||n.emitter.emitLine(`${t}${p} ${Ee(a,r.$.env)} = ${u};`)}}return""}}var pg=0;function Xo(e,t,n,r,i=" "){if(k.__yo_op_add.includes(e))return`((${t[0]}) + (${t[1]}))`;if(k.__yo_op_sub.includes(e))return`((${t[0]}) - (${t[1]}))`;if(k.__yo_op_mul.includes(e))return`((${t[0]}) * (${t[1]}))`;if(k.__yo_op_div.includes(e))return`((${t[0]}) / (${t[1]}))`;if(k.__yo_op_mod.includes(e))return`((${t[0]}) % (${t[1]}))`;if(k.__yo_op_neg.includes(e))return`(-(${t[0]}))`;if(k.__yo_op_eq.includes(e))return`((${t[0]}) == (${t[1]}))`;if(k.__yo_op_neq.includes(e))return`((${t[0]}) != (${t[1]}))`;if(k.__yo_op_lt.includes(e))return`((${t[0]}) < (${t[1]}))`;if(k.__yo_op_lte.includes(e))return`((${t[0]}) <= (${t[1]}))`;if(k.__yo_op_gt.includes(e))return`((${t[0]}) > (${t[1]}))`;if(k.__yo_op_gte.includes(e))return`((${t[0]}) >= (${t[1]}))`;if(k.__yo_op_not.includes(e))return`(!(${t[0]}))`;if(k.__yo_op_bit_and.includes(e))return`((${t[0]}) & (${t[1]}))`;if(k.__yo_op_bit_or.includes(e))return`((${t[0]}) | (${t[1]}))`;if(k.__yo_op_bit_xor.includes(e))return`((${t[0]}) ^ (${t[1]}))`;if(k.__yo_op_bit_complement.includes(e))return`(~(${t[0]}))`;if(k.__yo_op_bit_left_shift.includes(e))return`((${t[0]}) << (${t[1]}))`;if(k.__yo_op_bit_right_shift.includes(e))return`((${t[0]}) >> (${t[1]}))`;if(k.__yo_noop.includes(e))return"";if(k.__yo_return_self.includes(e))return`(*${t[0]})`;if(k.__yo_ms_sleep.includes(e))return Pt(r.targetInfo)?`Sleep(${t[0]})`:`usleep((${t[0]}) * 1000)`;if(k.__yo_decr_rc.includes(e))return`__yo_decr_rc((void*)(${t[0]}))`;if(k.__yo_as.includes(e)&&n.$?.type){let o=P(n.$.type,r),a=n.args[0]?.$?.type;return a&&ge(a)&&!Fn(a)?`((${o})((${t[0]}).tag))`:`((${o})(${t[0]}))`}else{if(k.__yo_ptr_add.includes(e))return`(${t[0]} + ${t[1]})`;if(k.__yo_ptr_sub.includes(e))return`(${t[0]} - ${t[1]})`;if(k.__yo_ptr_diff.includes(e))return`(${t[0]} - ${t[1]})`;if(k.__yo_ptr_eq.includes(e))return`(${t[0]} == ${t[1]})`;if(k.__yo_ptr_neq.includes(e))return`(${t[0]} != ${t[1]})`;if(k.__yo_ptr_lt.includes(e))return`(${t[0]} < ${t[1]})`;if(k.__yo_ptr_lte.includes(e))return`(${t[0]} <= ${t[1]})`;if(k.__yo_ptr_gt.includes(e))return`(${t[0]} > ${t[1]})`;if(k.__yo_ptr_gte.includes(e))return`(${t[0]} >= ${t[1]})`;if(k.__yo_slice_len.includes(e))return`(${t[0]}.length)`;if(k.__yo_slice_new.includes(e)&&n.$?.type)return`(${P(n.$.type,r)}){ .data = ${t[0]}, .length = ${t[1]} }`;if(k.__yo_getrandom.includes(e))return`getrandom(${t[0]}, ${t[1]}, ${t[2]})`;if(k.__yo_arc4random_buf.includes(e))return`(arc4random_buf(${t[0]}, ${t[1]}), (void)0)`;if(k.__yo_bcrypt_gen_random.includes(e))return`(int32_t)BCryptGenRandom(NULL, ${t[0]}, ${t[1]}, BCRYPT_USE_SYSTEM_PREFERRED_RNG)`;if(k.__yo_getentropy.includes(e))return`getentropy(${t[0]}, ${t[1]})`;if(k.__yo_maybe_uninit_new.includes(e)&&n.$?.type){let o=P(n.$.type,r),a=`__yo_uninit_${pg++}`;return r.emitter.emitLine(`${i}${o} ${a};`),a}else return k.__yo_maybe_uninit_as_ptr.includes(e)&&n.$?.type?`((${P(n.$.type,r)})(${t[0]}))`:k.__yo_maybe_uninit_assume_init.includes(e)?`(${t[0]})`:`/* Unhandled operator ${e} */`}}function Mc(e,t,n){let r=e.args[0];if(!r)return"// Error: __yo_iso_extract requires exactly 1 argument";let i=M(r,t,n),o=r.$?.type;if(!o||!wt(o))return"// Error: __yo_iso_extract requires an Iso type";let a=P(o,n),s=e.$?.type;if(s&&n.isoTypes?.has(a)){let _=n.isoTypes.get(a);_.optionTypeCName||(_.optionTypeCName=P(s,n))}let l=`__yo_iso_extract_${a}(${i})`,u=e.$?.variableName;return u&&s?(n.emitter.emitLine(`${t}${P(s,n)} ${u} = ${l};`),u):l}function Oc(e,t,n){let r=e.args[0];if(!r)return"// Error: __yo_iso_dispose requires exactly 1 argument";let i=M(r,t,n),o=r.$?.type;return!o||!wt(o)?"// Error: __yo_iso_dispose requires an Iso type":`__yo_iso_dispose_${P(o,n)}(${i})`}function Tl(e){let t=e.func.$?.value;return O(t)&&wt(t.value)&&e.args.length===1}function Rc(e,t,n){if(!Tl(e))return"/* Error: generateIsoTypeCall called on non-Iso type call */";let i=(e.func.$?.value).value,o=i.childType,a=e.args[0],s=M(a,t,n),l=P(i,n),u=P(o,n);return n.isoTypes||(n.isoTypes=new Map),n.isoTypes.has(l)||n.isoTypes.set(l,{childTypeCName:u,isoType:i}),`__yo_create_iso_${l}(${s})`}function Vr(e){return e===""||e==="break"||e==="continue"||e.startsWith("goto")||e.includes("return")}function Dr(e,t,n){if(F(e)&&E(e,I.begin)){let r=e.args,i=n,o=i.pendingDeferredDrops,a=e.$?.deferredDropExpressions??[];i.pendingDeferredDrops=[...a,...o??[]];let s=i.consumedVarPendingDrops,l=e.$?.consumedVariableDropExpressions??[];i.consumedVarPendingDrops=[...l,...s??[]];for(let _=0;_<r.length-1;_++){let c=r[_],f=M(c,t,n);if(f&&n.emitter.emitLine(`${t}${f};`),nt(c.$?.controlFlow))break}let u="";if(r.length>0){let _=r[r.length-1];if(_.$?.deferredDupExpressions&&_.$.deferredDupExpressions.length>0){if(_.$?.variableName){let f=_.$.variableName;_.$.variableName=void 0;let p=M(_,t,n);_.$.variableName=f;let m=P(_.$.type,n),g=Ee(f,_.$.env);g!==p&&n.emitter.emitLine(`${t}${m} ${g} = ${p};`)}rt(_,t,n);let c=_.$.deferredDupExpressions[0];F(c)&&c.$?.variableName?u=Ee(c.$.variableName,c.$.env):u=M(_,t,n)}else u=M(_,t,n)}return e.$?.deferredDropExpressions&&Ct(e,t,n),i.pendingDeferredDrops=o,i.consumedVarPendingDrops=s,u}else return e.$?.deferredDupExpressions&&rt(e,t,n),M(e,t,n)}function zc(e,t,n){if(!e.$)return'/* "match" expression is not evaluated */';let r=e.$.variableName,i=e.$.type,o=i&&fe(i);if(!o&&r){let g=P(i,n);n.emitter.emitLine(`${t}${g} ${r};`)}let a=M(e.args[0],t,n),s=e.args[0].$?.type;if(!s)return'// Error: "match" expression requires a valid type';if(e.$.isPrimitiveMatch)return mg(e,t,n,a,s,r,o);let l,u;if(Ie(s)?(u=s.childType,l=s.tag):ft(s)?(u=s,l="ref_semantics"):u=s,!ge(u))return'// Error: "match" expression requires an enum type';if(!n.types[u.id]?.cName)return`// Error: "match" expression enum type ${u.typeName} has no C name`;let c=qt(u);if(c){let g=e.args.slice(1),h=null,d=null;for(let v of g)if(F(v)&&E(v,"=>",2)){if(!v.args[0]?.$?.caseExecuted)continue;let T=v.args[0],$=v.args[1];if(T&&$&&F(T)&&E(T,"."))h={caseBody:$};else{let b=T.func;if(b&&F(b)&&E(b,".")){let L=b.args[0];if(L&&U(L)){let C=L.token.value;d={caseBody:$,variantName:C,casePattern:T}}}}}if(n.emitter.emitLine(`${t}if (${l&&l!=="ref_semantics"?"*":""}${a} != NULL) {`),d){let v;if(F(d.casePattern)&&d.casePattern.args.length>0){let L=d.casePattern.args[0];if(L&&U(L)){v=te(L.token.value);let C=c;n.emitter.emitLine(`${t} ${P(C,n)} ${v} = ${a};`)}}let T=n;v&&(T.inAsyncStateMachine||T.inEffectStateMachine)&&(T.localShadowedVariables||(T.localShadowedVariables=new Set),T.localShadowedVariables.add(v));let $=Dr(d.caseBody,t+" ",n);v&&T.localShadowedVariables&&T.localShadowedVariables.delete(v);let b=Vr($);if(!o&&r&&!b){let L=$||a;n.emitter.emitLine(`${t} ${r} = ${L};`)}else $&&$!==""&&n.emitter.emitLine(`${t} ${$};`)}if(n.emitter.emitLine(`${t}} else {`),h){let v=Dr(h.caseBody,t+" ",n),T=Vr(v);!o&&r&&!T?n.emitter.emitLine(`${t} ${r} = ${v};`):v&&v!==""&&n.emitter.emitLine(`${t} ${v};`)}return n.emitter.emitLine(`${t}}`),o?"":r??""}if(Fn(u)){n.emitter.emitLine(`${t}switch (${l&&l!=="ref_semantics"?"*":""}${a}) {`);let g=n.insideMatch;n.insideMatch=!0;let h=e.args.slice(1);for(let d=0;d<h.length;d++){let v=h[d];if(F(v)&&E(v,"=>",2)){if(!v.args[0]?.$?.caseExecuted)continue;let T=v.args[0],$=v.args[1];if(T&&$&&U(T)&&T.token.value==="_"){n.emitter.emitLine(`${t}default: {`);let b=Dr($,t+" ",n);!o&&r&&b&&!Vr(b)?n.emitter.emitLine(`${t} ${r} = ${b};`):b&&n.emitter.emitLine(`${t} ${b};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`)}else if(T&&$&&F(T)&&E(T,".",1)){let b=T.args[0].token.value,L=Bt(u,b,n);n.emitter.emitLine(`${t}case ${L}: {`);let C=Dr($,t+" ",n);!o&&r&&C&&!Vr(C)?n.emitter.emitLine(`${t} ${r} = ${C};`):C&&n.emitter.emitLine(`${t} ${C};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`)}}}return n.insideMatch=g,n.emitter.emitLine(`${t}}`),o?"":r??""}n.emitter.emitLine(`${t}switch (${l==="ref_semantics"||l?a+"->tag":"("+a+").tag"}) {`);let p=n.insideMatch;n.insideMatch=!0;let m=e.args.slice(1);for(let g=0;g<m.length;g++){let h=m[g];if(F(h)&&E(h,"=>",2)){if(!h.args[0]?.$?.caseExecuted)continue;let d=h.args[0],v=h.args[1];if(d&&v&&U(d)&&d.token.value==="_"){n.emitter.emitLine(`${t}default: {`);let T=Dr(v,t+" ",n);!o&&r&&T&&!Vr(T)?n.emitter.emitLine(`${t} ${r} = ${T};`):T&&n.emitter.emitLine(`${t} ${T};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`)}else if(d&&v&&F(d)&&d.func.tag==="Atom"&&d.func.token.value==="."&&d.args.length>=1){let T=d.args[0].token.value,$=Bt(u,T,n);if(n.emitter.emitLine(`${t}case ${$}: {`),d.args.length>1){let L=u.variants.find(C=>C.name===T);if(L&&L.fields){let C=d.args.slice(1);if(C.some(N=>F(N)&&E(N,":",2))){for(let N of C)if(F(N)&&E(N,":",2)){let B=N.args[0],D=N.args[1];if(!U(B))continue;let x=B.token.value,z=L.fields.find(re=>re.label===x);if(!z||fe(z.type))continue;if(U(D)){let re=D.token.value;if(re!=="_"){let j=te(re),W=te(x),le=P(z.type,n),ce=l==="ref_semantics"||l?"->":".";n.emitter.emitLine(`${t} ${le} ${j} = ${a}${ce}data.${T}.${W};`);let ve=n;if((ve?.inAsyncStateMachine||ve?.inEffectStateMachine)&&ve.stateMachineVariables){let Y;if(D.$?.env){let Z=X(D.$.env,re);Z.length>0&&(Y=Z[Z.length-1].id)}if(Y&&ve.stateMachineVariables.has(Y)){let Z=rn(Y,"local",ve.stateMachineFieldAliases);n.emitter.emitLine(`${t} sm->${Z} = ${j};`)}}}}}}else for(let N=0;N<C.length&&N<L.fields.length;N++){let B=C[N],D=L.fields[N];if(U(B)&&D){if(fe(D.type))continue;let x=B.token.value;if(x!=="_"){let z=te(x),re=te(D.label),j=P(D.type,n),W=l==="ref_semantics"||l?"->":".";n.emitter.emitLine(`${t} ${j} ${z} = ${a}${W}data.${T}.${re};`);let le=n;if((le?.inAsyncStateMachine||le?.inEffectStateMachine)&&le.stateMachineVariables){let ce;if(B.$?.env){let ve=X(B.$.env,x);ve.length>0&&(ce=ve[ve.length-1].id)}ce&&le.stateMachineVariables.has(ce)&&n.emitter.emitLine(`${t} sm->${rn(ce,"local",le.stateMachineFieldAliases)} = ${z};`)}}}}}}if(F(v)&&E(v,"=>",2)){let L=v.args[0];n.emitter.emitLine(`${t} ${P(s,n)} ${te(L.token.value)} = ${a};`),v=v.args[1]}let b=Dr(v,t+" ",n);!o&&r&&b&&!Vr(b)?n.emitter.emitLine(`${t} ${r} = ${b};`):b&&n.emitter.emitLine(`${t} ${b};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`)}else if(d&&v&&F(d)&&F(d.func)&&d.func.func.tag==="Atom"&&d.func.func.token.value==="."&&d.func.args.length===1){let T=d.func.args[0].token.value,$=Bt(u,T,n),b=d.args;n.emitter.emitLine(`${t}case ${$}: {`);let L=u.variants.find(R=>R.name===T);if(L&&L.fields&&b.length>0)if(b.some(N=>F(N)&&E(N,":",2))){for(let N of b)if(F(N)&&E(N,":",2)){let B=N.args[0],D=N.args[1];if(!U(B))continue;let x=B.token.value,z=L.fields.find(re=>re.label===x);if(!z)continue;if(U(D)){let re=D.token.value;if(re!=="_"){let j=te(re);if(fe(z.type))n.emitter.emitLine(`${t} // ${j} is unit type (no value)`);else{let W=te(x),le=P(z.type,n),ce=l==="ref_semantics"||l?"->":".";n.emitter.emitLine(`${t} ${le} ${j} = ${a}${ce}data.${T}.${W};`);let ve=n;if((ve?.inAsyncStateMachine||ve?.inEffectStateMachine)&&ve.stateMachineVariables){let Y;if(D.$?.env){let Z=X(D.$.env,j);Z.length>0&&(Y=Z[Z.length-1].id)}Y&&ve.stateMachineVariables.has(Y)&&n.emitter.emitLine(`${t} sm->${rn(Y,"local",ve.stateMachineFieldAliases)} = ${j};`)}}}}}}else for(let N=0;N<Math.min(b.length,L.fields.length);N++){let B=b[N],D=L.fields[N];if(B.tag==="Atom"&&D){let x=B.token.value;if(x!=="_"){let z=te(x);if(fe(D.type))n.emitter.emitLine(`${t} // ${z} is unit type (no value)`);else{let re=te(D.label),j=P(D.type,n),W=l==="ref_semantics"||l?"->":".";n.emitter.emitLine(`${t} ${j} ${z} = ${a}${W}data.${T}.${re};`);let le=n;if((le?.inAsyncStateMachine||le?.inEffectStateMachine)&&le.stateMachineVariables){let ce;if(B.$?.env){let ve=X(B.$.env,x);ve.length>0&&(ce=ve[ve.length-1].id)}ce&&le.stateMachineVariables.has(ce)&&n.emitter.emitLine(`${t} sm->${rn(ce,"local",le.stateMachineFieldAliases)} = ${z};`)}}}}}if(F(v)&&E(v,"=>",2)){let R=v.args[0];n.emitter.emitLine(`${t} ${P(s,n)} ${te(R.token.value)} = ${a};`),v=v.args[1]}let C=Dr(v,t+" ",n);!o&&r&&C&&!Vr(C)?n.emitter.emitLine(`${t} ${r} = ${C};`):C&&n.emitter.emitLine(`${t} ${C};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`)}}}return n.insideMatch=p,n.emitter.emitLine(`${t}}`),e.$?.deferredDropExpressions&&Ct(e,t,n),o?"":r??""}function dg(e){return F(e)?E(e,"|",2):!1}function El(e){if(!dg(e))return[e];let t=e,n=t.args[0],r=t.args[1];return[...El(n),...El(r)]}function Pc(e){if(e!==void 0){if(Ue(e))return String(e.value);if(Re(e))return e.value?"true":"false"}}function mg(e,t,n,r,i,o,a){let s=n.insideMatch;n.insideMatch=!0,n.emitter.emitLine(`${t}switch (${r}) {`);let l=e.args.slice(1);for(let u=0;u<l.length;u++){let _=l[u];if(F(_)&&E(_,"=>",2)){if(!_.args[0]?.$?.caseExecuted)continue;let c=_.args[0],f=_.args[1];if(!c||!f)continue;if(U(c)&&c.token.value==="_"){n.emitter.emitLine(`${t}default: {`);let h=Dr(f,t+" ",n);!a&&o&&h&&!Vr(h)?n.emitter.emitLine(`${t} ${o} = ${h};`):h&&n.emitter.emitLine(`${t} ${h};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`);continue}let p=El(c),m=c.$?.primitivePatternValues;if(m&&m.length>0)for(let h of m){let d=Pc(h);d!==void 0&&n.emitter.emitLine(`${t}case ${d}:`)}else for(let h of p){let d=h.$?.value,v=Pc(d);v!==void 0&&n.emitter.emitLine(`${t}case ${v}:`)}n.emitter.emitLine(`${t}{`);let g=Dr(f,t+" ",n);!a&&o&&g&&!Vr(g)?n.emitter.emitLine(`${t} ${o} = ${g};`):g&&n.emitter.emitLine(`${t} ${g};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`)}}return n.insideMatch=s,n.emitter.emitLine(`${t}}`),e.$?.deferredDropExpressions&&Ct(e,t,n),a?"":o??""}function Uc(e,t,n){if(e.$?.runtimeDestructurings&&e.$.runtimeDestructurings.length>0){let r=e.args[0];if(!r||!r.$?.type)return"// Error: open expression has no argument or type";let i=r.$.type,o=r.$.value;if(_e(i)&&o===void 0){let a=M(r,t,n),s=e.$.runtimeDestructurings;for(let l of s){let u=P(l.type,n),_=te(l.variableName),c=te(l.label);n.emitter.emitLine(`${t}${u} ${_} = ${a}.${c};`)}}}return""}function Bc(e,t,n,r){if(!t.callType)return e;let i=$t(t.callType);if(i.length===0)return e;let o=i.map(()=>"NULL").join(", "),s=`__yo_spawn_wrapper_${Ye(r)}`;return n.emitter.emitDeclarationLine(`
|
|
11024
|
+
`;let i=r.token.value,o=st(r.$.type,i,n);return n.emitter.emitLine(`${t}${o};`),""}function Ic(e,t,n){if(e.$){let r=e.$.variableName,i=e.$.type,o=i&&fe(i),a=-1;for(let c=0;c<e.args.length;c++){let f=e.args[c];if(F(f)&&E(f,"=>",2)){let p=f.args[0];if(p&&!(Pe(p.$?.value)&&p.$.value.value===!1)){a=c;break}}}let s=!1;if(a>=0){let c=e.args[a];if(c&&F(c)&&E(c,"=>",2)){let f=c.args[0];f&&Pe(f.$?.value)&&f.$.value.value===!0&&(s=!0)}}if(!o&&r&&!s){let c=P(i,n);n.emitter.emitLine(`${t}${c} ${r};`)}if(s&&a>=0){let c=e.args[a];if(c&&F(c)&&E(c,"=>",2)){let f=c.args[1];if(f){let p=M(f,t,n);r&&!o&&(p&&p!==""&&!p.startsWith("goto")&&p!=="continue"&&p!=="break"&&!p.includes("return")?n.emitter.emitLine(`${t}${r} = ${p};`):p&&(p.startsWith("goto")||p==="continue"||p==="break"||p.includes("return"))&&n.emitter.emitLine(`${t}${p};`))}}return o?"":r??""}let l=t,u=0,_=!1;for(let c=0;c<e.args.length;c++){let f=e.args[c];if(F(f)&&E(f,"=>",2)){let p=f.args[0],m=f.args[1];if(p&&m){if(Pe(p.$?.value)&&p.$.value.value===!1)continue;if(_){if(n.emitter.emitLine(`${l}else {`),u++,l+=" ",!(Pe(p.$?.value)&&p.$.value.value===!0)){let T=M(p,l,n);n.emitter.emitLine(`${l}if (${T}) {`)}}else{if(Pe(p.$?.value)&&p.$.value.value===!0)n.emitter.emitLine(`${l}{`);else{let v=M(p,l,n);n.emitter.emitLine(`${l}if (${v}) {`)}_=!0}let g=Pe(p.$?.value)&&p.$.value.value===!0,h=_&&g?l:l+" ";if(F(m)&&E(m,I.begin)){let v=m.args,T=n,$=T.pendingDeferredDrops,b=m.$?.deferredDropExpressions??[];T.pendingDeferredDrops=[...b,...$??[]];let L=T.consumedVarPendingDrops,C=m.$?.consumedVariableDropExpressions??[];T.consumedVarPendingDrops=[...C,...L??[]];for(let R=0;R<v.length-1;R++){let N=v[R],B=M(N,h,n);if(B&&N.$&&!ut(N.$.env.modulePath,B)&&n.emitter.emitLine(`${h}${B};`),nt(N.$?.controlFlow))break}if(v.length>0){let R=v[v.length-1];R.$?.deferredDupExpressions&&rt(R,h,n);let N=M(R,h,n);N&&(N==="continue"||N==="break"||N.startsWith("goto")||F(R)&&E(R,I.return)||N.includes("return")?n.emitter.emitLine(`${h}${N};`):r&&!o&&n.emitter.emitLine(`${h}${r} = ${N};`))}m.$?.deferredDropExpressions&&Ct(m,h,n),T.pendingDeferredDrops=$,T.consumedVarPendingDrops=L}else{m.$?.deferredDupExpressions&&rt(m,h,n);let v=M(m,h,n);v==="continue"||v==="break"||v.startsWith("goto")||F(m)&&E(m,I.return)||v.includes("return")?n.emitter.emitLine(`${h}${v};`):v===""||!v||r&&(o||n.emitter.emitLine(`${h}${r} = ${v};`))}!(_&&g)&&n.emitter.emitLine(`${l}}`)}}}for(let c=0;c<u;c++)l=l.slice(0,-2),n.emitter.emitLine(`${l}}`);return o?"":r??""}return'/* "cond" expression is not evaluated */'}function Sc(e,t,n){let r=e.args[0];return M(r,t,n)}function Nc(e,t,n){let r=e.args[0],i=r.$?.type;if(!i||!Ce(i))throw new Error("downcast codegen: expected Dyn type as first argument");let o=M(r,t,n),s=e.args[1].$?.value;if(!s||!O(s))throw new Error("downcast codegen: expected TypeValue as second argument");let l=s.value,u=P(l,n),_=n.types[l.id]?.cName||u,c=`__yo_typeid_${te(_)}`;n.typeIdStatics||(n.typeIdStatics=new Map),n.typeIdStatics.has(l.id)||(n.typeIdStatics.set(l.id,c),n.emitter.emitDeclarationLine(`static const char ${c} = 0;`)),n.cIncludes.add("<stdint.h>");let f=`${o}.vtable->__yo_type_id == (uintptr_t)&${c}`,p,m=!1,g="",h="";for(let[,R]of n.dynImpls){if(R.dynType.id!==i.id)continue;if((V(R.concreteType)&&R.concreteType.resolvedConcreteType?R.concreteType.resolvedConcreteType:R.concreteType).id===l.id&&$n(R.dataType)){m=!0,g=n.types[R.dataType.id]?.cName||`unknown_box_${R.dataType.id}`,h=te(R.dataType.fields[0].label);break}}if(m){let R=ft(l);if(!R){let N=l;for(;Cr(N)&&N.fields.length===1;)N=N.fields[0].type;R=ft(N)}R?p=`((${u})__yo_incr_rc((void*)((${g}*)${o}.data)->${h}))`:p=`((${u})((${g}*)${o}.data)->${h})`}else p=`((${u})__yo_incr_rc((void*)${o}.data))`;let d=e.$?.type;if(!d||!ge(d))throw new Error("downcast codegen: expected Option enum as result type");if(qt(d))return`((${f}) ? ${p} : NULL)`;let T=P(d,n),$=Bt(d,"Some",n),b=Bt(d,"None",n),L=`(${T}){ .tag = ${$}, .data = { .Some = { .value = ${p} } } }`,C=`(${T}){ .tag = ${b} }`;return`((${f}) ? ${L} : ${C})`}function xc(e,t,n){if(!e.$?.dynCallTraitValues||e.$.dynCallTraitValues.length===0)return"/* Error: dyn() call missing trait values */";let r=e.$?.runtimeArgExprsInOrder?.[0]??e.args[0];if(!r)return"/* Error: dyn() requires a value argument */";let i=e.$.type;if(!Ce(i))return"/* Error: dyn() result type is not DynType */";let o=r.$?.type;if(!o)return"/* Error: dyn() value has no type */";let a=e.$.dynCallTraitValues;if(!a||a.length===0)return"/* Error: dyn() call missing trait values */";if(!ft(o)&&!$n(o))return"/* Error: dyn() requires an object type (use box() for value types) */";let s=$n(o)?o.fields[0].type:o,l=V(s)&&s.resolvedConcreteType?s.resolvedConcreteType:s,u=n.types[i.id]?.cName||`__yo_dyn_${i.id}`,c=`${(()=>{let d=n.types[l.id]?.cName;if(d)return d;let v=nn(l);return(v?n.types[v.id]?.cName:void 0)||`unknown_${l.id}`})()}_${u}`;n.dynImpls.set(c,{dynType:i,concreteType:s,dataType:o,traitValues:a});let f=M(r,t,n);if(r.$?.variableName&&f!==r.$.variableName){let d=st(r.$.type,r.$.variableName,n);n.emitter.emitLine(`${t}${d} = ${f};`),f=r.$.variableName}if(r.$?.deferredDupExpressions&&r.$.deferredDupExpressions.length>0){rt(r,t,n);let d=r.$.deferredDupExpressions[0];F(d)&&d.$?.variableName&&(f=Ee(d.$.variableName,d.$.env))}let p=e.$?.variableName;if(!p)return"/* Error: dyn() expression missing temp variable name */";let m=n,g;if(m.inAsyncStateMachine&&m.stateMachineVariables){for(let[,d]of m.stateMachineVariables)if(d.kind==="local"&&d.id===p){g=`sm->${rn(d.id,"local",m.stateMachineFieldAliases)}`;break}}let h=`__yo_vtable_${c}`;return g?(n.emitter.emitLine(`${t}${g} = (${u}){`),n.emitter.emitLine(`${t} .data = ${f},`),n.emitter.emitLine(`${t} .vtable = &${h}`),n.emitter.emitLine(`${t}};`),g):(n.emitter.emitLine(`${t}${u} ${p} = {`),n.emitter.emitLine(`${t} .data = ${f},`),n.emitter.emitLine(`${t} .vtable = &${h}`),n.emitter.emitLine(`${t}};`),p)}function Vc(e,t,n){return e.args.length!==0?"// Error: __yo_gc_collect requires exactly 0 arguments":"__yo_gc_collect()"}function Dc(e,t,n){let r=e.args[0],i=e.args[1],o=n;if(F(r)&&E(r,I.comptime,1)||F(r)&&E(r,I.given,1))return"";if((o.inAsyncStateMachine||o.inEffectStateMachine)&&U(r)&&U(i)){let a=r.token.value,s=i.token.value,l=o.stateMachineVariables&&Array.from(o.stateMachineVariables.values()).some(_=>_.name===a),u=o.stateMachineVariables&&Array.from(o.stateMachineVariables.values()).some(_=>_.name===s);if(a===s&&(l||u))return""}if(e.$?.runtimeDestructurings){let a=e.$.runtimeDestructurings,s=M(i,t,n),l=i.$?.type;return a.forEach(({label:u,type:_,variableName:c})=>{let f=te(c,_.isExtern==="c"),p=st(_,f,n);if(l&&_e(l)&&l.isNewtype&&l.fields.length===1){let h=l.fields[0];if(h&&h.label===u){n.emitter.emitLine(`${t}${p} = ${s}; // Destructuring ${u} (newtype)`);return}}let m=u.match(/^\d+$/)?`_${u}`:te(u,_.isExtern==="c");if(l&&we(l)&&!u.match(/^\d+$/)){let h=l.fields.findIndex(d=>d.label===u);m=h>=0?`_${h}`:m}let g=l&&ft(l)?"->":".";n.emitter.emitLine(`${t}${p} = ${s}${g}${m}; // Destructuring ${u}`)}),""}if(U(r)){let a=r.token.value;if(!r.$?.type)return`// Error: No type information for variable ${a}
|
|
11025
|
+
`;if(r.$?.env){let u=X(r.$.env,a);if(u.length>0&&u[u.length-1].isCompileTimeOnly)return""}let s=!1,l;if((o.inAsyncStateMachine||o.inEffectStateMachine)&&o.stateMachineVariables&&r.$?.env){let u=X(r.$.env,a);if(u.length>0){let _=u[u.length-1],c=_.isOwningTheSameRcValueAs?_.isOwningTheSameRcValueAs.id:_.id;o.stateMachineVariables.has(c)&&(s=!0,l=c)}}if(ke(r.$.type))if(F(i)&&E(i,I.array)){let u=M(i,t,n);if(s&&l){let _=rn(l,"local",o.stateMachineFieldAliases);n.emitter.emitLine(`${t}sm->${_} = ${u};`)}else if(!fe(r.$.type)){let _=st(r.$.type,a,n);n.emitter.emitLine(`${t}${_} = ${u};`)}}else{let u;if(i.$?.variableName){let _=Ee(i.$.variableName,i.$.env),c=M(i,t,n);if(!s){let f=st(i.$.type,_,n);_!==c&&n.emitter.emitLine(`${t}${f} = ${c};`)}u=_}else u=M(i,t,n);if(s&&l){let _=rn(l,"local",o.stateMachineFieldAliases);n.emitter.emitLine(`${t}sm->${_} = ${u};`)}else if(!fe(r.$.type)){let _=st(r.$.type,a,n);n.emitter.emitLine(`${t}${_} = ${u};`)}}else{let u,_=F(i)&&i.$?.closureFunctionValue&&i.$?.type&&Wt(i.$.type),c=F(i)&&Rt(i);if(i.$?.variableName){let f=Ee(i.$.variableName,i.$.env),p=Ee(a,r.$.env);if(f===p){if(u=M(i,t,n),!_&&!c&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){rt(i,t,o);let m=i.$.deferredDupExpressions[0];F(m)&&m.$?.variableName&&(u=Ee(m.$.variableName,m.$.env))}}else if(U(i)&&f===Ee(i.token.value,i.$.env)){if(u=M(i,t,n),!_&&!c&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){rt(i,t,o);let m=i.$.deferredDupExpressions[0];F(m)&&m.$?.variableName&&(u=Ee(m.$.variableName,m.$.env))}}else if(U(i)&&o.currentClosureCaptures&&o.currentClosureCaptures.includes(i.token.value)&&i.$?.env&&o.currentClosureCaptureFrameLevel!==void 0&&$r(i.token.value,i.$.env,o.currentClosureCaptureFrameLevel)){let m=o.currentClosureType;if(m&&m.isClosure){let g=Object.values(o.types).find(h=>h.type===m);g?u=`((${`${g.cName}_capture`}*)closure_context->data)->${Ee(i.token.value,i.$.env)}`:u=`closure_context->${Ee(i.token.value,i.$.env)}`}else u=`closure_context->${Ee(i.token.value,i.$.env)}`}else{let m=M(i,t,n);if(m.trim()!==f){let g=i.$.convertedRuntimeType||i.$.type,h=st(g,f,n);n.emitter.emitLine(`${t}${h} = ${m};`)}if(!_&&!c&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){rt(i,t,o);let g=i.$.deferredDupExpressions[0];F(g)&&g.$?.variableName?u=Ee(g.$.variableName,g.$.env):u=f}else u=f}}else if(u=M(i,t,n),!_&&!c&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){rt(i,t,o);let f=i.$.deferredDupExpressions[0];F(f)&&f.$?.variableName&&(u=Ee(f.$.variableName,f.$.env))}if(Qe(r.$.type)){let f=r.$.type;if(s&&l){let p=rn(l,"local",o.stateMachineFieldAliases);n.emitter.emitLine(`${t}sm->${p} = ${u};`)}else if(!fe(f)){let p=st(f,a,n);n.emitter.emitLine(`${t}${p} = ${u};`)}}else if(s&&l){let f=rn(l,"local",o.stateMachineFieldAliases);n.emitter.emitLine(`${t}sm->${f} = ${u};`)}else{let f=ut(i.$.env.modulePath,u.trim()),p;if(f&&n.tempVarAsyncStructNames){let m=n.tempVarAsyncStructNames.get(u.trim());m?p=`${m}*`:p=P(r.$.type,n)}else p=P(r.$.type,n);fe(r.$.type)||n.emitter.emitLine(`${t}${p} ${Ee(a,r.$.env)} = ${u};`)}}return""}}var pg=0;function Xo(e,t,n,r,i=" "){if(k.__yo_op_add.includes(e))return`((${t[0]}) + (${t[1]}))`;if(k.__yo_op_sub.includes(e))return`((${t[0]}) - (${t[1]}))`;if(k.__yo_op_mul.includes(e))return`((${t[0]}) * (${t[1]}))`;if(k.__yo_op_div.includes(e))return`((${t[0]}) / (${t[1]}))`;if(k.__yo_op_mod.includes(e))return`((${t[0]}) % (${t[1]}))`;if(k.__yo_op_neg.includes(e))return`(-(${t[0]}))`;if(k.__yo_op_eq.includes(e))return`((${t[0]}) == (${t[1]}))`;if(k.__yo_op_neq.includes(e))return`((${t[0]}) != (${t[1]}))`;if(k.__yo_op_lt.includes(e))return`((${t[0]}) < (${t[1]}))`;if(k.__yo_op_lte.includes(e))return`((${t[0]}) <= (${t[1]}))`;if(k.__yo_op_gt.includes(e))return`((${t[0]}) > (${t[1]}))`;if(k.__yo_op_gte.includes(e))return`((${t[0]}) >= (${t[1]}))`;if(k.__yo_op_not.includes(e))return`(!(${t[0]}))`;if(k.__yo_op_bit_and.includes(e))return`((${t[0]}) & (${t[1]}))`;if(k.__yo_op_bit_or.includes(e))return`((${t[0]}) | (${t[1]}))`;if(k.__yo_op_bit_xor.includes(e))return`((${t[0]}) ^ (${t[1]}))`;if(k.__yo_op_bit_complement.includes(e))return`(~(${t[0]}))`;if(k.__yo_op_bit_left_shift.includes(e))return`((${t[0]}) << (${t[1]}))`;if(k.__yo_op_bit_right_shift.includes(e))return`((${t[0]}) >> (${t[1]}))`;if(k.__yo_noop.includes(e))return"";if(k.__yo_return_self.includes(e))return`(*${t[0]})`;if(k.__yo_ms_sleep.includes(e))return Pt(r.targetInfo)?`Sleep(${t[0]})`:`usleep((${t[0]}) * 1000)`;if(k.__yo_decr_rc.includes(e))return`__yo_decr_rc((void*)(${t[0]}))`;if(k.__yo_as.includes(e)&&n.$?.type){let o=P(n.$.type,r),a=n.args[0]?.$?.type;return a&&ge(a)&&!Fn(a)?`((${o})((${t[0]}).tag))`:`((${o})(${t[0]}))`}else{if(k.__yo_ptr_add.includes(e))return`(${t[0]} + ${t[1]})`;if(k.__yo_ptr_sub.includes(e))return`(${t[0]} - ${t[1]})`;if(k.__yo_ptr_diff.includes(e))return`(${t[0]} - ${t[1]})`;if(k.__yo_ptr_eq.includes(e))return`(${t[0]} == ${t[1]})`;if(k.__yo_ptr_neq.includes(e))return`(${t[0]} != ${t[1]})`;if(k.__yo_ptr_lt.includes(e))return`(${t[0]} < ${t[1]})`;if(k.__yo_ptr_lte.includes(e))return`(${t[0]} <= ${t[1]})`;if(k.__yo_ptr_gt.includes(e))return`(${t[0]} > ${t[1]})`;if(k.__yo_ptr_gte.includes(e))return`(${t[0]} >= ${t[1]})`;if(k.__yo_slice_len.includes(e))return`(${t[0]}.length)`;if(k.__yo_slice_new.includes(e)&&n.$?.type)return`(${P(n.$.type,r)}){ .data = ${t[0]}, .length = ${t[1]} }`;if(k.__yo_getrandom.includes(e))return`getrandom(${t[0]}, ${t[1]}, ${t[2]})`;if(k.__yo_arc4random_buf.includes(e))return`(arc4random_buf(${t[0]}, ${t[1]}), (void)0)`;if(k.__yo_bcrypt_gen_random.includes(e))return`(int32_t)BCryptGenRandom(NULL, ${t[0]}, ${t[1]}, BCRYPT_USE_SYSTEM_PREFERRED_RNG)`;if(k.__yo_getentropy.includes(e))return`getentropy(${t[0]}, ${t[1]})`;if(k.__yo_maybe_uninit_new.includes(e)&&n.$?.type){let o=P(n.$.type,r),a=`__yo_uninit_${pg++}`;return r.emitter.emitLine(`${i}${o} ${a};`),a}else return k.__yo_maybe_uninit_as_ptr.includes(e)&&n.$?.type?`((${P(n.$.type,r)})(${t[0]}))`:k.__yo_maybe_uninit_assume_init.includes(e)?`(${t[0]})`:`/* Unhandled operator ${e} */`}}function Mc(e,t,n){let r=e.args[0];if(!r)return"// Error: __yo_iso_extract requires exactly 1 argument";let i=M(r,t,n),o=r.$?.type;if(!o||!wt(o))return"// Error: __yo_iso_extract requires an Iso type";let a=P(o,n),s=e.$?.type;if(s&&n.isoTypes?.has(a)){let _=n.isoTypes.get(a);_.optionTypeCName||(_.optionTypeCName=P(s,n))}let l=`__yo_iso_extract_${a}(${i})`,u=e.$?.variableName;return u&&s?(n.emitter.emitLine(`${t}${P(s,n)} ${u} = ${l};`),u):l}function Oc(e,t,n){let r=e.args[0];if(!r)return"// Error: __yo_iso_dispose requires exactly 1 argument";let i=M(r,t,n),o=r.$?.type;return!o||!wt(o)?"// Error: __yo_iso_dispose requires an Iso type":`__yo_iso_dispose_${P(o,n)}(${i})`}function Tl(e){let t=e.func.$?.value;return O(t)&&wt(t.value)&&e.args.length===1}function Rc(e,t,n){if(!Tl(e))return"/* Error: generateIsoTypeCall called on non-Iso type call */";let i=(e.func.$?.value).value,o=i.childType,a=e.args[0],s=M(a,t,n),l=P(i,n),u=P(o,n);return n.isoTypes||(n.isoTypes=new Map),n.isoTypes.has(l)||n.isoTypes.set(l,{childTypeCName:u,isoType:i}),`__yo_create_iso_${l}(${s})`}function Vr(e){return e===""||e==="break"||e==="continue"||e.startsWith("goto")||e.includes("return")}function Dr(e,t,n){if(F(e)&&E(e,I.begin)){let r=e.args,i=n,o=i.pendingDeferredDrops,a=e.$?.deferredDropExpressions??[];i.pendingDeferredDrops=[...a,...o??[]];let s=i.consumedVarPendingDrops,l=e.$?.consumedVariableDropExpressions??[];i.consumedVarPendingDrops=[...l,...s??[]];for(let _=0;_<r.length-1;_++){let c=r[_],f=M(c,t,n);if(f&&n.emitter.emitLine(`${t}${f};`),nt(c.$?.controlFlow))break}let u="";if(r.length>0){let _=r[r.length-1];if(_.$?.deferredDupExpressions&&_.$.deferredDupExpressions.length>0){if(_.$?.variableName){let f=_.$.variableName;_.$.variableName=void 0;let p=M(_,t,n);_.$.variableName=f;let m=P(_.$.type,n),g=Ee(f,_.$.env);g!==p&&n.emitter.emitLine(`${t}${m} ${g} = ${p};`)}rt(_,t,n);let c=_.$.deferredDupExpressions[0];F(c)&&c.$?.variableName?u=Ee(c.$.variableName,c.$.env):u=M(_,t,n)}else u=M(_,t,n)}return e.$?.deferredDropExpressions&&Ct(e,t,n),i.pendingDeferredDrops=o,i.consumedVarPendingDrops=s,u}else return e.$?.deferredDupExpressions&&rt(e,t,n),M(e,t,n)}function zc(e,t,n){if(!e.$)return'/* "match" expression is not evaluated */';let r=e.$.variableName,i=e.$.type,o=i&&fe(i);if(!o&&r){let g=P(i,n);n.emitter.emitLine(`${t}${g} ${r};`)}let a=M(e.args[0],t,n),s=e.args[0].$?.type;if(!s)return'// Error: "match" expression requires a valid type';if(e.$.isPrimitiveMatch)return mg(e,t,n,a,s,r,o);let l,u;if(Ie(s)?(u=s.childType,l=s.tag):ft(s)?(u=s,l="ref_semantics"):u=s,!ge(u))return'// Error: "match" expression requires an enum type';if(!n.types[u.id]?.cName)return`// Error: "match" expression enum type ${u.typeName} has no C name`;let c=qt(u);if(c){let g=e.args.slice(1),h=null,d=null;for(let v of g)if(F(v)&&E(v,"=>",2)){if(!v.args[0]?.$?.caseExecuted)continue;let T=v.args[0],$=v.args[1];if(T&&$&&F(T)&&E(T,"."))h={caseBody:$};else{let b=T.func;if(b&&F(b)&&E(b,".")){let L=b.args[0];if(L&&U(L)){let C=L.token.value;d={caseBody:$,variantName:C,casePattern:T}}}}}if(n.emitter.emitLine(`${t}if (${l&&l!=="ref_semantics"?"*":""}${a} != NULL) {`),d){let v;if(F(d.casePattern)&&d.casePattern.args.length>0){let L=d.casePattern.args[0];if(L&&U(L)){v=te(L.token.value);let C=c;n.emitter.emitLine(`${t} ${P(C,n)} ${v} = ${a};`)}}let T=n;v&&(T.inAsyncStateMachine||T.inEffectStateMachine)&&(T.localShadowedVariables||(T.localShadowedVariables=new Set),T.localShadowedVariables.add(v));let $=Dr(d.caseBody,t+" ",n);v&&T.localShadowedVariables&&T.localShadowedVariables.delete(v);let b=Vr($);if(!o&&r&&!b){let L=$||a;n.emitter.emitLine(`${t} ${r} = ${L};`)}else $&&$!==""&&n.emitter.emitLine(`${t} ${$};`)}if(n.emitter.emitLine(`${t}} else {`),h){let v=Dr(h.caseBody,t+" ",n),T=Vr(v);!o&&r&&!T?n.emitter.emitLine(`${t} ${r} = ${v};`):v&&v!==""&&n.emitter.emitLine(`${t} ${v};`)}return n.emitter.emitLine(`${t}}`),o?"":r??""}if(Fn(u)){n.emitter.emitLine(`${t}switch (${l&&l!=="ref_semantics"?"*":""}${a}) {`);let g=n.insideMatch;n.insideMatch=!0;let h=e.args.slice(1);for(let d=0;d<h.length;d++){let v=h[d];if(F(v)&&E(v,"=>",2)){if(!v.args[0]?.$?.caseExecuted)continue;let T=v.args[0],$=v.args[1];if(T&&$&&U(T)&&T.token.value==="_"){n.emitter.emitLine(`${t}default: {`);let b=Dr($,t+" ",n);!o&&r&&b&&!Vr(b)?n.emitter.emitLine(`${t} ${r} = ${b};`):b&&n.emitter.emitLine(`${t} ${b};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`)}else if(T&&$&&F(T)&&E(T,".",1)){let b=T.args[0].token.value,L=Bt(u,b,n);n.emitter.emitLine(`${t}case ${L}: {`);let C=Dr($,t+" ",n);!o&&r&&C&&!Vr(C)?n.emitter.emitLine(`${t} ${r} = ${C};`):C&&n.emitter.emitLine(`${t} ${C};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`)}}}return n.insideMatch=g,n.emitter.emitLine(`${t}}`),o?"":r??""}n.emitter.emitLine(`${t}switch (${l==="ref_semantics"||l?a+"->tag":"("+a+").tag"}) {`);let p=n.insideMatch;n.insideMatch=!0;let m=e.args.slice(1);for(let g=0;g<m.length;g++){let h=m[g];if(F(h)&&E(h,"=>",2)){if(!h.args[0]?.$?.caseExecuted)continue;let d=h.args[0],v=h.args[1];if(d&&v&&U(d)&&d.token.value==="_"){n.emitter.emitLine(`${t}default: {`);let T=Dr(v,t+" ",n);!o&&r&&T&&!Vr(T)?n.emitter.emitLine(`${t} ${r} = ${T};`):T&&n.emitter.emitLine(`${t} ${T};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`)}else if(d&&v&&F(d)&&d.func.tag==="Atom"&&d.func.token.value==="."&&d.args.length>=1){let T=d.args[0].token.value,$=Bt(u,T,n);if(n.emitter.emitLine(`${t}case ${$}: {`),d.args.length>1){let L=u.variants.find(C=>C.name===T);if(L&&L.fields){let C=d.args.slice(1);if(C.some(N=>F(N)&&E(N,":",2))){for(let N of C)if(F(N)&&E(N,":",2)){let B=N.args[0],D=N.args[1];if(!U(B))continue;let x=B.token.value,z=L.fields.find(re=>re.label===x);if(!z||fe(z.type))continue;if(U(D)){let re=D.token.value;if(re!=="_"){let j=te(re),W=te(x),le=P(z.type,n),ce=l==="ref_semantics"||l?"->":".";n.emitter.emitLine(`${t} ${le} ${j} = ${a}${ce}data.${T}.${W};`);let ve=n;if((ve?.inAsyncStateMachine||ve?.inEffectStateMachine)&&ve.stateMachineVariables){let Y;if(D.$?.env){let Z=X(D.$.env,re);Z.length>0&&(Y=Z[Z.length-1].id)}if(Y&&ve.stateMachineVariables.has(Y)){let Z=rn(Y,"local",ve.stateMachineFieldAliases);n.emitter.emitLine(`${t} sm->${Z} = ${j};`)}}}}}}else for(let N=0;N<C.length&&N<L.fields.length;N++){let B=C[N],D=L.fields[N];if(U(B)&&D){if(fe(D.type))continue;let x=B.token.value;if(x!=="_"){let z=te(x),re=te(D.label),j=P(D.type,n),W=l==="ref_semantics"||l?"->":".";n.emitter.emitLine(`${t} ${j} ${z} = ${a}${W}data.${T}.${re};`);let le=n;if((le?.inAsyncStateMachine||le?.inEffectStateMachine)&&le.stateMachineVariables){let ce;if(B.$?.env){let ve=X(B.$.env,x);ve.length>0&&(ce=ve[ve.length-1].id)}ce&&le.stateMachineVariables.has(ce)&&n.emitter.emitLine(`${t} sm->${rn(ce,"local",le.stateMachineFieldAliases)} = ${z};`)}}}}}}if(F(v)&&E(v,"=>",2)){let L=v.args[0];n.emitter.emitLine(`${t} ${P(s,n)} ${te(L.token.value)} = ${a};`),v=v.args[1]}let b=Dr(v,t+" ",n);!o&&r&&b&&!Vr(b)?n.emitter.emitLine(`${t} ${r} = ${b};`):b&&n.emitter.emitLine(`${t} ${b};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`)}else if(d&&v&&F(d)&&F(d.func)&&d.func.func.tag==="Atom"&&d.func.func.token.value==="."&&d.func.args.length===1){let T=d.func.args[0].token.value,$=Bt(u,T,n),b=d.args;n.emitter.emitLine(`${t}case ${$}: {`);let L=u.variants.find(R=>R.name===T);if(L&&L.fields&&b.length>0)if(b.some(N=>F(N)&&E(N,":",2))){for(let N of b)if(F(N)&&E(N,":",2)){let B=N.args[0],D=N.args[1];if(!U(B))continue;let x=B.token.value,z=L.fields.find(re=>re.label===x);if(!z)continue;if(U(D)){let re=D.token.value;if(re!=="_"){let j=te(re);if(fe(z.type))n.emitter.emitLine(`${t} // ${j} is unit type (no value)`);else{let W=te(x),le=P(z.type,n),ce=l==="ref_semantics"||l?"->":".";n.emitter.emitLine(`${t} ${le} ${j} = ${a}${ce}data.${T}.${W};`);let ve=n;if((ve?.inAsyncStateMachine||ve?.inEffectStateMachine)&&ve.stateMachineVariables){let Y;if(D.$?.env){let Z=X(D.$.env,j);Z.length>0&&(Y=Z[Z.length-1].id)}Y&&ve.stateMachineVariables.has(Y)&&n.emitter.emitLine(`${t} sm->${rn(Y,"local",ve.stateMachineFieldAliases)} = ${j};`)}}}}}}else for(let N=0;N<Math.min(b.length,L.fields.length);N++){let B=b[N],D=L.fields[N];if(B.tag==="Atom"&&D){let x=B.token.value;if(x!=="_"){let z=te(x);if(fe(D.type))n.emitter.emitLine(`${t} // ${z} is unit type (no value)`);else{let re=te(D.label),j=P(D.type,n),W=l==="ref_semantics"||l?"->":".";n.emitter.emitLine(`${t} ${j} ${z} = ${a}${W}data.${T}.${re};`);let le=n;if((le?.inAsyncStateMachine||le?.inEffectStateMachine)&&le.stateMachineVariables){let ce;if(B.$?.env){let ve=X(B.$.env,x);ve.length>0&&(ce=ve[ve.length-1].id)}ce&&le.stateMachineVariables.has(ce)&&n.emitter.emitLine(`${t} sm->${rn(ce,"local",le.stateMachineFieldAliases)} = ${z};`)}}}}}if(F(v)&&E(v,"=>",2)){let R=v.args[0];n.emitter.emitLine(`${t} ${P(s,n)} ${te(R.token.value)} = ${a};`),v=v.args[1]}let C=Dr(v,t+" ",n);!o&&r&&C&&!Vr(C)?n.emitter.emitLine(`${t} ${r} = ${C};`):C&&n.emitter.emitLine(`${t} ${C};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`)}}}return n.insideMatch=p,n.emitter.emitLine(`${t}}`),e.$?.deferredDropExpressions&&Ct(e,t,n),o?"":r??""}function dg(e){return F(e)?E(e,"|",2):!1}function El(e){if(!dg(e))return[e];let t=e,n=t.args[0],r=t.args[1];return[...El(n),...El(r)]}function Pc(e){if(e!==void 0){if(Ue(e))return String(e.value);if(Pe(e))return e.value?"true":"false"}}function mg(e,t,n,r,i,o,a){let s=n.insideMatch;n.insideMatch=!0,n.emitter.emitLine(`${t}switch (${r}) {`);let l=e.args.slice(1);for(let u=0;u<l.length;u++){let _=l[u];if(F(_)&&E(_,"=>",2)){if(!_.args[0]?.$?.caseExecuted)continue;let c=_.args[0],f=_.args[1];if(!c||!f)continue;if(U(c)&&c.token.value==="_"){n.emitter.emitLine(`${t}default: {`);let h=Dr(f,t+" ",n);!a&&o&&h&&!Vr(h)?n.emitter.emitLine(`${t} ${o} = ${h};`):h&&n.emitter.emitLine(`${t} ${h};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`);continue}let p=El(c),m=c.$?.primitivePatternValues;if(m&&m.length>0)for(let h of m){let d=Pc(h);d!==void 0&&n.emitter.emitLine(`${t}case ${d}:`)}else for(let h of p){let d=h.$?.value,v=Pc(d);v!==void 0&&n.emitter.emitLine(`${t}case ${v}:`)}n.emitter.emitLine(`${t}{`);let g=Dr(f,t+" ",n);!a&&o&&g&&!Vr(g)?n.emitter.emitLine(`${t} ${o} = ${g};`):g&&n.emitter.emitLine(`${t} ${g};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`)}}return n.insideMatch=s,n.emitter.emitLine(`${t}}`),e.$?.deferredDropExpressions&&Ct(e,t,n),a?"":o??""}function Uc(e,t,n){if(e.$?.runtimeDestructurings&&e.$.runtimeDestructurings.length>0){let r=e.args[0];if(!r||!r.$?.type)return"// Error: open expression has no argument or type";let i=r.$.type,o=r.$.value;if(_e(i)&&o===void 0){let a=M(r,t,n),s=e.$.runtimeDestructurings;for(let l of s){let u=P(l.type,n),_=te(l.variableName),c=te(l.label);n.emitter.emitLine(`${t}${u} ${_} = ${a}.${c};`)}}}return""}function Bc(e,t,n,r){if(!t.callType)return e;let i=$t(t.callType);if(i.length===0)return e;let o=i.map(()=>"NULL").join(", "),s=`__yo_spawn_wrapper_${Ye(r)}`;return n.emitter.emitDeclarationLine(`
|
|
11026
11026
|
// Spawn wrapper: bridges __yo_thread_fn to closure with evidence params
|
|
11027
11027
|
static void ${s}(void* closure) {
|
|
11028
11028
|
${e}(closure, ${o});
|
|
11029
11029
|
}
|
|
11030
11030
|
`),s}function Gc(e,t,n){let r=e.$?.runtimeArgExprsInOrder;if(!r||r.length!==1)return"/* Error: __yo_thread_spawn requires exactly 1 argument */";let i=r[0],o=i.$?.type;if(!o)return"/* Error: __yo_thread_spawn argument has no type */";let a,s;if(V(o)){let h=o;h.resolvedConcreteType&&(a=h.resolvedConcreteType.id,s=h.resolvedConcreteType)}else _e(o)&&(a=o.id,s=o);if(!a||!s)return"/* Error: __yo_thread_spawn could not determine concrete closure type */";let l=n.implClosureCallMap.get(a);if(!l)return`/* Error: __yo_thread_spawn could not find closure function for type ${a} */`;let u=l.functionCName,_=P(s,n),c=Bc(u,l,n,e.$?.env.modulePath??""),f=M(i,t,n),p=i.$?.variableName?Ee(i.$.variableName,i.$.env):f,m=`_thread_closure_data_${Ye(e.$?.env.modulePath??"")}`;n.emitter.emitLine(`${t}${_}* ${m} = (${_}*)__yo_malloc(sizeof(${_}));`),n.emitter.emitLine(`${t}*${m} = ${p};`);let g=e.$?.variableName;return g?(n.emitter.emitLine(`${t}__yo_thread_t ${g} = __yo_thread_spawn(${c}, ${m});`),g):`__yo_thread_spawn(${c}, ${m})`}function Wc(e,t,n){let r=e.$?.runtimeArgExprsInOrder;if(!r||r.length!==1)return"/* Error: __yo_worker_spawn requires exactly 1 argument */";let i=r[0],o=i.$?.type;if(!o)return"/* Error: __yo_worker_spawn argument has no type */";let a,s;if(V(o)){let g=o;g.resolvedConcreteType&&(a=g.resolvedConcreteType.id,s=g.resolvedConcreteType)}else _e(o)&&(a=o.id,s=o);if(!a||!s)return"/* Error: __yo_worker_spawn could not determine concrete closure type */";let l=n.implClosureCallMap.get(a);if(!l)return`/* Error: __yo_worker_spawn could not find closure function for type ${a} */`;let u=l.functionCName,_=P(s,n),c=Bc(u,l,n,e.$?.env.modulePath??""),f=M(i,t,n),p=i.$?.variableName?Ee(i.$.variableName,i.$.env):f,m=`_worker_closure_data_${Ye(e.$?.env.modulePath??"")}`;return n.emitter.emitLine(`${t}${_}* ${m} = (${_}*)__yo_malloc(sizeof(${_}));`),n.emitter.emitLine(`${t}*${m} = ${p};`),n.emitter.emitLine(`${t}__yo_worker_spawn(${c}, ${m});`),""}function Yc(e,t,n){let r=e.args[0];return r?`__yo_thread_set_maximum_threads(${M(r,t,n)})`:"// Error: __yo_thread_set_maximum_threads requires exactly 1 argument"}function qc(e,t){let n=t;if(!(n.inAsyncStateMachine||n.inEffectStateMachine)||!n.stateMachineVariables)return e;for(let[r,i]of n.stateMachineVariables)if(i.name===e)return`sm->${i.kind==="outer"?`__capture.${i.name}`:`var_${r}`}`;return e}function Ln(e,t,n){let r=n;if(!(r.inAsyncStateMachine||r.inEffectStateMachine)||!r.stateMachineVariables)return;let i=r.stateMachineVariables.get(e);if(!i){for(let[,o]of r.stateMachineVariables)if(o.name===e){i=o;break}}if(i&&i.kind!=="outer"){if(i.type&&be(i.type))return;let o=`var_${i.id}`,a=te(e);n.emitter.emitLine(`${t}sm->${o} = ${a};`)}}function Kc(e,t,n){if(e.$?.value!==void 0&&!de(e.$.value))return e.$?.deferredDropExpressions&&Ct(e,t,n),fe(e.$.type)?"":Qt(e.$.value,n,e);let r=e.func.$?.value,i=e.func.$?.type??(ne(r)?r.specializedType??r.type:void 0);if(G(i)){let o=e.$?.runtimeArgExprsInOrder;if(o){let a=!1;if(F(e.func)&&E(e.func,".",2)){let _=e.func.args[0]?.$?.type;_&&Ce(_)&&(a=!0)}let s=o.map((u,_)=>{if(u.$?.variableName&&u.$?.type){let c=n,f=c.currentClosureCaptures&&c.currentClosureCaptures.includes(u.$.variableName)&&U(u)&&u.$.env&&c.currentClosureCaptureFrameLevel!==void 0&&$r(u.token.value,u.$.env,c.currentClosureCaptureFrameLevel),p=M(u,t,n),m=!1;if(U(u)&&u.$.env&&u.$.variableName){let v=X(u.$.env,u.$.variableName);v.length>0&&v[v.length-1].isCompileTimeOnly&&(m=!0)}let g=(c.inAsyncStateMachine||c.inEffectStateMachine)&&p.startsWith("sm->"),h=!1;if(p&&p!==u.$.variableName&&!f&&!g&&!m){let v=Ee(u.$.variableName,u.$.env);if(p!==v){let T=u.$.convertedRuntimeType||u.$.type,$=st(T,u.$.variableName,n);n.emitter.emitLine(`${t}${$} = ${p};`),h=!0,Ln(u.$.variableName,t,n)}}let d=h?u.$.variableName:p;if(u.$?.deferredDupExpressions&&u.$.deferredDupExpressions.length>0){let v=new Set;u.$?.variableName&&v.add(Ee(u.$.variableName,u.$.env)),p&&v.add(p),U(u)&&v.add(Ee(u.token.value,u.$.env));let T=u.$.deferredDupExpressions.find($=>{let b=Ra($);return b?v.has(Ee(b,$.$?.env)):!1});T&&(rt(u,t,c),F(T)&&T.$?.variableName&&(d=Ee(T.$.variableName,T.$.env)))}if(a&&_===0){if(F(e.func)&&E(e.func,".",2)){let $=e.func.args[0]?.$?.type,b=e.func.args[1];if(U(b)&&Ce($)){let L=b.token.value;if($.trait.fields.find(R=>R.label===L))return g?p:te(d,u.$.type.isExtern==="c")}}let v=u.$?.type;return v&&Ie(v)?g?`${p}->data`:`${te(d,u.$.type.isExtern==="c")}->data`:g?`(${p}).data`:`(${te(d,u.$.type.isExtern==="c")}).data`}else return f||g||m?p:te(d,u.$.type.isExtern==="c")}else if(a&&_===0){let c=M(u,t,n);if(F(e.func)&&E(e.func,".",2)){let m=e.func.args[0]?.$?.type,g=e.func.args[1];if(U(g)&&Ce(m)){let h=g.token.value;if(m.trait.fields.find(v=>v.label===h))return c}}let f=u.$?.type;return f&&Ie(f)?`(${c})->data`:`(${c}).data`}else return M(u,t,n)}),l=s.join(", ");if(i.isExtern==="yo"&&i.externName){let u=i.externName;return gi.includes(u)?Xo(u,s,e,n,t):u==="__yo_thread_spawn"?Gc(e,t,n):u==="__yo_worker_spawn"?Wc(e,t,n):fe(i.return.type)?(n.emitter.emitLine(`${t}${u}(${l});`),e.$?.deferredDropExpressions&&Ct(e,t,n),""):`${u}(${l})`}{let u=n;if(u.currentEvidenceParams?.size){let _=e.func.token?.value,c;if(_==="."&&F(e.func)&&E(e.func,".",2)){let f=e.func.args[1];f&&U(f)&&(_=f.token.value);let p=e.func.args[0];if(p&&U(p))c=p.token.value;else if(p&&F(p)&&E(p,".",2)){let m=p.args[0];m&&U(m)&&(c=m.token.value)}}if(_&&_!=="."){for(let f of u.currentEvidenceParams.values())if(f.fieldLabel===_||f.implicitLabel===_||f.fieldPath[f.fieldPath.length-1]===_){if(c&&c!==f.implicitLabel)continue;return jc(f.cParamName,i,s,o,e,t,u,f)}}}}if(ne(r)){let u=Ki(r);if(u)return Xo(u,s,e,n,t);let _=r.specializedType??r.type,c=n;if(c.currentEvidenceParams&&r.isModuleEffectMember){let p,m=e.func.$?.env??e.$?.env;if(m)for(let g of c.currentEvidenceParams.values()){let h=X(m,g.implicitLabel),v=h[h.length-1]?.value?.[0];if(v&&We(v)){let T=v,$=!0;for(let b=0;b<g.fieldPath.length-1;b++){let L=g.fieldPath[b],C=T.type.fields.findIndex(R=>R.label===L);if(C>=0&&T.fields[C]&&We(T.fields[C]))T=T.fields[C];else{$=!1;break}}if($){let b=g.fieldPath[g.fieldPath.length-1],L=T.type.fields.findIndex(C=>C.label===b);if(L>=0){let C=T.fields[L];if(C&&ne(C)&&C.funcId===r.funcId){p=g;break}}}}}if(p){let g=p.cParamName;return jc(g,_,s,o,e,t,c,p)}}let f=n.functions[r.funcId]?.cName;if(f){let p=r.specializedType??r.type,m=$t(p);if(m.length===0&&r.specializedType){let d=$t(r.type);d.length>0&&d.some(v=>v.fieldFunctionType.forallParameters&&v.fieldFunctionType.forallParameters.length>0)&&(m=d)}if(m.length>0){let{args:d,isHandlerInstallation:v}=$l(m,r,e,n);if(d.length>0){let T=l?`${l}, ${d.join(", ")}`:d.join(", ");return bl(f,T,_,e,o,t,n,v)}}let g=r.isControlFunction||r.isModuleEffectMember||r.body?.$?.effectAnalysis?.hasEffects,h=!1;if(g){if(r.isControlFunction||r.isModuleEffectMember){let d=e.func?.$?.env??e.$?.env;if(d){let v=Bo(d,T=>T.isImplicit===!0&&ne(T.value?.[0])&&T.value[0].funcId===r.funcId);v>=0&&v>d.functionDeclarationFrameLevel&&d.frames[v]?.isBeginBlockFrame&&(h=!0)}}else if(r.specializedType){let d=$t(r.type);if(d.length>0){let v=e.func?.$?.env??e.$?.env;if(v)for(let T of d){let $=Bo(v,b=>b.isImplicit===!0&&(b.name===T.implicitLabel||b.name===T.fieldLabel));if($>=0&&$>v.functionDeclarationFrameLevel&&v.frames[$]?.isBeginBlockFrame){h=!0;break}}}}}if(fe(_.return.type))return n.emitter.emitLine(`${t}${f}(${l});`),e.$?.deferredDropExpressions&&Ct(e,t,n),g&&Hc(t,n,h,e),"";{let d=e.$?.variableName;if(d){let v=r.specializedType?.return.type??_.return.type,T=e.$?.type,$=T&&be(T),b=v&&be(v),L;if($&&b){let C=r.body;if(C&&E(C,"begin")){let R=C.args;if(R.length>0){let N=R[R.length-1];Rt(N)&&(C=N)}}if(C&&Rt(C)&&C.$?.asyncStateMachineStructName){let R=C.$.asyncStateMachineStructName;L=`${R}*`,n.tempVarAsyncStructNames||(n.tempVarAsyncStructNames=new Map),n.tempVarAsyncStructNames.set(d,R)}else T&&V(T)&&T.resolvedConcreteType?L=P(T,n):L=P(v,n)}else L=P(v??T,n);return n.emitter.emitLine(`${t}${L} ${d} = ${f}(${l});`),Ln(d,t,n),e.$?.deferredDropExpressions&&Ct(e,t,n),g&&Hc(t,n,h,e),d}else return`// Error: Regular function call returns ${P(r.specializedType?.return.type??_.return.type,n)} but no temp variable assigned`}}}else{let u=n.externFunctions[i.id];if(u){let _=u.cName;return e.$?.deferredDropExpressions&&Ct(e,t,n),`${_}(${l})`}else{let _=M(e.func,t,n);if(r&&G(r.type)){let d=$t(r.type);if(d.length>0){let{args:v,isHandlerInstallation:T}=$l(d,r,e,n);if(v.length>0){let $=l?`${l}, ${v.join(", ")}`:v.join(", ");return bl(_,$,i,e,o,t,n,T)}}}let c=e.$?.type??i.return.type,f=P(c,n),p=i.parameters.filter(d=>!d.isCompileTimeOnly).map(d=>P(d.type,n)),m=`((${f} (*)(${p.join(", ")}))${_})`,g=n,h=_.includes("__capture.")&&!!g.inAsyncStateMachine;if(h&&n.emitter.emitLine(`${t}__yo_effect_escaped = 0;`),fe(i.return.type)||fe(c)){if(n.emitter.emitLine(`${t}${m}(${l});`),e.$?.deferredDropExpressions&&Ct(e,t,n),h){if(n.emitter.emitLine(`${t}if (__yo_effect_escaped) {`),o){for(let d of o)if(d.$?.variableName&&d.$?.type&&Le(d.$.type)){let v=qc(te(d.$.variableName),n),T=Nr(v,d.$.type,n);T&&(n.emitter.emitLine(`${t} ${T};`),n.emitter.emitLine(`${t} memset(&${v}, 0, sizeof(${v}));`))}}Mn({emitter:n.emitter,indent:t+" ",resultCode:void 0,debugLabel:void 0}),n.emitter.emitLine(`${t}}`)}return""}else{let d=e.$?.variableName;if(d){let v=i.return.type,T=e.$?.type,$=T&&v&&be(T)&&be(v)?v:T??v;if(n.emitter.emitLine(`${t}${P($,n)} ${d} = ${m}(${l});`),Ln(d,t,n),e.$?.deferredDropExpressions&&Ct(e,t,n),h){if(n.emitter.emitLine(`${t}if (__yo_effect_escaped) {`),o){for(let b of o)if(b.$?.variableName&&b.$?.type&&Le(b.$.type)){let L=qc(te(b.$.variableName),n),C=Nr(L,b.$.type,n);C&&(n.emitter.emitLine(`${t} ${C};`),n.emitter.emitLine(`${t} memset(&${L}, 0, sizeof(${L}));`))}}Mn({emitter:n.emitter,indent:t+" ",resultCode:void 0,debugLabel:void 0}),n.emitter.emitLine(`${t}}`)}return d}else return`// Error: Function parameter call returns ${P(i.return.type,n)} but no temp variable assigned`}}}}}else if(i&&Wt(i)){let o=i,a=nn(o),s=Ce(o);{let l=a.isFn.callType,u=e.$?.runtimeArgExprsInOrder;if(u){let _=n;for(let g of u)if(g.$?.variableName&&g.$?.type){let h=_.currentClosureCaptures&&_.currentClosureCaptures.includes(g.$.variableName)&&U(g)&&g.$.env&&_.currentClosureCaptureFrameLevel!==void 0&&$r(g.token.value,g.$.env,_.currentClosureCaptureFrameLevel),d=M(g,t,n),v=!1;if(U(g)&&g.$.env&&g.$.variableName){let $=X(g.$.env,g.$.variableName);$.length>0&&$[$.length-1].isCompileTimeOnly&&(v=!0)}let T=(_.inAsyncStateMachine||_.inEffectStateMachine)&&d.startsWith("sm->");if(d&&d!==g.$.variableName&&!h&&!T&&!v){let $=g.$.convertedRuntimeType||g.$.type,b=st($,g.$.variableName,n);n.emitter.emitLine(`${t}${b} = ${d};`),Ln(g.$.variableName,t,n)}}let c=M(e.func,t,n),f=u.map(g=>{if(g.$?.variableName&&g.$?.type){if(_.currentClosureCaptures&&_.currentClosureCaptures.includes(g.$.variableName)&&U(g)&&g.$.env&&_.currentClosureCaptureFrameLevel!==void 0&&$r(g.token.value,g.$.env,_.currentClosureCaptureFrameLevel))return M(g,t,n);{let d=Ee(g.$.variableName,g.$.env),v=(_.inAsyncStateMachine||_.inEffectStateMachine)&&d.startsWith("sm->"),T=d;if(g.$?.deferredDupExpressions&&g.$.deferredDupExpressions.length>0){rt(g,t,_);let $=g.$.deferredDupExpressions[0];F($)&&$.$?.variableName&&(T=Ee($.$.variableName,$.$.env))}return v?d:T}}else return M(g,t,n)}),p;if(s){let g=[`(${c}).data`,...f];p=`(${c}).vtable->call(${g.join(", ")})`}else{let g;if(V(o)){let d=o;d.resolvedConcreteType&&(g=d.resolvedConcreteType.id)}let h=g?n.implClosureCallMap.get(g):void 0;if(h){let d=$t(l);if(d.length>0){let{args:T,isHandlerInstallation:$}=$l(d,{},e,_);if(T.length>0){let b=[`&(${c})`,...f,...T];return bl(h.functionCName,b.join(", "),l,e,u,t,_,$)}}let v=[`&(${c})`,...f];p=`${h.functionCName}(${v.join(", ")})`}else{let d=[`(${c}).data`,...f];p=`(${c}).call(${d.join(", ")})`}}let m=l.return.type;if(fe(m))return n.emitter.emitLine(`${t}${p};`),e.$?.deferredDropExpressions&&Ct(e,t,n),"";{let g=e.$?.variableName;return g?(n.emitter.emitLine(`${t}${P(m,n)} ${g} = ${p};`),Ln(g,t,n),e.$?.deferredDropExpressions&&Ct(e,t,n),g):`// Error: Closure call returns ${P(m,n)} but no temp variable assigned`}}else return"// Error: No runtime args found for closure call"}}else if(O(r))if(_e(r.value)){let o=r.value,a=e.$?.runtimeArgExprsInOrder,s=n.types[o.id]?.cName,l=o.fields.map(_=>_.label),u=e.$?.variableName;if(a&&s&&l.length===a.length){if(o.isNewtype&&o.fields.length===1){let _=a[0],c=M(_,t,n),f=c;if(_.$?.deferredDupExpressions&&_.$.deferredDupExpressions.length>0){let m=n;if(_.$?.variableName&&_.$?.type){let h=Ee(_.$.variableName,_.$.env);if(c!==h){let d=_.$.type,v=P(d,n);n.emitter.emitLine(`${t}${v} ${h} = ${c};`)}}rt(_,t,m);let g=_.$.deferredDupExpressions[0];F(g)&&g.$?.variableName&&(f=Ee(g.$.variableName,g.$.env))}let p=`((${s})(${f}))`;if(u&&e.$?.type){let m=st(e.$.type,u,n);return n.emitter.emitLine(`${t}${m} = ${p};`),Ln(u,t,n),u}else return p}if(o.isReferenceSemantics){let _=n,c=a.map(m=>{let g=M(m,t,n);if(m.$?.deferredDupExpressions&&m.$.deferredDupExpressions.length>0){if(m.$?.variableName&&m.$?.type){let d=Ee(m.$.variableName,m.$.env);if(g!==d){let v=m.$.type,T=P(v,n);n.emitter.emitLine(`${t}${T} ${d} = ${g};`)}}rt(m,t,_);let h=m.$.deferredDupExpressions[0];if(F(h)&&h.$?.variableName)return Ee(h.$.variableName,h.$.env)}return g}).join(", "),p=`${`__yo_new_${s}`}(${c})`;if(u&&e.$?.type){let m=st(e.$.type,u,n);return n.emitter.emitLine(`${t}${m} = ${p};`),Ln(u,t,n),u}else return p}else{let _=n,c=a.map((p,m)=>{let g=M(p,t,n),h=we(o)?`_${m}`:te(l[m],o.isExtern==="c"),d=g;if(p.$?.deferredDupExpressions&&p.$.deferredDupExpressions.length>0){if(p.$?.variableName&&p.$?.type){let T=Ee(p.$.variableName,p.$.env),$=p.$.type,b=P($,n);g!==T&&n.emitter.emitLine(`${t}${b} ${T} = ${g};`)}rt(p,t,_);let v=p.$.deferredDupExpressions[0];F(v)&&v.$?.variableName&&(d=Ee(v.$.variableName,v.$.env))}return`.${h} = `+d}).join(", "),f=`(${s}){ ${c} }`;if(u&&e.$?.type){let p=st(e.$.type,u,n);return n.emitter.emitLine(`${t}${p} = ${f};`),Ln(u,t,n),u}else return f}}}else{if(Wt(r.value))return"// Error: Closure construction should have been handled by closureFunctionValue check at top of generateFuncCall";if(it(r.value)){let o=e.$?.variableName,a=e.args[0];if(a&&F(a)&&E(a,":",2)){let s=a.args[0],l=a.args[1],u=n.types[r.value.id]?.cName;if(u&&U(s)&&l){let _=n,c=s.token.value,f=Ee(c,s.$?.env),m=M(l,t,n);if(l.$?.deferredDupExpressions&&l.$.deferredDupExpressions.length>0){rt(l,t,_);let h=l.$.deferredDupExpressions[0];F(h)&&h.$?.variableName&&(m=Ee(h.$.variableName,h.$.env))}let g=`(${u}){ .${f} = ${m} }`;if(o&&e.$?.type){let h=st(e.$.type,o,n);return n.emitter.emitLine(`${t}${h} = ${g};`),Ln(o,t,n),o}else return g}}}else if(ge(r.value)){let o=r.value,a=e.$?.runtimeArgExprsInOrder,s=n.types[o.id]?.cName,l=e.$?.variableName;if(o.selectedVariantName&&a&&s){if(qt(o)){let p=o.selectedVariantName,m=o.variants.find(g=>g.name===p);if(m){if(!m.fields||m.fields.length===0){let g="NULL";if(l&&e.$?.type){let h=st(e.$.type,l,n);return n.emitter.emitLine(`${t}${h} = ${g};`),Ln(l,t,n),l}else return g}else if(m.fields.length===1){let g=M(a[0],t,n);if(l&&e.$?.type){let h=st(e.$.type,l,n);return n.emitter.emitLine(`${t}${h} = ${g};`),Ln(l,t,n),l}else return g}}}if(Fn(o)){let p=o.selectedVariantName,m=Bt(o,p,n);if(l&&e.$?.type){let g=st(e.$.type,l,n);return n.emitter.emitLine(`${t}${g} = ${m};`),Ln(l,t,n),l}else return m}let c=o.selectedVariantName,f=o.variants.find(p=>p.name===c);if(f){let p=f.fields?.filter(d=>!fe(d.type))||[],m=n,g=a.map((d,v)=>{if(f.fields){let T=f.fields[v];if(T&&!fe(T.type)){let $=M(d,t,n),b=Ee(T.label,d.$?.env),L=$;if(d.$?.variableName&&d.$?.type){let C=m.currentClosureCaptures&&m.currentClosureCaptures.includes(d.$.variableName)&&U(d)&&d.$.env&&m.currentClosureCaptureFrameLevel!==void 0&&$r(d.token.value,d.$.env,m.currentClosureCaptureFrameLevel),R=(m.inAsyncStateMachine||m.inEffectStateMachine)&&$.startsWith("sm->"),N=!1;if(U(d)&&d.$.env&&d.$.variableName){let D=X(d.$.env,d.$.variableName);D.length>0&&D[D.length-1].isCompileTimeOnly&&(N=!0)}let B=!1;if($&&$!==d.$.variableName&&!C&&!R&&!N){let D=Ee(d.$.variableName,d.$.env);if($!==D){let x=st(d.$.type,d.$.variableName,n);n.emitter.emitLine(`${t}${x} = ${$};`),B=!0,Ln(d.$.variableName,t,n)}}B&&(L=Ee(d.$.variableName,d.$.env))}if(d.$?.deferredDupExpressions&&d.$.deferredDupExpressions.length>0){rt(d,t,m);let C=d.$.deferredDupExpressions[0];F(C)&&C.$?.variableName&&(L=Ee(C.$.variableName,C.$.env))}return`.${b} = `+L}return""}else return""}).filter(d=>d).join(", "),h=p.length>0?`(${s}){ .tag = ${Bt(o,c,n)}, .data = { .${c} = { ${g} } } }`:`(${s}){ .tag = ${Bt(o,c,n)} }`;if(l&&e.$?.type){let d=st(e.$.type,l,n);return n.emitter.emitLine(`${t}${d} = ${h};`),Ln(l,t,n),l}else return h}}}}else if(ke(i)){let o=e.args[0];if(o&&F(o)&&E(o,":")){let l=M(e.func,t,n),u=M(o.args[0],t,n),_=M(o.args[1],t,n),c=`Slice_${te(P(i.childType,n))}`;return n.sliceStructTypes.has(c)||n.sliceStructTypes.set(c,{childType:P(i.childType,n)}),`(${c}){ .data = &${l}.data[${u}], .length = (${_}) - (${u}) }`}else if(o&&U(o)&&o.token.value===":"){let l=M(e.func,t,n),u=i,_=u.childType,c=`Slice_${te(P(_,n))}`;return n.sliceStructTypes.has(c)||n.sliceStructTypes.set(c,{childType:P(_,n)}),Ue(u.length)?`(${c}){ .data = &${l}.data[0], .length = ${u.length.value} }`:"/* Error: Cannot slice array with non-compile-time length */"}let a=M(e.func,t,n),s=M(o,t,n);return`${a}.data[${s}]`}else if(Qe(i)){let o=e.args[0];if(o&&F(o)&&E(o,":")){let l=M(e.func,t,n),u=M(o.args[0],t,n),_=M(o.args[1],t,n),c=`Slice_${te(P(i.childType,n))}`;return n.sliceStructTypes.has(c)||n.sliceStructTypes.set(c,{childType:P(i.childType,n)}),`(${c}){ .data = &${l}.data[${u}], .length = (${_}) - (${u}) }`}else if(o&&U(o)&&o.token.value===":"){let l=M(e.func,t,n),u=`Slice_${te(P(i.childType,n))}`;return n.sliceStructTypes.has(u)||n.sliceStructTypes.set(u,{childType:P(i.childType,n)}),`(${u}){ .data = ${l}.data, .length = ${l}.length }`}let a=M(e.func,t,n),s=M(o,t,n);return`${a}.data[${s}]`}else if(i&&Ie(i)&&Qe(i.childType)){let o=M(e.func,t,n),a=M(e.args[0],t,n);return`${o}.data[${a}]`}}function Hc(e,t,n,r){let i=t.emitter;if(i.emitLine(`${e}if (__yo_effect_escaped) {`),t.inAsyncStateMachine||(dn(e+" ",t,r,!1,!0,!1),ir(e+" ",t,r)),t.inAsyncStateMachine)n&&i.emitLine(`${e} __yo_effect_escaped = 0;`),Mn({emitter:i,indent:e+" ",resultCode:void 0,debugLabel:void 0});else if(n){i.emitLine(`${e} __yo_effect_escaped = 0;`);let o=t.currentFunctionType?.return.type;if(o&&!fe(o)){let a=P(o,t);a!=="void"?(i.emitLine(`${e} ${a} _esc_result;`),i.emitLine(`${e} memcpy(&_esc_result, __yo_effect_escape_value, sizeof(${a}));`),i.emitLine(`${e} return _esc_result;`)):i.emitLine(`${e} return;`)}else i.emitLine(`${e} return;`)}else{let o=t.currentFunctionType?.return.type;if(o&&!fe(o)){let a=P(o,t);a!=="void"?i.emitLine(`${e} return (${a}){0};`):i.emitLine(`${e} return;`)}else i.emitLine(`${e} return;`)}i.emitLine(`${e}}`)}function jc(e,t,n,r,i,o,a,s){let l=n.join(", "),u=t.return.type,_=a.emitter,c;if(s?.fieldFunctionType.forallParameters&&s.fieldFunctionType.forallParameters.length>0){let f=i.$?.type?P(i.$.type,a):P(u,a),p=[],g=s.fieldFunctionType.parameters.filter(d=>!d.isCompileTimeOnly);for(let d=0;d<g.length;d++){let v=g[d].type,T=V(v)&&r?.[d]?.$?.type?r[d].$.type:v,$=G(T)?Er(T,"(*)",a):P(T,a);p.push($)}let h=p.join(", ");c=`((${f} (*)(${h}))${e})`}else c=e;if(fe(u)){if(_.emitLine(`${o}${c}(${l});`),i.$?.deferredDropExpressions&&Ct(i,o,a),_.emitLine(`${o}if (__yo_effect_escaped) {`),a.inAsyncStateMachine||(dn(o+" ",a,i,!1,!0,!1),ir(o+" ",a,i)),a.inAsyncStateMachine)Mn({emitter:_,indent:o+" ",resultCode:void 0,debugLabel:void 0});else{let f=a.currentFunctionType?.return.type;if(f&&!fe(f)){let p=P(f,a);p!=="void"?_.emitLine(`${o} return (${p}){0};`):_.emitLine(`${o} return;`)}else _.emitLine(`${o} return;`)}return _.emitLine(`${o}}`),""}else{let f=i.$?.variableName;if(f){let p=s?.fieldFunctionType.forallParameters?.length&&i.$?.type?i.$.type:u,m=P(p,a);if(m==="void"||fe(p)){if(_.emitLine(`${o}${c}(${l});`),i.$?.deferredDropExpressions&&Ct(i,o,a),_.emitLine(`${o}if (__yo_effect_escaped) {`),a.inAsyncStateMachine||(dn(o+" ",a,i,!1,!0,!1),ir(o+" ",a,i)),a.inAsyncStateMachine)Mn({emitter:_,indent:o+" ",resultCode:void 0,debugLabel:void 0});else{let g=a.currentFunctionType?.return.type;if(g&&!fe(g)){let h=P(g,a);h!=="void"?_.emitLine(`${o} return (${h}){0};`):_.emitLine(`${o} return;`)}else _.emitLine(`${o} return;`)}return _.emitLine(`${o}}`),""}if(_.emitLine(`${o}${m} ${f} = ${c}(${l});`),i.$?.deferredDropExpressions&&Ct(i,o,a),_.emitLine(`${o}if (__yo_effect_escaped) {`),a.inAsyncStateMachine||(dn(o+" ",a,i,!1,!0,!1),ir(o+" ",a,i)),a.inAsyncStateMachine)Mn({emitter:_,indent:o+" ",resultCode:void 0,debugLabel:void 0});else{let g=a.currentFunctionType?.return.type;if(g&&!fe(g)){let h=P(g,a);h!=="void"?_.emitLine(`${o} return (${h}){0};`):_.emitLine(`${o} return;`)}else _.emitLine(`${o} return;`)}return _.emitLine(`${o}}`),f}else return`${c}(${l})`}}function $l(e,t,n,r){let i=[],o=t.body?.$?.effectAnalysis,a=!1;for(let s of e){let l=`${s.implicitLabel}.${s.fieldLabel}`,u=!1;if(r.currentEvidenceParams){let _=r.currentEvidenceParams.get(l);_&&(i.push(_.cParamName),u=!0)}if(!u){if(o){if(o.effectHandlerInfos)for(let _ of o.effectHandlerInfos){if(_.effectParameterName!==s.fieldLabel&&_.effectParameterName!==s.implicitLabel)continue;let c=_.handlerValue;if(c&&ne(c)){if(c.specializedFunctionCaches?.length){let p=c.specializedFunctionCaches[0].specializedFunction,m=r.functions[p.funcId]?.cName;if(m){i.push(`(void*)${m}`),u=!0,a=!0;break}}let f=r.functions[c.funcId]?.cName;if(f){i.push(f),u=!0,a=!0;break}}}if(!u&&o.handlerValue&&e.length===1){let _=o.handlerValue;if(_&&ne(_)){if(_.specializedFunctionCaches?.length){let c=_.specializedFunctionCaches[0].specializedFunction,f=r.functions[c.funcId]?.cName;f&&(i.push(`(void*)${f}`),u=!0,a=!0)}if(!u){let c=r.functions[_.funcId]?.cName;c&&(i.push(c),u=!0,a=!0)}}}}if(!u){let _=n.func.$?.env??n.$?.env;if(_){let c=X(_,s.implicitLabel),f=pn(_,d=>d.isImplicit===!0&&G(d.type)&&G(s.fieldFunctionType)&&d.type===s.fieldFunctionType),p=c[c.length-1],m=f[f.length-1],h=(m&&m!==p?m:p??m)?.value?.[0];if(h&&We(h)){let d=h,v=!0;for(let T=0;T<s.fieldPath.length-1;T++){let $=s.fieldPath[T],b=d.type.fields.findIndex(L=>L.label===$);if(b>=0&&d.fields[b]&&We(d.fields[b]))d=d.fields[b];else{v=!1;break}}if(v){let T=s.fieldPath[s.fieldPath.length-1],$=d.type.fields.findIndex(b=>b.label===T);if($>=0){let b=d.fields[$];if(b&&ne(b)){if(b.specializedFunctionCaches?.length>0){let L=b.specializedFunctionCaches[0].specializedFunction,C=r.functions[L.funcId]?.cName;C&&(i.push(`(void*)${C}`),u=!0)}if(!u){let L=r.functions[b.funcId]?.cName;L&&(i.push(L),u=!0)}}}}}else if(h&&ne(h)){if(h.specializedFunctionCaches?.length){let d=h.specializedFunctionCaches[0].specializedFunction,v=r.functions[d.funcId]?.cName;v&&(i.push(`(void*)${v}`),u=!0)}if(!u){let d=r.functions[h.funcId]?.cName;d&&(i.push(d),u=!0)}}u&&(a=!0)}}if(!u&&r.stateMachineVariables){let _=s.fieldPath[s.fieldPath.length-1];for(let[,c]of r.stateMachineVariables)if(c.name===_&&c.kind==="outer"){i.push(`sm->__capture.${_}`),u=!0;break}}if(!u)break}}return{args:i,isHandlerInstallation:a}}function bl(e,t,n,r,i,o,a,s=!1){let l=a.emitter,u=n.return.type;if(l.emitLine(`${o}__yo_effect_escaped = 0;`),fe(u)){if(l.emitLine(`${o}${e}(${t});`),r.$?.deferredDropExpressions&&Ct(r,o,a),l.emitLine(`${o}if (__yo_effect_escaped) {`),a.inAsyncStateMachine||(dn(o+" ",a,r,!1,!0,!1),ir(o+" ",a,r)),a.inAsyncStateMachine)Mn({emitter:l,indent:o+" ",resultCode:void 0,debugLabel:void 0});else{let _=a.currentFunctionType?.return.type;if(s&&l.emitLine(`${o} __yo_effect_escaped = 0;`),_&&!fe(_))if(s){let c=P(_,a);c!=="void"?(l.emitLine(`${o} ${c} _esc_result;`),l.emitLine(`${o} memcpy(&_esc_result, __yo_effect_escape_value, sizeof(${c}));`),l.emitLine(`${o} return _esc_result;`)):l.emitLine(`${o} return;`)}else{let c=P(_,a);c!=="void"?l.emitLine(`${o} return (${c}){0};`):l.emitLine(`${o} return;`)}else l.emitLine(`${o} return;`)}return l.emitLine(`${o}}`),""}else{let _=r.$?.variableName;if(_){let c=P(u,a);if(l.emitLine(`${o}${c} ${_} = ${e}(${t});`),Ln(_,o,a),r.$?.deferredDropExpressions&&Ct(r,o,a),l.emitLine(`${o}if (__yo_effect_escaped) {`),a.inAsyncStateMachine||(dn(o+" ",a,r,!1,!0,!1),ir(o+" ",a,r)),a.inAsyncStateMachine)Mn({emitter:l,indent:o+" ",resultCode:void 0,debugLabel:void 0});else{let f=a.currentFunctionType?.return.type;if(s&&f&&!fe(f)){let p=P(f,a);l.emitLine(`${o} ${p} _esc_result;`),l.emitLine(`${o} memcpy(&_esc_result, __yo_effect_escape_value, sizeof(${p}));`),l.emitLine(`${o} __yo_effect_escaped = 0;`),l.emitLine(`${o} return _esc_result;`)}else if(f&&!fe(f)){let p=P(f,a);p!=="void"?l.emitLine(`${o} return (${p}){0};`):l.emitLine(`${o} return;`)}else s&&l.emitLine(`${o} __yo_effect_escaped = 0;`),l.emitLine(`${o} return;`)}return l.emitLine(`${o}}`),_}else return`${e}(${t})`}}function Xc(e,t,n){let r=n.emitter,i=e.$?.type;if(!i)return"// Error: panic() missing type information";if(e.args.length===0)r.emitLine(`${t}abort();`);else if(e.args.length===1){let a=e.args[0];if(a.$?.value&&xe(a.$.value)){let s=a.$.value.value;r.emitLine(`${t}fprintf(stderr, "%s\\n", ${JSON.stringify(s)});`),r.emitLine(`${t}abort();`)}else{let s=M(a,t,n);r.emitLine(`${t}fprintf(stderr, "%s\\n", ${s});`),r.emitLine(`${t}abort();`)}}else return`// Error: panic accepts 0 or 1 arguments, got ${e.args.length}`;return`(*((${P(i,n)}*)NULL))`}var yg={reg:{x86_64:"r",aarch64:"r",x86:"r",arm:"r"},reg_byte:{x86_64:"q",x86:"q"},reg_abcd:{x86_64:"Q",x86:"Q"},xmm_reg:{x86_64:"x",aarch64:"w"},ymm_reg:{x86_64:"x"},imm:{x86_64:"i",aarch64:"i",x86:"i",arm:"i"},mem:{x86_64:"m",aarch64:"m",x86:"m",arm:"m"}},gg={rax:"a",eax:"a",ax:"a",al:"a",rbx:"b",ebx:"b",bx:"b",bl:"b",rcx:"c",ecx:"c",cx:"c",cl:"c",rdx:"d",edx:"d",dx:"d",dl:"d",rsi:"S",esi:"S",si:"S",rdi:"D",edi:"D",di:"D"},hg={e:"k",x:"w",l:"b",h:"h",w:"w"};function vg(e,t){if(!e)return"r";if(e.startsWith("raw:"))return e.slice(4);let n=gg[e];if(n)return n;let r=yg[e];return r?r[t]??r.x86_64??"r":e}function Tg(e,t){let n="",r=0;for(;r<e.length;)if(e[r]==="{"){if(r+1<e.length&&e[r+1]==="{"){n+="{",r+=2;continue}let i=e.indexOf("}",r+1);if(i===-1){n+=e[r],r++;continue}let o=e.slice(r+1,i),a=o.indexOf(":"),s,l;a>=0?(s=o.slice(0,a),l=o.slice(a+1)):s=o;let u=l?hg[l]??l:void 0,_=parseInt(s,10);isNaN(_)?u?n+=`%${u}[${s}]`:n+=`%[${s}]`:u?n+=`%${u}${_}`:n+=`%${_}`,r=i+1}else e[r]==="}"&&r+1<e.length&&e[r+1]==="}"?(n+="}",r+=2):(n+=e[r],r++);return n}function Eg(e,t,n,r){let i=e.args,o=n.targetInfo.arch;if(r==="const_val"){let d,v=0;i.length===2&&i[0].$?.value&&xe(i[0].$.value)&&(d=i[0].$.value.value,v=1);let T=M(i[v],t,n);return{kind:"const_val",name:d,constraint:"",cExpr:T,cType:"",isDiscarded:!1,isVariableTarget:!1}}if(r==="sym"){let d,v=0;i.length===2&&i[0].$?.value&&xe(i[0].$.value)&&(d=i[0].$.value.value,v=1);let T=M(i[v],t,n);return{kind:"sym",name:d,constraint:"i",cExpr:T,cType:"",isDiscarded:!1,isVariableTarget:!1}}let a,s=0;if(i.length>=2){let d=i[0];d.$?.value&&xe(d.$.value)&&!(d.tag==="Atom"&&Qc(d.token.value))&&(a=d.$.value.value,s=1)}let l=s<i.length-1,u,_;l?(u=$g(i[s],t,n),_=s+1):(a!==void 0&&(u=a),_=s);let c=vg(u,o),f=i[_];if(f.tag==="Atom"&&f.token.value==="_")return{kind:r,name:a,constraint:c,cExpr:"",cType:"int32_t",isDiscarded:!0,isVariableTarget:!1};if(f.$?.value&&O(f.$.value)){let d=f.$.value.value,v=P(d,n);return{kind:r,name:a,constraint:c,cExpr:"",cType:v,isDiscarded:!1,isVariableTarget:!1}}let p=M(f,t,n),m=P(f.$?.type,n),h=(r==="out"||r==="lateout")&&f.tag==="Atom";return{kind:r,name:a,constraint:c,cExpr:p,cType:m,isDiscarded:!1,isVariableTarget:h}}function Qc(e){return["reg","reg_byte","reg_abcd","xmm_reg","ymm_reg","imm","mem"].includes(e)}function $g(e,t,n){if(e.tag==="Atom"&&Qc(e.token.value))return e.token.value;if(e.$?.value&&xe(e.$.value))return e.$.value.value;if(E(e,"raw",1)){let r=e;if(r.args[0].$?.value&&xe(r.args[0].$.value))return`raw:${r.args[0].$.value.value}`}return"r"}function bg(e,t){let n=[];if((e.func.tag==="Atom"?e.func.token.value:"clobber")==="clobber_abi"){let i=t.targetInfo.arch;if(i==="x86_64")n.push("rax","rcx","rdx","rsi","rdi","r8","r9","r10","r11","xmm0","xmm1","xmm2","xmm3","xmm4","xmm5","xmm6","xmm7","xmm8","xmm9","xmm10","xmm11","xmm12","xmm13","xmm14","xmm15","cc","memory");else if(i==="aarch64"){for(let o=0;o<=18;o++)n.push(`x${o}`);n.push("x30");for(let o=0;o<=31;o++)n.push(`v${o}`);n.push("cc","memory")}return n}for(let i of e.args)i.$?.value&&xe(i.$.value)?n.push(i.$.value.value):i.tag==="Atom"&&n.push(i.token.value);return n}function Cg(e){let t={isVolatile:!0,intelSyntax:!1,noreturn:!1,pure:!1};for(let n of e.args)if(n.tag==="Atom")switch(n.token.value){case"pure":t.pure=!0,t.isVolatile=!1;break;case"intel_syntax":t.intelSyntax=!0;break;case"noreturn":t.noreturn=!0;break;case"volatile":t.isVolatile=!0;break}return t}var Cl=0;function Zc(e,t,n){let r=n.emitter,i=e.$?.type;if(!i)return"/* Error: asm() missing type information */";if(Hn(n.targetInfo))return r.emitLine(`${t}/* Error: inline assembly is not supported on WebAssembly */`),r.emitLine(`${t}abort();`),`(*((${P(i,n)}*)NULL))`;let o=[],a=0;for(;a<e.args.length;){let D=e.args[a];if(F(D))break;if(D.$?.value&&xe(D.$.value))o.push(D.$.value.value),a++;else break}let s=o.join(`
|
|
11031
11031
|
`),l=[],u=[],_={isVolatile:!0,intelSyntax:!1,noreturn:!1,pure:!1};for(;a<e.args.length;){let D=e.args[a];if(!F(D)){a++;continue}let x=D.func.tag==="Atom"?D.func.token.value:void 0;if(!x){a++;continue}["in","out","inout","lateout","inlateout","const_val","sym"].includes(x)?l.push(Eg(D,t,n,x)):x==="clobber"||x==="clobber_abi"?u.push(...bg(D,n)):x==="asm_options"&&(_=Cg(D)),a++}let c=new Map;for(let D=0;D<l.length;D++)l[D].name&&c.set(l[D].name,D);let f=s;for(let D=0;D<l.length;D++){let x=l[D];x.kind==="const_val"&&(x.name&&(f=f.replace(new RegExp(`\\{${x.name}(?::[^}]*)?\\}`,"g"),x.cExpr)),f=f.replace(new RegExp(`\\{${D}(?::[^}]*)?\\}`,"g"),x.cExpr))}let p=Tg(f,c),m=[],g=[],h=[];for(let D=0;D<l.length;D++){let x=l[D];if(x.isDiscarded){let z=`__asm_discard_${Cl++}`;h.push({varName:z,cType:x.cType,operandIdx:D}),r.emitLine(`${t}${x.cType} ${z};`)}else if(x.kind==="out"||x.kind==="lateout"){if(!x.isVariableTarget){if(x.cType){let z=`__asm_out_${Cl++}`;m.push({varName:z,cType:x.cType,operandIdx:D}),r.emitLine(`${t}${x.cType} ${z};`)}}}else if(x.kind==="inout"||x.kind==="inlateout"){let z=`__asm_inout_${Cl++}`;g.push({varName:z,cType:x.cType,initExpr:x.cExpr,operandIdx:D}),r.emitLine(`${t}${x.cType} ${z} = ${x.cExpr};`)}}let d=_.isVolatile?" __volatile__":"",v=p;_.intelSyntax&&(n.needsIntelAsmSyntax=!0);let T=JSON.stringify(v),$=[];for(let D=0;D<l.length;D++){let x=l[D];if(x.kind==="in"||x.kind==="const_val"||x.kind==="sym")continue;let z;x.kind==="out"||x.kind==="lateout"?z=x.kind==="lateout"?"=&":"=":z=x.kind==="inlateout"?"+&":"+";let re=`${z}${x.constraint}`,j=x.name?`[${x.name}] `:"",W;x.isDiscarded?W=h.find(ce=>ce.operandIdx===D).varName:x.isVariableTarget?W=x.cExpr:x.kind==="out"||x.kind==="lateout"?W=m.find(ce=>ce.operandIdx===D).varName:W=g.find(ce=>ce.operandIdx===D).varName,$.push(`${j}"${re}" (${W})`)}let b=[];for(let D=0;D<l.length;D++){let x=l[D];if(x.kind!=="in"&&x.kind!=="sym")continue;let z=x.constraint,re=x.name?`[${x.name}] `:"";b.push(`${re}"${z}" (${x.cExpr})`)}let L=u.map(D=>`"${D}"`),C=$.join(", "),R=b.join(", "),N=L.join(", ");if(r.emitLine(`${t}__asm__${d} (`),r.emitLine(`${t} ${T}`),r.emitLine(`${t} : ${C}`),r.emitLine(`${t} : ${R}`),r.emitLine(`${t} : ${N}`),r.emitLine(`${t});`),_.noreturn)return r.emitLine(`${t}__builtin_unreachable();`),`(*((${P(i,n)}*)NULL))`;if(fe(i))return"";let B=[];for(let D=0;D<l.length;D++){let x=l[D];if(!(x.isDiscarded||x.isVariableTarget)&&!(x.kind==="in"||x.kind==="const_val"||x.kind==="sym"))if(x.kind==="out"||x.kind==="lateout"){let z=m.find(re=>re.operandIdx===D);z&&B.push(z.varName)}else{let z=g.find(re=>re.operandIdx===D);z&&B.push(z.varName)}}if(B.length===1)return B[0];if(B.length>1){let D=P(i,n),x=B.map((z,re)=>`._${re} = ${z}`).join(", ");return`((${D}){ ${x} })`}return""}function Jc(e,t,n){if(Hn(n.targetInfo))return"/* global_asm skipped: not supported on this target */";let r=e.args[0];if(r.$?.value&&xe(r.$.value)){let i=r.$.value.value;n.emitter.emitDeclarationLine(`__asm__(${JSON.stringify(i)});`)}return""}function ef(e,t,n){if(e.args.length!==2)return"/* ERROR: field access requires exactly 2 arguments */";let r=e.args[0],i=e.args[1];if(!r||!i)return"/* ERROR: invalid field access arguments */";let o=M(r,t,n),a=r.$?.type,s=r.$?.value;if(U(i)){let l=i.token.value,u=n;if(u.currentEvidenceParams&&U(r)){let c=`${r.token.value}.${l}`,f=u.currentEvidenceParams.get(c);if(f)return f.cParamName}if(e.$?.value&&ne(e.$.value)){let _=e.$.value;return n.functions[_.funcId]?.cName||_.funcId}if(!e.$?.value&&(k.___dispose.includes(l)||k.___drop.includes(l)||k.___dup.includes(l))&&a){let _=null;if((_e(a)||ge(a))&&(_=a.trait),_){let c=_.fields.find(f=>f.label===l&&f.assignedValue&&ne(f.assignedValue));if(c&&ne(c.assignedValue)){let f=c.assignedValue;return n.functions[f.funcId]?.cName||f.funcId}else return`/* ERROR: Rc method ${l} not found in type module */`}else return`/* ERROR: No module found for Rc method ${l} */`}if(Te(a)||We(s)){let _=e.$?.value;if(_){if(de(_)){if(_.variableName)return Ee(_.variableName,e.$?.env);if((u.inAsyncStateMachine||u.inEffectStateMachine)&&u.stateMachineVariables){for(let[,c]of u.stateMachineVariables)if(c.name===l&&c.kind==="outer")return`sm->__capture.${l}`}}else if(!We(_))return Qt(_,n,e)}return Ee(l,e.$?.env)}if(Cr(a)&&a.fields.length===1){let _=a.fields[0];if(_&&_.label===l)return o}if(ge(a)){let _=a;if(qt(_))return o;for(let f of _.variants)if(f.fields){for(let p of f.fields)if(p.label===l){let m=f.name;return`${o}.data.${m}.${te(l)}`}}return`/* ERROR: field ${l} not found in enum ${_.typeName} */`}else if(O(s)&&ge(s.value)){let _=s.value,c=_.variants.find(p=>p.name===l),f=n.types[_.id]?.cName;if(c&&!c.fields&&f){let p=Bt(_,c.name,n);return`(${f}){ .tag = ${p}, .data = { } }`}}else{if(bt(a)&&l==="*")return`${o}->value`;if(Ie(a)){if(l==="*")return`(*${o})`;if(Qe(a.childType))return`${o}->${te(l)}`;{let _=0,c=a;for(;Ie(c);)_++,c=c.childType;if(_>0&&_e(c)&&c.isReferenceSemantics&&_++,Cr(c)&&c.fields.length===1){let f=c.fields[0];if(f&&f.label===l)return _===1?`(*${o})`:`${"*".repeat(_)}(${o})`}return _>0?_===1?`${o}->${te(l)}`:`${`(${"*".repeat(_-1)}${o})`}->${te(l)}`:`${o}.${te(l)}`}}else if(we(a)){if(l.match(/^\d+$/))return`${o}._${l}`;{let _=a.fields.findIndex(c=>c.label===l);return`${o}._${_}`}}else return Ce(a)?`${o}.vtable->${te(l)}`:ft(a)?`${o}->${te(l)}`:`${o}.${te(l)}`}}return"/* ERROR: field name must be an identifier */"}function tf(e,t,n){if(!e.$?.type)return`// Error: No type information for pointer/reference expression ${w(e)}
|
|
11032
|
-
`;let i=e.args[0];if(F(i)){let l=i.func.$?.type;if(l&&ke(l)){let u=i.args[0];if(u&&F(u)&&E(u,":")){let _=M(i.func,t,n),c=M(u.args[0],t,n),f=M(u.args[1],t,n),p=`Slice_${te(P(l.childType,n))}`;return n.sliceStructTypes.has(p)||n.sliceStructTypes.set(p,{childType:P(l.childType,n)}),`(${p}){ .data = &${_}.data[${c}], .length = ${f} - ${c} }`}else if(u&&U(u)&&u.token.value===":"){let _=M(i.func,t,n),c=l,f=c.childType,p=`Slice_${te(P(f,n))}`;return n.sliceStructTypes.has(p)||n.sliceStructTypes.set(p,{childType:P(f,n)}),Ue(c.length)?`(${p}){ .data = &${_}.data[0], .length = ${c.length.value} }`:"/* Error: Cannot slice array with non-compile-time length */"}}else if(l&&(Qe(l)||Ie(l)&&Qe(l.childType))){let u=Qe(l)?l:l.childType,_=i.args[0];if(_&&F(_)&&E(_,":")){let c=M(i.func,t,n),f=M(_.args[0],t,n),p=M(_.args[1],t,n),m=`Slice_${te(P(u.childType,n))}`;return n.sliceStructTypes.has(m)||n.sliceStructTypes.set(m,{childType:P(u.childType,n)}),`(${m}){ .data = &${c}.data[${f}], .length = ${p} - ${f} }`}else if(_&&U(_)&&_.token.value===":"){let c=M(i.func,t,n),f=`Slice_${te(P(u.childType,n))}`;return n.sliceStructTypes.has(f)||n.sliceStructTypes.set(f,{childType:P(u.childType,n)}),`(${f}){ .data = ${c}.data, .length = ${c}.length }`}}}let o=i.$?.value,a=i.$?.type;if(o!==void 0&&a){if(Ue(o)||
|
|
11032
|
+
`;let i=e.args[0];if(F(i)){let l=i.func.$?.type;if(l&&ke(l)){let u=i.args[0];if(u&&F(u)&&E(u,":")){let _=M(i.func,t,n),c=M(u.args[0],t,n),f=M(u.args[1],t,n),p=`Slice_${te(P(l.childType,n))}`;return n.sliceStructTypes.has(p)||n.sliceStructTypes.set(p,{childType:P(l.childType,n)}),`(${p}){ .data = &${_}.data[${c}], .length = ${f} - ${c} }`}else if(u&&U(u)&&u.token.value===":"){let _=M(i.func,t,n),c=l,f=c.childType,p=`Slice_${te(P(f,n))}`;return n.sliceStructTypes.has(p)||n.sliceStructTypes.set(p,{childType:P(f,n)}),Ue(c.length)?`(${p}){ .data = &${_}.data[0], .length = ${c.length.value} }`:"/* Error: Cannot slice array with non-compile-time length */"}}else if(l&&(Qe(l)||Ie(l)&&Qe(l.childType))){let u=Qe(l)?l:l.childType,_=i.args[0];if(_&&F(_)&&E(_,":")){let c=M(i.func,t,n),f=M(_.args[0],t,n),p=M(_.args[1],t,n),m=`Slice_${te(P(u.childType,n))}`;return n.sliceStructTypes.has(m)||n.sliceStructTypes.set(m,{childType:P(u.childType,n)}),`(${m}){ .data = &${c}.data[${f}], .length = ${p} - ${f} }`}else if(_&&U(_)&&_.token.value===":"){let c=M(i.func,t,n),f=`Slice_${te(P(u.childType,n))}`;return n.sliceStructTypes.has(f)||n.sliceStructTypes.set(f,{childType:P(u.childType,n)}),`(${f}){ .data = ${c}.data, .length = ${c}.length }`}}}let o=i.$?.value,a=i.$?.type;if(o!==void 0&&a){if(Ue(o)||Pe(o)){let l=M(i,t,n);return`(&(${P(a,n)}){${l}})`}if(xe(o)&&i.$?.convertedRuntimeType)return`(&${M(i,t,n)})`}return`(&${M(i,t,n)})`}function nf(e,t,n){let r=e.args[0];return r?`__yo_decr_rc(${M(r,t,n)})`:"// Error: __yo_decr_rc requires exactly 1 argument"}function rf(e,t,n){let r=e.args[0];return r?`__yo_incr_rc(${M(r,t,n)})`:"// Error: __yo_incr_rc requires exactly 1 argument"}function of(e,t,n){let r=e.args[0];return r?M(r,t,n):"// Error: __yo_rc_own requires exactly 1 argument"}function af(e,t,n){let r=e.args[0],i=e.args[1];if(!r||!i)return"// Error: __yo_drop_array_element requires exactly 2 arguments";let o=M(r,t,n),a=M(i,t,n),s=r.$?.type;if(!s||!ke(s))return"// Error: __yo_drop_array_element requires an array type";let l=s.childType,u=V(l)&&l.resolvedConcreteType?l.resolvedConcreteType:l;if(ke(u)){let c=u.length;if(!Ue(c))return"// Error: array element has non-constant length";let f=`i_${Math.floor(Math.random()*1e6)}`,p=n.emitter;p.emitLine(`for (size_t ${f} = 0; ${f} < ${c.value}; ${f}++) {`);let m=`(${o}).data[${a}].data[${f}]`;p.emitLine(" { // drop nested array element");let g=Nr(m,u.childType,n);return g&&p.emitLine(` ${g};`),p.emitLine(" }"),p.emitLine("}"),""}let _=Tr(u,n);return _?`${_}((${o}).data[${a}])`:"// No drop function for array element type"}function sf(e,t,n){let r=e.args[0],i=e.args[1];if(!r||!i)return"// Error: __yo_dup_array_element requires exactly 2 arguments";let o=M(r,t,n),a=M(i,t,n),s=r.$?.type;if(!s||!ke(s))return"// Error: __yo_dup_array_element requires an array type";let l=s.childType,u=V(l)&&l.resolvedConcreteType?l.resolvedConcreteType:l;if(ke(u)){let c=u.length;if(!Ue(c))return"// Error: array element has non-constant length";let f=`temp_array_${Math.floor(Math.random()*1e6)}`,p=`i_${Math.floor(Math.random()*1e6)}`,m=P(u,n),g=n.emitter;g.emitLine(`${m} ${f} = (${o}).data[${a}];`),g.emitLine(`for (size_t ${p} = 0; ${p} < ${c.value}; ${p}++) {`);let h=Xi(`${f}.data[${p}]`,u.childType,n);return g.emitLine(` ${f}.data[${p}] = ${h};`),g.emitLine("}"),f}let _=On(u,n);return _?`${_}((${o}).data[${a}])`:"// No dup function for array element type"}function lf(e,t,n){let r=e.args[0],i=e.args[1];if(!r||!i)return"// Error: __yo_drop_tuple_element requires exactly 2 arguments";let o=M(r,t,n);M(i,t,n);let a=r.$?.type;if(!a||!we(a))return"// Error: __yo_drop_tuple_element requires a tuple type";let s=i.$?.value;if(!Ue(s))return"// Error: __yo_drop_tuple_element requires a constant index";let l=Number(s.value);if(l<0||l>=a.fields.length)return"// Error: __yo_drop_tuple_element index out of bounds";let u=a.fields[l].type,_=V(u)&&u.resolvedConcreteType?u.resolvedConcreteType:u;if(we(_)){let f=`(${o})._${l}`;return Nr(f,_,n)}let c=Tr(_,n);return c?`${c}((${o})._${l})`:"// No drop function for tuple element type"}function uf(e,t,n){let r=e.args[0],i=e.args[1];if(!r||!i)return"// Error: __yo_dup_tuple_element requires exactly 2 arguments";let o=M(r,t,n);M(i,t,n);let a=r.$?.type;if(!a||!we(a))return"// Error: __yo_dup_tuple_element requires a tuple type";let s=i.$?.value;if(!Ue(s))return"// Error: __yo_dup_tuple_element requires a constant index";let l=Number(s.value);if(l<0||l>=a.fields.length)return"// Error: __yo_dup_tuple_element index out of bounds";let u=a.fields[l].type,_=V(u)&&u.resolvedConcreteType?u.resolvedConcreteType:u;if(we(_)){let f=`(${o})._${l}`;return Xi(f,_,n)}let c=On(_,n);return c?`${c}((${o})._${l})`:"// No dup function for tuple element type"}function _f(e,t,n){let r=e.args[0];if(!r)return"// Error: ___dup requires exactly 1 argument";let i=M(r,t,n),o=r.$?.type??e.$?.type;return o?Xi(i,o,n):i}function cf(e,t,n){let r=e.args[0];if(!r)return"// Error: ___drop requires exactly 1 argument";let i=M(r,t,n),o=r.$?.type??e.$?.type;return o?Nr(i,o,n):""}function ff(e,t,n){let r=e.args[0];return r?`__yo_decr_rc((void*)(${M(r,t,n)}).data)`:"// Error: __yo_dyn_drop requires exactly 1 argument"}function pf(e,t,n){let r=e.args[0];return r?`__yo_incr_rc((void*)(${M(r,t,n)}).data)`:"// Error: __yo_dyn_dup requires exactly 1 argument"}function df(e,t,n){let r=e.args[0];return r?`__yo_incr_rc_atomic(${M(r,t,n)})`:"// Error: __yo_incr_rc_atomic requires exactly 1 argument"}function mf(e,t,n){let r=e.args[0];return r?`__yo_decr_rc_atomic(${M(r,t,n)})`:"// Error: __yo_decr_rc_atomic requires exactly 1 argument"}function yf(e,t,n){let r=e.args[0];if(!r)return"// Error: __yo_sometype_drop requires exactly 1 argument";let i=r.$?.type;if(i&&V(i)&&be(i)){let o=M(r,t,n);return`if (${o} != NULL) { __yo_decr_rc((void*)${o}); }`}if(i&&V(i)&&i.resolvedConcreteType){let a=i.resolvedConcreteType.trait?.fields.find(s=>s.label===k.___drop[0]);if(a&&a.assignedValue&&ne(a.assignedValue)){let s=n.functions[a.assignedValue.funcId]?.cName;if(s){let l=M(r,t,n);return`${s}(${l})`}}}return"/* __yo_sometype_drop: no-op */"}function gf(e,t,n){let r=e.args[0];if(!r)return"// Error: __yo_sometype_dup requires exactly 1 argument";let i=r.$?.type;if(i&&V(i)&&be(i))return`__yo_incr_rc((void*)${M(r,t,n)})`;if(i&&V(i)&&i.resolvedConcreteType){let a=i.resolvedConcreteType.trait?.fields.find(s=>s.label===k.___dup[0]);if(a&&a.assignedValue&&ne(a.assignedValue)){let s=n.functions[a.assignedValue.funcId]?.cName;if(s){let l=M(r,t,n);return`${s}(${l})`}}}return"/* __yo_sometype_dup: no-op */"}function hf(e,t,n){if(e.args.length!==1)return"// Error: rc requires exactly 1 argument";let r=e.args[0],i=r.$?.type;if(!i)return"// Error: rc argument missing type information";let o=M(r,t,n);return sn(i)?`((__yo_ref_header_t*)(${o}))->ref_count`:"1"}function vf(e,t,n){let r=e.$?.runtimeArgExprsInOrder;if(r){let i=n,o=r.map(a=>{let s=M(a,t,n);if(a.$?.deferredDupExpressions&&a.$.deferredDupExpressions.length>0){rt(a,t,i);let l=a.$.deferredDupExpressions[0];if(F(l)&&l.$?.variableName)return Ee(l.$.variableName,l.$.env)}return s}).join(", ");return`${n.currentFunctionName}(${o})`}else return`// Error: No arguments for recur call ${w(e)}
|
|
11033
11033
|
`}function Tf(e,t,n){let r=e.args[0];return`sizeof(${M(r,t,n)})`}function Ef(e,t,n){let r=e.$?.runtimeArgExprsInOrder,i=n.types[e.$?.type?.id??""]?.cName,o=e.$?.variableName;if(r&&i){let a=n,s=r.map((l,u)=>{let c=M(l,t,n);if(l.$?.deferredDupExpressions&&l.$.deferredDupExpressions.length>0){rt(l,t,a);let f=l.$.deferredDupExpressions[0];F(f)&&f.$?.variableName&&(c=Ee(f.$.variableName,f.$.env))}return`._${u} = ${c}`}).join(", ");if(o&&e.$?.type){let l=`(${i}){ ${s} }`,u=st(e.$.type,o,n);return n.emitter.emitLine(`${t}${u} = ${l};`),o}else return`(${i}){ ${s} }`}else{if(e.args.length===0)return"";{let a=r??e.args;if(!i)return`/* Error: tuple type not found - typeId: ${e.$?.type?.id??"none"} */`;let s=a.map((l,u)=>{let _=M(l,t,n);return`._${u} = ${_}`}).join(", ");if(o&&e.$?.type){let l=`(${i}){ ${s} }`,u=st(e.$.type,o,n);return n.emitter.emitLine(`${t}${u} = ${l};`),o}else return`(${i}){ ${s} }`}}}function $f(e,t,n){let i=e.args[0].$?.value;if(!i||!O(i))throw new Error("typeid codegen: expected TypeValue argument");let o=i.value,a=o.id,s=n.types[a]?.cName||P(o,n),l=`__yo_typeid_${te(s)}`;return n.typeIdStatics||(n.typeIdStatics=new Map),n.typeIdStatics.has(a)||(n.typeIdStatics.set(a,l),n.emitter.emitDeclarationLine(`static const char ${l} = 0;`)),n.cIncludes.add("<stdint.h>"),`(uintptr_t)&${l}`}function kg(e,t){if(F(e)&&E(e,I.begin)){let n=[];for(let r of e.args)if(F(r)&&E(r,"=",2)){let i=r.args[0],o=r.args[1],a=M(i,"",t),s=M(o,"",t);n.push(`${a} = ${s}`)}return n.join(", ")}else if(F(e)&&E(e,"=",2)){let n=e.args[0],r=e.args[1],i=M(n,"",t),o=M(r,"",t);return`${i} = ${o}`}return M(e,"",t)}function kl(e,t,n){if(F(e)&&E(e,I.begin)){let r=n,i=r.pendingDeferredDrops,o=e.$?.deferredDropExpressions??[],a=new Map;for(let _ of o){let c=In(_);c&&a.set(c,_)}r.pendingDeferredDrops=[...i??[]];let s=r.consumedVarPendingDrops,l=e.$?.consumedVariableDropExpressions??[];r.consumedVarPendingDrops=[...l,...s??[]];let u=new Set;for(let _ of e.args){let c=M(_,t,n);if(c&&n.emitter.emitLine(`${t}${c};`),_.$?.env&&a.size>u.size)for(let f of _.$.env.frames)for(let p of f.variables)a.has(p.name)&&!u.has(p.name)&&(u.add(p.name),r.pendingDeferredDrops.unshift(a.get(p.name)))}if(e.$?.deferredDropExpressions)for(let _ of e.$.deferredDropExpressions){let c=M(_,t,n);c&&n.emitter.emitLine(`${t}${c};`)}r.pendingDeferredDrops=i,r.consumedVarPendingDrops=s}else{let r=M(e,t,n);r&&n.emitter.emitLine(`${t}${r};`)}}function bf(e,t,n){if(e.$?.comptimeUnrolledBodies){for(let i of e.$.comptimeUnrolledBodies)kl(i,t,n);return""}let r=e.args;if(r.length===2){let i=r[0],o=r[1],a=n.currentLoopLabel,s=`loop_${Math.random().toString(36).substr(2,9)}`;n.currentLoopLabel=s;let l=n,u=l.loopBodyDropsBaselineCount;l.loopBodyDropsBaselineCount=l.pendingDeferredDrops?.length??0,n.emitter.emitLine(`${t}while (true) {`);let _=M(i,t+" ",n);return n.emitter.emitLine(`${t} if (!(${_})) {`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t} }`),kl(o,t+" ",n),n.emitter.emitLine(`${t}}`),n.emitter.emitLine(`${t}${s}:;`),l.loopBodyDropsBaselineCount=u,n.currentLoopLabel=a,""}else if(r.length===3){let i=r[0],o=r[1],a=r[2],s=n.currentLoopLabel,l=n.currentContinueLabel,u=`loop_${Math.random().toString(36).substr(2,9)}`,_=`continue_${Math.random().toString(36).substr(2,9)}`;n.currentLoopLabel=u,n.currentContinueLabel=_;let c=n,f=c.loopBodyDropsBaselineCount;c.loopBodyDropsBaselineCount=c.pendingDeferredDrops?.length??0,n.emitter.emitLine(`${t}while (true) {`);let p=M(i,t+" ",n);n.emitter.emitLine(`${t} if (!(${p})) {`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t} }`),kl(a,t+" ",n),n.emitter.emitLine(`${t}${_}:;`);let m=kg(o,n);return n.emitter.emitLine(`${t} ${m};`),n.emitter.emitLine(`${t}}`),n.emitter.emitLine(`${t}${u}:;`),c.loopBodyDropsBaselineCount=f,n.currentLoopLabel=s,n.currentContinueLabel=l,""}else return n.emitter.emitLine(`${t}/* Error: while loop expects 2 or 3 arguments, got ${r.length} */`),""}function wg(e){let t=[];for(let n of e)if(n.isEffectRowSpread){let r=n.type;V(r)&&r.resolvedConcreteType&&(r=r.resolvedConcreteType),ot(r)&&t.push(...r.implicitParameters)}else t.push(n);return t}function Fg(e,t,n,r){let i=e.args[0];if(!i?.$?.type)return;let o=e.args.find(c=>F(c)&&E(c,I.using));if(!o)return;let a=Dt(i.$.type);if(!a?.isFuture.effects?.length)return;let s=wg(a.isFuture.effects),l=o.args,u=r,_=u.emitter;for(let c=0;c<s.length&&c<l.length;c++){let f=s[c],p=l[c];if(G(f.type)){let m=f.label,g;if(u.currentEvidenceParams){for(let h of u.currentEvidenceParams.values())if(h.fieldLabel===m){g=h.cParamName;break}}if(!g&&u.stateMachineVariables){for(let[,h]of u.stateMachineVariables)if(h.name===m&&h.kind==="outer"){g=`sm->__capture.${m}`;break}}if(!g){let h=p.$?.value;if(h&&ne(h)){let d=r.functions[h.funcId];d&&(g=d.cName)}}g||(g=M(p,n,r)),g&&_.emitLine(`${n} ${t}->__capture.${m} = (void*)${g};`)}else if(Te(f.type)){let m=f.type;for(let g of m.fields){if(!G(g.type))continue;let h;if(u.stateMachineVariables){for(let[,d]of u.stateMachineVariables)if(d.name===g.label&&d.kind==="outer"){h=`sm->__capture.${g.label}`;break}}if(!h){let d=p.$?.value;if(d&&We(d)){let v=m.fields.indexOf(g),T=d.fields[v];if(T&&ne(T)){let $=r.functions[T.funcId];$&&(h=$.cName)}}}if(!h&&u.currentEvidenceParams){for(let d of u.currentEvidenceParams.values())if(d.fieldLabel===g.label){h=d.cParamName;break}}h||(h=Lg(g.label,m,u,e)),h&&_.emitLine(`${n} ${t}->__capture.${g.label} = (void*)${h};`)}}}}function Lg(e,t,n,r){let i=r.$?.env??r.func.$?.env;if(!i)return;let o=pn(i,a=>a.isImplicit===!0);for(let a=o.length-1;a>=0;a--){let s=o[a],l=s.value?.[s.value.length-1];if(l&&We(l)){let u=l.type.fields.findIndex(_=>_.label===e);if(u>=0){let _=l.fields[u];if(_&&ne(_)){let c=n.functions[_.funcId]?.cName;if(c)return c}}}}}function Ag(e,t,n){let r=n,i=e.args[0],o=r.continuationVariables?.get("resume");if(o&&"directReturnVar"in o&&o.directExitLabel){if(i){let l=M(i,t,n);if(r.effectHandlerParamDrops)for(let u of r.effectHandlerParamDrops)r.emitter.emitLine(`${t}${u};`);r.emitter.emitLine(`${t}${o.directReturnVar} = ${l};`),r.emitter.emitLine(`${t}goto ${o.directExitLabel};`)}else{if(r.effectHandlerParamDrops)for(let l of r.effectHandlerParamDrops)r.emitter.emitLine(`${t}${l};`);r.emitter.emitLine(`${t}goto ${o.directExitLabel};`)}return""}if(r.inAsyncStateMachine){let l=r.emitter;if(i){let u=M(i,t,n);u&&u!=="(void)0"&&l.emitLine(`${t}(void)${u};`)}if(r.effectHandlerParamDrops)for(let u of r.effectHandlerParamDrops)l.emitLine(`${t}${u};`);return dn(t,r,e,!1,!0,!0),ir(t,r,e,!0),Mn({emitter:l,indent:t,debugLabel:r.currentFunctionName}),""}if((r.isModuleEffectMemberFunction||r.currentEvidenceParams&&r.currentEvidenceParams.size>0)&&r.emitter.emitLine(`${t}__yo_effect_escaped = 1;`),!i){if(r.effectHandlerParamDrops)for(let l of r.effectHandlerParamDrops)r.emitter.emitLine(`${t}${l};`);if(dn(t,r,e,!1,!0,!0),ir(t,r,e,!0),r.currentFunctionType){let l=r.currentFunctionType.return.type;if(!fe(l)){let u=r.overrideReturnTypeStr??P(l,n);if(u!=="void")return`return (${u}){0}`}}return"return"}let s=M(i,t,n);if(r.effectHandlerParamDrops)for(let l of r.effectHandlerParamDrops)r.emitter.emitLine(`${t}${l};`);if(dn(t,r,e,!1,!0,!0),ir(t,r,e,!0),(r.isModuleEffectMemberFunction||r.currentEvidenceParams&&r.currentEvidenceParams.size>0)&&r.currentFunctionType){let l=i.$?.type;if(l&&!fe(l)){let _=P(l,n);r.emitter.emitLine(`${t}{ ${_} _esc_val = ${s}; memcpy(__yo_effect_escape_value, &_esc_val, sizeof(${_})); }`)}let u=r.currentFunctionType.return.type;if(!fe(u)){let _=r.overrideReturnTypeStr??P(u,n);if(_!=="void")return`return (${_}){0}`}return"return"}return`return ${s}`}function Cf(e,t,n){let r;switch(e.tag){case"FnCall":r=Ig(e,t,n);break;case"Atom":r=no(e,n,t);break}return r}function Ig(e,t,n){if(e.$?.macroExpansion)return M(e.$.macroExpansion,t,n);if(F(e.func)&&E(e.func,".",2)&&e.func.args[1]&&U(e.func.args[1])){let r=e.func.args[1].token.value,i=e.func.args[0],o=i?.$?.type;if(o&&V(o)&&be(o)){if(r===k.___drop[0]){let a=M(i,t,n);return`if (${a} != NULL) { __yo_decr_rc((void*)${a}); }`}if(r===k.___dup[0])return`__yo_incr_rc((void*)${M(i,t,n)})`}}if(A_(e))return I_(e,t,n);if(E(e,k.__yo_decr_rc))return nf(e,t,n);if(E(e,k.__yo_incr_rc))return rf(e,t,n);if(E(e,k.__yo_rc_own))return of(e,t,n);if(E(e,k.__yo_drop_array_element))return af(e,t,n);if(E(e,k.__yo_dup_array_element))return sf(e,t,n);if(E(e,k.__yo_drop_tuple_element))return lf(e,t,n);if(E(e,k.__yo_dup_tuple_element))return uf(e,t,n);if(E(e,k.___dup))return _f(e,t,n);if(E(e,k.___drop))return cf(e,t,n);if(E(e,k.__yo_dyn_drop))return ff(e,t,n);if(E(e,k.__yo_dyn_dup))return pf(e,t,n);if(E(e,k.__yo_incr_rc_atomic))return df(e,t,n);if(E(e,k.__yo_decr_rc_atomic))return mf(e,t,n);if(E(e,k.__yo_iso_extract))return Mc(e,t,n);if(E(e,k.__yo_iso_dispose))return Oc(e,t,n);if(E(e,k.__yo_arc_dispose))return hc(e,t,n);if(Tl(e))return Rc(e,t,n);if(vl(e))return vc(e,t,n);if(E(e,k.__yo_sometype_drop))return yf(e,t,n);if(E(e,k.__yo_sometype_dup))return gf(e,t,n);if(E(e,k.__yo_gc_collect))return Vc(e,t,n);if(E(e,k.rc))return hf(e,t,n);if(E(e,k.panic))return Xc(e,t,n);if(E(e,k.asm))return Zc(e,t,n);if(E(e,k.global_asm))return Jc(e,t,n);if(E(e,I.test))return"/* test declaration skipped */";if(E(e,k.__yo_thread_set_maximum_threads))return Yc(e,t,n);if(E(e,I.op_and))return yc(e,t,n);if(E(e,I.op_or))return gc(e,t,n);if(Rt(e))return e.$?.awaitAnalysis?S_(e,t,n):M_(e,t,n);if(E(e,I.dyn))return xc(e,t,n);if(fn(e))return Cc(e,t,n);if(Uu(e))return kc(e,t,n);if(Fa(e)){let r=e.args[0];if(!r)return"// Error: spawn requires a Future argument";let o=n.emitter,a=M(r,t,n),s=r.$?.type,l=s?P(s,n):"void*",u=e.$?.type,_=u?P(u,n):null,c=e.$?.variableName?`__spawn_future_${e.$.variableName}`:"__spawn_future",f=e.$?.variableName?`__spawn_state_${e.$.variableName}`:"__spawn_state";return o.emitLine(`${t}// io.spawn \u2014 start cold Future, return JoinHandle`),o.emitLine(`${t}${l} ${c} = ${a};`),o.emitLine(`${t}int ${f} = ${c}->state;`),o.emitLine(`${t}if (${f} == -2) {`),o.emitLine(`${t} fprintf(stderr, "panic: attempted to spawn an aborted Future\\n");`),o.emitLine(`${t} abort();`),o.emitLine(`${t}}`),jo(r.$?.type)||(o.emitLine(`${t}if (${f} == 0 && ${c}->__yo_resume_fn) {`),Fg(e,c,t,n),o.emitLine(`${t} __yo_incr_rc((void*)${c});`),o.emitLine(`${t} ${c}->__yo_resume_fn((void*)${c});`),o.emitLine(`${t}}`)),_?`(${_}){ .__future = (void*)${c} }`:`(void*)${c}`}if(Bu(e))return wc(e,t,n);if(E(e,I.return))return nc(e,t,n);if(E(e,I.escape))return Ag(e,t,n);if(E(e,k.__yo_array_fill,2))return Ec(e,t,n);if(E(e,"::",2))return"";if(E(e,":",2))return Ac(e,t,n);if(E(e,":=",2)){let r=Dc(e,t,n);if(r!==void 0)return r}else{if(E(e,"=",2))return $c(e,t,n);if(e.$?.value&&!de(e.$?.value)&&!fe(e.$.type)&&!nt(e.$?.controlFlow)){let r=e.$.value;return Qt(r,n,e)}else{if(E(e,".",2))return ef(e,t,n);if(E(e,I.begin))return Lc(e,t,n);if(E(e,I.cond))return Ic(e,t,n);if(E(e,I.match))return zc(e,t,n);if(E(e,k.__yo_address_of,1))return tf(e,t,n);if(E(e,I.tuple))return Ef(e,t,n);if(E(e,I.array)){let r=Tc(e,t,n);if(r!==void 0)return r}else{if(E(e,I.recur))return vf(e,t,n);if(E(e,I.runtime,1))return M(e.args[0],t,n);if(E(e,k.sizeof,1))return Tf(e,t,n);if(E(e,k.typeid,1))return $f(e,t,n);if(E(e,k.downcast,2))return Nc(e,t,n);if(E(e,gi)){let r=e.$?.runtimeArgExprsInOrder||e.args;if(r){let i=n,o=r.map(a=>{let s=M(a,t,n);if(a.$?.deferredDupExpressions&&a.$.deferredDupExpressions.length>0){rt(a,t,i);let l=a.$.deferredDupExpressions[0];if(F(l)&&l.$?.variableName)return Ee(l.$.variableName,l.$.env)}return s});return Xo(e.func.token.value,o,e,n,t)}}else{if(E(e,I.while))return bf(e,t,n);if(E(e,"->",2)&&F(e.args[0])&&E(e.args[0],I.fn)){let r=e.$?.value;return ne(r)?Qt(r,n):"// Error: Anonymous function missing function value"}else{if(E(e,k.consume))return Sc(e,t,n);if(E(e,k.comptime_expect_error)||E(e,k.comptime_assert)||E(e,k.__yo_var_print_info)||E(e,k.__yo_var_is_owning_the_rc_value)||E(e,k.__yo_var_has_other_aliases))return"";if(E(e,I.open))return Uc(e,t,n);{let r=Kc(e,t,n);if(r!==void 0)return r}}}}}}if(F(e))throw new Error(`Unhandled function call: ${w(e)}`);return`// Failed to transpile ${w(e)}`}function kf({expr:e,env:t,context:n}){he(e,k.alignof,1);let r=e.args[0],i=S({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:"Failed to evaluate expression."});t=i.$.env;let o;i.$.value&&O(i.$.value)?o=i.$.value.value:o=i.$.type;let a=Qn(o),s;return a===null?s=K(gt(),{env:t,context:n}):s=Xt("Usize",a),e.$={env:t,type:gt(),value:s,pathCollection:[]},e}function wf({expr:e,env:t,context:n}){let r=E(e,I.op_and)?"and":"or",i=e.args;if(i.length===0){let u=pt(r==="and");return e.$={env:t,type:Je(),value:u,pathCollection:[],isAccessingProperty:!1},e}let o=t,a,s=!1,l=!1;for(let u=0;u<i.length;u++){let _=i[u],c=S({expr:_,env:o,context:{...n}});if(!c.$||!_n(c.$.type))throw y({token:_.token,errorMessage:`Expected bool type for "${r}" argument, got:
|
|
11034
|
-
${w(_)}`});o=c.$.env;let f=c.$.value;if(de(f)){s=!0;continue}if(
|
|
11034
|
+
${w(_)}`});o=c.$.env;let f=c.$.value;if(de(f)){s=!0;continue}if(Pe(f)){let p=f.value;if(r==="and"){if(!p){a=pt(!1);break}!s&&!l&&(a=pt(!0))}else{if(p){a=pt(!0);break}!s&&!l&&(a=pt(!1))}}else l=!0}return Pe(a)||(l||s)&&(l?a=void 0:a=K(Je(),{env:o,context:n})),e.$={env:o,type:Je(),value:a,pathCollection:[],isAccessingProperty:!1},e}function Ff({expr:e,env:t,context:n}){he(e,k.__yo_array_fill,2);let r=e.args[0],i=e.args[1],o=S({expr:r,env:t,context:{...n}});o.$?.env&&(t=o.$.env);let a=o.$?.value;if(!O(a)||!ke(a.value))throw y({token:r.token,errorMessage:`__yo_array_fill expects first argument to be an ArrayType, got ${a?Me(a):"undefined"}`});let s=a.value,l=S({expr:i,env:t,context:{...n,expectedType:{type:s.childType,env:t}}});l.$?.env&&(t=l.$.env);let u=l.$?.type,_=l.$?.value;if(!u)throw y({token:i.token,errorMessage:"Failed to evaluate fill value"});if(!_)throw y({token:i.token,errorMessage:"__yo_array_fill expects second argument to be a compile-time known value, got runtime value"});if(!q({type:s.childType,env:t},{type:u,env:t}))throw y({token:i.token,errorMessage:`Fill value type ${A(u)} is not compatible with array element type ${A(s.childType)}`});let c=s.length;if(de(c)){let g=K(s,{env:t,context:n});return e.$={env:t,type:s,value:g,pathCollection:[]},e}let f;if(Ue(c)){let g=c.value;if(f=typeof g=="bigint"?Number(g):g,!Number.isInteger(f)||f<0)throw y({token:i.token,errorMessage:`Array length must be a non-negative integer, got ${f}`})}else throw y({token:i.token,errorMessage:`Array length must be a compile-time known integer, got ${Me(c)}`});let p=[];if(de(_)){let g=K(s,{env:t,context:n});return e.$={env:t,type:s,value:g,pathCollection:[]},e}for(let g=0;g<f;g++)p.push(_);let m=Rr(s,p);return e.$={env:t,type:s,value:m,pathCollection:[]},e}function Lf({expr:e,env:t,context:n}){if(n.isValidatingFunctionDefinition||!n.isExecuting){let s=n.expectedType?.type??H.type;return e.$={env:t,type:s,value:fe(s)?H:K(s,{env:t,context:n}),pathCollection:[]},e}let r=e.args[0],i=e.args[1],o=S({expr:r,env:t,context:{...n}});if(!o.$||!Pe(o.$.value))throw y({token:r.token,errorMessage:`Expected bool value for "comptime_assert", got:
|
|
11035
11035
|
${w(r)}
|
|
11036
11036
|
|
|
11037
11037
|
Value:
|
|
11038
11038
|
${Me(o.$?.value)}`,isAssertionError:!0});if(o.$.value.value)return e.$={env:t,type:H.type,value:H,pathCollection:[]},e;if(i){let s=S({expr:i,env:t,context:{...n}});if(s.$?.value)throw y({token:e.token,errorMessage:xe(s.$.value)?s.$.value.value:Me(s.$.value),isAssertionError:!0})}throw y({token:e.token,errorMessage:`Assertion failed for "comptime_assert":
|
|
11039
11039
|
${w(r)}`,isAssertionError:!0})}function Af({expr:e,env:t,context:n}){if(E(e,k.__yo_comptime_bool_not)||E(e,k.__yo_comptime_bool_to_comptime_string)){let r=S({expr:e.args[0],env:t,context:{...n}});if(!r.$||!_n(r.$.type)||!r.$.value)throw y({token:r.token,errorMessage:`Expected bool type for "${e.func.token.value}" argument, got:
|
|
11040
|
-
${w(r)}`});t=r.$.env;let i;if(E(e,k.__yo_comptime_bool_not))
|
|
11040
|
+
${w(r)}`});t=r.$.env;let i;if(E(e,k.__yo_comptime_bool_not))Pe(r.$.value)?i=pt(!r.$.value.value):i=K(Je(),{env:t,context:n});else if(E(e,k.__yo_comptime_bool_to_comptime_string))Pe(r.$.value)?i=on(r.$.value.value.toString()):i=K(Vt(),{env:t,context:n});else throw y({token:e.token,errorMessage:`Unexpected function call for "${e.func.token.value}", expected "__yo_comptime_bool_not" or "__yo_comptime_bool_to_comptime_string" function`});e.$={env:t,type:i.type,value:i,pathCollection:[]}}else{let r=S({expr:e.args[0],env:t,context:{...n}});if(!r.$||!_n(r.$.type)||!r.$.value)throw y({token:r.token,errorMessage:`Expected bool type for "${e.func.token.value}" first argument, got:
|
|
11041
11041
|
${w(r)}`});t=r.$.env;let i=S({expr:e.args[1],env:t,context:{...n}});if(!i.$||!_n(i.$.type)||!i.$.value)throw y({token:i.token,errorMessage:`Expected bool type for "${e.func.token.value}" second argument, got:
|
|
11042
|
-
${w(i)}`});t=i.$.env;let o=r.$.value,a=i.$.value,s;if(E(e,k.__yo_comptime_bool_and))
|
|
11043
|
-
${w(r)}`})}function Sg(e){return{...e,forallParameters:e.forallParameters.map(t=>({...t,isCompileTimeOnly:!0})),parameters:e.parameters.map(t=>({...t,isCompileTimeOnly:!0})),return:{...e.return,isCompileTimeOnly:!0}}}function ro(e,t,n){if(e.type.return.isCompileTimeOnly||e.type.isExtern||e.type.forallParameters.length>0)return;for(let i of e.type.parameters)if(mr(i.type,t))return;if(mr(e.type.return.type,t))return;let r=Sg(e.type);try{let i=Ae(e.body),o=
|
|
11042
|
+
${w(i)}`});t=i.$.env;let o=r.$.value,a=i.$.value,s;if(E(e,k.__yo_comptime_bool_and))Pe(o)&&Pe(a)?s=pt(o.value&&a.value):s=K(Je(),{env:t,context:n});else if(E(e,k.__yo_comptime_bool_or))Pe(o)&&Pe(a)?s=pt(o.value||a.value):s=K(Je(),{env:t,context:n});else if(E(e,k.__yo_comptime_bool_eq))Pe(o)&&Pe(a)?s=pt(o.value===a.value):s=K(Je(),{env:t,context:n});else if(E(e,k.__yo_comptime_bool_neq))Pe(o)&&Pe(a)?s=pt(o.value!==a.value):s=K(Je(),{env:t,context:n});else throw y({token:e.token,errorMessage:`Unexpected function call for comptime_bool operations: ${w(e)}`});e.$={env:t,type:s.type,value:s,pathCollection:[]}}return e}function If({expr:e,env:t,context:n}){let r=Ae(e.args[0]),i=e.args[1]?Ae(e.args[1]):void 0;try{S({expr:r,env:t,context:{...n}})}catch{return e.$={env:t,type:H.type,value:H,pathCollection:[]},e}if(i){let o=S({expr:i,env:t,context:{...n}});if(o.$?.value)throw y({token:e.token,errorMessage:xe(o.$.value)?o.$.value.value:Me(o.$.value)})}throw y({token:e.token,errorMessage:`Expected compile error, but the expression was evaluated successfully:
|
|
11043
|
+
${w(r)}`})}function Sg(e){return{...e,forallParameters:e.forallParameters.map(t=>({...t,isCompileTimeOnly:!0})),parameters:e.parameters.map(t=>({...t,isCompileTimeOnly:!0})),return:{...e.return,isCompileTimeOnly:!0}}}function ro(e,t,n){if(e.type.return.isCompileTimeOnly||e.type.isExtern||e.type.forallParameters.length>0)return;for(let i of e.type.parameters)if(mr(i.type,t))return;if(mr(e.type.return.type,t))return;let r=Sg(e.type);try{let i=Ae(e.body),o=ze(r.env);for(let l of r.parameters){let{env:u}=me({env:o,variable:{name:l.label,type:l.type,isCompileTimeOnly:!0,value:[K(l.type,{variableName:l.label,env:o,context:n})],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});o=u}let a={tag:"Function",type:r,body:i,frameLevel:e.frameLevel,funcName:e.funcName?`${e.funcName}_comptime`:void 0,funcId:`${e.funcId}_comptime`,definitionSiteEnclosingFunctionType:e.definitionSiteEnclosingFunctionType,calledComptimeFunctionCaches:[],specializedFunctionCaches:[]},s=ht({expr:i,env:o,context:{...n,isExecuting:!0,forceCompileTimeBindings:!0,isAnalyzingCtfeCapability:!0,isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:r,value:a,evaluationEnv:o},expectedType:{type:r.return.type,env:o}},variablesToAdd:[],isEvaluatingFunctionBodyBeginBlock:!0});if(s.$?.value!==void 0)return a.body=s,_t(o,!0),a;_t(o,!0);return}catch{return}}function Sf({expr:e,env:t,context:n}){let r=e.args[0];if(!r)throw y({token:e.token,errorMessage:"comptime_fn requires exactly one argument (a function)"});let i=S({expr:r,env:t,context:n});if(!i.$)throw y({token:r.token,errorMessage:"Failed to evaluate argument to comptime_fn"});let o=i.$.value;if(!ne(o))throw y({token:r.token,errorMessage:`comptime_fn requires a function argument, got: ${Me(o)}`});if(o.type.return.isCompileTimeOnly)return e.$={env:t,type:o.type,value:o,pathCollection:[]},e;let a=ro(o,t,n);if(a)return e.$={env:t,type:a.type,value:a,pathCollection:[]},e;throw y({token:r.token,errorMessage:"comptime_fn: Failed to create compile-time version of function. The function body cannot be evaluated at compile time."})}function Nf({expr:e,env:t,context:n}){he(e,k.__yo_comptime_list_car,1);let r=e.args[0],i=S({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:`Failed to evaluate the argument expression for "${e.func.token.value}":
|
|
11044
11044
|
${w(r)}`});if(!xt(i.$.type))throw y({token:r.token,errorMessage:`Expected ComptimeList type for "${e.func.token.value}" argument, got:
|
|
11045
11045
|
${w(r)}`});let o=i.$.type,a=i.$.value;if(!a)throw y({token:r.token,errorMessage:`Expected ComptimeList value for "${e.func.token.value}" argument, got:
|
|
11046
11046
|
${w(r)}`});if(e.$={env:i.$.env,type:o.childType,value:K(o.childType,{env:i.$.env,context:n}),pathCollection:[],isAccessingProperty:!1},cr(a)){let s=a.elements;if(s.length>0)e.$.value=s[0];else throw y({token:r.token,errorMessage:`Unexpected empty ComptimeList for "${e.func.token.value}" argument`})}return e}function xf({expr:e,env:t,context:n}){he(e,k.__yo_comptime_list_cdr,1);let r=e.args[0],i=S({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:`Failed to evaluate the argument expression for "${e.func.token.value}":
|
|
@@ -11074,7 +11074,7 @@ ${w(r)}`});t=r.$.env;let i=S({expr:e.args[1],env:t,context:{...n}});if(!i.$||!vt
|
|
|
11074
11074
|
${w(i)}`});t=i.$.env;let o;if(e.args.length===3){if(o=S({expr:e.args[2],env:t,context:{...n}}),!o.$||!vt(o.$.type)||!o.$.value)throw y({token:o.token,errorMessage:`Expected comptime_int type for "${e.func.token.value}" end argument, got:
|
|
11075
11075
|
${w(o)}`});t=o.$.env}let a;if(xe(r.$.value)&&An(i.$.value)){let s=r.$.value.value,l=i.$.value.value,u=typeof l=="bigint"?Number(l):l,_=s.length;if(o&&o.$&&o.$.value&&An(o.$.value)){let c=o.$.value.value;_=typeof c=="bigint"?Number(c):c}a=on(s.slice(u,_))}else a=K(Vt(),{env:t,context:n});e.$={env:t,type:a.type,value:a,pathCollection:[]}}else{let r=S({expr:e.args[0],env:t,context:{...n}});if(!r.$||!Et(r.$.type)||!r.$.value)throw y({token:r.token,errorMessage:`Expected comptime_string type for "${e.func.token.value}" first argument, got:
|
|
11076
11076
|
${w(r)}`});t=r.$.env;let i=S({expr:e.args[1],env:t,context:{...n}});if(!i.$||!Et(i.$.type)||!i.$.value)throw y({token:i.token,errorMessage:`Expected comptime_string type for "${e.func.token.value}" second argument, got:
|
|
11077
|
-
${w(i)}`});t=i.$.env;let o=r.$.value,a=i.$.value,s;if(E(e,k.__yo_comptime_string_concat))xe(o)&&xe(a)?s=on(o.value+a.value):s=K(Vt(),{env:t,context:n});else if(E(e,k.__yo_comptime_string_eq))xe(o)&&xe(a)?s=pt(o.value===a.value):s=K(Je(),{env:t,context:n});else if(E(e,k.__yo_comptime_string_neq))xe(o)&&xe(a)?s=pt(o.value!==a.value):s=K(Je(),{env:t,context:n});else if(E(e,k.__yo_comptime_string_lt))xe(o)&&xe(a)?s=pt(o.value<a.value):s=K(Je(),{env:t,context:n});else if(E(e,k.__yo_comptime_string_lte))xe(o)&&xe(a)?s=pt(o.value<=a.value):s=K(Je(),{env:t,context:n});else if(E(e,k.__yo_comptime_string_gt))xe(o)&&xe(a)?s=pt(o.value>a.value):s=K(Je(),{env:t,context:n});else if(E(e,k.__yo_comptime_string_gte))xe(o)&&xe(a)?s=pt(o.value>=a.value):s=K(Je(),{env:t,context:n});else throw y({token:e.token,errorMessage:`Unexpected function call for comptime_string operations: ${w(e)}`});e.$={env:t,type:s.type,value:s,pathCollection:[]}}return e}function Gf({expr:e,env:t,context:n}){he(e,k.consume,1);let r=e.args[0],i=S({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:"Failed to evaluate expression."});return t=i.$.env,t=
|
|
11077
|
+
${w(i)}`});t=i.$.env;let o=r.$.value,a=i.$.value,s;if(E(e,k.__yo_comptime_string_concat))xe(o)&&xe(a)?s=on(o.value+a.value):s=K(Vt(),{env:t,context:n});else if(E(e,k.__yo_comptime_string_eq))xe(o)&&xe(a)?s=pt(o.value===a.value):s=K(Je(),{env:t,context:n});else if(E(e,k.__yo_comptime_string_neq))xe(o)&&xe(a)?s=pt(o.value!==a.value):s=K(Je(),{env:t,context:n});else if(E(e,k.__yo_comptime_string_lt))xe(o)&&xe(a)?s=pt(o.value<a.value):s=K(Je(),{env:t,context:n});else if(E(e,k.__yo_comptime_string_lte))xe(o)&&xe(a)?s=pt(o.value<=a.value):s=K(Je(),{env:t,context:n});else if(E(e,k.__yo_comptime_string_gt))xe(o)&&xe(a)?s=pt(o.value>a.value):s=K(Je(),{env:t,context:n});else if(E(e,k.__yo_comptime_string_gte))xe(o)&&xe(a)?s=pt(o.value>=a.value):s=K(Je(),{env:t,context:n});else throw y({token:e.token,errorMessage:`Unexpected function call for comptime_string operations: ${w(e)}`});e.$={env:t,type:s.type,value:s,pathCollection:[]}}return e}function Gf({expr:e,env:t,context:n}){he(e,k.consume,1);let r=e.args[0],i=S({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:"Failed to evaluate expression."});return t=i.$.env,t=En(i,t),e.$={env:t,type:H.type,value:H,pathCollection:[]},e}function oo({functionCalleeExpr:e,functionType:t,functionValue:n,argValues:r,callerEnv:i,calleeEnv:o,context:a}){if(a.isAnalyzingCtfeCapability)return{value:K(t.return.type,{variableName:"ctfe_analysis_result_"+Ye(i.modulePath),env:t.env,context:a}),callerEnv:i,calleeEnv:o};let s=[...r.forallArgs.map(T=>T.value),...r.args.map(T=>T.value)];if(s.some(T=>!T))throw y({token:e?.token??ae,errorMessage:"Failed to call the function for compile-time. Some arguments are not compile-time evaluated correctly."});let l=s,u=t.return.type,_=He(u),c=n.funcId,f=n.calledComptimeFunctionCaches,p=_?f.find(T=>T.argValues.length===l.length&&T.argValues.every(($,b)=>{let L=l[b];return O($)&&O(L)?V($.value)&&V(L.value)||Fe($.value)||Fe(L.value)?$.value.id===L.value.id:V($.value)&&!V(L.value)?!1:q({type:$.value,env:T.env},{type:L.value,env:i},!0):At({value:$,env:T.env},{value:L,env:i})})):void 0;if(p)return{callerEnv:i,calleeEnv:o,value:p.value};let m=n.body,g={funcId:c,argValues:l,value:K(t.return.type,{variableName:t.return.label,recursiveTypeRef:{functionValue:n,argValues:l},env:o,context:a}),env:o,body:Ae(m)};n.calledComptimeFunctionCaches.push(g);let h=n.calledComptimeFunctionCaches.length-1,d;try{d=ht({expr:g.body,env:o,context:{...a,isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:t,value:n,evaluationEnv:o},isEvaluatingLoopBody:void 0,capturedVariables:void 0,isExecuting:!a.isValidatingFunctionDefinition,functionReturnImplConcreteType:[],SelfType:t.SelfType??a.SelfType,forceCompileTimeBindings:!0},variablesToAdd:[]})}catch(T){throw n.calledComptimeFunctionCaches.splice(h,1),T}if(!d.$)throw y({token:n.body.token,errorMessage:"Function body is not evaluated correctly"});let v=d.$.value;if(!v)throw y({token:n.body.token,errorMessage:"Function body is not evaluated correctly. Expected to return a compile-time known value."});if(o=d.$.env,O(v)){let T=v.value;!T.typeName&&n.funcName&&(T.typeName=n.funcName+`(${l.map($=>Me($)).join(", ")})`),(_e(T)||ge(T)||it(T)||Te(T)||De(T))&&(T.functionValue||(T.functionValue=n))}return _?n.calledComptimeFunctionCaches[h]={funcId:c,argValues:l,value:v,env:d.$.env,body:d}:n.calledComptimeFunctionCaches.splice(h,1),{value:v,callerEnv:i,calleeEnv:o}}function Fl(e,t,n){let i=X(t,"Option").find(p=>p.value?.[0]&&ne(p.value[0])&&G(p.type));if(!i||!i.value?.[0]||!ne(i.value[0]))throw new Error("Cannot find Option type constructor in environment");let o=i.value[0],a=o.type,s=a.parameters[0],l=ee(e),u=ze(a.env),{env:_}=me({env:u,variable:{name:s.label,token:ae,type:l.type,isCompileTimeOnly:!0,initializedAtToken:ae,consumedAtToken:void 0,value:[l],isOwningTheRcValue:!1}}),{value:c,callerEnv:f}=oo({functionCalleeExpr:void 0,functionType:a,functionValue:o,argValues:{forallArgs:[],args:[{value:l,parameterType:s.type,argType:tt()}],variadicArgs:[]},callerEnv:t,calleeEnv:_,context:n});if(!O(c))throw new Error("Option type constructor did not return a type value");return{optionType:c.value,env:f}}function Wf({expr:e,env:t,context:n}){he(e,[k.__yo_decr_rc[0]],1);let r=e.args[0],i=S({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:`Failed to evaluate the argument expression for "${k.__yo_decr_rc[0]}":
|
|
11078
11078
|
${w(r)}`});return t=i.$.env,e.$={env:t,type:H.type,value:H,pathCollection:[]},e}function Yf({expr:e,env:t,context:n}){he(e,[k.__yo_incr_rc[0]]);let r=e.args[0],i=S({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:`Failed to evaluate the argument expression for "${k.__yo_incr_rc[0]}":
|
|
11079
11079
|
${w(r)}`});return t=i.$.env,e.$={env:t,type:H.type,value:H,pathCollection:[]},e}function qf({expr:e,env:t,context:n}){he(e,[k.__yo_incr_rc_atomic[0]]);let r=e.args[0],i=S({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:`Failed to evaluate the argument expression for "${k.__yo_incr_rc_atomic[0]}":
|
|
11080
11080
|
${w(r)}`});return t=i.$.env,e.$={env:t,type:H.type,value:H,pathCollection:[]},e}function Hf({expr:e,env:t,context:n}){he(e,[k.__yo_decr_rc_atomic[0]]);let r=e.args[0],i=S({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:`Failed to evaluate the argument expression for "${k.__yo_decr_rc_atomic[0]}":
|
|
@@ -11116,7 +11116,7 @@ use_id :: (fn(forall(T : Type),
|
|
|
11116
11116
|
) -> T) {
|
|
11117
11117
|
return val.id();
|
|
11118
11118
|
}
|
|
11119
|
-
`});let $=X(t,o),b=$.length>0?$[$.length-1]:void 0,L=$.find(N=>{if(N.value&&O(N.value[0])){let B=N.value[0];if(V(B.value))return!0}return!1}),C=T,R=c;if(L){let N=L.value[0],B=N.value;if(p&&O(p)&&V(p.value)){let D=p.value,x=[...B.requiredTraits];for(let re of D.requiredTraits)x.some(j=>j.traitType.id===re.traitType.id)||x.push(re);let z=[...B.negativeTraits??[]];if(D.negativeTraits)for(let re of D.negativeTraits)z.some(j=>j.traitType.id===re.traitType.id)||z.push(re);B.requiredTraits=x,B.negativeTraits=z}C=N,R=Ft(B)}else if(b&&b.isCompileTimeOnly&&b.value&&b.frameLevel===t.frames.length-1)C=b.value[0],R=b.type;else{let{env:N}=me({env:t,variable:{name:o,type:c,isCompileTimeOnly:a,value:p?[p]:a?[K(c,{variableName:o,env:t,context:n})]:void 0,token:u?.token??e.token,initializedAtToken:u?.token??e.token,consumedAtToken:void 0,isOwningTheRcValue:l,isOwningTheSameRcValueAs:void 0,isReassignable:!1},allowVariableShadowing:i});t=N}return u&&(u.$={env:t,type:R,value:C,pathCollection:[]}),u!==e&&g!==e&&(e.$={env:t,type:H.type,value:H,pathCollection:[]}),kt(c),{parameter:{label:o,type:c,exprs:di({expr:e,labelExpr:h,typeExpr:g,defaultValueExpr:d,assignedValueExpr:v}),isCompileTimeOnly:a,isQuote:s,isOwningTheRcValue:l,isImplicit:!1,assignedValue:p},env:t}}function zg({constraintExprs:e,env:t,context:n}){let r=[];for(let i of e){if(!F(i)||!E(i,"<:",2))continue;let o=i.args[0];if(U(o)){let s=o.token.value;if(X(t,s).length===0){let u=Cn(tt(),s,{env:t,context:n}),_=ee(u),{env:c}=me({env:t,variable:{name:s,type:Ft(u),isCompileTimeOnly:!0,value:[_],token:o.token,initializedAtToken:o.token,consumedAtToken:void 0,isOwningTheRcValue:!1,isOwningTheSameRcValueAs:void 0,isReassignable:!1}});t=c,o.$={env:t,type:Ft(u),value:_,pathCollection:[]}}}let a=Al({constraintExprs:[i],env:t,context:n,collectPendingTraits:!0});t=a.env,r.push(...a.pendingTraits)}return{env:t,pendingConstraints:r}}function _p({pendingConstraints:e,env:t,context:n}){let r=[];for(let i of e){let o=Ug({lhsExpr:i.lhsExpr,traitExpr:i.traitExpr,originalConstraintExpr:i.originalConstraintExpr,env:t,context:n});t=o.env,o.success||r.push(i)}return{env:t,pendingConstraints:r}}function cp({concreteType:e,traitExpr:t,isNegated:n,constraintExpr:r,env:i,context:o}){let a;try{a=S({expr:t,env:i,context:{...o}})}catch{return{env:i,success:!1}}if(!a.$||!a.$.value||!O(a.$.value))return{env:i,success:!1};i=a.$.env;let s=a.$.value;if(!De(s.value))throw y({token:t.token,errorMessage:`Expected trait type for right-hand side of where clause constraint, got: ${A(s.value)}`});let l=s.value,u=St({targetType:e,traitType:l,env:i});if(n){if(u)throw y({token:r.token,errorMessage:`Type ${A(e)} must NOT implement ${A(l)}, but it does.`})}else if(!u)throw y({token:r.token,errorMessage:`Type ${A(e)} does not implement required trait ${A(l)}.`});return{env:i,success:!0}}function Ug({lhsExpr:e,traitExpr:t,originalConstraintExpr:n,env:r,context:i}){let o=!1,a=t;F(t)&&E(t,"!")&&t.args.length===1&&(o=!0,a=t.args[0]);let s;if(U(e)){let c=e.token.value,f=X(r,c);if(f.length===0)return{env:r,success:!1};let p=f[f.length-1];if(p.value&&O(p.value[0])&&V(p.value[0].value))s=p.value[0].value;else if(p.value&&O(p.value[0]))try{return cp({concreteType:p.value[0].value,traitExpr:a,isNegated:o,constraintExpr:n,env:r,context:i})}catch{return{env:r,success:!1}}else return{env:r,success:!1}}else{let c;try{c=S({expr:e,env:r,context:{...i}})}catch{return{env:r,success:!1}}if(!c.$||!c.$.value||!O(c.$.value))return{env:r,success:!1};r=c.$.env;let f=c.$.value;if(!V(f.value))try{return cp({concreteType:f.value,traitExpr:a,isNegated:o,constraintExpr:n,env:r,context:i})}catch{return{env:r,success:!1}}s=f.value}let l;try{l=S({expr:a,env:r,context:{...i}})}catch{return{env:r,success:!1}}if(!l.$||!l.$.value||!O(l.$.value))return{env:r,success:!1};r=l.$.env;let u=l.$.value;if(!De(u.value))throw y({token:a.token,errorMessage:`Expected trait type for right-hand side of where clause constraint, got: ${A(u.value)}`});let _=u.value;if(_.receiverType)throw y({token:a.token,errorMessage:"Trait type in where clause already has a receiver type assigned."});return r=rr({env:r,someType:s,traitType:_,isNegated:o}),{env:r,success:!0}}function Al({constraintExprs:e,env:t,context:n,collectPendingTraits:r=!1}){let i=[];for(let o of e){if(!F(o)||!E(o,"<:",2))throw y({token:o.token,errorMessage:`Expected constraint in the form "T <: Trait" or "T <: (Trait1, Trait2)", got: ${w(o)}`});let a=o.args[0],s=o.args[1],l;if(U(a)){let _=a.token.value,c=X(t,_);if(c.length>0){let f=c[c.length-1];if(f.value&&O(f.value[0])&&V(f.value[0].value))l=f.value[0].value;else if(f.value&&O(f.value[0])){let p=f.value[0].value;t=fp({concreteType:p,rhsExpr:s,constraintExpr:o,env:t,context:n});continue}else throw y({token:a.token,errorMessage:`Expected type for left-hand side of where clause constraint, got variable "${_}".`})}else{l=Cn(tt(),_,{env:t,context:n});let f=ee(l),{env:p}=me({env:t,variable:{name:_,type:Ft(l),isCompileTimeOnly:!0,value:[f],token:a.token,initializedAtToken:a.token,consumedAtToken:void 0,isOwningTheRcValue:!1,isOwningTheSameRcValueAs:void 0,isReassignable:!1}});t=p,a.$={env:t,type:Ft(l),value:f,pathCollection:[]}}}else{let _=S({expr:a,env:t,context:{...n}});if(!_.$||!_.$.value||!O(_.$.value))throw y({token:a.token,errorMessage:"Expected type for left-hand side of where clause constraint."});t=_.$.env;let c=_.$.value;if(!V(c.value)){t=fp({concreteType:c.value,rhsExpr:s,constraintExpr:o,env:t,context:n});continue}l=c.value}let u=[];F(s)&&E(s,I.tuple)?u.push(...s.args):u.push(s);for(let _=0;_<u.length;_++){let c=u[_],f=!1,p=c;F(c)&&E(c,"!")&&c.args.length===1&&(f=!0,p=c.args[0]);let m;try{m=S({expr:p,env:t,context:{...n}})}catch(d){if(r){i.push({lhsExpr:a,traitExpr:c,originalConstraintExpr:o});continue}throw d}if(!m.$||!m.$.value||!O(m.$.value)){if(r){i.push({lhsExpr:a,traitExpr:c,originalConstraintExpr:o});continue}throw y({token:p.token,errorMessage:"Expected trait type for right-hand side of where clause constraint."})}t=m.$.env;let g=m.$.value;if(!De(g.value))throw y({token:p.token,errorMessage:`Expected trait type for right-hand side of where clause constraint, got: ${A(g.value)}`});let h=g.value;if(h.receiverType)throw y({token:p.token,errorMessage:"Trait type in where clause already has a receiver type assigned."});t=rr({env:t,someType:l,traitType:h,isNegated:f})}}return{env:t,pendingTraits:i}}function jr({constraintExprs:e,env:t,context:n}){return e.length===0?{env:t}:{env:Al({constraintExprs:e,env:t,context:n,collectPendingTraits:!1}).env}}function fp({concreteType:e,rhsExpr:t,constraintExpr:n,env:r,context:i}){let o=[];if(F(t)&&E(t,I.tuple))for(let a of t.args)F(a)&&E(a,"!")&&a.args.length===1?o.push({expr:a.args[0],isNegated:!0}):o.push({expr:a,isNegated:!1});else F(t)&&E(t,"!")&&t.args.length===1?o.push({expr:t.args[0],isNegated:!0}):o.push({expr:t,isNegated:!1});for(let{expr:a,isNegated:s}of o){let l=S({expr:a,env:r,context:{...i}});if(!l.$||!l.$.value||!O(l.$.value))throw y({token:a.token,errorMessage:"Expected trait type for right-hand side of where clause constraint."});r=l.$.env;let u=l.$.value;if(!De(u.value))throw y({token:a.token,errorMessage:`Expected trait type for right-hand side of where clause constraint, got: ${A(u.value)}`});let _=u.value,c=St({targetType:e,traitType:_,env:r});if(s){if(c)throw y({token:n.token,errorMessage:`Type ${A(e)} must NOT implement ${A(_)}, but it does.`})}else if(!c)throw y({token:n.token,errorMessage:`Type ${A(e)} does not implement required trait ${A(_)}.`})}return r}function Il({parameterExprs:e,env:t,context:n}){t=Pe(t);let r=[],i=[],o=[],a,s,l=!1;if(e.length>0){let f=e[0];if(F(f)&&E(f,I.forall)){let p=f.args;for(let m=0;m<p.length;m++){let g=p[m];if(F(g)&&E(g,"...")&&g.args.length===1&&U(g.args[0])){let T=g.args[0].token.value;if(i.find(N=>N.label===T))throw y({token:g.token,errorMessage:`Duplicate label "${T}" in type parameter`});let b=pi(T,t),L=gn(1),{env:C}=me({env:t,variable:{name:T,type:L,isCompileTimeOnly:!0,value:[ee(b)],token:g.args[0].token,initializedAtToken:g.args[0].token,consumedAtToken:void 0,isOwningTheRcValue:!1}});t=C,g.$={env:t,type:L,value:ee(b),pathCollection:[]};let R={label:T,type:L,isCompileTimeOnly:!0,isQuote:!1,isOwningTheRcValue:!1,isImplicit:!1,isEffectRowSpread:!1,exprs:di({expr:g,labelExpr:g.args[0],typeExpr:g.args[0],defaultValueExpr:void 0,assignedValueExpr:void 0})};i.push(R);continue}let{parameter:h,env:d}=Ll({expr:g,env:t,context:{...n},isParameterComptimeByDefault:!0,allowVariableShadowing:!0});if(i.find(T=>T.label===h.label))throw y({token:g.token,errorMessage:`Duplicate label "${h.label}" in type parameter`});i.push(h),t=d}}}let u=0;for(let f=0;f<e.length;f++){let p=e[f];if(F(p)&&E(p,I.using)){if(u++,u>1)throw y({token:p.token,errorMessage:'Only one "using(...)" clause is allowed per function signature. Combine all implicit parameters into a single using(), e.g.: using(a : TypeA, b : TypeB)'});let m=p.args;for(let g=0;g<m.length;g++){let h=m[g];if(F(h)&&E(h,"...")&&h.args.length===1&&U(h.args[0])){let N=h.args[0].token.value,D=X(t,N).at(-1);if(!D)throw y({token:h.token,errorMessage:`Effect row variable "${N}" not found in scope. Declare it with forall(..., ...(${N}))`});let x,z=D.value?.[0];if(z&&O(z)&&ot(z.value)){let j=z.value;for(let W of j.implicitParameters)o.push({...W,isEffectRowSpread:!1});continue}else if(z&&O(z)){if(!(V(z.value)&&z.value.isEffectsRow||ot(z.value)))throw y({token:h.token,errorMessage:`"...(${N})" requires "${N}" to be a forall-declared effect row variable, but it resolves to a concrete type. Use individual effect types directly in using(), e.g. using(name : ${N}) instead of using(...(${N}))`});x=z.value}else if(z&&de(z)&&ot(z.type)){let j=z.type;for(let W of j.implicitParameters)o.push({...W,isEffectRowSpread:!1});continue}else if(z&&de(z))x=pi(N,t);else throw y({token:h.token,errorMessage:`Effect row variable "${N}" has invalid value. Expected a type.`});let re={label:N,type:x,isCompileTimeOnly:!0,isImplicit:!0,isEffectRowSpread:!0,isQuote:!1,isOwningTheRcValue:!1,exprs:di({expr:h,labelExpr:h.args[0],typeExpr:h.args[0],defaultValueExpr:void 0,assignedValueExpr:void 0})};o.push(re);continue}if(!(F(h)&&(E(h,":")||E(h,"=")||E(h,"?=")||E(h,":="))))throw y({token:h.token,errorMessage:'Implicit parameter requires a label. Use "using(name : Type)" instead of "using(Type)".'});let{parameter:v,env:T}=Ll({expr:h,env:t,context:{...n},isParameterComptimeByDefault:!0,allowVariableShadowing:!0});if(i.find(N=>N.label===v.label))throw y({token:h.token,errorMessage:`Duplicate label "${v.label}" in implicit parameter (already in forall)`});if(o.find(N=>N.label===v.label))throw y({token:h.token,errorMessage:`Duplicate label "${v.label}" in implicit parameter`});let L={...v,isCompileTimeOnly:!0,isImplicit:!0};o.push(L);let R=T.frames[T.frames.length-1].variables.find(N=>N.name===v.label);R&&(R.isImplicit=!0),t=T}}}let _=new Set;for(let f=0;f<e.length;f++){let p=e[f];if(F(p)&&(E(p,I.forall)||E(p,I.using)||E(p,I.where)||E(p,"...")))continue;let m=Pg(p);if(m){let g=S({expr:m.typeExpr,env:t,context:{...n}});if(g.$?.env&&(t=g.$.env),!g.$||!g.$.value||!O(g.$.value))continue;let h=g.$.value.value,d=K(h,{variableName:m.name,env:t,context:n}),{env:v}=me({env:t,variable:{name:m.name,type:h,isCompileTimeOnly:!0,value:[d],token:m.token,initializedAtToken:m.token,consumedAtToken:void 0,isOwningTheRcValue:!1,isOwningTheSameRcValueAs:void 0,isReassignable:!1}});t=v,_.add(f)}}let c=[];if(e.length>0){let f=e[e.length-1];if(F(f)&&E(f,I.where)){if(s=f.args,s.length===0)throw y({token:f.token,errorMessage:"The where clause must have at least one constraint."});let p=zg({constraintExprs:s,env:t,context:n});t=p.env,c=p.pendingConstraints}}for(let f=0;f<e.length;f++){let p=e[f];if(F(p)&&E(p,I.forall)){if(f!==0)throw y({token:p.token,errorMessage:`Expected type parameters to be the first argument, got ${f+1}`});continue}else{if(F(p)&&E(p,I.using))continue;if(F(p)&&E(p,I.where)){if(f!==e.length-1)throw y({token:p.token,errorMessage:"The where clause must be the last parameter in the function signature."});continue}else if(U(p)&&dt(p,"...")||F(p)&&E(p,"...")){l=!0;let m=!1,g=!1,h="...",d=p,v=H.type;if(F(p)){let b=p.args[0];if(b){if(F(b)&&E(b,I.comptime))throw m=!0,b.args.length!==1?y({token:b.token,errorMessage:`Expected one argument for "comptime" , got ${b.args.length}`}):(d=b.args[0],h=b.args[0].token.value,v=H.type,y({token:b.token,errorMessage:"...(comptime(param_name)) is not supported yet."}));if(F(b)&&E(b,I.quote)){if(m=!0,g=!0,b.args.length!==1)throw y({token:b.token,errorMessage:`Expected one argument for "quote" (or ":"), got ${b.args.length}`});d=b.args[0],h=b.args[0].token.value,v=Vo()}else throw je(b)?(d=b,h=b.token.value,v=H.type,y({token:b.token,errorMessage:"...(param_name) is not supported yet."})):y({token:b.token,errorMessage:`Expected a valid variable name for variadic parameter, got ${w(b)}`})}else throw y({token:p.token,errorMessage:`Expected a name for variadic parameter, got ${w(p)}`})}else v=H.type;let T=Jt(A(v)),$={exprs:{expr:p,labelExpr:d,typeExpr:T},isCompileTimeOnly:m,isQuote:g,label:h,type:v,isOwningTheRcValue:!1,isImplicit:!1};if(a=$,h!=="..."){let{env:b}=me({env:t,variable:{name:h,type:v,isCompileTimeOnly:$.isCompileTimeOnly,value:m?[K(v,{variableName:h,env:t,context:n})]:void 0,token:d.token,initializedAtToken:d.token,consumedAtToken:void 0,isOwningTheRcValue:$.isOwningTheRcValue,isOwningTheSameRcValueAs:void 0,isReassignable:!1}});t=b,d.$={env:t,type:v,value:m?K(v,{variableName:h,env:t,context:n}):void 0,pathCollection:[]}}}else{if(l)throw y({token:p.token,errorMessage:"Expected variadic parameter to be the last parameter before the normal parameters."});let{parameter:m,env:g}=Ll({expr:p,env:t,context:{...n},isParameterComptimeByDefault:!1,allowVariableShadowing:!0});if(r.find(d=>d.label===m.label))throw y({token:F(p)?p.args[0]?.token??p.token:p.token,errorMessage:`Duplicate label "${m.label}" in function parameter`});if(r.push(m),t=g,c.length>0){let d=_p({pendingConstraints:c,env:t,context:n});t=d.env,c=d.pendingConstraints}}}}if(r.forEach((f,p)=>{if(f.isQuote&&Jr(f.type)&&p!==r.length-1)throw y({token:f.exprs.expr.token,errorMessage:"Expected ExprList type to be the last parameter."})}),c.length>0){let f=_p({pendingConstraints:c,env:t,context:n});if(t=f.env,f.pendingConstraints.length>0){let p=f.pendingConstraints[0];Al({constraintExprs:[p.originalConstraintExpr],env:t,context:n,collectPendingTraits:!1})}}return{parameters:r,forallParameters:i,implicitParameters:o,variadicParameter:a,whereClauseExprs:s,env:t}}function Ya({expr:e,env:t,context:n}){if(!E(e,"->",2))throw y({token:e.token,errorMessage:`Expected -> for function type, got:
|
|
11119
|
+
`});let $=X(t,o),b=$.length>0?$[$.length-1]:void 0,L=$.find(N=>{if(N.value&&O(N.value[0])){let B=N.value[0];if(V(B.value))return!0}return!1}),C=T,R=c;if(L){let N=L.value[0],B=N.value;if(p&&O(p)&&V(p.value)){let D=p.value,x=[...B.requiredTraits];for(let re of D.requiredTraits)x.some(j=>j.traitType.id===re.traitType.id)||x.push(re);let z=[...B.negativeTraits??[]];if(D.negativeTraits)for(let re of D.negativeTraits)z.some(j=>j.traitType.id===re.traitType.id)||z.push(re);B.requiredTraits=x,B.negativeTraits=z}C=N,R=Ft(B)}else if(b&&b.isCompileTimeOnly&&b.value&&b.frameLevel===t.frames.length-1)C=b.value[0],R=b.type;else{let{env:N}=me({env:t,variable:{name:o,type:c,isCompileTimeOnly:a,value:p?[p]:a?[K(c,{variableName:o,env:t,context:n})]:void 0,token:u?.token??e.token,initializedAtToken:u?.token??e.token,consumedAtToken:void 0,isOwningTheRcValue:l,isOwningTheSameRcValueAs:void 0,isReassignable:!1},allowVariableShadowing:i});t=N}return u&&(u.$={env:t,type:R,value:C,pathCollection:[]}),u!==e&&g!==e&&(e.$={env:t,type:H.type,value:H,pathCollection:[]}),kt(c),{parameter:{label:o,type:c,exprs:di({expr:e,labelExpr:h,typeExpr:g,defaultValueExpr:d,assignedValueExpr:v}),isCompileTimeOnly:a,isQuote:s,isOwningTheRcValue:l,isImplicit:!1,assignedValue:p},env:t}}function zg({constraintExprs:e,env:t,context:n}){let r=[];for(let i of e){if(!F(i)||!E(i,"<:",2))continue;let o=i.args[0];if(U(o)){let s=o.token.value;if(X(t,s).length===0){let u=Cn(tt(),s,{env:t,context:n}),_=ee(u),{env:c}=me({env:t,variable:{name:s,type:Ft(u),isCompileTimeOnly:!0,value:[_],token:o.token,initializedAtToken:o.token,consumedAtToken:void 0,isOwningTheRcValue:!1,isOwningTheSameRcValueAs:void 0,isReassignable:!1}});t=c,o.$={env:t,type:Ft(u),value:_,pathCollection:[]}}}let a=Al({constraintExprs:[i],env:t,context:n,collectPendingTraits:!0});t=a.env,r.push(...a.pendingTraits)}return{env:t,pendingConstraints:r}}function _p({pendingConstraints:e,env:t,context:n}){let r=[];for(let i of e){let o=Ug({lhsExpr:i.lhsExpr,traitExpr:i.traitExpr,originalConstraintExpr:i.originalConstraintExpr,env:t,context:n});t=o.env,o.success||r.push(i)}return{env:t,pendingConstraints:r}}function cp({concreteType:e,traitExpr:t,isNegated:n,constraintExpr:r,env:i,context:o}){let a;try{a=S({expr:t,env:i,context:{...o}})}catch{return{env:i,success:!1}}if(!a.$||!a.$.value||!O(a.$.value))return{env:i,success:!1};i=a.$.env;let s=a.$.value;if(!De(s.value))throw y({token:t.token,errorMessage:`Expected trait type for right-hand side of where clause constraint, got: ${A(s.value)}`});let l=s.value,u=St({targetType:e,traitType:l,env:i});if(n){if(u)throw y({token:r.token,errorMessage:`Type ${A(e)} must NOT implement ${A(l)}, but it does.`})}else if(!u)throw y({token:r.token,errorMessage:`Type ${A(e)} does not implement required trait ${A(l)}.`});return{env:i,success:!0}}function Ug({lhsExpr:e,traitExpr:t,originalConstraintExpr:n,env:r,context:i}){let o=!1,a=t;F(t)&&E(t,"!")&&t.args.length===1&&(o=!0,a=t.args[0]);let s;if(U(e)){let c=e.token.value,f=X(r,c);if(f.length===0)return{env:r,success:!1};let p=f[f.length-1];if(p.value&&O(p.value[0])&&V(p.value[0].value))s=p.value[0].value;else if(p.value&&O(p.value[0]))try{return cp({concreteType:p.value[0].value,traitExpr:a,isNegated:o,constraintExpr:n,env:r,context:i})}catch{return{env:r,success:!1}}else return{env:r,success:!1}}else{let c;try{c=S({expr:e,env:r,context:{...i}})}catch{return{env:r,success:!1}}if(!c.$||!c.$.value||!O(c.$.value))return{env:r,success:!1};r=c.$.env;let f=c.$.value;if(!V(f.value))try{return cp({concreteType:f.value,traitExpr:a,isNegated:o,constraintExpr:n,env:r,context:i})}catch{return{env:r,success:!1}}s=f.value}let l;try{l=S({expr:a,env:r,context:{...i}})}catch{return{env:r,success:!1}}if(!l.$||!l.$.value||!O(l.$.value))return{env:r,success:!1};r=l.$.env;let u=l.$.value;if(!De(u.value))throw y({token:a.token,errorMessage:`Expected trait type for right-hand side of where clause constraint, got: ${A(u.value)}`});let _=u.value;if(_.receiverType)throw y({token:a.token,errorMessage:"Trait type in where clause already has a receiver type assigned."});return r=rr({env:r,someType:s,traitType:_,isNegated:o}),{env:r,success:!0}}function Al({constraintExprs:e,env:t,context:n,collectPendingTraits:r=!1}){let i=[];for(let o of e){if(!F(o)||!E(o,"<:",2))throw y({token:o.token,errorMessage:`Expected constraint in the form "T <: Trait" or "T <: (Trait1, Trait2)", got: ${w(o)}`});let a=o.args[0],s=o.args[1],l;if(U(a)){let _=a.token.value,c=X(t,_);if(c.length>0){let f=c[c.length-1];if(f.value&&O(f.value[0])&&V(f.value[0].value))l=f.value[0].value;else if(f.value&&O(f.value[0])){let p=f.value[0].value;t=fp({concreteType:p,rhsExpr:s,constraintExpr:o,env:t,context:n});continue}else throw y({token:a.token,errorMessage:`Expected type for left-hand side of where clause constraint, got variable "${_}".`})}else{l=Cn(tt(),_,{env:t,context:n});let f=ee(l),{env:p}=me({env:t,variable:{name:_,type:Ft(l),isCompileTimeOnly:!0,value:[f],token:a.token,initializedAtToken:a.token,consumedAtToken:void 0,isOwningTheRcValue:!1,isOwningTheSameRcValueAs:void 0,isReassignable:!1}});t=p,a.$={env:t,type:Ft(l),value:f,pathCollection:[]}}}else{let _=S({expr:a,env:t,context:{...n}});if(!_.$||!_.$.value||!O(_.$.value))throw y({token:a.token,errorMessage:"Expected type for left-hand side of where clause constraint."});t=_.$.env;let c=_.$.value;if(!V(c.value)){t=fp({concreteType:c.value,rhsExpr:s,constraintExpr:o,env:t,context:n});continue}l=c.value}let u=[];F(s)&&E(s,I.tuple)?u.push(...s.args):u.push(s);for(let _=0;_<u.length;_++){let c=u[_],f=!1,p=c;F(c)&&E(c,"!")&&c.args.length===1&&(f=!0,p=c.args[0]);let m;try{m=S({expr:p,env:t,context:{...n}})}catch(d){if(r){i.push({lhsExpr:a,traitExpr:c,originalConstraintExpr:o});continue}throw d}if(!m.$||!m.$.value||!O(m.$.value)){if(r){i.push({lhsExpr:a,traitExpr:c,originalConstraintExpr:o});continue}throw y({token:p.token,errorMessage:"Expected trait type for right-hand side of where clause constraint."})}t=m.$.env;let g=m.$.value;if(!De(g.value))throw y({token:p.token,errorMessage:`Expected trait type for right-hand side of where clause constraint, got: ${A(g.value)}`});let h=g.value;if(h.receiverType)throw y({token:p.token,errorMessage:"Trait type in where clause already has a receiver type assigned."});t=rr({env:t,someType:l,traitType:h,isNegated:f})}}return{env:t,pendingTraits:i}}function jr({constraintExprs:e,env:t,context:n}){return e.length===0?{env:t}:{env:Al({constraintExprs:e,env:t,context:n,collectPendingTraits:!1}).env}}function fp({concreteType:e,rhsExpr:t,constraintExpr:n,env:r,context:i}){let o=[];if(F(t)&&E(t,I.tuple))for(let a of t.args)F(a)&&E(a,"!")&&a.args.length===1?o.push({expr:a.args[0],isNegated:!0}):o.push({expr:a,isNegated:!1});else F(t)&&E(t,"!")&&t.args.length===1?o.push({expr:t.args[0],isNegated:!0}):o.push({expr:t,isNegated:!1});for(let{expr:a,isNegated:s}of o){let l=S({expr:a,env:r,context:{...i}});if(!l.$||!l.$.value||!O(l.$.value))throw y({token:a.token,errorMessage:"Expected trait type for right-hand side of where clause constraint."});r=l.$.env;let u=l.$.value;if(!De(u.value))throw y({token:a.token,errorMessage:`Expected trait type for right-hand side of where clause constraint, got: ${A(u.value)}`});let _=u.value,c=St({targetType:e,traitType:_,env:r});if(s){if(c)throw y({token:n.token,errorMessage:`Type ${A(e)} must NOT implement ${A(_)}, but it does.`})}else if(!c)throw y({token:n.token,errorMessage:`Type ${A(e)} does not implement required trait ${A(_)}.`})}return r}function Il({parameterExprs:e,env:t,context:n}){t=ze(t);let r=[],i=[],o=[],a,s,l=!1;if(e.length>0){let f=e[0];if(F(f)&&E(f,I.forall)){let p=f.args;for(let m=0;m<p.length;m++){let g=p[m];if(F(g)&&E(g,"...")&&g.args.length===1&&U(g.args[0])){let T=g.args[0].token.value;if(i.find(N=>N.label===T))throw y({token:g.token,errorMessage:`Duplicate label "${T}" in type parameter`});let b=pi(T,t),L=hn(1),{env:C}=me({env:t,variable:{name:T,type:L,isCompileTimeOnly:!0,value:[ee(b)],token:g.args[0].token,initializedAtToken:g.args[0].token,consumedAtToken:void 0,isOwningTheRcValue:!1}});t=C,g.$={env:t,type:L,value:ee(b),pathCollection:[]};let R={label:T,type:L,isCompileTimeOnly:!0,isQuote:!1,isOwningTheRcValue:!1,isImplicit:!1,isEffectRowSpread:!1,exprs:di({expr:g,labelExpr:g.args[0],typeExpr:g.args[0],defaultValueExpr:void 0,assignedValueExpr:void 0})};i.push(R);continue}let{parameter:h,env:d}=Ll({expr:g,env:t,context:{...n},isParameterComptimeByDefault:!0,allowVariableShadowing:!0});if(i.find(T=>T.label===h.label))throw y({token:g.token,errorMessage:`Duplicate label "${h.label}" in type parameter`});i.push(h),t=d}}}let u=0;for(let f=0;f<e.length;f++){let p=e[f];if(F(p)&&E(p,I.using)){if(u++,u>1)throw y({token:p.token,errorMessage:'Only one "using(...)" clause is allowed per function signature. Combine all implicit parameters into a single using(), e.g.: using(a : TypeA, b : TypeB)'});let m=p.args;for(let g=0;g<m.length;g++){let h=m[g];if(F(h)&&E(h,"...")&&h.args.length===1&&U(h.args[0])){let N=h.args[0].token.value,D=X(t,N).at(-1);if(!D)throw y({token:h.token,errorMessage:`Effect row variable "${N}" not found in scope. Declare it with forall(..., ...(${N}))`});let x,z=D.value?.[0];if(z&&O(z)&&ot(z.value)){let j=z.value;for(let W of j.implicitParameters)o.push({...W,isEffectRowSpread:!1});continue}else if(z&&O(z)){if(!(V(z.value)&&z.value.isEffectsRow||ot(z.value)))throw y({token:h.token,errorMessage:`"...(${N})" requires "${N}" to be a forall-declared effect row variable, but it resolves to a concrete type. Use individual effect types directly in using(), e.g. using(name : ${N}) instead of using(...(${N}))`});x=z.value}else if(z&&de(z)&&ot(z.type)){let j=z.type;for(let W of j.implicitParameters)o.push({...W,isEffectRowSpread:!1});continue}else if(z&&de(z))x=pi(N,t);else throw y({token:h.token,errorMessage:`Effect row variable "${N}" has invalid value. Expected a type.`});let re={label:N,type:x,isCompileTimeOnly:!0,isImplicit:!0,isEffectRowSpread:!0,isQuote:!1,isOwningTheRcValue:!1,exprs:di({expr:h,labelExpr:h.args[0],typeExpr:h.args[0],defaultValueExpr:void 0,assignedValueExpr:void 0})};o.push(re);continue}if(!(F(h)&&(E(h,":")||E(h,"=")||E(h,"?=")||E(h,":="))))throw y({token:h.token,errorMessage:'Implicit parameter requires a label. Use "using(name : Type)" instead of "using(Type)".'});let{parameter:v,env:T}=Ll({expr:h,env:t,context:{...n},isParameterComptimeByDefault:!0,allowVariableShadowing:!0});if(i.find(N=>N.label===v.label))throw y({token:h.token,errorMessage:`Duplicate label "${v.label}" in implicit parameter (already in forall)`});if(o.find(N=>N.label===v.label))throw y({token:h.token,errorMessage:`Duplicate label "${v.label}" in implicit parameter`});let L={...v,isCompileTimeOnly:!0,isImplicit:!0};o.push(L);let R=T.frames[T.frames.length-1].variables.find(N=>N.name===v.label);R&&(R.isImplicit=!0),t=T}}}let _=new Set;for(let f=0;f<e.length;f++){let p=e[f];if(F(p)&&(E(p,I.forall)||E(p,I.using)||E(p,I.where)||E(p,"...")))continue;let m=Pg(p);if(m){let g=S({expr:m.typeExpr,env:t,context:{...n}});if(g.$?.env&&(t=g.$.env),!g.$||!g.$.value||!O(g.$.value))continue;let h=g.$.value.value,d=K(h,{variableName:m.name,env:t,context:n}),{env:v}=me({env:t,variable:{name:m.name,type:h,isCompileTimeOnly:!0,value:[d],token:m.token,initializedAtToken:m.token,consumedAtToken:void 0,isOwningTheRcValue:!1,isOwningTheSameRcValueAs:void 0,isReassignable:!1}});t=v,_.add(f)}}let c=[];if(e.length>0){let f=e[e.length-1];if(F(f)&&E(f,I.where)){if(s=f.args,s.length===0)throw y({token:f.token,errorMessage:"The where clause must have at least one constraint."});let p=zg({constraintExprs:s,env:t,context:n});t=p.env,c=p.pendingConstraints}}for(let f=0;f<e.length;f++){let p=e[f];if(F(p)&&E(p,I.forall)){if(f!==0)throw y({token:p.token,errorMessage:`Expected type parameters to be the first argument, got ${f+1}`});continue}else{if(F(p)&&E(p,I.using))continue;if(F(p)&&E(p,I.where)){if(f!==e.length-1)throw y({token:p.token,errorMessage:"The where clause must be the last parameter in the function signature."});continue}else if(U(p)&&dt(p,"...")||F(p)&&E(p,"...")){l=!0;let m=!1,g=!1,h="...",d=p,v=H.type;if(F(p)){let b=p.args[0];if(b){if(F(b)&&E(b,I.comptime))throw m=!0,b.args.length!==1?y({token:b.token,errorMessage:`Expected one argument for "comptime" , got ${b.args.length}`}):(d=b.args[0],h=b.args[0].token.value,v=H.type,y({token:b.token,errorMessage:"...(comptime(param_name)) is not supported yet."}));if(F(b)&&E(b,I.quote)){if(m=!0,g=!0,b.args.length!==1)throw y({token:b.token,errorMessage:`Expected one argument for "quote" (or ":"), got ${b.args.length}`});d=b.args[0],h=b.args[0].token.value,v=Vo()}else throw je(b)?(d=b,h=b.token.value,v=H.type,y({token:b.token,errorMessage:"...(param_name) is not supported yet."})):y({token:b.token,errorMessage:`Expected a valid variable name for variadic parameter, got ${w(b)}`})}else throw y({token:p.token,errorMessage:`Expected a name for variadic parameter, got ${w(p)}`})}else v=H.type;let T=Jt(A(v)),$={exprs:{expr:p,labelExpr:d,typeExpr:T},isCompileTimeOnly:m,isQuote:g,label:h,type:v,isOwningTheRcValue:!1,isImplicit:!1};if(a=$,h!=="..."){let{env:b}=me({env:t,variable:{name:h,type:v,isCompileTimeOnly:$.isCompileTimeOnly,value:m?[K(v,{variableName:h,env:t,context:n})]:void 0,token:d.token,initializedAtToken:d.token,consumedAtToken:void 0,isOwningTheRcValue:$.isOwningTheRcValue,isOwningTheSameRcValueAs:void 0,isReassignable:!1}});t=b,d.$={env:t,type:v,value:m?K(v,{variableName:h,env:t,context:n}):void 0,pathCollection:[]}}}else{if(l)throw y({token:p.token,errorMessage:"Expected variadic parameter to be the last parameter before the normal parameters."});let{parameter:m,env:g}=Ll({expr:p,env:t,context:{...n},isParameterComptimeByDefault:!1,allowVariableShadowing:!0});if(r.find(d=>d.label===m.label))throw y({token:F(p)?p.args[0]?.token??p.token:p.token,errorMessage:`Duplicate label "${m.label}" in function parameter`});if(r.push(m),t=g,c.length>0){let d=_p({pendingConstraints:c,env:t,context:n});t=d.env,c=d.pendingConstraints}}}}if(r.forEach((f,p)=>{if(f.isQuote&&Jr(f.type)&&p!==r.length-1)throw y({token:f.exprs.expr.token,errorMessage:"Expected ExprList type to be the last parameter."})}),c.length>0){let f=_p({pendingConstraints:c,env:t,context:n});if(t=f.env,f.pendingConstraints.length>0){let p=f.pendingConstraints[0];Al({constraintExprs:[p.originalConstraintExpr],env:t,context:n,collectPendingTraits:!1})}}return{parameters:r,forallParameters:i,implicitParameters:o,variadicParameter:a,whereClauseExprs:s,env:t}}function Ya({expr:e,env:t,context:n}){if(!E(e,"->",2))throw y({token:e.token,errorMessage:`Expected -> for function type, got:
|
|
11120
11120
|
${w(e)}
|
|
11121
11121
|
|
|
11122
11122
|
Note: For closures, use Impl(Fn(...) -> ...) syntax.`});let r=e.args[0],i=e.args[1],o=[];if(F(r)&&(E(r,I.fn)||E(r,I.unsafe_fn)))o=r.args;else throw y({token:r.token,errorMessage:`Expected a "fn" or "unsafe_fn" call for parameter list, got:
|
|
@@ -11133,7 +11133,7 @@ ${w(r)}`});let o=_i(t),a=o.fields,s=[],l=[];for(let f=0;f<i.length;f++){let p=i[
|
|
|
11133
11133
|
${w(m)}`});h=m.token.value}{let d=S({expr:g,env:t,context:{...n,SelfType:o}});if(Yt(d,n),!d.$)throw y({token:g.token,errorMessage:`Failed to evaluate the anonymous struct field expression: ${w(g)}`});t=d.$.env;let v=d.$.type,T={exprs:{expr:g,labelExpr:void 0,typeExpr:void 0,defaultValueExpr:void 0,assignedValueExpr:g},type:v,label:h??`__field_${Ye(t.modulePath)}`};a.push(T),l.push(d),d.$.value?s.push(d.$?.value):s.push(void 0),m&&(m.$=d.$)}}t=li({structType:o,env:t,context:n,errorToken:r.token});let u;u=s.some(f=>!f)?void 0:Gn(o,s);let _=ee(o);r.$={env:t,type:_.type,value:_,pathCollection:[]};let{env:c}=me({env:t,variable:{name:o.id,type:_.type,value:[_],initializedAtToken:e.token,token:e.token,isCompileTimeOnly:!0,consumedAtToken:void 0,isOwningTheRcValue:!1}});return t=c,e.$={env:t,type:o,value:u,pathCollection:[],runtimeArgExprsInOrder:l},Ge(e,!0),e}function dp({expr:e,env:t,context:n}){let r=e.args[0],i=S({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:`Failed to evaluate the argument expression for Arc:
|
|
11134
11134
|
${w(r)}`});if(t=i.$.env,!O(i.$.value))throw y({token:r.token,errorMessage:`Arc expects a type as argument, but got:
|
|
11135
11135
|
${w(r)}`});let a=i.$.value.value,s=Vu(a,t);t=pu({arcType:s,env:t,context:n});let l=ee(s);return e.$={env:t,type:l.type,value:l,pathCollection:[]},e}function mp({expr:e,env:t,context:n,arcType:r}){let i=e.args[0],o=S({expr:i,env:t,context:{...n,expectedType:{type:r.childType,env:t}}});if(!o.$)throw y({token:i.token,errorMessage:`Failed to evaluate the argument expression for Arc value constructor:
|
|
11136
|
-
${w(i)}`});return t=o.$.env,t=
|
|
11136
|
+
${w(i)}`});return t=o.$.env,t=En(o,t),e.$={env:t,type:r,value:void 0,pathCollection:o.$.pathCollection||[]},Ge(e,!0),e}function yp({expr:e,arrayType:t,arrayValue:n,sliceValue:r,argExprs:i,callerEnv:o,context:a}){if(i.length!==1)throw y({token:e.func.token,errorMessage:`Expect 1 argument for accessing array element, got ${i.length}.`});if(U(e.args[0])&&dt(e.args[0],":")||F(e.args[0])&&E(e.args[0],":")){let s=$a(t.childType);if(U(e.args[0]))return n?{value:fa(s,[n],0,n.elements.length),type:s,callerEnv:o}:r?{value:r,type:s,callerEnv:o}:{value:void 0,type:s,callerEnv:o};{let l=e.args[0].args[0],u=e.args[0].args[1],_=S({expr:l,env:o,context:{...a,expectedType:{type:gt(),env:o}}});if(!_.$)throw y({token:l.token,errorMessage:`Failed to evaluate start expression:
|
|
11137
11137
|
${w(l)}`});o=_.$.env;let c=_.$.type;if(!q({type:gt(),env:o},{type:c,env:o}))throw y({token:l.token,errorMessage:`Expected usize for array start index, got:
|
|
11138
11138
|
${A(c)}`});let f=S({expr:u,env:o,context:{...a,expectedType:{type:gt(),env:o}}});if(!f.$)throw y({token:u.token,errorMessage:`Failed to evaluate end expression:
|
|
11139
11139
|
${w(u)}`});o=f.$.env;let p=f.$.type;if(!q({type:gt(),env:o},{type:p,env:o}))throw y({token:u.token,errorMessage:`Expected usize for array end index, got:
|
|
@@ -11144,9 +11144,9 @@ ${A(u)}`});let _=t.childType;if(r)if(l.$.value)if(Ue(l.$.value)){let c=l.$.value
|
|
|
11144
11144
|
- Given : ${A(m.$.type)}`});m.$.value!==void 0?l.push(m.$.value):l.push(K(_,{env:u,context:i}))}let c=Rr(a,l);return e.$={env:u,value:c,type:a,pathCollection:[]},e}function hp({capturedVariables:e,env:t,closureToken:n}){let r=t;for(let[i,o]of e.entries())if(o.frameLevel<t.frames.length&&o.usageType==="own"){let a=X(r,i);if(a.length>0){let s=a[a.length-1];s.consumedAtToken||(r=Be(r,s,{...s,consumedAtToken:n}))}}return r}function so(e){let t=[];for(let[n]of e.entries())t.push([n]);return t}function qa({wrapperType:e,captureType:t,env:n,errorToken:r}){for(let{traitType:i}of e.requiredTraits)if(!kt(i)&&!St({targetType:t,traitType:i,env:n})){let o=t.fields.filter(l=>!St({targetType:l.type,traitType:i,env:n})),a=A(i),s=o.map(l=>`\`${l.label}\` has type \`${A(l.type)}\` which does not implement \`${a}\``).join(`
|
|
11145
11145
|
`);throw y({token:r,errorMessage:`Closure does not implement \`${a}\` because captured variable ${s}`})}}function Ha({expectedCaptureType:e,capturedVariablesWithValues:t,env:n,closureToken:r,context:i}){let o=e,a;if(o===void 0)if(t&&t.size>0){let s=_i(n),l=Array.from(t.entries()).map(([_,c])=>({label:_,type:c.type,isCompileTimeOnly:!1,assignedValue:void 0,isEffectParam:c.isEffectParam||void 0,exprs:{expr:{tag:"Atom",token:c.token},labelExpr:void 0,typeExpr:void 0,defaultValueExpr:void 0}}));s.fields=l,o=s,n=li({structType:s,env:n,context:{...i},errorToken:r});let u=Array.from(t.values()).map(_=>_.value);u.every(_=>_!==void 0)?a=Gn(s,u):a=void 0}else{let s=_i(n);s.fields=[],n=li({structType:s,env:n,context:{...i},errorToken:r}),o=s,a=Gn(s,[])}else if(t&&t.size>0){let s=o,l=Array.from(t.keys()),u=s.fields.map(c=>c.label);for(let c of l)if(!u.includes(c))throw y({token:r,errorMessage:`Captured variable "${c}" does not exist in expected capture struct "${A(s)}"`});for(let c of s.fields)if(!l.includes(c.label))throw y({token:r,errorMessage:`Expected capture struct field "${c.label}" is not captured by this closure`});for(let[c,f]of t.entries()){let p=s.fields.find(m=>m.label===c);if(p&&!q({type:p.type,env:n},{type:f.type,env:n}))throw y({token:f.token,errorMessage:`Captured variable "${c}" has type "${A(f.type)}" but expected struct field has type "${A(p.type)}"`})}let _=Array.from(t.values()).map(c=>c.value);_.every(c=>c!==void 0)?a=Gn(o,_):a=void 0}else a=Gn(o,[]);return{captureType:o,captureValue:a}}function ja({capturedVariables:e,env:t}){let n=new Map;for(let[r,i]of e.entries())if(i.frameLevel<t.frames.length){let a=t.frames[i.frameLevel].variables.find(s=>s.name===r);a&&!a.isCompileTimeOnly&&n.set(r,{...i,value:a.value?.[0],type:a.type})}return n}function Ka({capturedVariablesWithValues:e,env:t,context:n}){let r=[],i=t;if(e&&e.size>0){for(let[o,a]of e.entries())if(Le(a.type)){let s=Jt(`${k.___dup[0]}(${o})`),l=S({expr:s,env:i,context:{...n}});r.push(l),l.$&&l.$.env&&(i=l.$.env)}}return{capturedVariableDupExpressions:r.length>0?r:void 0,env:i}}function Sl({functionBodyExpr:e,functionType:t,functionValue:n,env:r,context:i}){if(!Fe(t.return.type))return;let o;try{let a=Ae(e),s=lo({...i,capturedVariables:void 0},t,{...n},r),l=ht({expr:a,env:r,context:s.evaluationContext,variablesToAdd:[],isEvaluatingFunctionBodyBeginBlock:!0});if(o=l.$?.type,et(l.$?.controlFlow,"escape")&&!et(l.$?.controlFlow,"return"))return}catch{return}if(o&&!q({type:t.return.type,env:r},{type:o,env:r},!0))throw y({token:t.return.typeExpr.token,errorMessage:`Incompatible function return type for:
|
|
11146
11146
|
- Expected: ${A(t.return.type)}
|
|
11147
|
-
- Given : ${A(o)}`})}function lo(e,t,n,r){let i={kind:"function-body",type:t,value:n,evaluationEnv:r},o=new Map,a;if(e.isEvaluatingFunctionBodyOrAsyncBlock){let l=e.isEvaluatingFunctionBodyOrAsyncBlock;l.kind==="function-body"?a=l.type.return.type:a=Vn()}return{evaluationContext:{...e,isExecuting:!1,isValidatingFunctionDefinition:!0,isEvaluatingFunctionBodyOrAsyncBlock:i,isEvaluatingFunctionType:!1,isEvaluatingLoopBody:void 0,capturedVariables:o,expectedType:{type:t.return.type,env:r},functionReturnImplConcreteType:[],enclosingFunctionReturnType:a,isInsideGivenHandler:e.isInsideGivenHandler,forceCompileTimeBindings:!1,isAnalyzingCtfeCapability:!1},functionBodyContext:i}}function vp({expr:e,functionType:t,callerEnv:n,context:r}){let i=e.func,o=e.args;if(o.length!==1)throw y({token:i.token,errorMessage:`Failed to implement the function. Expected 1 argument for the function body, got ${o.length}.`});let a=o[0],s=!1,l=r.expectedType?.type,u=l&&G(l)&&l.parameters.length===t.parameters.length&&l.parameters.some((L,C)=>L.label!==t.parameters[C].label),_=
|
|
11147
|
+
- Given : ${A(o)}`})}function lo(e,t,n,r){let i={kind:"function-body",type:t,value:n,evaluationEnv:r},o=new Map,a;if(e.isEvaluatingFunctionBodyOrAsyncBlock){let l=e.isEvaluatingFunctionBodyOrAsyncBlock;l.kind==="function-body"?a=l.type.return.type:a=Vn()}return{evaluationContext:{...e,isExecuting:!1,isValidatingFunctionDefinition:!0,isEvaluatingFunctionBodyOrAsyncBlock:i,isEvaluatingFunctionType:!1,isEvaluatingLoopBody:void 0,capturedVariables:o,expectedType:{type:t.return.type,env:r},functionReturnImplConcreteType:[],enclosingFunctionReturnType:a,isInsideGivenHandler:e.isInsideGivenHandler,forceCompileTimeBindings:!1,isAnalyzingCtfeCapability:!1},functionBodyContext:i}}function vp({expr:e,functionType:t,callerEnv:n,context:r}){let i=e.func,o=e.args;if(o.length!==1)throw y({token:i.token,errorMessage:`Failed to implement the function. Expected 1 argument for the function body, got ${o.length}.`});let a=o[0],s=!1,l=r.expectedType?.type,u=l&&G(l)&&l.parameters.length===t.parameters.length&&l.parameters.some((L,C)=>L.label!==t.parameters[C].label),_=ze(s?n:Ma(n));if(u&&l&&G(l)){for(let L of t.forallParameters){let{env:C}=me({env:_,variable:{name:L.label,type:L.type,isCompileTimeOnly:!0,value:[K(L.type,{variableName:L.label,env:_,context:r})],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1}});_=C}for(let L=0;L<t.parameters.length;L++){let C=t.parameters[L],R=l.parameters[L],N=C.label,B=R.label,{env:D}=me({env:_,variable:{name:N,type:C.type,isCompileTimeOnly:C.isCompileTimeOnly,value:C.isCompileTimeOnly?[K(C.type,{variableName:B,env:_,context:r})]:void 0,token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:C.isOwningTheRcValue,parameterAlias:N!==B?B:void 0}});_=D}}else _=ze(_,t.parametersFrame);let c=_.frames[_.frames.length-1],f={...t,parametersFrame:c,env:t.env},p={tag:"Function",type:f,body:a,frameLevel:_.frames.length-1,funcName:void 0,funcId:`fn_${Ye(_.modulePath)}`,definitionSiteEnclosingFunctionType:r.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"?r.isEvaluatingFunctionBodyOrAsyncBlock.type:void 0,calledComptimeFunctionCaches:[],specializedFunctionCaches:[]};if(f.whereClauseExprs?.length){let L=f.whereClauseExprs.map(R=>Ae(R));_=jr({constraintExprs:L,env:_,context:{...r,isEvaluatingFunctionType:!0}}).env}let m=f.forallParameters.length>0||f.parameters.some(L=>Fe(L.type))||f.SelfType&&Fe(f.SelfType),g,h;if(m)Sl({functionBodyExpr:a,functionType:f,functionValue:p,env:_,context:r}),a.$={env:_,type:t.return.type,value:t.return.isCompileTimeOnly?K(t.return.type,{variableName:"function_body",env:_,context:r}):void 0,pathCollection:[]},h={...r,capturedVariables:void 0},g=a;else{if(h=lo({...r,capturedVariables:void 0},f,p,_).evaluationContext,g=ht({expr:a,env:_,context:h,variablesToAdd:[],isEvaluatingFunctionBodyBeginBlock:!0}),!g.$)throw y({token:a.token,errorMessage:"Failed to evaluate the function body."});_=g.$.env}let d=h.capturedVariables,v=g.$?.type;if(er(g)&&(p.isControlFunction=!0),!p.isControlFunction&&v&&!q({type:f.return.type,env:_},{type:v,env:_}))throw y({token:f.return.typeExpr.token,errorMessage:`Incompatible function return type for:
|
|
11148
11148
|
- Expected: ${A(f.return.type)}
|
|
11149
|
-
- Given : ${A(v)}`});if(V(f.return.type)&&!f.return.type.resolvedConcreteType&&(V(v)?V(v)&&v.resolvedConcreteType&&(f.return.type.resolvedConcreteType=v.resolvedConcreteType):f.return.type.resolvedConcreteType=v),f.return.isCompileTimeOnly&&g.$&&!g.$.value)throw y({token:f.return.typeExpr.token,errorMessage:"Expected to return a compile-time value, but got runtime value."});_=_t(_,!0);let T=n;s&&d&&d.size>0&&(T=hp({capturedVariables:d,env:n,closureToken:e.token}));let $=p,b=f;if(r.isAnalyzingCtfeCapability||r.forceCompileTimeBindings){let L=ro(p,T,r);L&&($=L,b=L.type)}return e.$={env:T,value:$,type:b,pathCollection:d&&d.size>0?so(d):[]},e}function Tp({expr:e,fnModuleType:t,wrapperType:n,callerEnv:r,context:i}){let o=e.func,a=e.args;if(a.length!==1)throw y({token:o.token,errorMessage:`Fn module type expects exactly 1 argument (the closure body), got ${a.length}`});let s=a[0],l=
|
|
11149
|
+
- Given : ${A(v)}`});if(V(f.return.type)&&!f.return.type.resolvedConcreteType&&(V(v)?V(v)&&v.resolvedConcreteType&&(f.return.type.resolvedConcreteType=v.resolvedConcreteType):f.return.type.resolvedConcreteType=v),f.return.isCompileTimeOnly&&g.$&&!g.$.value)throw y({token:f.return.typeExpr.token,errorMessage:"Expected to return a compile-time value, but got runtime value."});_=_t(_,!0);let T=n;s&&d&&d.size>0&&(T=hp({capturedVariables:d,env:n,closureToken:e.token}));let $=p,b=f;if(r.isAnalyzingCtfeCapability||r.forceCompileTimeBindings){let L=ro(p,T,r);L&&($=L,b=L.type)}return e.$={env:T,value:$,type:b,pathCollection:d&&d.size>0?so(d):[]},e}function Tp({expr:e,fnModuleType:t,wrapperType:n,callerEnv:r,context:i}){let o=e.func,a=e.args;if(a.length!==1)throw y({token:o.token,errorMessage:`Fn module type expects exactly 1 argument (the closure body), got ${a.length}`});let s=a[0],l=ze(r,t.isFn.callType.parametersFrame);if(t.isFn.callType.whereClauseExprs?.length){let $=t.isFn.callType.whereClauseExprs.map(L=>Ae(L));l=jr({constraintExprs:$,env:l,context:{...i,isEvaluatingFunctionType:!0}}).env}let u={tag:"Function",type:t.isFn.callType,body:s,frameLevel:l.frames.length-1,funcName:void 0,funcId:`closure_${Ye(l.modulePath)}`,definitionSiteEnclosingFunctionType:i.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"?i.isEvaluatingFunctionBodyOrAsyncBlock.type:void 0,calledComptimeFunctionCaches:[],specializedFunctionCaches:[]},{evaluationContext:_}=lo(i,t.isFn.callType,u,l),c=ht({expr:s,env:l,context:_,variablesToAdd:[],isEvaluatingFunctionBodyBeginBlock:!0});if(!c.$)throw y({token:s.token,errorMessage:"Failed to evaluate the closure body."});l=c.$.env;let f=_.capturedVariables,p=c.$.type;if(!q({type:t.isFn.callType.return.type,env:l},{type:p,env:l}))throw y({token:t.isFn.callType.return.typeExpr.token,errorMessage:`Incompatible closure return type:
|
|
11150
11150
|
- Expected: ${A(t.isFn.callType.return.type)}
|
|
11151
11151
|
- Given : ${A(p)}`});if(t.isFn.callType.return.isCompileTimeOnly&&!c.$.value)throw y({token:t.isFn.callType.return.typeExpr.token,errorMessage:"Expected to return a compile-time value, but got runtime value."});l=_t(l,!0);let m=f&&f.size>0?ja({capturedVariables:f,env:r}):void 0,g=r,{capturedVariableDupExpressions:h,env:d}=Ka({capturedVariablesWithValues:m,env:r,context:i});g=d;let{captureType:v}=Ha({expectedCaptureType:void 0,capturedVariablesWithValues:m,env:g,closureToken:e.token,context:{...i}});u.closureInfo={closureType:t,captureType:v},V(n)&&v&&qa({wrapperType:n,captureType:v,env:g,errorToken:e.token});let T;return V(n)?(n.resolvedConcreteType=v,T={...n,resolvedConcreteType:v}):Ce(n)?T=n:T=t,e.$={env:g,value:void 0,type:T,pathCollection:f&&f.size>0?so(f):[],deferredDupExpressions:h&&h.length>0?h:void 0,captureType:v,closureFunctionValue:u},Ce(n)&&Ge(e,!0),e}function Ep({expr:e,comptimeListType:t,argExprs:n,callerEnv:r,context:i}){let o=[],a=r,s=t.childType;for(let u=0;u<n.length;u++){let _=n[u],c=S({expr:_,env:a,context:{...i,expectedType:{type:s,env:a}}});if(!c.$)throw y({token:_.token,errorMessage:`Failed to evaluate ComptimeList element at index ${u}.`});if(Yt(c,i),a=c.$.env,!q({type:s,env:a},{type:c.$.type,env:a}))throw y({token:_.token,errorMessage:`ComptimeList element at index ${u} has incompatible type:
|
|
11152
11152
|
- Expected: ${A(s)}
|
|
@@ -11154,7 +11154,7 @@ ${A(u)}`});let _=t.childType;if(r)if(l.$.value)if(Ue(l.$.value)){let c=l.$.value
|
|
|
11154
11154
|
${w(a)}`})}return{deferredDropExpressions:r.length>0?r:void 0,env:i}}function Wg({functionType:e,definitionSiteEnclosingFunctionType:t,parameter:n,argExprs:r,argIndex:i,calleeEnv:o,callerEnv:a,context:s,isMethodCall:l,runtimeArgExprsInOrder:u}){let _=r[i],c;if(_&&F(_)&&E(_,":",2)){if(c=_.args[0],_=_.args[1],!U(c))throw y({token:c.token,errorMessage:`Expected identifier for label, got:
|
|
11155
11155
|
${w(c)}`});let b=c.token.value;if(n.label==="")throw y({token:c.token,errorMessage:"Named argument call is not allowed for this parameter (it has no label)."});if(n.label!==b)throw y({token:c.token,errorMessage:`Named argument is not supported. Label is only used for readibility.
|
|
11156
11156
|
Expected ${n?`label "${n.label}"`:"no label"} at the argument position, but got "${b}".`})}let{parameterType:f,calleeEnv:p}=ea({functionType:e,definitionSiteEnclosingFunctionType:t,parameter:n,calleeEnv:o,context:{...s,isEvaluatingFunctionType:!0}});o=p;let m;if(!_||U(_)&&dt(_,I.undefined))if(n.exprs.defaultValueExpr)m=S({expr:Ae(n.exprs.defaultValueExpr),env:o,context:{...s,expectedType:{type:f,env:o}}}),m.$?.env&&(o=m.$?.env),_&&(_.$=m.$),n.isCompileTimeOnly||u.push(m);else throw y({token:_?.token??ae,errorMessage:`Expected default value for parameter "${n.label}"`});else if(n.isQuote)if(Lt(f))m=Ae(_),m.$={type:cn(),value:Wn(_),env:a,pathCollection:[]};else throw y({token:_.token,errorMessage:`Expected "Expr" type for "quote" parameter "${n.label}", got:
|
|
11157
|
-
${A(f)}`});else{let b=e.ioBuiltin==="io_await"||e.ioBuiltin==="io_state"||e.ioBuiltin==="io_spawn"||e.ioBuiltin==="join_handle_await"?void 0:{type:f,env:o};if(m=S({expr:_,env:a,context:{...s,expectedType:b}}),m.$?.env&&(a=m.$?.env),n.isCompileTimeOnly||u.push(m),oi(m,a),n.isOwningTheRcValue&&!n.isCompileTimeOnly){let L=m.$?.variableName,C=L?X(a,L):[];(C.length?C[C.length-1]:void 0)?.isOwningTheRcValue?a=
|
|
11157
|
+
${A(f)}`});else{let b=e.ioBuiltin==="io_await"||e.ioBuiltin==="io_state"||e.ioBuiltin==="io_spawn"||e.ioBuiltin==="join_handle_await"?void 0:{type:f,env:o};if(m=S({expr:_,env:a,context:{...s,expectedType:b}}),m.$?.env&&(a=m.$?.env),n.isCompileTimeOnly||u.push(m),oi(m,a),n.isOwningTheRcValue&&!n.isCompileTimeOnly){let L=m.$?.variableName,C=L?X(a,L):[];(C.length?C[C.length-1]:void 0)?.isOwningTheRcValue?a=En(m,a,!0):(Yt(m,s),m.$?.env&&(a=m.$.env),a=En(m,a,!0))}}if(!m.$)throw y({token:_?.token??ae,errorMessage:"Failed to evaluate argument expression."});let g=m.$.type;if(!m.$?.value&&n.isCompileTimeOnly)throw y({token:_?.token??ae,errorMessage:`Cannot assign runtime argument to compile-time parameter:
|
|
11158
11158
|
${_?w(_):""}`});if(n.assignedValue&&m.$?.value&&!At({value:n.assignedValue,env:o},{value:m.$.value,env:a}))throw y({token:_?.token??ae,errorMessage:`Value mismatch for parameter "${n.label}":
|
|
11159
11159
|
Expected: ${Me(n.assignedValue)}
|
|
11160
11160
|
Got: ${Me(m.$.value)}`});let h=m.$.value;if(!n.isCompileTimeOnly&&ni(g,m.$.env)&&(s.forceCompileTimeBindings||(h=void 0),g=yt({type:g,expectedType:f,expr:m,env:m.$.env}),dr(g,m.$.env)))throw y({token:_?.token??ae,errorMessage:`Cannot convert compile-time type to runtime type for argument:
|
|
@@ -11165,31 +11165,31 @@ ${b.message}`})}let{parameterType:T,calleeEnv:$}=ea({functionType:e,definitionSi
|
|
|
11165
11165
|
Expected: ${T} arguments
|
|
11166
11166
|
Got: ${$.length} arguments`})}else if($.length<T&&!n.parameters.slice($.length).every(Q=>Q.exprs.defaultValueExpr!==void 0))throw y({token:r?.token??ae,errorMessage:`Too few arguments for function call:
|
|
11167
11167
|
Expected: ${T} arguments
|
|
11168
|
-
Got: ${$.length} arguments`})}let b=d.slice(0,T),L=d.slice(T);i=b,o=
|
|
11168
|
+
Got: ${$.length} arguments`})}let b=d.slice(0,T),L=d.slice(T);i=b,o=ze(o);let C=ze(n.env);if(n.SelfType){let J=ee(n.SelfType),{env:Q}=me({env:C,variable:{name:"Self",token:ae,type:J.type,isCompileTimeOnly:!0,initializedAtToken:ae,consumedAtToken:void 0,value:[J],isOwningTheRcValue:!1},allowVariableShadowing:!0});C=Q}for(let J=0;J<n.forallParameters.length;J++){let Q=n.forallParameters[J],oe;if(Q.exprs.labelExpr&&Q.label){let ye=He(Q.type)&&Q.type.level===1&&F(Q.exprs.expr)&&E(Q.exprs.expr,"...",1)?ee(pi(Q.label,C)):K(Q.type,{variableName:Q.label,env:C,context:a}),{env:ie,variable:Ne}=me({env:C,variable:{name:Q.label,type:Q.type,isCompileTimeOnly:!0,value:[ye],token:Q.exprs.labelExpr.token,initializedAtToken:Q.exprs.labelExpr.token,consumedAtToken:void 0,isOwningTheRcValue:!1}});C=ie,oe=Ne}if(_){let ue=_.args[J],ye;if(F(ue)&&E(ue,":",2)){if(ye=ue.args[0],ue=ue.args[1],!U(ye))throw y({token:ye.token,errorMessage:`Expected identifier for type parameter label, got:
|
|
11169
11169
|
${w(ye)}`});if(Q.label!==ye.token.value)throw y({token:ye.token,errorMessage:`Expected type parameter label "${Q.label}", got "${ye.token.value}".`})}let ie;if(U(ue)&&ue.token.value==="_")continue;if(!ue||U(ue)&&dt(ue,I.undefined))if(Q.exprs.defaultValueExpr){let qe=S({expr:Ae(Q.exprs.defaultValueExpr),env:C,context:{...a}});if(qe.$?.env&&(o=qe.$.env),ue&&(ue.$=qe.$),!O(qe.$?.value))throw y({token:ue?.token??r?.token??ae,errorMessage:ue?`Expected type for default value, got:
|
|
11170
11170
|
${w(ue)}`:"Expected type for default value."});ie=qe.$?.value}else throw y({token:ue?.token??r?.token??ae,errorMessage:"Type parameter does not have default value."});else{let qe=S({expr:ue,env:o,context:{...a,expectedType:{type:Q.type,env:C}}});if(qe.$?.env&&(o=qe.$.env),!O(qe.$?.value))throw y({token:ue.token,errorMessage:`Expected type for argument, got:
|
|
11171
11171
|
${w(ue)}`});ie=qe.$?.value}ye&&(ye.$={env:C,type:ie.type,value:ie,pathCollection:[]});let{parameterType:Ne,calleeEnv:$e}=ea({parameter:Q,calleeEnv:C,definitionSiteEnclosingFunctionType:m,context:{...a,isEvaluatingFunctionType:!0},functionType:n});C=$e;let{expectedEnv:Xe,givenEnv:ct}=Ze({type:Ne,env:C},{type:ie.type,env:o});if(C=Xe,o=ct,!q({type:Ne,env:C},{type:ie.type,env:o}))throw y({token:ue?.token??r?.token??ae,errorMessage:`Type mismatch for type parameter "${Q.label}":
|
|
11172
11172
|
Expected: ${A(Ne)}
|
|
11173
11173
|
Got: ${A(ie.type)}`});if(Q.label)if(oe)C=Be(C,oe,{...oe,value:[ie]});else{let qe=ue?.token??r?.token??ae,{env:Gt}=me({env:C,variable:{name:Q.label,type:ie.type,isCompileTimeOnly:!0,value:[ie],token:qe,initializedAtToken:qe,consumedAtToken:void 0,isOwningTheRcValue:!1}});C=Gt}c.push({value:ie,argType:ie.type,parameterType:Ne})}}if(a.expectedType&&!_&&n.forallParameters.length>0&&!n.return.isUnquote)try{let{returnType:J,calleeEnv:Q}=Ei({functionType:n,calleeEnv:C,context:{...a,isEvaluatingFunctionType:!0},functionCalleeExpr:r}),{expectedEnv:oe}=Ze({type:J,env:Q},{type:a.expectedType.type,env:a.expectedType.env});C=oe}catch{}if(h&&n.implicitParameters.length>0&&n.implicitParameters.some(Q=>Q.isEffectRowSpread)){let oe=n.implicitParameters.filter(ye=>!ye.isEffectRowSpread).length,ue=h.args.slice(oe);if(ue.length>0){let ye=[];for(let $e of ue){if(!U($e))throw y({token:$e.token,errorMessage:`Expected identifier for using() argument in effect row spread, got ${w($e)}`});let Xe=$e.token.value,qe=X(o,Xe).at(-1);if(!qe)throw y({token:$e.token,errorMessage:`Variable "${Xe}" not found for using() argument in effect row spread.`});$e.$={env:o,type:qe.type,value:qe.value?.[0],variableName:Xe,pathCollection:[]},ye.push({label:Xe,type:qe.type,isCompileTimeOnly:!0,isImplicit:!0,isOwningTheRcValue:!1,isQuote:!1,exprs:{expr:$e,labelExpr:$e,typeExpr:void 0,defaultValueExpr:void 0}})}let ie=Ir(ye),Ne=ee(ie);for(let $e of n.implicitParameters){if(!$e.isEffectRowSpread)continue;let Xe=$e.label,qe=X(C,Xe).at(-1);qe&&(C=Be(C,qe,{...qe,value:[Ne]})),V($e.type)&&$e.type.isEffectsRow&&($e.type.resolvedConcreteType=ie)}}}n.ioBuiltin==="io_async"&&(a={...a,isInsideIoAsyncCall:!0});let R=n.parameters.length;for(let J=0;J<R;J++){let Q=n.parameters[J],{calleeEnv:oe,callerEnv:ue,context:ye,argValue:ie,argType:Ne,parameterType:$e}=Wg({functionType:n,definitionSiteEnclosingFunctionType:m,parameter:Q,argExprs:i,argIndex:J,callerEnv:o,calleeEnv:C,context:a,isMethodCall:s,runtimeArgExprsInOrder:p});C=oe,o=ue,a=ye,f.push({value:ie,parameterType:$e,argType:Ne})}if(!_&&n.forallParameters.length>0){for(let J of n.forallParameters)if(J.label){let oe=X(C,J.label).at(-1);if(oe?.value?.[0]&&O(oe.value[0])){let ue=oe.value[0];if(V(ue.value)&&ue.value.resolvedConcreteType&&(!ue.value.requiredTraits||ue.value.requiredTraits.length===0)){let ye=ee(ue.value.resolvedConcreteType);C=Be(C,oe,{...oe,value:[ye]})}}}}if(!_&&n.forallParameters.length>0){for(let J of n.forallParameters)if(J.label){let oe=X(C,J.label).at(-1);oe?.value?.[0]&&O(oe.value[0])&&c.push({value:oe.value[0],argType:oe.value[0].type,parameterType:J.type})}}if(n.whereClauseExprs?.length){let J=n.whereClauseExprs.map(oe=>Ae(oe));C=jr({constraintExprs:J,env:C,context:{...a,isEvaluatingFunctionType:!0}}).env}let{returnType:N,calleeEnv:B}=Ei({functionType:n,calleeEnv:C,context:{...a,isEvaluatingFunctionType:!0},functionCalleeExpr:r});if(C=B,a.expectedType&&!n.return.isUnquote){let{expectedEnv:J}=Ze({type:N,env:C},{type:a.expectedType.type,env:a.expectedType.env});C=J;let Q=Ei({functionType:n,calleeEnv:C,context:{...a,isEvaluatingFunctionType:!0},functionCalleeExpr:r});N=Q.returnType,C=Q.calleeEnv,q({type:a.expectedType.type,env:a.expectedType.env},{type:N,env:C})&&(N=a.expectedType.type)}let D=[];if(n.variadicParameter){for(let J=0;J<L.length;J++){let Q=L[J],oe;if(n.variadicParameter.isQuote)oe=Ae(Q),oe.$={type:cn(),value:Wn(Q),env:o,pathCollection:[]},D.push({value:oe.$.value,argType:oe.$.type});else{if(oe=S({expr:Q,env:o,context:{...a}}),!oe.$?.env)throw y({token:Q.token,errorMessage:`Failed to evaluate the expression:
|
|
11174
|
-
${w(Q)}`});o=oe.$.env,D.push({value:oe.$.value,argType:oe.$.type}),n.variadicParameter.isCompileTimeOnly||p.push(Q)}}if(n.variadicParameter.label!=="..."){if(n.variadicParameter.isQuote){let J=Un(cn(),D.map(oe=>oe.value)),{env:Q}=me({env:C,variable:{name:n.variadicParameter.label,type:J.type,isCompileTimeOnly:n.variadicParameter.isCompileTimeOnly,value:[J],token:n.variadicParameter.exprs.expr.token,initializedAtToken:n.variadicParameter.exprs.expr.token,consumedAtToken:void 0,isOwningTheRcValue:!1}});C=Q}}}let x=[],z=[];if(n.implicitParameters.length>0)for(let J=0;J<n.implicitParameters.length;J++){let Q=n.implicitParameters[J],oe=!1;if(Q.isEffectRowSpread){let ie=[],$e=X(C,Q.label).at(-1)?.value?.[0],Xe;if($e&&O($e)&&ot($e.value))Xe=$e.value;else if(V(Q.type)&&Q.type.isEffectsRow){let ct=Ot(C,Q.type);ot(ct)&&(Xe=ct)}else ot(Q.type)&&(Xe=Q.type);if(!Xe&&V(Q.type)&&Q.type.isEffectsRow){let ct=pn(o,Ut=>Ut.isImplicit===!0&&Ut.isCompileTimeOnly===!0&&(G(Ut.type)||Te(Ut.type))),qe=new Set(n.implicitParameters.filter(Ut=>!Ut.isEffectRowSpread).map(Ut=>Ut.label)),Gt=ct.filter(Ut=>!qe.has(Ut.name));if(Gt.length>0){for(let ar of Gt){let Zr=ar.value?.[0];if(Zr){z.push({value:Zr,parameterType:ar.type,argType:ar.type});let{env:Em}=me({env:C,variable:{name:ar.name,type:ar.type,isCompileTimeOnly:!0,isImplicit:!0,isFromEffectSpread:!0,value:[Zr],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});C=Em}}let Ut=Ir(Gt.map(ar=>({label:ar.name,type:ar.type,isCompileTimeOnly:!0,isQuote:!1,isOwningTheRcValue:!1,isImplicit:!0,exprs:{expr:void 0,labelExpr:void 0,typeExpr:void 0}}))),
|
|
11174
|
+
${w(Q)}`});o=oe.$.env,D.push({value:oe.$.value,argType:oe.$.type}),n.variadicParameter.isCompileTimeOnly||p.push(Q)}}if(n.variadicParameter.label!=="..."){if(n.variadicParameter.isQuote){let J=Un(cn(),D.map(oe=>oe.value)),{env:Q}=me({env:C,variable:{name:n.variadicParameter.label,type:J.type,isCompileTimeOnly:n.variadicParameter.isCompileTimeOnly,value:[J],token:n.variadicParameter.exprs.expr.token,initializedAtToken:n.variadicParameter.exprs.expr.token,consumedAtToken:void 0,isOwningTheRcValue:!1}});C=Q}}}let x=[],z=[];if(n.implicitParameters.length>0)for(let J=0;J<n.implicitParameters.length;J++){let Q=n.implicitParameters[J],oe=!1;if(Q.isEffectRowSpread){let ie=[],$e=X(C,Q.label).at(-1)?.value?.[0],Xe;if($e&&O($e)&&ot($e.value))Xe=$e.value;else if(V(Q.type)&&Q.type.isEffectsRow){let ct=Ot(C,Q.type);ot(ct)&&(Xe=ct)}else ot(Q.type)&&(Xe=Q.type);if(!Xe&&V(Q.type)&&Q.type.isEffectsRow){let ct=pn(o,Ut=>Ut.isImplicit===!0&&Ut.isCompileTimeOnly===!0&&(G(Ut.type)||Te(Ut.type))),qe=new Set(n.implicitParameters.filter(Ut=>!Ut.isEffectRowSpread).map(Ut=>Ut.label)),Gt=ct.filter(Ut=>!qe.has(Ut.name));if(Gt.length>0){for(let ar of Gt){let Zr=ar.value?.[0];if(Zr){z.push({value:Zr,parameterType:ar.type,argType:ar.type});let{env:Em}=me({env:C,variable:{name:ar.name,type:ar.type,isCompileTimeOnly:!0,isImplicit:!0,isFromEffectSpread:!0,value:[Zr],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});C=Em}}let Ut=Ir(Gt.map(ar=>({label:ar.name,type:ar.type,isCompileTimeOnly:!0,isQuote:!1,isOwningTheRcValue:!1,isImplicit:!0,exprs:{expr:void 0,labelExpr:void 0,typeExpr:void 0}}))),yn=ee(Ut),Or=X(C,Q.label).at(-1);Or&&(C=Be(C,Or,{...Or,value:[yn],type:Ut})),oe=!0;continue}}ie=Xe?.implicitParameters??[];for(let ct of ie){let qe=ct.type,Ut=pn(o,yn=>yn.isImplicit===!0&&yn.isCompileTimeOnly===!0&&yn.name===ct.label&&q({type:qe,env:C},{type:yn.type,env:o})).at(-1);if(Ut?.value?.[0]){let yn=Ut.value[0];z.push({value:yn,parameterType:qe,argType:Ut.type});let{env:jn}=me({env:C,variable:{name:ct.label,type:qe,isCompileTimeOnly:!0,isImplicit:!0,isFromEffectSpread:!0,value:[yn],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});C=jn}else{let jn=pn(o,Zr=>Zr.isImplicit===!0&&Zr.isCompileTimeOnly===!0&&q({type:qe,env:C},{type:Zr.type,env:o})).at(-1);if(!jn?.value?.[0])throw y({token:r?.token??e?.token??ae,errorMessage:`No "given" variable found for effect row parameter "${ct.label}" of type ${A(qe)} (expanded from effect row ...(${Q.label})).
|
|
11175
11175
|
Please ensure a given variable of matching type is in scope.`});let Or=jn.value[0];z.push({value:Or,parameterType:qe,argType:jn.type});let{env:ar}=me({env:C,variable:{name:ct.label,type:qe,isCompileTimeOnly:!0,isImplicit:!0,isFromEffectSpread:!0,value:[Or],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});C=ar}}continue}let{parameterType:ue,calleeEnv:ye}=ea({parameter:Q,calleeEnv:C,definitionSiteEnclosingFunctionType:m,context:{...a,isEvaluatingFunctionType:!0},functionType:n});if(C=ye,h){let ie=h.args[J],Ne=ie&&U(ie)&&dt(ie,I.undefined);if(ie&&!Ne){let $e=S({expr:ie,env:o,context:{...a}});if(!$e.$)throw y({token:ie.token,errorMessage:`Failed to evaluate using() argument: ${w(ie)}`});o=$e.$.env;let Xe=$e.$.value,ct=$e.$.type;if(!Xe)throw y({token:ie.token,errorMessage:`Expected compile-time value for using() argument, got runtime value: ${w(ie)}`});if(!q({type:ue,env:C},{type:ct,env:o}))throw y({token:ie.token,errorMessage:`Incompatible type for implicit parameter "${Q.label}":
|
|
11176
11176
|
Expected: ${A(ue)}
|
|
11177
11177
|
Got: ${A(ct)}`});z.push({value:Xe,parameterType:ue,argType:ct});let qe=X(C,Q.label);if(qe.length>0){let Gt=qe[qe.length-1];C=Be(C,Gt,{...Gt,type:ue,isImplicit:!0,value:[Xe]})}else{let{env:Gt}=me({env:C,variable:{name:Q.label,type:ue,isCompileTimeOnly:!0,isImplicit:!0,value:[Xe],token:Q.exprs.labelExpr?.token??ae,initializedAtToken:Q.exprs.labelExpr?.token??ae,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});C=Gt}oe=!0}}if(!oe){let ie=pn(o,Gt=>Gt.isImplicit===!0&&Gt.isCompileTimeOnly===!0&&q({type:ue,env:C},{type:Gt.type,env:o}));if(ie.length===0)throw y({token:r?.token??e?.token??ae,errorMessage:`No "given" variable found for implicit parameter "${Q.label}" of type ${A(ue)}.
|
|
11178
11178
|
Please declare a given variable with a compatible type, e.g.:
|
|
11179
11179
|
given(${Q.label}) := <value>;
|
|
11180
11180
|
Or pass it explicitly:
|
|
11181
|
-
${t?.funcName??"func"}(..., using(<value>))`});if(ie[ie.length-1].isFromEffectSpread&&!(()=>{if(!r||!U(r))return!1;let Ut=r.token.value,
|
|
11181
|
+
${t?.funcName??"func"}(..., using(<value>))`});if(ie[ie.length-1].isFromEffectSpread&&!(()=>{if(!r||!U(r))return!1;let Ut=r.token.value,yn=a.isEvaluatingFunctionBodyOrAsyncBlock;return!yn||yn.kind!=="function-body"?!1:yn.type.parameters.some(Or=>Or.label===Ut)})())throw y({token:r?.token??e?.token??ae,errorMessage:`Effect "${Q.label}" of type ${A(ue)} is available through an effect row spread but not explicitly declared in the function's using clause.
|
|
11182
11182
|
Add it explicitly:
|
|
11183
|
-
using(${Q.label} : ${A(ue)}, ...(E))`});let $e=ie;if($e.length>1){let Gt=Bo(o,Ut=>Ut.isImplicit===!0&&Ut.isCompileTimeOnly===!0&&q({type:ue,env:C},{type:Ut.type,env:o}));if(Gt>=0){let
|
|
11184
|
-
Please use explicit using() to disambiguate.`});let Xe=$e[$e.length-1],ct=Xe.value?.[0];if(!ct)throw y({token:r?.token??e?.token??ae,errorMessage:`The "given" variable "${Xe.name}" has no compile-time value.`});z.push({value:ct,parameterType:ue,argType:Xe.type});let{env:qe}=me({env:C,variable:{name:Q.label,type:ue,isCompileTimeOnly:!0,isImplicit:!0,value:[ct],token:Q.exprs.labelExpr?.token??ae,initializedAtToken:Q.exprs.labelExpr?.token??ae,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});C=qe}}let re={args:f,forallArgs:c,implicitArgs:z,variadicArgs:D},j;if(n.return.isCompileTimeOnly)if(u)j=K(N,{variableName:n.return.label,env:n.env,context:a});else if(ne(t)){let{value:J,callerEnv:Q,calleeEnv:oe}=oo({functionCalleeExpr:r,functionType:n,functionValue:t,argValues:re,callerEnv:o,calleeEnv:C,context:{...a}});j=J,N=J.type,o=Q,C=oe}else{let J=He(N)&&N.level===0,Q=`${n.id}_return_sometype`;if(J)if(a.expectedType?.type)j=ee(a.expectedType.type);else if(a.isEvaluatingFunctionType){let oe=Cn(N,n.return.label,{id:Q,env:C,context:a});oe.functionApplication=e;let ue=Ot(C,oe);j=ee(ue)}else throw y({token:e?.token??r?.token??ae,errorMessage:"Cannot infer comptime return type. Please provide the expected type."});else j=K(N,{variableName:n.return.label,env:n.env,context:a})}Hg({returnType:N,env:C,expr:e,context:a});let W,le=a.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"&&a.isEvaluatingFunctionBodyOrAsyncBlock.value&&ne(a.isEvaluatingFunctionBodyOrAsyncBlock.value)&&t&&ne(t)&&a.isEvaluatingFunctionBodyOrAsyncBlock.value.funcId===t.funcId,ce=re.implicitArgs?.some(J=>de(J.value)),ve=ce&&!re.implicitArgs?.some(J=>de(J.value)&&!Te(J.parameterType)),Y=re.args.some(J=>J.argType&&V(J.argType)),Z=ve&&Y,se=(()=>{if(!ce||!n.implicitParameters.some(ue=>ue.isEffectRowSpread))return!1;let Q=0;for(let ue of n.implicitParameters)ue.isEffectRowSpread||Q++;let oe=re.implicitArgs??[];for(let ue=0;ue<Q&&ue<oe.length;ue++)if(de(oe[ue].value))return!1;return!0})(),pe=Pn(n)&&!_r(n)&&n.implicitParameters.some(J=>Te(J.type)?J.type.fields.some(Q=>G(Q.type)&&Q.type.forallParameters.length===0):!!J.isEffectRowSpread);if(!l&&!pe&&t&&ne(t)&&!t.isControlFunction&&Pn(n)&&!le&&(!ce||Z||se)){if(W=Yg({originalFunction:t,argValues:re,calleeEnv:C,callerEnv:o,context:a}),W&&V(N)){let J=W.body?.$?.type;J&&!V(J)&&(N=J,W.specializedType&&(W.specializedType={...W.specializedType,return:{...W.specializedType.return,type:J}}))}if(W){let J=new Set,Q=0;for(let oe=0;oe<n.parameters.length;oe++)if(!n.parameters[oe].isCompileTimeOnly){let ie=re.args[oe]?.value;ie&&ne(ie)&&ie.type.implicitParameters.some(Ne=>G(Ne.type)||Te(Ne.type))&&J.add(Q),Q++}if(J.size>0)for(let oe=p.length-1;oe>=0;oe--)J.has(oe)&&p.splice(oe,1)}}if(!l&&t&&ne(t)&&t.isControlFunction&&n.forallParameters.length>0&&!W&&(W=qg({originalFunction:t,argValues:re,calleeEnv:C,callerEnv:o,context:a}),W&&V(N))){let J=W.body?.$?.type;J&&!V(J)&&(N=J,W.specializedType&&(W.specializedType={...W.specializedType,return:{...W.specializedType.return,type:J}}))}let Ve=ji(o),Ke;if(Ve.length>0){let J=Gg({variablesToDrop:Ve,env:o,context:a});Ke=J.deferredDropExpressions,o=J.env}return{returnType:N,calleeEnv:C,callerEnv:o,pathCollection:x,argValues:re,returnValue:j,specializedFunctionValue:W,runtimeArgExprsInOrder:p,deferredDropExpressions:Ke}}function Yg({originalFunction:e,argValues:t,calleeEnv:n,callerEnv:r,context:i}){if(Qa){br.specializeCount++;let D=e.funcName??e.funcId;br.specializeNames.set(D,(br.specializeNames.get(D)??0)+1)}let o=e.type,a=[],s=[];t.forallArgs&&a.push(...t.forallArgs.map(D=>D.value)),t.implicitArgs&&a.push(...t.implicitArgs.map(D=>D.value)),o.parameters.forEach((D,x)=>{let z=t.args[x];if(D.isCompileTimeOnly)z.value&&a.push(z.value);else if(z.value&&ne(z.value)&&z.value.type.implicitParameters.some(j=>G(j.type)||Te(j.type)))z.value&&a.push(z.value);else{let W=V(z.argType)&&z.argType.resolvedConcreteType&&!be(z.argType)?z.argType.resolvedConcreteType:z.argType;s.push({...D,type:W})}});let l=s.map(D=>D.type),u=e.specializedFunctionCaches.find(D=>D.compileTimeArgValues.length===a.length&&D.compileTimeArgValues.every((re,j)=>{let W=a[j];return At({value:re,env:D.env},{value:W,env:r})})?D.runtimeParameterTypes.length===l.length&&D.runtimeParameterTypes.every((re,j)=>{let W=l[j];return q({type:re,env:D.env},{type:W,env:r},!0)}):!1);if(u)return Qa&&br.cacheHitCount++,u.specializedFunction;Qa&&br.cacheMissCount++;let _=n;for(let D of r.frames)for(let x of D.variables){if(!x.isCompileTimeOnly||X(_,x.name).length>0)continue;let{env:re}=me({env:_,variable:{...x},allowVariableShadowing:!0});_=re}for(let D of s){let x=X(_,D.label);if(x.length>0){let z=x[x.length-1],re={...z,value:void 0};_=Be(_,z,re)}}let c=Ae(e.body),{returnType:f,calleeEnv:p}=Ei({functionType:o,calleeEnv:_,context:{...i,isEvaluatingFunctionType:!0},functionCalleeExpr:void 0});_=p;let m=i.enclosingFunctionReturnType,g=t.implicitArgs?.some(D=>ne(D.value)&&D.value.isControlFunction||We(D.value)&&wp(D.value.type,D.value))??!1,h=ht({expr:c,env:_,context:{...i,expectedType:{type:f,env:_},isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:o,value:e,evaluationEnv:_},isEvaluatingLoopBody:void 0,capturedVariables:void 0,functionReturnImplConcreteType:[],hasControlFunctionImplicitParams:g,...m?{enclosingFunctionReturnType:m}:{}},variablesToAdd:[],isEvaluatingFunctionBodyBeginBlock:!0});if(!h.$)throw y({token:e.body.token,errorMessage:"Failed to evaluate function body for specialization."});let d=[],v=0;for(let D=0;D<o.implicitParameters.length;D++){let x=o.implicitParameters[D];if(G(x.type)){let z=t.implicitArgs?.[v];(z&&ne(z.value)?z.value:void 0)?.isControlFunction&&d.push({handlerArgIndex:v,label:x.label,type:x.type,fromSpread:!1}),v+=1}else if(x.isEffectRowSpread){let z=x.type;if(V(z)){let j=X(_,x.label).at(-1)?.value?.[0];if(j&&O(j)&&ot(j.value))z=j.value;else{let W=Ot(_,z);W&&(z=W)}}if(ot(z)){for(let re=0;re<z.implicitParameters.length;re++){let j=z.implicitParameters[re];if(G(j.type)){let W=t.implicitArgs?.[v+re];(W&&ne(W.value)?W.value:void 0)?.isControlFunction&&d.push({handlerArgIndex:v+re,label:j.label,type:j.type,fromSpread:!0})}else if(Te(j.type)){let W=t.implicitArgs?.[v+re],le=W&&We(W.value)?W.value:void 0,ce=[],ve=(Y,Z,se)=>{for(let Se=0;Se<Y.fields.length;Se++){let pe=Y.fields[Se];if(G(pe.type)){let Ve=se?.fields[Se];if(Ve&&ne(Ve)&&Ve.isControlFunction){let Ke=Ve.specializedType??pe.type;ce.push({path:[...Z,pe.label],type:Ke})}}else if(Te(pe.type)){let Ve=se?.fields[Se];ve(pe.type,[...Z,pe.label],Ve&&We(Ve)?Ve:void 0)}}};ve(j.type,[],le);for(let Y of ce)d.push({handlerArgIndex:v+re,label:j.label,type:Y.type,fromSpread:!0,effectFieldPath:Y.path})}}v+=z.implicitParameters.length}else v+=1}else if(Te(x.type)){let z=[],re=t.implicitArgs?.[v],j=(W,le,ce)=>{for(let ve=0;ve<W.fields.length;ve++){let Y=W.fields[ve];if(G(Y.type)){let Z=ce?.fields[ve];if(Z&&ne(Z)&&Z.isControlFunction){let se=Z.specializedType??Y.type;z.push({path:[...le,Y.label],type:se})}}else if(Te(Y.type)){let Z=ce?.fields[ve];j(Y.type,[...le,Y.label],Z&&We(Z)?Z:void 0)}}};j(x.type,[],re&&We(re.value)?re.value:void 0);for(let W of z)d.push({handlerArgIndex:v,label:x.label,type:W.type,fromSpread:!1,effectFieldPath:W.path});v+=1}else v+=1}let T=[];for(let D of d){let x=Cp(h,D.label,D.type,!0,D.effectFieldPath);if(x.hasEffects){let z=t.implicitArgs?.[D.handlerArgIndex],re,j=D.effectFieldPath;if(z&&ne(z.value))re=z.value;else if(z&&We(z.value)&&j&&j.length>0){let W=z.value;for(let le of j){if(!We(W)){W=void 0;break}let ce=W.type.fields.findIndex(ve=>ve.label===le);if(ce<0||!W.fields[ce]){W=void 0;break}W=W.fields[ce]}W&&ne(W)&&(re=W)}if(re){let W=re,le=D.type,ce=!W.body.$;if(!ce&&W.isControlFunction&&F(W.body)&&W.body.args.length>0&&!W.body.args[0]?.$&&(ce=!0),ce&&G(le)&&le.forallParameters.length>0&&x.effectCallPoints.length>0){let ve=new Map,Y=le.return.type,Z=x.effectCallPoints[0].operationResultType;if(V(Y)&&ve.set(Y.name,Z),ve.size===0&&le.forallParameters.length===1){let J=le.forallParameters[0];ve.set(J.label,Z)}let se=Ae(W.body),Se=W.body.$?.env??_;Se=Pe(Se);for(let J of le.forallParameters){let Q=ve.get(J.label);Q&&(Se=me({env:Se,variable:{name:J.label,type:J.type,isCompileTimeOnly:!0,value:[ee(Q)],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0}).env)}let pe=W.specializedType??W.type,Ve=W.definitionSiteEnclosingFunctionType?.return.type??Vn(),Ke={...i,expectedType:void 0,enclosingFunctionReturnType:Ve,isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:pe,value:W,evaluationEnv:Se}};try{let J=Xr({expr:se,env:Se,context:Ke}),Q=pe.parameters.map(ie=>{if(ie.isCompileTimeOnly)return ie;if(V(ie.type)){let Ne=ve.get(ie.type.name);if(Ne)return{...ie,type:Ne}}return ie}),oe=pe.return.type;if(V(oe)){let ie=ve.get(oe.name);ie&&(oe=ie)}let ue={...pe,parameters:Q,return:{...pe.return,type:oe}},ye={...W,body:J,specializedType:ue};x.handlerValue=ye,x.effectParameterType=ue;for(let ie of x.effectCallPoints)ie.isTransitiveEffectCall&&(ie.operationArgTypes=ie.operationArgTypes.map(Ne=>V(Ne)?ve.get(Ne.name)??Ne:Ne))}catch(J){if(F(W.body)&&W.body.args.length>0&&!W.body.args[0]?.$)throw J;x.handlerValue=W}}else x.handlerValue=W}else z&&(x.handlerValue=z.value);T.push({analysis:x,ctlParam:D})}}if(T.length===1)h.$.effectAnalysis=T[0].analysis;else if(T.length>1){let D=[],x=new Map,z=new Map,re=[];for(let le=0;le<T.length;le++){let{analysis:ce}=T[le];re.push({effectParameterName:ce.effectParameterName,effectParameterType:ce.effectParameterType,effectFieldPath:ce.effectFieldPath,handlerValue:ce.handlerValue,operationArgTypes:ce.effectCallPoints.length>0?ce.effectCallPoints[0].operationArgTypes:[],operationResultType:ce.effectCallPoints.length>0?ce.effectCallPoints[0].operationResultType:{tag:"unit"}});for(let ve of ce.effectCallPoints)D.push({...ve,effectIndex:le});for(let ve of ce.capturedVariables)x.has(ve.id)||x.set(ve.id,ve);for(let[ve,Y]of ce.variableIdRemapping)z.set(ve,Y)}if(F(h)&&E(h,I.begin)){let le=h.args,ce=new Map;for(let Y=0;Y<le.length;Y++)ce.set(le[Y],Y);let ve=Y=>{for(let Z=0;Z<le.length;Z++)if(Nl(le[Z],Y.expr))return Z;return 999};D.sort((Y,Z)=>ve(Y)-ve(Z))}for(let le=0;le<D.length;le++)D[le].index=le;let j=T[0].analysis,W={effectCallPoints:D,capturedVariables:Array.from(x.values()),hasEffects:!0,variableIdRemapping:z,effectParameterName:j.effectParameterName,effectParameterType:j.effectParameterType,effectFieldPath:j.effectFieldPath,handlerValue:j.handlerValue,effectHandlerInfos:re};h.$.effectAnalysis=W}let $=[],b=D=>{if(O(D)){let x=D.value;if(!x.typeName&&x.id)return`${Me(D)}_id${x.id}`}return ne(D)?`fn_${D.funcId}`:Me(D)};o.forallParameters.forEach((D,x)=>{if(x<t.forallArgs.length){let z=t.forallArgs[x];$.push(te(b(z.value)))}else{let z=D.label,re=X(n,z);re.length>0&&re[re.length-1]?.value?.[0]?$.push(te(b(re[re.length-1].value[0]))):$.push("unknown")}}),o.parameters.forEach((D,x)=>{if(D.isCompileTimeOnly&&x<t.args.length){let z=t.args[x];z?$.push(te(b(z.value))):$.push("unknown")}}),t.implicitArgs&&t.implicitArgs.forEach(D=>{$.push(te(b(D.value)))}),s.forEach((D,x)=>{let z=D.type;(!z.typeName&&z.id||Fe(z))&&$.push(`rtparam${x}_${te(A(z))}_id${z.id}`)});let L=$.join("_"),C=[];for(let D of o.implicitParameters)if(D.isEffectRowSpread){let x=D.type;if(V(x)){if(t.forallArgs){for(let z=0;z<o.forallParameters.length;z++)if(o.forallParameters[z].label===x.name&&z<t.forallArgs.length){let j=t.forallArgs[z].value;O(j)&&ot(j.value)&&(x=j.value);break}}if(V(x)&&x.resolvedConcreteType&&ot(x.resolvedConcreteType)&&(x=x.resolvedConcreteType),V(x)){let z=X(_,x.name);if(z.length>0){let j=z[z.length-1].value?.[0];j&&O(j)&&ot(j.value)&&(x=j.value)}}}ot(x)&&C.push(...x.implicitParameters)}else Te(D.type)&&C.push(D);let R=ci({forallParameters:[],parameters:s,implicitParameters:C.length>0?C:void 0,variadicParameter:void 0,return_:{...o.return,type:f},parametersFrame:_.frames[_.frames.length-1],env:o.env,SelfType:o.SelfType}),N={...e,specializedType:R,body:h,isControlFunction:e.isControlFunction||er(h),funcId:`${e.funcId}_${L}`,funcName:`${e.funcName}_${L}`,calledComptimeFunctionCaches:[],specializedFunctionCaches:[]},B={funcId:e.funcId,compileTimeArgValues:a,runtimeParameterTypes:l,specializedFunction:N,env:h.$.env};return e.specializedFunctionCaches=[...e.specializedFunctionCaches,B],N}function qg({originalFunction:e,calleeEnv:t,callerEnv:n,context:r}){let i=e.type,o=r.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"?r.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type:i.return.type,a=e.definitionSiteEnclosingFunctionType?.return.type??Vn(),s=te(A(o)),l=e.specializedFunctionCaches.find(d=>d.specializedFunction.funcId===`${e.funcId}_ctl_${s}`);if(l)return l.specializedFunction;let u=Pe(t);for(let d of n.frames)for(let v of d.variables){if(!v.isCompileTimeOnly||X(u,v.name).length>0)continue;let{env:$}=me({env:u,variable:{...v},allowVariableShadowing:!0});u=$}for(let d of i.forallParameters){let v=o,{env:T}=me({env:u,variable:{name:d.label,type:d.type,isCompileTimeOnly:!0,value:[ee(v)],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});u=T}let _=Ae(e.body),c={...r,expectedType:void 0,enclosingFunctionReturnType:a,isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:i,value:e,evaluationEnv:u},functionReturnImplConcreteType:[]},f=Xr({expr:_,env:u,context:c}),p={...e,body:f,isControlFunction:e.isControlFunction||er(f),funcId:`${e.funcId}_ctl_${s}`,funcName:`${e.funcName??e.funcId}_ctl_${s}`,calledComptimeFunctionCaches:[],specializedFunctionCaches:[]},m=new Set(i.forallParameters.map(d=>d.type)),g=d=>V(d)&&m.has(d)?o:d,h=ci({forallParameters:[],parameters:i.parameters.map(d=>({...d,type:g(d.type)})),implicitParameters:i.implicitParameters.length>0?i.implicitParameters:void 0,variadicParameter:void 0,return_:{...i.return,type:g(i.return.type)},parametersFrame:u.frames[u.frames.length-1],env:i.env,SelfType:i.SelfType});return p.specializedType=h,e.specializedFunctionCaches=[...e.specializedFunctionCaches,{funcId:e.funcId,compileTimeArgValues:[],runtimeParameterTypes:[],specializedFunction:p,env:f.$?.env??u}],p}function Hg({returnType:e,expr:t,env:n,context:r}){if(r.isEvaluatingFunctionType||r.expectedType)return;let i=us(e);for(let o of i){if(be(o)||Wt(o)||o.resolvedConcreteType||o.requiredTraits&&o.requiredTraits.length>0)continue;if(!X(n,o.name).length){let s=pn(n,()=>!0),l=!1;for(let u of s)if(O(u.value?.[0])){let _=u.value[0].value,c=us(_);for(let f of c)if(f.name===o.name){l=!0;break}if(l)break}if(l)continue;throw y({token:t?.token??ae,errorMessage:`Failed to infer the function call return type.
|
|
11183
|
+
using(${Q.label} : ${A(ue)}, ...(E))`});let $e=ie;if($e.length>1){let Gt=Bo(o,Ut=>Ut.isImplicit===!0&&Ut.isCompileTimeOnly===!0&&q({type:ue,env:C},{type:Ut.type,env:o}));if(Gt>=0){let yn=o.frames[Gt].variables.filter(jn=>jn.isImplicit===!0&&jn.isCompileTimeOnly===!0&&q({type:ue,env:C},{type:jn.type,env:o}));yn.length>0&&($e=yn)}}if($e.length>1)throw y({token:r?.token??e?.token??ae,errorMessage:`Ambiguous implicit parameter "${Q.label}": found ${$e.length} "given" variables with compatible type ${A(ue)} in the same scope.
|
|
11184
|
+
Please use explicit using() to disambiguate.`});let Xe=$e[$e.length-1],ct=Xe.value?.[0];if(!ct)throw y({token:r?.token??e?.token??ae,errorMessage:`The "given" variable "${Xe.name}" has no compile-time value.`});z.push({value:ct,parameterType:ue,argType:Xe.type});let{env:qe}=me({env:C,variable:{name:Q.label,type:ue,isCompileTimeOnly:!0,isImplicit:!0,value:[ct],token:Q.exprs.labelExpr?.token??ae,initializedAtToken:Q.exprs.labelExpr?.token??ae,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});C=qe}}let re={args:f,forallArgs:c,implicitArgs:z,variadicArgs:D},j;if(n.return.isCompileTimeOnly)if(u)j=K(N,{variableName:n.return.label,env:n.env,context:a});else if(ne(t)){let{value:J,callerEnv:Q,calleeEnv:oe}=oo({functionCalleeExpr:r,functionType:n,functionValue:t,argValues:re,callerEnv:o,calleeEnv:C,context:{...a}});j=J,N=J.type,o=Q,C=oe}else{let J=He(N)&&N.level===0,Q=`${n.id}_return_sometype`;if(J)if(a.expectedType?.type)j=ee(a.expectedType.type);else if(a.isEvaluatingFunctionType){let oe=Cn(N,n.return.label,{id:Q,env:C,context:a});oe.functionApplication=e;let ue=Ot(C,oe);j=ee(ue)}else throw y({token:e?.token??r?.token??ae,errorMessage:"Cannot infer comptime return type. Please provide the expected type."});else j=K(N,{variableName:n.return.label,env:n.env,context:a})}Hg({returnType:N,env:C,expr:e,context:a});let W,le=a.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"&&a.isEvaluatingFunctionBodyOrAsyncBlock.value&&ne(a.isEvaluatingFunctionBodyOrAsyncBlock.value)&&t&&ne(t)&&a.isEvaluatingFunctionBodyOrAsyncBlock.value.funcId===t.funcId,ce=re.implicitArgs?.some(J=>de(J.value)),ve=ce&&!re.implicitArgs?.some(J=>de(J.value)&&!Te(J.parameterType)),Y=re.args.some(J=>J.argType&&V(J.argType)),Z=ve&&Y,se=(()=>{if(!ce||!n.implicitParameters.some(ue=>ue.isEffectRowSpread))return!1;let Q=0;for(let ue of n.implicitParameters)ue.isEffectRowSpread||Q++;let oe=re.implicitArgs??[];for(let ue=0;ue<Q&&ue<oe.length;ue++)if(de(oe[ue].value))return!1;return!0})(),pe=Pn(n)&&!_r(n)&&n.implicitParameters.some(J=>Te(J.type)?J.type.fields.some(Q=>G(Q.type)&&Q.type.forallParameters.length===0):!!J.isEffectRowSpread);if(!l&&!pe&&t&&ne(t)&&!t.isControlFunction&&Pn(n)&&!le&&(!ce||Z||se)){if(W=Yg({originalFunction:t,argValues:re,calleeEnv:C,callerEnv:o,context:a}),W&&V(N)){let J=W.body?.$?.type;J&&!V(J)&&(N=J,W.specializedType&&(W.specializedType={...W.specializedType,return:{...W.specializedType.return,type:J}}))}if(W){let J=new Set,Q=0;for(let oe=0;oe<n.parameters.length;oe++)if(!n.parameters[oe].isCompileTimeOnly){let ie=re.args[oe]?.value;ie&&ne(ie)&&ie.type.implicitParameters.some(Ne=>G(Ne.type)||Te(Ne.type))&&J.add(Q),Q++}if(J.size>0)for(let oe=p.length-1;oe>=0;oe--)J.has(oe)&&p.splice(oe,1)}}if(!l&&t&&ne(t)&&t.isControlFunction&&n.forallParameters.length>0&&!W&&(W=qg({originalFunction:t,argValues:re,calleeEnv:C,callerEnv:o,context:a}),W&&V(N))){let J=W.body?.$?.type;J&&!V(J)&&(N=J,W.specializedType&&(W.specializedType={...W.specializedType,return:{...W.specializedType.return,type:J}}))}let Ve=ji(o),Ke;if(Ve.length>0){let J=Gg({variablesToDrop:Ve,env:o,context:a});Ke=J.deferredDropExpressions,o=J.env}return{returnType:N,calleeEnv:C,callerEnv:o,pathCollection:x,argValues:re,returnValue:j,specializedFunctionValue:W,runtimeArgExprsInOrder:p,deferredDropExpressions:Ke}}function Yg({originalFunction:e,argValues:t,calleeEnv:n,callerEnv:r,context:i}){if(Qa){br.specializeCount++;let D=e.funcName??e.funcId;br.specializeNames.set(D,(br.specializeNames.get(D)??0)+1)}let o=e.type,a=[],s=[];t.forallArgs&&a.push(...t.forallArgs.map(D=>D.value)),t.implicitArgs&&a.push(...t.implicitArgs.map(D=>D.value)),o.parameters.forEach((D,x)=>{let z=t.args[x];if(D.isCompileTimeOnly)z.value&&a.push(z.value);else if(z.value&&ne(z.value)&&z.value.type.implicitParameters.some(j=>G(j.type)||Te(j.type)))z.value&&a.push(z.value);else{let W=V(z.argType)&&z.argType.resolvedConcreteType&&!be(z.argType)?z.argType.resolvedConcreteType:z.argType;s.push({...D,type:W})}});let l=s.map(D=>D.type),u=e.specializedFunctionCaches.find(D=>D.compileTimeArgValues.length===a.length&&D.compileTimeArgValues.every((re,j)=>{let W=a[j];return At({value:re,env:D.env},{value:W,env:r})})?D.runtimeParameterTypes.length===l.length&&D.runtimeParameterTypes.every((re,j)=>{let W=l[j];return q({type:re,env:D.env},{type:W,env:r},!0)}):!1);if(u)return Qa&&br.cacheHitCount++,u.specializedFunction;Qa&&br.cacheMissCount++;let _=n;for(let D of r.frames)for(let x of D.variables){if(!x.isCompileTimeOnly||X(_,x.name).length>0)continue;let{env:re}=me({env:_,variable:{...x},allowVariableShadowing:!0});_=re}for(let D of s){let x=X(_,D.label);if(x.length>0){let z=x[x.length-1],re={...z,value:void 0};_=Be(_,z,re)}}let c=Ae(e.body),{returnType:f,calleeEnv:p}=Ei({functionType:o,calleeEnv:_,context:{...i,isEvaluatingFunctionType:!0},functionCalleeExpr:void 0});_=p;let m=i.enclosingFunctionReturnType,g=t.implicitArgs?.some(D=>ne(D.value)&&D.value.isControlFunction||We(D.value)&&wp(D.value.type,D.value))??!1,h=ht({expr:c,env:_,context:{...i,expectedType:{type:f,env:_},isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:o,value:e,evaluationEnv:_},isEvaluatingLoopBody:void 0,capturedVariables:void 0,functionReturnImplConcreteType:[],hasControlFunctionImplicitParams:g,...m?{enclosingFunctionReturnType:m}:{}},variablesToAdd:[],isEvaluatingFunctionBodyBeginBlock:!0});if(!h.$)throw y({token:e.body.token,errorMessage:"Failed to evaluate function body for specialization."});let d=[],v=0;for(let D=0;D<o.implicitParameters.length;D++){let x=o.implicitParameters[D];if(G(x.type)){let z=t.implicitArgs?.[v];(z&&ne(z.value)?z.value:void 0)?.isControlFunction&&d.push({handlerArgIndex:v,label:x.label,type:x.type,fromSpread:!1}),v+=1}else if(x.isEffectRowSpread){let z=x.type;if(V(z)){let j=X(_,x.label).at(-1)?.value?.[0];if(j&&O(j)&&ot(j.value))z=j.value;else{let W=Ot(_,z);W&&(z=W)}}if(ot(z)){for(let re=0;re<z.implicitParameters.length;re++){let j=z.implicitParameters[re];if(G(j.type)){let W=t.implicitArgs?.[v+re];(W&&ne(W.value)?W.value:void 0)?.isControlFunction&&d.push({handlerArgIndex:v+re,label:j.label,type:j.type,fromSpread:!0})}else if(Te(j.type)){let W=t.implicitArgs?.[v+re],le=W&&We(W.value)?W.value:void 0,ce=[],ve=(Y,Z,se)=>{for(let Se=0;Se<Y.fields.length;Se++){let pe=Y.fields[Se];if(G(pe.type)){let Ve=se?.fields[Se];if(Ve&&ne(Ve)&&Ve.isControlFunction){let Ke=Ve.specializedType??pe.type;ce.push({path:[...Z,pe.label],type:Ke})}}else if(Te(pe.type)){let Ve=se?.fields[Se];ve(pe.type,[...Z,pe.label],Ve&&We(Ve)?Ve:void 0)}}};ve(j.type,[],le);for(let Y of ce)d.push({handlerArgIndex:v+re,label:j.label,type:Y.type,fromSpread:!0,effectFieldPath:Y.path})}}v+=z.implicitParameters.length}else v+=1}else if(Te(x.type)){let z=[],re=t.implicitArgs?.[v],j=(W,le,ce)=>{for(let ve=0;ve<W.fields.length;ve++){let Y=W.fields[ve];if(G(Y.type)){let Z=ce?.fields[ve];if(Z&&ne(Z)&&Z.isControlFunction){let se=Z.specializedType??Y.type;z.push({path:[...le,Y.label],type:se})}}else if(Te(Y.type)){let Z=ce?.fields[ve];j(Y.type,[...le,Y.label],Z&&We(Z)?Z:void 0)}}};j(x.type,[],re&&We(re.value)?re.value:void 0);for(let W of z)d.push({handlerArgIndex:v,label:x.label,type:W.type,fromSpread:!1,effectFieldPath:W.path});v+=1}else v+=1}let T=[];for(let D of d){let x=Cp(h,D.label,D.type,!0,D.effectFieldPath);if(x.hasEffects){let z=t.implicitArgs?.[D.handlerArgIndex],re,j=D.effectFieldPath;if(z&&ne(z.value))re=z.value;else if(z&&We(z.value)&&j&&j.length>0){let W=z.value;for(let le of j){if(!We(W)){W=void 0;break}let ce=W.type.fields.findIndex(ve=>ve.label===le);if(ce<0||!W.fields[ce]){W=void 0;break}W=W.fields[ce]}W&&ne(W)&&(re=W)}if(re){let W=re,le=D.type,ce=!W.body.$;if(!ce&&W.isControlFunction&&F(W.body)&&W.body.args.length>0&&!W.body.args[0]?.$&&(ce=!0),ce&&G(le)&&le.forallParameters.length>0&&x.effectCallPoints.length>0){let ve=new Map,Y=le.return.type,Z=x.effectCallPoints[0].operationResultType;if(V(Y)&&ve.set(Y.name,Z),ve.size===0&&le.forallParameters.length===1){let J=le.forallParameters[0];ve.set(J.label,Z)}let se=Ae(W.body),Se=W.body.$?.env??_;Se=ze(Se);for(let J of le.forallParameters){let Q=ve.get(J.label);Q&&(Se=me({env:Se,variable:{name:J.label,type:J.type,isCompileTimeOnly:!0,value:[ee(Q)],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0}).env)}let pe=W.specializedType??W.type,Ve=W.definitionSiteEnclosingFunctionType?.return.type??Vn(),Ke={...i,expectedType:void 0,enclosingFunctionReturnType:Ve,isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:pe,value:W,evaluationEnv:Se}};try{let J=Xr({expr:se,env:Se,context:Ke}),Q=pe.parameters.map(ie=>{if(ie.isCompileTimeOnly)return ie;if(V(ie.type)){let Ne=ve.get(ie.type.name);if(Ne)return{...ie,type:Ne}}return ie}),oe=pe.return.type;if(V(oe)){let ie=ve.get(oe.name);ie&&(oe=ie)}let ue={...pe,parameters:Q,return:{...pe.return,type:oe}},ye={...W,body:J,specializedType:ue};x.handlerValue=ye,x.effectParameterType=ue;for(let ie of x.effectCallPoints)ie.isTransitiveEffectCall&&(ie.operationArgTypes=ie.operationArgTypes.map(Ne=>V(Ne)?ve.get(Ne.name)??Ne:Ne))}catch(J){if(F(W.body)&&W.body.args.length>0&&!W.body.args[0]?.$)throw J;x.handlerValue=W}}else x.handlerValue=W}else z&&(x.handlerValue=z.value);T.push({analysis:x,ctlParam:D})}}if(T.length===1)h.$.effectAnalysis=T[0].analysis;else if(T.length>1){let D=[],x=new Map,z=new Map,re=[];for(let le=0;le<T.length;le++){let{analysis:ce}=T[le];re.push({effectParameterName:ce.effectParameterName,effectParameterType:ce.effectParameterType,effectFieldPath:ce.effectFieldPath,handlerValue:ce.handlerValue,operationArgTypes:ce.effectCallPoints.length>0?ce.effectCallPoints[0].operationArgTypes:[],operationResultType:ce.effectCallPoints.length>0?ce.effectCallPoints[0].operationResultType:{tag:"unit"}});for(let ve of ce.effectCallPoints)D.push({...ve,effectIndex:le});for(let ve of ce.capturedVariables)x.has(ve.id)||x.set(ve.id,ve);for(let[ve,Y]of ce.variableIdRemapping)z.set(ve,Y)}if(F(h)&&E(h,I.begin)){let le=h.args,ce=new Map;for(let Y=0;Y<le.length;Y++)ce.set(le[Y],Y);let ve=Y=>{for(let Z=0;Z<le.length;Z++)if(Nl(le[Z],Y.expr))return Z;return 999};D.sort((Y,Z)=>ve(Y)-ve(Z))}for(let le=0;le<D.length;le++)D[le].index=le;let j=T[0].analysis,W={effectCallPoints:D,capturedVariables:Array.from(x.values()),hasEffects:!0,variableIdRemapping:z,effectParameterName:j.effectParameterName,effectParameterType:j.effectParameterType,effectFieldPath:j.effectFieldPath,handlerValue:j.handlerValue,effectHandlerInfos:re};h.$.effectAnalysis=W}let $=[],b=D=>{if(O(D)){let x=D.value;if(!x.typeName&&x.id)return`${Me(D)}_id${x.id}`}return ne(D)?`fn_${D.funcId}`:Me(D)};o.forallParameters.forEach((D,x)=>{if(x<t.forallArgs.length){let z=t.forallArgs[x];$.push(te(b(z.value)))}else{let z=D.label,re=X(n,z);re.length>0&&re[re.length-1]?.value?.[0]?$.push(te(b(re[re.length-1].value[0]))):$.push("unknown")}}),o.parameters.forEach((D,x)=>{if(D.isCompileTimeOnly&&x<t.args.length){let z=t.args[x];z?$.push(te(b(z.value))):$.push("unknown")}}),t.implicitArgs&&t.implicitArgs.forEach(D=>{$.push(te(b(D.value)))}),s.forEach((D,x)=>{let z=D.type;(!z.typeName&&z.id||Fe(z))&&$.push(`rtparam${x}_${te(A(z))}_id${z.id}`)});let L=$.join("_"),C=[];for(let D of o.implicitParameters)if(D.isEffectRowSpread){let x=D.type;if(V(x)){if(t.forallArgs){for(let z=0;z<o.forallParameters.length;z++)if(o.forallParameters[z].label===x.name&&z<t.forallArgs.length){let j=t.forallArgs[z].value;O(j)&&ot(j.value)&&(x=j.value);break}}if(V(x)&&x.resolvedConcreteType&&ot(x.resolvedConcreteType)&&(x=x.resolvedConcreteType),V(x)){let z=X(_,x.name);if(z.length>0){let j=z[z.length-1].value?.[0];j&&O(j)&&ot(j.value)&&(x=j.value)}}}ot(x)&&C.push(...x.implicitParameters)}else Te(D.type)&&C.push(D);let R=ci({forallParameters:[],parameters:s,implicitParameters:C.length>0?C:void 0,variadicParameter:void 0,return_:{...o.return,type:f},parametersFrame:_.frames[_.frames.length-1],env:o.env,SelfType:o.SelfType}),N={...e,specializedType:R,body:h,isControlFunction:e.isControlFunction||er(h),funcId:`${e.funcId}_${L}`,funcName:`${e.funcName}_${L}`,calledComptimeFunctionCaches:[],specializedFunctionCaches:[]},B={funcId:e.funcId,compileTimeArgValues:a,runtimeParameterTypes:l,specializedFunction:N,env:h.$.env};return e.specializedFunctionCaches=[...e.specializedFunctionCaches,B],N}function qg({originalFunction:e,calleeEnv:t,callerEnv:n,context:r}){let i=e.type,o=r.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"?r.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type:i.return.type,a=e.definitionSiteEnclosingFunctionType?.return.type??Vn(),s=te(A(o)),l=e.specializedFunctionCaches.find(d=>d.specializedFunction.funcId===`${e.funcId}_ctl_${s}`);if(l)return l.specializedFunction;let u=ze(t);for(let d of n.frames)for(let v of d.variables){if(!v.isCompileTimeOnly||X(u,v.name).length>0)continue;let{env:$}=me({env:u,variable:{...v},allowVariableShadowing:!0});u=$}for(let d of i.forallParameters){let v=o,{env:T}=me({env:u,variable:{name:d.label,type:d.type,isCompileTimeOnly:!0,value:[ee(v)],token:ae,initializedAtToken:ae,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});u=T}let _=Ae(e.body),c={...r,expectedType:void 0,enclosingFunctionReturnType:a,isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:i,value:e,evaluationEnv:u},functionReturnImplConcreteType:[]},f=Xr({expr:_,env:u,context:c}),p={...e,body:f,isControlFunction:e.isControlFunction||er(f),funcId:`${e.funcId}_ctl_${s}`,funcName:`${e.funcName??e.funcId}_ctl_${s}`,calledComptimeFunctionCaches:[],specializedFunctionCaches:[]},m=new Set(i.forallParameters.map(d=>d.type)),g=d=>V(d)&&m.has(d)?o:d,h=ci({forallParameters:[],parameters:i.parameters.map(d=>({...d,type:g(d.type)})),implicitParameters:i.implicitParameters.length>0?i.implicitParameters:void 0,variadicParameter:void 0,return_:{...i.return,type:g(i.return.type)},parametersFrame:u.frames[u.frames.length-1],env:i.env,SelfType:i.SelfType});return p.specializedType=h,e.specializedFunctionCaches=[...e.specializedFunctionCaches,{funcId:e.funcId,compileTimeArgValues:[],runtimeParameterTypes:[],specializedFunction:p,env:f.$?.env??u}],p}function Hg({returnType:e,expr:t,env:n,context:r}){if(r.isEvaluatingFunctionType||r.expectedType)return;let i=us(e);for(let o of i){if(be(o)||Wt(o)||o.resolvedConcreteType||o.requiredTraits&&o.requiredTraits.length>0)continue;if(!X(n,o.name).length){let s=pn(n,()=>!0),l=!1;for(let u of s)if(O(u.value?.[0])){let _=u.value[0].value,c=us(_);for(let f of c)if(f.name===o.name){l=!0;break}if(l)break}if(l)continue;throw y({token:t?.token??ae,errorMessage:`Failed to infer the function call return type.
|
|
11185
11185
|
Please consider providing the expected type.`})}}}function Nl(e,t){if(e===t)return!0;if(e.tag==="FnCall"){if(Nl(e.func,t))return!0;for(let n of e.args)if(Nl(n,t))return!0}return!1}function Fp({expr:e,env:t,context:n}){let r=e.args[0],i=S({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:`Failed to evaluate the argument expression for Iso:
|
|
11186
11186
|
${w(r)}`});if(t=i.$.env,!O(i.$.value))throw y({token:r.token,errorMessage:`Iso expects a type as argument, but got:
|
|
11187
11187
|
${w(r)}`});let a=i.$.value.value,s=xu(a,t);t=fu({isoType:s,env:t,context:n});let l=ee(s);return e.$={env:t,type:l.type,value:l,pathCollection:[]},e}function Lp({expr:e,env:t,context:n,isoType:r}){let i=e.args[0],o=S({expr:i,env:t,context:{...n,expectedType:{type:r.childType,env:t}}});if(!o.$)throw y({token:i.token,errorMessage:`Failed to evaluate the argument expression for Iso value constructor:
|
|
11188
11188
|
${w(i)}`});t=o.$.env;let a=o.$?.variableName;if(a){let s=X(t,a);if(s.length>0){let l=s[s.length-1];if(Lr(l.type,new Set,t))throw y({token:i.token,errorMessage:`Cannot isolate variable ${a} because its type may form RC cycles.`});if(!l.isOwningTheRcValue)throw y({token:i.token,errorMessage:`Cannot isolate variable ${a} because it does not own its RC value.`});let _=t.frames.flatMap(c=>c.variables).filter(c=>c.isOwningTheSameRcValueAs?.id===l.id&&c.id!==l.id);if(_.length>0){let c=_.map(f=>f.name).join(", ");throw y({token:i.token,errorMessage:`Cannot isolate ${a}, also owned by: ${c}
|
|
11189
|
-
Iso requires unique ownership (no aliases). Drop other aliases first.`})}}else throw y({token:i.token,errorMessage:`Variable ${a} not found in the environment.`})}return t=
|
|
11189
|
+
Iso requires unique ownership (no aliases). Drop other aliases first.`})}}else throw y({token:i.token,errorMessage:`Variable ${a} not found in the environment.`})}return t=En(o,t),e.$={env:t,type:r,value:void 0,pathCollection:o.$.pathCollection||[]},Ge(e,!0),e}function Ap({moduleExpr:e,moduleType:t,argExprs:n,callerEnv:r,context:i}){if(n.length>t.fields.length)throw y({token:e.token,errorMessage:"Failed to implement the module. Too many fields provided."});let o=Array(t.fields.length).fill(void 0),a={...t,fields:t.fields.map((l,u)=>({...l,assignedValue:o[u]}))};for(let l=0;l<t.fields.length;l++){let u=t.fields[l],_=!1,c;for(let f=0;f<n.length;f++){let p=n[f],m;if(F(p)&&E(p,":",2)){if(m=p.args[0],p=p.args[1],!U(m))throw y({token:m.token,errorMessage:`Expected identifier for label, got:
|
|
11190
11190
|
${w(m)}`});c=m.token.value}else throw y({token:p.token,errorMessage:`Expected member label, but got:
|
|
11191
11191
|
${w(p)}`});if(!t.fields.find(g=>g.label===c))throw y({token:m.token,errorMessage:`Module member with label "${c}" does not exist in the module type.`});if(u.label===c){if(_=!0,u.assignedValue)throw y({token:p.token,errorMessage:`Module member "${u.label}" already has a assigned value:
|
|
11192
|
-
${Me(u.assignedValue)}`});let g,h=u.exprs.typeExpr,d=u.exprs.defaultValueExpr;if(h){let L=S({expr:Ae(h),env:
|
|
11192
|
+
${Me(u.assignedValue)}`});let g,h=u.exprs.typeExpr,d=u.exprs.defaultValueExpr;if(h){let L=S({expr:Ae(h),env:ze(t.env,r.frames[r.frames.length-1]),context:{...i,expectedType:void 0,ReceiverType:void 0,SelfType:void 0,SelfModuleType:t}}).$?.value;if(!O(L))throw y({token:p.token,errorMessage:`Failed to evaluate the module member "${c}"`});g=L.value}else if(d){let L=S({expr:Ae(d),env:ze(t.env,r.frames[r.frames.length-1]),context:{...i,expectedType:void 0,ReceiverType:void 0,SelfType:void 0}}).$?.value;if(!L)throw y({token:p.token,errorMessage:`Failed to evaluate the module member "${c}"`});g=L.type}else throw y({token:p.token,errorMessage:`Module member "${c}" has no type or default value or assigned value.`});let v=S({expr:p,env:r,context:{...i,expectedType:{type:g,env:r},ReceiverType:void 0,SelfType:void 0}}),T=v.$?.type;if(!T)throw y({token:p.token,errorMessage:`Failed to evaluate the module member "${c}"`});if(v.$?.env&&(r=v.$.env),!q({type:g,env:r},{type:T,env:r}))throw y({token:p.token,errorMessage:`Type mismatch for the module member "${c}":
|
|
11193
11193
|
Expected: ${A(g)}
|
|
11194
11194
|
Got: ${A(T)}`});let $=v.$?.value;T.ioBuiltin&&(t.fields[l].type.ioBuiltin=T.ioBuiltin),ne($)&&($.funcId+=`_${u.label}`,!$.specializedType&&G(g)&&($.specializedType={...g,parameters:$.type.parameters,parametersFrame:$.type.parametersFrame})),o[l]=$,a.fields[l].assignedValue=$,p.$={env:r,type:T,value:$,pathCollection:[]},m&&(m.$=p.$);break}}if(!_){let f=u.defaultValue,p=u.assignedValue,m=p;if(!p&&f&&(m=f),!m)throw y({token:e.token,errorMessage:`Module member "${u.label}" is not provided and has no required/default value.`});o[l]=m,a.fields[l].assignedValue=m}}return{moduleValue:_a({...t},o),callerEnv:r}}function Ip({targetType:e,argExpr:t,expr:n,callerEnv:r,context:i}){if(!Ie(e))return;let o=S({expr:t,env:r,context:{...i,expectedType:void 0}});if(!o.$)throw y({token:t.token,errorMessage:`Failed to evaluate argument: ${w(t)}`});let a=o.$.env,s=o.$.type;if(Et(s)&&(Kn(e.childType)||ki(e.childType))){let u=yt({type:s,expectedType:e,expr:o,env:a});return o.$={...o.$,type:u,convertedRuntimeType:u},Object.assign(n,o),n.$=o.$,{expr:n,env:a}}if(!Ie(s))throw y({token:t.token,errorMessage:`Cannot cast ${A(s)} to ${A(e)}. Expected a pointer type or comptime_string.`});let l={tag:"FnCall",func:{tag:"Atom",token:{...n.token,value:k.__yo_as[0],type:"identifier"},$:void 0},args:[o,n.func],token:n.token,$:{env:a,type:e,value:void 0,pathCollection:o.$.pathCollection,runtimeArgExprsInOrder:[o]}};return ga(n,l),{expr:n,env:a}}function Sp({traitType:e,argExprs:t,callerEnv:n,context:r}){let i=[];for(let a of t){if(!F(a)||!E(a,":=",2))throw y({token:a.token,errorMessage:`Expected ":=" for trait specialization (binding associated types), got:
|
|
11195
11195
|
${w(a)}`});let s=a.args[0],l=a.args[1];if(!U(s))throw y({token:s.token,errorMessage:`Expected identifier for associated type label, got:
|
|
@@ -11204,20 +11204,20 @@ impl Point, Id(Point)(
|
|
|
11204
11204
|
`});let u=s.trait;s.trait?s.trait={...s.trait,fields:[...a.fields,...s.trait.fields]}:s.trait=a;for(let c=0;c<t.fields.length;c++){let f=t.fields[c],p=!1,m;for(let g=0;g<n.length;g++){let h=n[g],d;if(F(h)&&E(h,":",2)){if(d=h.args[0],h=h.args[1],!U(d))throw y({token:d.token,errorMessage:`Expected identifier for label, got:
|
|
11205
11205
|
${w(d)}`});m=d.token.value}else throw y({token:h.token,errorMessage:`Expected member label, but got:
|
|
11206
11206
|
${w(h)}`});if(!t.fields.find(v=>v.label===m))throw y({token:d.token,errorMessage:`Trait member with label "${m}" does not exist in the trait type.`});if(f.label===m){if(p=!0,f.assignedValue)throw y({token:h.token,errorMessage:`Trait member "${f.label}" already has a assigned value:
|
|
11207
|
-
${Me(f.assignedValue)}`});let v,T=f.exprs.typeExpr,$=f.exprs.defaultValueExpr;if(T){let N=S({expr:Ae(T),env:
|
|
11207
|
+
${Me(f.assignedValue)}`});let v,T=f.exprs.typeExpr,$=f.exprs.defaultValueExpr;if(T){let N=S({expr:Ae(T),env:ze(t.env,r.frames[r.frames.length-1]),context:{...i,expectedType:void 0,ReceiverType:void 0,SelfType:l,SelfTraitType:t}}).$?.value;if(!O(N))throw y({token:h.token,errorMessage:`Failed to evaluate the trait member "${m}"`});v=N.value}else if($){let N=S({expr:Ae($),env:ze(t.env,r.frames[r.frames.length-1]),context:{...i,expectedType:void 0,ReceiverType:void 0,SelfType:l,SelfTraitType:t}}).$?.value;if(!N)throw y({token:h.token,errorMessage:`Failed to evaluate the trait member "${m}"`});v=N.type}else throw y({token:h.token,errorMessage:`Trait member "${m}" has no type or default value or assigned value.`});let b=S({expr:h,env:r,context:{...i,expectedType:{type:v,env:r},ReceiverType:void 0,SelfType:l}}),L=b.$?.type;if(!L)throw y({token:h.token,errorMessage:`Failed to evaluate the trait member "${m}"`});if(b.$?.env&&(r=b.$.env),!q({type:v,env:r},{type:L,env:r}))throw y({token:h.token,errorMessage:`Type mismatch for the trait member "${m}":
|
|
11208
11208
|
Expected: ${A(v)}
|
|
11209
|
-
Got: ${A(L)}`});let C=b.$?.value;ne(C)&&(C.funcId+=`_${f.label}`,!C.specializedType&&G(v)&&(C.specializedType={...v,parameters:C.type.parameters,parametersFrame:C.type.parametersFrame})),o[c]=C,a.fields[c].assignedValue=C,s&&s.trait&&(s.trait.fields[c].assignedValue=C),h.$={env:r,type:L,value:C,pathCollection:[]},d&&(d.$=h.$);break}}if(!p){let g=f.exprs.typeExpr,h=f.exprs.defaultValueExpr,d=f.defaultValue,v=f.assignedValue,T=v;if(!v&&h)try{let $;if(g){let C=S({expr:Ae(g),env:
|
|
11209
|
+
Got: ${A(L)}`});let C=b.$?.value;ne(C)&&(C.funcId+=`_${f.label}`,!C.specializedType&&G(v)&&(C.specializedType={...v,parameters:C.type.parameters,parametersFrame:C.type.parametersFrame})),o[c]=C,a.fields[c].assignedValue=C,s&&s.trait&&(s.trait.fields[c].assignedValue=C),h.$={env:r,type:L,value:C,pathCollection:[]},d&&(d.$=h.$);break}}if(!p){let g=f.exprs.typeExpr,h=f.exprs.defaultValueExpr,d=f.defaultValue,v=f.assignedValue,T=v;if(!v&&h)try{let $;if(g){let C=S({expr:Ae(g),env:ze(t.env,r.frames[r.frames.length-1]),context:{...i,expectedType:void 0,ReceiverType:void 0,SelfType:l,SelfTraitType:t}}).$?.value;O(C)&&($=C.value)}T=S({expr:Ae(h),env:ze(t.env,r.frames[r.frames.length-1]),context:{...i,expectedType:$?{type:$,env:r}:void 0,ReceiverType:void 0,SelfType:l,SelfTraitType:t}}).$?.value,T&&ne(T)&&(T.funcId+=`_${f.label}`,!T.specializedType&&$&&G($)&&(T.specializedType={...$,parameters:T.type.parameters,parametersFrame:T.type.parametersFrame}))}catch{T=d}if(!T&&d&&(T=d),!T)throw y({token:e.token,errorMessage:`Trait member "${f.label}" is not provided and has no required/default value.`});o[c]=T,a.fields[c].assignedValue=T}}s&&u&&(s.trait=u);for(let c=0;c<t.fields.length;c++){let f=t.fields[c];if(!f.unassignedSomeType)continue;let p=f.unassignedSomeType,m=o[c];if(!m||!O(m))continue;let g=m.value;if(!Fe(g))for(let{traitType:h}of p.requiredTraits){let d=h;if(h.associatedTypeConstraints){let T=h.associatedTypeConstraints.map($=>{let b=$.constraintType;if(V(b)){for(let L=0;L<t.fields.length;L++)if(t.fields[L].unassignedSomeType===b){let R=o[L];R&&O(R)&&(b=R.value);break}}return{...$,constraintType:b}});d={...h,associatedTypeConstraints:T}}if(!St({targetType:g,traitType:d,env:r}))throw y({token:e.token,errorMessage:`Where clause constraint not satisfied: ${A(g)} does not implement ${d.typeName??"trait"}(${d.associatedTypeConstraints?.map(T=>`${T.label} := ${A(T.constraintType)}`).join(", ")??""}).
|
|
11210
11210
|
Field "${f.label}" must satisfy the trait's where clause.`})}}return{traitValue:Fi({...t,receiverType:s},o),callerEnv:r}}function Za({typeFields:e,functionCalleeExpr:t,argExprs:n,callerEnv:r,context:i,isUnionType:o}){if(n.length>e.length)throw y({token:t.token,errorMessage:`Failed to call the type. Too many members provided. Expected ${e.length} arguments, got ${n.length}.`});if(o&&n.length!==1)throw y({token:t.token,errorMessage:`Failed to call the union type. Expected exactly one argument, got ${n.length}.`});let a=new Set,s=Array(e.length).fill(void 0),l=[];for(let _=0;_<e.length;_++){let c=e[_],f=n[_];if(!f)break;let p;if(F(f)&&E(f,":",2)&&(p=f.args[0],f=f.args[1],!U(p)))throw y({token:p.token,errorMessage:`Expected identifier for label, got:
|
|
11211
11211
|
${w(p)}`});if(p){let d=p.token.value,v=e.find(T=>T.label===d);if(v){if(v.assignedValue)throw y({token:f.token,errorMessage:`Cannot use label "${d}" for already assigned value:
|
|
11212
11212
|
${Ri(v)}`});c=v}else throw y({token:f.token,errorMessage:`Failed to find "${d}" in the type.`})}if(a.has(c))throw y({token:f.token,errorMessage:`Type member "${c.label}" is already implemented.`});let m=e.indexOf(c),g=S({expr:f,env:r,context:{...i,expectedType:{type:c.type,env:r}}});if(!g.$)throw y({token:f.token,errorMessage:`Failed to evaluate argument expression:
|
|
11213
11213
|
${w(f)}`});Yt(g,i),r=g.$.env;let h=g.$.type;if(ni(c.type,r)||(h=yt({type:h,expectedType:c.type,expr:g,env:r})),p&&(p.$=g.$),!q({type:c.type,env:r},{type:h,env:r}))throw y({token:f.token,errorMessage:`Type mismatch for type member "${c.label}":
|
|
11214
11214
|
Expected: ${A(c.type)}
|
|
11215
11215
|
Got: ${A(h)}`});s[m]=g.$?.value,l[m]=g,a.add(c)}if(!o)for(let _=0;_<e.length;_++){let c=e[_];if(!a.has(c)){if(!c.defaultValue&&!c.assignedValue)throw y({token:t.token,errorMessage:`Type member "${c.label}" is not provided and has no default value or assigned value.`});s[_]=c.defaultValue??c.assignedValue,l[_]=c.exprs.defaultValueExpr??c.exprs.assignedValueExpr}}return{values:s,pathCollection:[],callerEnv:r,runtimeArgExprsInOrder:l}}function jg(e,t,n){if(!e.recursiveTypeRef)return;let{functionValue:r,argValues:i}=e.recursiveTypeRef,o=r.calledComptimeFunctionCaches.find(s=>s.argValues.length===i.length&&s.argValues.every((l,u)=>{let _=i[u];return O(l)&&O(_)?q({type:l.value,env:s.env},{type:_.value,env:t},!0):At({value:l,env:s.env},{value:_,env:t})}));if(o&&O(o.value)&&!(V(o.value.value)&&o.value.value.recursiveTypeRef))return o.value.value;if(n?.SelfType&&ft(n.SelfType)||n?.SelfType&&_e(n.SelfType))return n.SelfType;let a=r.calledComptimeFunctionCaches.find(s=>!(!O(s.value)||V(s.value.value)&&s.value.value.recursiveTypeRef));if(a&&O(a.value))return a.value.value}function Rn({expr:e,env:t,context:n,givenFunc:r,forMacroExpansion:i}){let o=e.func,a=e.args,s,l=[];if(r)l=[r];else if(F(o)){let d=S({expr:o,env:t,context:{...n}});if(o=d,d.$?.type)l=[{type:d.$.type,value:d.$.value}];else if(F(d)&&E(d,".",2)){let v=d.args[0];s=d.args[1];let T=v.$?.type;if(!T)throw y({token:v.token,errorMessage:"Expected to be evaluated."});let $=v.$?.value,b=O($);if(U(s)){let L=s.token.value;if(b){let C=$.value;l=o_({env:t,context:n,methodName:L,type:C}).map(N=>({type:N.type,value:N.value,args:a}))}else l=il({env:t,context:n,methodName:L,receiverType:T,isInfixOperatorCall:!1}).map(R=>{let N;if(R.needsPointerConversion){let B={tag:"Atom",token:v.token,$:void 0};B.token={...v.token,value:"&",type:"identifier"},N=[{tag:"FnCall",func:B,args:[v],token:v.token,$:void 0},...a]}else N=[v,...a];return{type:R.type,value:R.value,needsPointerConversion:R.needsPointerConversion,args:N}})}else{let L=S({expr:s,env:t,context:{...n}});L.$?.env&&(t=L.$?.env),s=L;let C=s.$?.type,R=s.$?.value;if(!C)throw y({token:s.token,errorMessage:"Expected to be a function."});l=[{type:C,value:R}],a=[v,...a]}}else throw y({token:o.token,errorMessage:`Expected type for function call, got ${w(d)}`})}else{let d=o.token.value;if(d==="_"){let v=n.expectedType;if(!v||V(v.type))return pp({expr:e,env:t,context:n});l=[{type:Ft(v.type),value:ee(v.type)}],o.$={env:t,type:l[0].type,value:l[0].value,pathCollection:[]}}else if(sr(d)&&e.isInfix){let v=a[0];if(!v)throw y({token:o.token,errorMessage:`Expected first argument for operator, got:
|
|
11216
|
-
${w(o)}`});let $=S({expr:v,env:t,context:{...n,expectedType:void 0}}).$?.type;if(!$)throw y({token:v.token,errorMessage:"Expected to be evaluated."});let b=d;s=o,l=il({env:t,context:n,methodName:b,receiverType:$,isInfixOperatorCall:!0}).map(C=>({type:C.type,value:C.value,needsPointerConversion:C.needsPointerConversion}))}else if(d==="Call"&&n.SelfType){let v=ee(n.SelfType);l=[{type:v.type,value:v}]}else{let v=S({expr:o,env:t,context:{...n}});if(o=v,!v.$)throw y({token:o.token,errorMessage:"Failed to evaluate the callee:"});if(Te(v.$.type)){let T=v.$.type,$=T.fields.findIndex(L=>L.label==="Call");if($<0)throw y({token:o.token,errorMessage:'Calling a module value which does not have "Call" element is not allowed.'});let b=T.fields[$];if(b.assignedValue){let L=b.assignedValue;
|
|
11217
|
-
`},...T.tokenAndErrorList],T.isAssertionError);return{...d,result:{kind:"error",error:T}}}else if((V(d.type)||Ce(d.type))&&nn(d.type)){let T=nn(d.type);try{let $=Kr({functionValue:uo(d.value),functionType:T.isFn.callType,expr:Ae(e),functionCalleeExpr:o,argExprs:v.map(b=>Ae(b)),callerEnv:rl(t),context:{...n,isInFunctionCallCheckingPhase:!0},isMethodCall:!!s,skipSpecialization:!0,skipCtfeExecution:!0});return{...d,result:{kind:"function",result:$}}}catch($){if($ instanceof
|
|
11216
|
+
${w(o)}`});let $=S({expr:v,env:t,context:{...n,expectedType:void 0}}).$?.type;if(!$)throw y({token:v.token,errorMessage:"Expected to be evaluated."});let b=d;s=o,l=il({env:t,context:n,methodName:b,receiverType:$,isInfixOperatorCall:!0}).map(C=>({type:C.type,value:C.value,needsPointerConversion:C.needsPointerConversion}))}else if(d==="Call"&&n.SelfType){let v=ee(n.SelfType);l=[{type:v.type,value:v}]}else{let v=S({expr:o,env:t,context:{...n}});if(o=v,!v.$)throw y({token:o.token,errorMessage:"Failed to evaluate the callee:"});if(Te(v.$.type)){let T=v.$.type,$=T.fields.findIndex(L=>L.label==="Call");if($<0)throw y({token:o.token,errorMessage:'Calling a module value which does not have "Call" element is not allowed.'});let b=T.fields[$];if(b.assignedValue){let L=b.assignedValue;vn(L)?l=L.fields.map(C=>({type:C.type,value:C})):l=[{type:L.type,value:L}]}else throw y({token:o.token,errorMessage:`Calling a module value whose "Call" element doesn't have assigned value is not allowed.`})}else l=[{type:v.$.type,value:v.$.value}]}}let u=l.length===1&&G(l[0].type)&&l[0].type.return.isCompileTimeOnly&&!l[0].type.return.isUnquote&&!He(l[0].type.return.type)&&l[0].type.forallParameters.length===0,f=l.length===1&&(G(l[0].type)||(V(l[0].type)||Ce(l[0].type))&&!!nn(l[0].type))?l.map(d=>({...d,result:{kind:"function",result:void 0}})):l.map(d=>{let v=d.args??a;if(G(d.type))try{let T=Kr({functionValue:uo(d.value),functionType:d.type,expr:Ae(e),functionCalleeExpr:o,argExprs:v.map($=>Ae($)),callerEnv:rl(t),context:{...n,isInFunctionCallCheckingPhase:!0},isMethodCall:!!s,skipSpecialization:!0,skipCtfeExecution:!0});return{...d,result:{kind:"function",result:T}}}catch(T){if(T instanceof gn&&T.kind==="overflow")throw lt([{token:e.token,errorMessage:`Failed to call the function:
|
|
11217
|
+
`},...T.tokenAndErrorList],T.isAssertionError);return{...d,result:{kind:"error",error:T}}}else if((V(d.type)||Ce(d.type))&&nn(d.type)){let T=nn(d.type);try{let $=Kr({functionValue:uo(d.value),functionType:T.isFn.callType,expr:Ae(e),functionCalleeExpr:o,argExprs:v.map(b=>Ae(b)),callerEnv:rl(t),context:{...n,isInFunctionCallCheckingPhase:!0},isMethodCall:!!s,skipSpecialization:!0,skipCtfeExecution:!0});return{...d,result:{kind:"function",result:$}}}catch($){if($ instanceof gn&&$.kind==="overflow")throw lt([{token:e.token,errorMessage:`Failed to call the function:
|
|
11218
11218
|
`},...$.tokenAndErrorList],$.isAssertionError);return{...d,result:{kind:"error",error:$}}}}else{let T=d.value;if(O(T)&&V(T.value)&&T.value.recursiveTypeRef){let $=jg(T.value,t,n);$&&(T=ee($),d.value=T,d.type=T.type)}if(O(T)&&_e(T.value))try{let $=Za({typeFields:T.value.fields,functionCalleeExpr:o,argExprs:v,callerEnv:t,context:{...n}});return{...d,result:{kind:"type",result:$}}}catch($){return{...d,result:{kind:"error",error:$}}}else if(O(T)&&ge(T.value)){let $=T.value,b=$.variants.find(L=>L.name===$.selectedVariantName);if(b)try{let L=Za({typeFields:b.fields||[],functionCalleeExpr:o,argExprs:v,callerEnv:t,context:{...n}});return{...d,result:{kind:"type",result:L}}}catch(L){return{...d,result:{kind:"error",error:L}}}else return{...d,result:{kind:"error",error:y({token:e.token,errorMessage:"Enum variant not selected for enum type"})}}}else if(O(T)&&it(T.value))try{let $=Za({typeFields:T.value.fields,functionCalleeExpr:o,argExprs:v,callerEnv:t,context:{...n},isUnionType:!0});return{...d,result:{kind:"type",result:$}}}catch($){return{...d,result:{kind:"error",error:$}}}else if(O(T)&&Te(T.value)){let $=T.value;try{let b=Ap({moduleExpr:o,moduleType:$,argExprs:v,callerEnv:t,context:{...n}});return{...d,result:{kind:"module-type",result:b}}}catch(b){return{...d,result:{kind:"error",error:b}}}}else if(O(T)&&De(T.value)){let $=T.value;if(v.some(L=>F(L)&&E(L,":=",2)))try{let L=Sp({traitExpr:o,traitType:$,argExprs:v,callerEnv:t,context:{...n}});return{...d,result:{kind:"trait-specialization",result:L}}}catch(L){return{...d,result:{kind:"error",error:L}}}try{let L=Np({traitExpr:o,traitType:$,argExprs:v,callerEnv:t,context:{...n}});return{...d,result:{kind:"trait-type",result:L}}}catch(L){return{...d,result:{kind:"error",error:L}}}}else if(O(T)&&G(T.value)){let $=T.value;try{return vp({expr:e,functionType:$,callerEnv:t,context:{...n}}),{...d,result:{kind:"function-type"}}}catch(b){return{...d,result:{kind:"error",error:b}}}}else if(O(T)&&ke(T.value)){let $=T.value;try{return gp({expr:e,arrayType:$,argExprs:v,callerEnv:t,context:{...n}}),{...d,result:{kind:"array-type"}}}catch(b){return{...d,result:{kind:"error",error:b}}}}else if(O(T)&&xt(T.value)){let $=T.value;try{return Ep({expr:e,comptimeListType:$,argExprs:v,callerEnv:t,context:{...n}}),{...d,result:{kind:"array-type"}}}catch(b){return{...d,result:{kind:"error",error:b}}}}else if(O(T)&&(V(T.value)||Ce(T.value))){let $=T.value,b=nn($);if(b)try{return Tp({expr:e,fnModuleType:b,wrapperType:$,callerEnv:t,context:{...n}}),{...d,result:{kind:"closure-type"}}}catch(L){return{...d,result:{kind:"error",error:L}}}else if(V($)&&$.recursiveTypeRef)try{let L=[];for(let C of v){let R=S({expr:C,env:t,context:{...n}});if(!R.$)throw y({token:C.token,errorMessage:"Failed to evaluate argument"});t=R.$.env,L.push(R)}return{...d,result:{kind:"type",result:{values:L.map(C=>C.$.value),pathCollection:[],runtimeArgExprsInOrder:L,callerEnv:t}}}}catch(L){return{...d,result:{kind:"error",error:L}}}else return{...d,result:{kind:"error",error:y({token:o.token,errorMessage:`Invalid function call on type:
|
|
11219
11219
|
${O(T)?A(T.value):A(d.type)}`})}}}else if(ke(d.type)||Qe(d.type))try{let $=d.value,b=zn($)?$:void 0,L=sa($)?$:void 0,C=yp({expr:e,arrayType:d.type,arrayValue:b,sliceValue:L,argExprs:v,callerEnv:t,context:{...n}});return{...d,result:{kind:"array",result:C}}}catch($){return{...d,result:{kind:"error",error:$}}}else if(O(T)&&Qo(T.value)){let $=T.value;if(v.length!==1)return{...d,result:{kind:"error",error:y({token:o.token,errorMessage:`Numeric type conversion expects exactly 1 argument, got ${v.length}`})}};try{let b=Pf({targetType:$,argExpr:v[0],expr:e,callerEnv:t,context:{...n}});return b?{...d,result:{kind:"numeric-type",result:b}}:{...d,result:{kind:"error",error:y({token:o.token,errorMessage:`Failed to convert to numeric type ${A($)}`})}}}catch(b){return{...d,result:{kind:"error",error:b}}}}else if(O(T)&&Ie(T.value)){let $=T.value;if(v.length!==1)return{...d,result:{kind:"error",error:y({token:o.token,errorMessage:`Pointer type casting expects exactly 1 argument, got ${v.length}`})}};try{let b=Ip({targetType:$,argExpr:v[0],expr:e,callerEnv:t,context:{...n}});return b?{...d,result:{kind:"pointer-type",result:b}}:{...d,result:{kind:"error",error:y({token:o.token,errorMessage:`Failed to cast to pointer type ${A($)}`})}}}catch(b){return{...d,result:{kind:"error",error:b}}}}else if(O(T)&&wt(T.value)){let $=T.value;if(v.length!==1)return{...d,result:{kind:"error",error:y({token:o.token,errorMessage:`Iso value constructor expects exactly 1 argument, got ${v.length}`})}};try{let b=Lp({expr:e,env:t,context:{...n},isoType:$});return{...d,result:{kind:"iso-value",result:b}}}catch(b){return{...d,result:{kind:"error",error:b}}}}else if(O(T)&&bt(T.value)){let $=T.value;if(v.length!==1)return{...d,result:{kind:"error",error:y({token:o.token,errorMessage:`Arc value constructor expects exactly 1 argument, got ${v.length}`})}};try{let b=mp({expr:e,env:t,context:{...n},arcType:$});return{...d,result:{kind:"arc-value",result:b}}}catch(b){return{...d,result:{kind:"error",error:b}}}}else return{...d,result:{kind:"error",error:y({token:o.token,errorMessage:`Invalid function call on type:
|
|
11220
|
-
${O(T)?A(T.value):A(d.type)}`})}}}}),p=f.filter(d=>d.result.kind!=="error"),m=p.filter(d=>G(d.type)&&d.type.return.isCompileTimeOnly);if(m.length===1&&(p=m),p.length>1){let d=p.filter(v=>G(v.type)?v.type.parameters.some($=>vt($.type)||Nt($.type)||Et($.type)):!1);d.length===1&&(p=d)}if(p.length===0){if(f.length===1&&f[0].result.kind==="error"){let d=f[0].result.error;throw d instanceof
|
|
11220
|
+
${O(T)?A(T.value):A(d.type)}`})}}}}),p=f.filter(d=>d.result.kind!=="error"),m=p.filter(d=>G(d.type)&&d.type.return.isCompileTimeOnly);if(m.length===1&&(p=m),p.length>1){let d=p.filter(v=>G(v.type)?v.type.parameters.some($=>vt($.type)||Nt($.type)||Et($.type)):!1);d.length===1&&(p=d)}if(p.length===0){if(f.length===1&&f[0].result.kind==="error"){let d=f[0].result.error;throw d instanceof gn?lt([{token:e.token,errorMessage:`Failed to call the function:
|
|
11221
11221
|
|
|
11222
11222
|
${d.tokenAndErrorList.filter(({token:v})=>v.modulePath!==e.token.modulePath).map(({errorMessage:v})=>`- ${v}`).join(`
|
|
11223
11223
|
`)}`},...d.tokenAndErrorList.filter(({token:v})=>v.modulePath===e.token.modulePath)],d.isAssertionError):lt([{token:e.token,errorMessage:`Failed to call the function:
|
|
@@ -11225,7 +11225,7 @@ ${d.tokenAndErrorList.filter(({token:v})=>v.modulePath!==e.token.modulePath).map
|
|
|
11225
11225
|
${w(e)}
|
|
11226
11226
|
|
|
11227
11227
|
${f.length?`Available functions:
|
|
11228
|
-
`:""}`},...f.map(d=>{let v=d.result.kind==="error"?d.result.error:void 0;return v?v instanceof
|
|
11228
|
+
`:""}`},...f.map(d=>{let v=d.result.kind==="error"?d.result.error:void 0;return v?v instanceof gn?[{token:o.token,errorMessage:`- ${A(d.type)}
|
|
11229
11229
|
`},...v.tokenAndErrorList]:{token:o.token,errorMessage:`- ${A(d.type)}
|
|
11230
11230
|
${v instanceof Error?v.message:String(v)}`}:{token:o.token,errorMessage:`${A(d.type)}`}}).flat()])}if(p.length>1)throw y({token:o.token,errorMessage:`Ambiguous call with arguments:
|
|
11231
11231
|
${w(e)}
|
|
@@ -11251,9 +11251,9 @@ ${w(r)}`});t=i.$.env;let o=i.$?.variableName;if(!o)throw y({token:r.token,errorM
|
|
|
11251
11251
|
${w(i)}
|
|
11252
11252
|
|
|
11253
11253
|
Original expression:
|
|
11254
|
-
${w(r)}`});let a=i.$.type,l=V(a)&&a.resolvedConcreteType&&!be(a)?a.resolvedConcreteType:a;if(Le(l))if(we(l)){let u=Kg(i);if(u){let _=Jt(u);t=
|
|
11254
|
+
${w(r)}`});let a=i.$.type,l=V(a)&&a.resolvedConcreteType&&!be(a)?a.resolvedConcreteType:a;if(Le(l))if(we(l)){let u=Kg(i);if(u){let _=Jt(u);t=En(i,t,!0);let c=S({expr:_,env:t,context:{...n}});return F(c)?(gr(e,c),e):c}else return t=En(i,t,!0),e.$={env:t,type:H.type,value:H,pathCollection:[]},e}else if(ke(l)){let u=Xg(i);if(u){let _=Jt(u);t=En(i,t,!0);let c=S({expr:_,env:t,context:{...n}});return F(c)?(gr(e,c),e):c}else return t=En(i,t,!0),e.$={env:t,type:H.type,value:H,pathCollection:[]},e}else{if(V(l)&&!be(l))return t=En(i,t,!0),e.$={env:t,type:H.type,value:void 0,pathCollection:[]},e;{let u=i.$?.variableName;if(u){let g=X(t,u),h=g.length?g[g.length-1]:void 0;if(h&&!h.isOwningTheRcValue)return t=En(i,t,!0),e.$={env:t,type:H.type,value:void 0,pathCollection:[]},e}let _=Jt(`(${w(i)}).___drop()`),c=Rn({env:t,context:{...n},expr:_});if(!c.$?.env)throw y({token:e.token,errorMessage:`Failed to get updated environment after evaluating "${k.___drop[0]}" method call:
|
|
11255
11255
|
${w(_)}`});let p=X(c.$.env,o).at(-1);if(!p)throw y({token:e.token,errorMessage:`Variable "${o}" not found in environment after evaluating "${k.___drop[0]}" method call:
|
|
11256
|
-
${w(_)}`});let m=Be(c.$.env,p,{...p,consumedAtToken:e.token});return c.$.env=m,c}}else return t=
|
|
11256
|
+
${w(_)}`});let m=Be(c.$.env,p,{...p,consumedAtToken:e.token});return c.$.env=m,c}}else return t=En(i,t,!0),e.$={env:t,type:H.type,value:void 0,pathCollection:[]},e}function Qg(e){if(!e.$?.type||!we(e.$.type))throw new Error("Expected tuple type for dup generation");if(!e.$.variableName)throw y({token:e.token,errorMessage:`Expected variable name for drop generation:
|
|
11257
11257
|
${w(e)}`});let n=e.$.type.fields.map((i,o)=>({index:o,element:i,needsDup:Le(i.type)}));return n.every(({needsDup:i})=>!i)?"":`begin(
|
|
11258
11258
|
${n.map(({index:i,needsDup:o})=>o?`${k.__yo_dup_tuple_element[0]}(${e.$?.variableName}, ${i})`:"").filter(i=>i.length>0).join(`,
|
|
11259
11259
|
`)}
|
|
@@ -11293,8 +11293,8 @@ ${w(o)}`});let s=a.$.value;if(de(s))return e;if(ln(s))return s.value;throw y({to
|
|
|
11293
11293
|
${Me(s)}`})}else{let o=ta({expr:r,env:t,context:{...n}}),a=[];for(let l=0;l<i.length;l++){let u=i[l];if(F(u)&&E(u,I.unquote_splicing)){let _;if(u.args.length!==1)throw y({token:u.token,errorMessage:`Expected exactly one argument for "unquote_splicing", got ${u.args.length}`});let c=u.args[0],f=S({expr:c,env:t,context:{...n}});if(!f.$||!Jr(f.$.type)||!f.$.value)throw y({token:c.token,errorMessage:`Expected ExprList for "unquote_splicing" argument, got:
|
|
11294
11294
|
${w(c)}`});let p=f.$.value;Jl(p)&&p.elements.every(m=>ln(m))&&(_=p.elements.map(m=>m.value)),_?_.forEach(m=>{a.push(m)}):a.push(u)}else a.push(ta({expr:u,env:t,context:{...n}}))}return{...e,func:o,args:a}}}}function Wp({expr:e,env:t,context:n}){he(e,I.quote,1);let r=ta({expr:e.args[0],env:t,context:{...n}}),i=Wn(r);return e.$={env:t,type:i.type,value:i,pathCollection:[]},e}function Yp({expr:e,env:t,context:n}){if(e.args.length!==1&&e.args.length!==2)throw y({token:e.token,errorMessage:`"macro_expand" expects 1 or 2 arguments, but got ${e.args.length}`});let r=e.args[0],i=S({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:`Failed to evaluate the argument expression for "macro_expand":
|
|
11295
11295
|
${r.toString()}`});if(t=i.$.env,!Lt(i.$.type))throw y({token:r.token,errorMessage:`The argument expression for "macro_expand" must be an Expr value, but got: ${A(i.$.type)}`});let o=null;if(e.args.length===2){let s=e.args[1],l=S({expr:s,env:t,context:{...n}});if(!l.$)throw y({token:s.token,errorMessage:`Failed to evaluate the level argument expression for "macro_expand":
|
|
11296
|
-
${s.toString()}`});if(!vt(l.$.type))throw y({token:s.token,errorMessage:`The level argument for "macro_expand" must be a comptime_int value, but got: ${A(l.$.type)}`});if(!An(l.$.value))throw y({token:s.token,errorMessage:'The level argument for "macro_expand" must be a comptime_int value'});let u=l.$.value.value;if(o=typeof u=="bigint"?Number(u):u,o<0)throw y({token:s.token,errorMessage:`The level argument for "macro_expand" must be non-negative, but got: ${o}`})}let a=i.$.value;if(ln(a)){let s=a.value,l=t,u=0;for(;F(s)&&(o===null||u<o);)try{let _=Rn({expr:s,env:l,context:{...n},forMacroExpansion:!0});if(!_.$)break;if(l=_.$.env,ln(_.$.value)){let c=_.$.value.value;if(w(c)===w(s))break;s=c,u++}else break}catch(_){if(_ instanceof
|
|
11297
|
-
`),c=/\{([^}:]+)(?::[^}]*)?\}/g,f,p=new Set;for(let m=0;m<o.length;m++)if(o[m].name){if(p.has(o[m].name))throw y({token:e.token,errorMessage:`Duplicate asm operand name: '${o[m].name}'.`});p.add(o[m].name)}for(;(f=c.exec(_))!==null;){let m=f[1];if(m==="{"||m==="}")continue;let g=parseInt(m,10);if(isNaN(g)){if(!p.has(m))throw y({token:e.token,errorMessage:`asm template references undefined operand '{${m}}'.`})}else if(g<0||g>=o.length)throw y({token:e.token,errorMessage:`asm template references positional operand {${g}} but only ${o.length} operands are defined.`})}return e.$={env:t,type:u,value:void 0,pathCollection:[]},e}function Jp({expr:e,env:t,context:n}){if(e.args.length===0)throw y({token:e.token,errorMessage:"global_asm() requires at least one argument (the assembly string)."});let r=e.args[0],i=S({expr:r,env:t,context:{...n}});if(!i.$?.value||!xe(i.$.value)&&!(de(i.$.value)&&Et(i.$.value.type)))throw y({token:r.token,errorMessage:"global_asm() argument must be a compile-time string."});return e.$={env:t,type:H.type,value:void 0,pathCollection:[]},e}function ed({expr:e,env:t}){if(E(e,k.__yo_process_platform)){if(e.args.length!==0)throw y({token:e.token,errorMessage:`__yo_process_platform expects 0 arguments, got ${e.args.length}`});let n=Wo(),r=n.os,i=on(r);return e.$={env:t,type:Vt(),value:i,pathCollection:[]},e}if(E(e,k.__yo_process_arch)){if(e.args.length!==0)throw y({token:e.token,errorMessage:`__yo_process_arch expects 0 arguments, got ${e.args.length}`});let n=Wo(),r=n.arch,i=on(r);return e.$={env:t,type:Vt(),value:i,pathCollection:[]},e}if(E(e,k.__yo_pointer_size_bits)){if(e.args.length!==0)throw y({token:e.token,errorMessage:`__yo_pointer_size_bits expects 0 arguments, got ${e.args.length}`});let n=Zn(),r=Bn(BigInt(n));return e.$={env:t,type:fr(),value:r,pathCollection:[]},e}throw y({token:e.token,errorMessage:`Unknown process function: ${e.func.token.value}`})}var Ol=class{constructor(){this.artifacts=[];this.testSuites=[];this.runSteps=[];this.steps=[];this.dependencies=[];this.pathDependencies=[];this.systemLibraries=[];this.dependencyArtifacts=[];this.modules=[];this.cliOptions=new Map;this.declaredOptions=new Map}setCliOptions(t){this.cliOptions=t}registerExecutable(t){this.artifacts.push({kind:"executable",...t})}registerStaticLibrary(t){this.artifacts.push({kind:"static_library",...t})}registerSharedLibrary(t){this.artifacts.push({kind:"shared_library",...t})}registerTest(t){this.testSuites.push(t)}registerRun(t,n){let r=`run:${t}`;this.runSteps.push({name:r,artifactName:t,args:n})}registerStep(t,n,r=[]){this.steps.push({name:t,description:n,dependencyNames:r})}addStepDependency(t,n){let r=this.findStep(t);r&&(r.dependencyNames.includes(n)||r.dependencyNames.push(n))}registerDependency(t){this.dependencies.push(t)}registerPathDependency(t){this.pathDependencies.push(t)}registerSystemLibrary(t){this.systemLibraries.push(t)}registerDependencyArtifact(t){this.dependencyArtifacts.some(n=>n.dependencyName===t.dependencyName&&n.artifactName===t.artifactName)||this.dependencyArtifacts.push(t)}registerModule(t){this.modules.some(n=>n.name===t.name)||this.modules.push(t)}registerModuleLink(t,n){let r=this.modules.find(i=>i.name===t);r&&!r.linkedSystemLibraries.includes(n)&&r.linkedSystemLibraries.push(n)}registerImportedModule(t,n){let r=this.findArtifact(t);if(r){if(r.importedModules.some(i=>i.importName===n.importName))return;r.importedModules.push(n)}}findModule(t){return this.modules.find(n=>n.name===t)}registerLink(t,n){let r=this.findArtifact(t);r&&(r.linkedArtifacts.includes(n)||r.linkedArtifacts.push(n))}findArtifact(t){return this.artifacts.find(n=>n.name===t)}findTest(t){return this.testSuites.find(n=>n.name===t)}findRunStep(t){return this.runSteps.find(n=>n.name===t)}findStep(t){return this.steps.find(n=>n.name===t)}findDependency(t){return this.dependencies.find(n=>n.name===t)}findPathDependency(t){return this.pathDependencies.find(n=>n.name===t)}findSystemLibrary(t){return this.systemLibraries.find(n=>n.name===t)}getStepNames(){return this.steps.map(t=>t.name)}resolveDependency(t){let n=this.findArtifact(t);if(n)return{kind:"artifact",value:n};let r=this.findTest(t);if(r)return{kind:"test",value:r};let i=this.findRunStep(t);if(i)return{kind:"run",value:i};let o=this.findStep(t);if(o)return{kind:"step",value:o}}resolveDependencies(t){let n=[],r=[],i=[];for(let o of t.dependencyNames){let a=this.resolveDependency(o);if(a)switch(a.kind){case"artifact":n.some(s=>s.name===a.value.name)||n.push(a.value);break;case"test":r.some(s=>s.name===a.value.name)||r.push(a.value);break;case"run":i.some(s=>s.name===a.value.name)||i.push(a.value);{let s=this.findArtifact(a.value.artifactName);s&&!n.some(l=>l.name===s.name)&&n.push(s)}break;case"step":{let s=this.resolveDependencies(a.value);for(let l of s.artifacts)n.some(u=>u.name===l.name)||n.push(l);for(let l of s.tests)r.some(u=>u.name===l.name)||r.push(l);for(let l of s.runs)i.some(u=>u.name===l.name)||i.push(l);break}}}return{artifacts:n,tests:r,runs:i}}clear(){this.artifacts=[],this.testSuites=[],this.runSteps=[],this.steps=[],this.dependencies=[],this.pathDependencies=[],this.systemLibraries=[],this.dependencyArtifacts=[],this.modules=[]}},Ml,ah,sh=new Map;function td(){return ah}function nd(e){return sh.get(e)}function Rl(){return Ml||(Ml=new Ol),Ml}function ze(e,t,n){if(!xe(e))throw y({token:n,errorMessage:`Build function: expected comptime_string for "${t}", got ${e?"non-string":"undefined"}`});return e.value}function En(e,t){return e.$={env:t,type:Vn(),value:H,pathCollection:[]},e}function _o(e,t,n){return e.$={env:t,type:Vt(),value:on(n),pathCollection:[]},e}function lh(e){for(let t of e.args){if(t===void 0)continue;let n=t.$?.value;if(n===void 0||de(n))return!0}return!1}function rd({expr:e,env:t}){if(lh(e)){if(E(e,k.__yo_build_target_host)){let r=Wr();return _o(e,t,r.triple)}return E(e,k.__yo_build_option)?_o(e,t,""):En(e,t)}let n=Rl();if(E(e,k.__yo_build_executable)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_executable expects at least 2 arguments (name, root), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"name",e.token),i=ze(e.args[1].$?.value,"root",e.token),o=e.args.length>2?ze(e.args[2].$?.value,"target",e.token):Wr().triple,a=e.args.length>3?ze(e.args[3].$?.value,"optimize",e.token):"debug",s=e.args.length>4?ze(e.args[4].$?.value,"allocator",e.token):"mimalloc",l=e.args.length>5?ze(e.args[5].$?.value,"sanitize",e.token):"none";return n.registerExecutable({name:r,root:i,target:o,optimize:a,allocator:s,sanitize:l,linkLibraries:[],includePaths:[],libraryPaths:[],cSources:[],cFlags:[],defines:[],strip:!1,staticLink:!1,runtimeFiles:[],linkedArtifacts:[],linkedSystemLibraries:[],importedModules:[]}),En(e,t)}if(E(e,k.__yo_build_static_library)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_static_library expects at least 2 arguments (name, root), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"name",e.token),i=ze(e.args[1].$?.value,"root",e.token),o=e.args.length>2?ze(e.args[2].$?.value,"target",e.token):Wr().triple,a=e.args.length>3?ze(e.args[3].$?.value,"optimize",e.token):"debug";return n.registerStaticLibrary({name:r,root:i,target:o,optimize:a,allocator:"mimalloc",sanitize:"none",linkLibraries:[],includePaths:[],libraryPaths:[],cSources:[],cFlags:[],defines:[],strip:!1,staticLink:!1,runtimeFiles:[],linkedArtifacts:[],linkedSystemLibraries:[],importedModules:[]}),En(e,t)}if(E(e,k.__yo_build_shared_library)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_shared_library expects at least 2 arguments (name, root), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"name",e.token),i=ze(e.args[1].$?.value,"root",e.token),o=e.args.length>2?ze(e.args[2].$?.value,"target",e.token):Wr().triple,a=e.args.length>3?ze(e.args[3].$?.value,"optimize",e.token):"debug";return n.registerSharedLibrary({name:r,root:i,target:o,optimize:a,allocator:"mimalloc",sanitize:"none",linkLibraries:[],includePaths:[],libraryPaths:[],cSources:[],cFlags:[],defines:[],strip:!1,staticLink:!1,runtimeFiles:[],linkedArtifacts:[],linkedSystemLibraries:[],importedModules:[]}),En(e,t)}if(E(e,k.__yo_build_link)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_link expects 2 arguments (artifact_name, library_name), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"artifact_name",e.token),i=ze(e.args[1].$?.value,"library_name",e.token);if(n.findSystemLibrary(i)){let o=n.findArtifact(r);o&&(o.linkedSystemLibraries.includes(i)||o.linkedSystemLibraries.push(i))}else n.registerLink(r,i);return En(e,t)}if(E(e,k.__yo_build_link_system_library)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_link_system_library expects 2 arguments (artifact_name, system_lib_name), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"artifact_name",e.token),i=ze(e.args[1].$?.value,"system_lib_name",e.token),o=n.findArtifact(r);return o&&(o.linkedSystemLibraries.includes(i)||o.linkedSystemLibraries.push(i)),En(e,t)}if(E(e,k.__yo_build_test)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_test expects at least 2 arguments (name, root), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"name",e.token),i=ze(e.args[1].$?.value,"root",e.token),o=e.args.length>2?ze(e.args[2].$?.value,"target",e.token):Wr().triple;return n.registerTest({name:r,root:i,target:o,verbose:!1,bail:!1,parallel:1}),En(e,t)}if(E(e,k.__yo_build_run)){if(e.args.length<1)throw y({token:e.token,errorMessage:`__yo_build_run expects at least 1 argument (artifact_name), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"artifact_name",e.token);return n.registerRun(r,[]),En(e,t)}if(E(e,k.__yo_build_step)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_step expects 2 arguments (name, description), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"name",e.token),i=ze(e.args[1].$?.value,"description",e.token);return n.registerStep(r,i),En(e,t)}if(E(e,k.__yo_build_step_depend_on)){if(e.args.length<3)throw y({token:e.token,errorMessage:`__yo_build_step_depend_on expects 3 arguments (step_name, dep_name, dep_kind), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"step_name",e.token),i=ze(e.args[1].$?.value,"dep_name",e.token),o=e.args[2].$?.value,a=i;return o&&It(o)&&o.variantName==="Run"&&(a=`run:${i}`),n.addStepDependency(r,a),En(e,t)}if(E(e,k.__yo_build_target_host)){let r=Wr();return _o(e,t,r.triple)}if(E(e,k.__yo_build_target_parse)){if(e.args.length!==1)throw y({token:e.token,errorMessage:`__yo_build_target_parse expects 1 argument (triple), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"triple",e.token),i=d_(r);return _o(e,t,i.triple)}if(E(e,k.__yo_build_dependency)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_dependency expects at least 2 arguments (name, url), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"name",e.token),i=ze(e.args[1].$?.value,"url",e.token),o=e.args.length>2?ze(e.args[2].$?.value,"ref",e.token):"HEAD",a=e.args.length>3?ze(e.args[3].$?.value,"path",e.token):"";return n.registerDependency({name:r,url:i,ref:o,path:a}),En(e,t)}if(E(e,k.__yo_build_path_dependency)){if(e.args.length!==2)throw y({token:e.token,errorMessage:`__yo_build_path_dependency expects 2 arguments (name, path), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"name",e.token),i=ze(e.args[1].$?.value,"path",e.token);return n.registerPathDependency({name:r,path:i}),En(e,t)}if(E(e,k.__yo_build_system_library)){if(e.args.length<1)throw y({token:e.token,errorMessage:`__yo_build_system_library expects at least 1 argument (name), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"name",e.token),i=e.args.length>1?ze(e.args[1].$?.value,"fallback_include",e.token):"",o=e.args.length>2?ze(e.args[2].$?.value,"fallback_lib",e.token):"",a=e.args.length>3?ze(e.args[3].$?.value,"fallback_link",e.token):"",s=e.args.length>4?ze(e.args[4].$?.value,"defines",e.token).split(/\s+/).filter(Boolean):[];return n.registerSystemLibrary({name:r,fallbackInclude:i,fallbackLib:o,fallbackLink:a,defines:s}),En(e,t)}if(E(e,k.__yo_build_option)){if(e.args.length<3)throw y({token:e.token,errorMessage:`__yo_build_option expects 3 arguments (name, description, default), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"name",e.token),i=ze(e.args[1].$?.value,"description",e.token),o=ze(e.args[2].$?.value,"default",e.token);n.declaredOptions.set(r,{description:i,defaultValue:o});let a=n.cliOptions.get(r)??o;return _o(e,t,a)}if(E(e,k.__yo_build_dep_artifact)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_dep_artifact expects 2 arguments (dependency_name, artifact_name), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"dependency_name",e.token),i=ze(e.args[1].$?.value,"artifact_name",e.token);return n.registerDependencyArtifact({dependencyName:r,artifactName:i}),En(e,t)}if(E(e,k.__yo_build_module)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_module expects 2 arguments (name, root), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"name",e.token),i=ze(e.args[1].$?.value,"root",e.token);return n.registerModule({name:r,root:i,linkedSystemLibraries:[]}),En(e,t)}if(E(e,k.__yo_build_module_link)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_module_link expects 2 arguments (module_name, system_library_name), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"module_name",e.token),i=ze(e.args[1].$?.value,"system_library_name",e.token);return n.registerModuleLink(r,i),En(e,t)}if(E(e,k.__yo_build_add_import)){if(e.args.length<4)throw y({token:e.token,errorMessage:`__yo_build_add_import expects 4 arguments (artifact_name, import_name, module_name, dependency_name), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"artifact_name",e.token),i=ze(e.args[1].$?.value,"import_name",e.token),o=ze(e.args[2].$?.value,"module_name",e.token),a=ze(e.args[3].$?.value,"dependency_name",e.token),s=n.findArtifact(r);if(s){let l=s.importedModules.find(u=>u.importName===i);if(l)throw y({token:e.token,errorMessage:`Duplicate import name "${i}" on artifact "${r}". Already imported from module "${l.moduleName}".`})}return n.registerImportedModule(r,{importName:i,moduleName:o,dependencyName:a}),En(e,t)}if(E(e,k.__yo_build_dep_module)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_dep_module expects 2 arguments (dependency_name, module_name), got ${e.args.length}`});let r=ze(e.args[0].$?.value,"dependency_name",e.token),i=ze(e.args[1].$?.value,"module_name",e.token);return _o(e,t,`${r}\0${i}`)}throw y({token:e.token,errorMessage:`Unknown build function: ${e.func.token.value}`})}function id({expr:e,env:t,context:n}){he(e,k.__yo_address_of,1);let r=e.args[0],i=n.expectedType;i&&Ie(i.type)&&(i={...i,type:i.type.childType});let o=S({expr:r,env:t,context:{...n,expectedType:i}});if(!o.$)throw y({token:r.token,errorMessage:`Failed to evaluate the argument expression for reference:
|
|
11296
|
+
${s.toString()}`});if(!vt(l.$.type))throw y({token:s.token,errorMessage:`The level argument for "macro_expand" must be a comptime_int value, but got: ${A(l.$.type)}`});if(!An(l.$.value))throw y({token:s.token,errorMessage:'The level argument for "macro_expand" must be a comptime_int value'});let u=l.$.value.value;if(o=typeof u=="bigint"?Number(u):u,o<0)throw y({token:s.token,errorMessage:`The level argument for "macro_expand" must be non-negative, but got: ${o}`})}let a=i.$.value;if(ln(a)){let s=a.value,l=t,u=0;for(;F(s)&&(o===null||u<o);)try{let _=Rn({expr:s,env:l,context:{...n},forMacroExpansion:!0});if(!_.$)break;if(l=_.$.env,ln(_.$.value)){let c=_.$.value.value;if(w(c)===w(s))break;s=c,u++}else break}catch(_){if(_ instanceof gn&&_.isAssertionError)throw _;break}s=ta({expr:s,env:l,context:{...n}}),e.$={env:l,type:cn(),value:Wn(s),pathCollection:i.$.pathCollection}}else e.$={env:t,type:i.$.type,value:i.$.value,pathCollection:i.$.pathCollection};return e}function qp({expr:e,env:t,context:n}){if(n.isEvaluatingFunctionBodyOrAsyncBlock?.kind!=="function-body"&&n.isEvaluatingFunctionBodyOrAsyncBlock?.kind!=="test-block")throw y({token:e.token,errorMessage:"panic() can only be called inside a function body or test block"});if(n.isAnalyzingCtfeCapability)throw y({token:e.token,errorMessage:'Cannot use "panic" during compile-time function evaluation analysis. Functions containing "panic" cannot be evaluated at compile time.'});let r=n.isEvaluatingFunctionBodyOrAsyncBlock.kind==="function-body"?n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type:H.type;if(e.args.length>0){let i=e.args[0],o=S({expr:i,env:t,context:{...n}});if(!o.$)throw y({token:i.token,errorMessage:"Failed to evaluate panic message"});if(!o.$.value||!xe(o.$.value)&&!(de(o.$.value)&&Et(o.$.value.type)))throw y({token:i.token,errorMessage:"panic message must be a comptime_string"})}return e.$={env:t,type:r,value:void 0,pathCollection:[]},e}var Kp=new Set(["reg","reg_byte","reg_abcd","xmm_reg","ymm_reg","imm","mem"]),Vl=new Set(["in"]),Dl=new Set(["out","lateout"]),Xp=new Set(["inout","inlateout"]),Qp=new Set(["const_val","sym"]),Jg=new Set([...Vl,...Dl,...Xp,...Qp,"clobber","clobber_abi","asm_options"]),Hp=new Set(["pure","nomem","readonly","nostack","preserves_flags","att_syntax","intel_syntax","volatile","noreturn"]);function xl(e){return lr(e)||ur(e)||Ie(e)||_n(e)}function eh(e){return e.tag==="Atom"&&Kp.has(e.token.value)}function th(e){return!F(e)||e.func.tag!=="Atom"?!1:Jg.has(e.func.token.value)}function jp(e){return e.tag==="Atom"&&e.token.value==="_"}function nh(e,t,n){if(e.tag==="Atom"&&Kp.has(e.token.value))return e.token.value;let r=S({expr:e,env:t,context:{...n}});if(r.$?.value&&xe(r.$.value))return r.$.value.value;if(E(e,"raw",1)){let o=e.args[0],a=S({expr:o,env:t,context:{...n}});if(a.$?.value&&xe(a.$.value))return`raw:${a.$.value.value}`}throw y({token:e.token,errorMessage:'Invalid asm constraint. Expected a register class (reg, imm, mem, ...), an explicit register name string, or raw("constraint").'})}function rh(e,t,n,r){let i=e.args;if(r==="const_val"||r==="sym")return ih(e,t,n,r);if(i.length<1||i.length>3)throw y({token:e.token,errorMessage:`asm ${r}() expects 1 to 3 arguments, got ${i.length}.`});let o,a;if(i.length>=2){let g=i[0];if(eh(g))a=0;else if(jp(g))a=0;else{let h=S({expr:g,env:t,context:{...n}});h.$?.value&&xe(h.$.value)?(o=h.$.value.value,a=1):a=0}}else a=0;let s=a<i.length-1,l,u;s?(l=nh(i[a],t,n),u=a+1):(o!==void 0&&(l=o),u=a);let _=i[u];if(!_)throw y({token:e.token,errorMessage:`asm ${r}() is missing its value/type argument.`});let c=Vl.has(r);if(Dl.has(r)){if(jp(_))return{kind:r,name:o,constraint:l,valueExpr:void 0,outputType:void 0,targetVarName:void 0,discarded:!0};if(_.tag==="Atom"){let h=_.token.value,d=X(t,h);if(d.length>0){let v=d[d.length-1];if(!(v.value&&O(v.value[0]))){let T=v.type;if(!xl(T))throw y({token:_.token,errorMessage:`asm ${r}() target variable '${h}' has type that is not valid for inline assembly. Must be a primitive numeric, pointer, or bool type.`});let $;return v.initializedAtToken?$=S({expr:_,env:t,context:{...n}}):($=_,$.$={env:t,type:T,value:void 0,pathCollection:[]}),{kind:r,name:o,constraint:l,valueExpr:$,outputType:T,targetVarName:h,discarded:!1}}}}let g=S({expr:_,env:t,context:{...n}});if(g.$?.value&&O(g.$.value)){let h=g.$.value.value;if(!xl(h))throw y({token:_.token,errorMessage:`asm ${r}() output type must be a primitive numeric, pointer, or bool type.`});return{kind:r,name:o,constraint:l,valueExpr:void 0,outputType:h,targetVarName:void 0,discarded:!1}}throw y({token:_.token,errorMessage:`asm ${r}() last argument must be a type, variable, or _ (discard).`})}let p=S({expr:_,env:t,context:{...n}});if(!p.$)throw y({token:_.token,errorMessage:`Failed to evaluate asm ${r}() value expression.`});let m=p.$.type;if(!xl(m))throw y({token:_.token,errorMessage:`asm ${r}() value type is not valid for inline assembly. Must be a primitive numeric, pointer, or bool type.`});return c?{kind:r,name:o,constraint:l,valueExpr:p,outputType:void 0,targetVarName:void 0,discarded:!1}:{kind:r,name:o,constraint:l,valueExpr:p,outputType:m,targetVarName:void 0,discarded:!1}}function ih(e,t,n,r){let i=e.args;if(i.length<1||i.length>2)throw y({token:e.token,errorMessage:`asm ${r}() expects 1 or 2 arguments, got ${i.length}.`});let o,a=0;if(i.length===2){let u=S({expr:i[0],env:t,context:{...n}});u.$?.value&&xe(u.$.value)&&(o=u.$.value.value,a=1)}let s=i[a],l=S({expr:s,env:t,context:{...n}});return{kind:r,name:o,constraint:void 0,valueExpr:l,outputType:void 0,targetVarName:void 0,discarded:!1}}function oh(e,t,n){let r={noreturn:!1};for(let i of e.args)if(i.tag==="Atom"){let o=i.token.value;if(!Hp.has(o))throw y({token:i.token,errorMessage:`Unknown asm_options flag: '${o}'. Valid flags: ${[...Hp].join(", ")}.`});o==="noreturn"&&(r.noreturn=!0)}else throw y({token:e.token,errorMessage:"asm_options() arguments must be flag identifiers (e.g., pure, nomem, noreturn)."});return r}function Zp({expr:e,env:t,context:n}){if(n.isEvaluatingFunctionBodyOrAsyncBlock?.kind!=="function-body"&&n.isEvaluatingFunctionBodyOrAsyncBlock?.kind!=="test-block")throw y({token:e.token,errorMessage:"asm() can only be called inside a function body or test block."});if(n.isAnalyzingCtfeCapability)throw y({token:e.token,errorMessage:'Cannot use "asm" during compile-time function evaluation analysis.'});if(e.args.length===0)throw y({token:e.token,errorMessage:"asm() requires at least one argument (the assembly template string)."});let r=[],i=0;for(;i<e.args.length;){let m=e.args[i];if(th(m))break;let g=S({expr:m,env:t,context:{...n}});if(g.$?.value&&xe(g.$.value))r.push(g.$.value.value),i++;else if(g.$?.value&&de(g.$.value)&&Et(g.$.value.type))r.push(""),i++;else break}if(r.length===0)throw y({token:e.args[0].token,errorMessage:"First argument to asm() must be a compile-time string (the assembly template)."});let o=[],a={noreturn:!1};for(;i<e.args.length;){let m=e.args[i];if(!F(m))throw y({token:m.token,errorMessage:"asm() arguments after the template must be operand or option calls (in, out, inout, clobber, asm_options, etc.)."});let g=m.func.tag==="Atom"?m.func.token.value:void 0;if(!g)throw y({token:m.token,errorMessage:"asm() operand must be a named call like in(...), out(...), etc."});if(Vl.has(g)||Dl.has(g)||Xp.has(g)||Qp.has(g))o.push(rh(m,t,n,g));else if(g==="clobber"||g==="clobber_abi")for(let h of m.args){if(h.tag==="Atom"&&(h.token.value==="memory"||h.token.value==="cc"))continue;let d=S({expr:h,env:t,context:{...n}});if((!d.$?.value||!xe(d.$.value))&&!(h.tag==="Atom"&&h.token.value==="memory")&&!(h.tag==="Atom"&&h.token.value==="cc"))throw y({token:h.token,errorMessage:`${g}() arguments must be compile-time strings (e.g., "memory", "cc", "rax").`})}else if(g==="asm_options")a=oh(m,t,n);else throw y({token:m.token,errorMessage:`Unknown asm() operand or option: '${g}'. Expected: in, out, inout, lateout, inlateout, const_val, sym, clobber, clobber_abi, asm_options.`});i++}let s=t;for(let m of o){if(m.targetVarName===void 0||m.kind!=="out"&&m.kind!=="lateout")continue;let g=X(s,m.targetVarName);if(g.length>0){let h=g[g.length-1];h.initializedAtToken||(s=Be(s,h,{...h,initializedAtToken:e.token}))}}t=s;let l=[];for(let m of o)m.discarded||m.targetVarName===void 0&&(m.kind==="const_val"||m.kind==="sym"||m.kind!=="in"&&m.outputType&&l.push(m.outputType));let u;if(a.noreturn)u=n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"?n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type:H.type;else if(l.length===0)u=H.type;else if(l.length===1)u=l[0];else{let m=l.map((g,h)=>({label:h.toString(),type:g,exprs:{expr:e,labelExpr:void 0,typeExpr:void 0,defaultValueExpr:void 0,assignedValueExpr:void 0}}));u=Yi(m)}let _=r.join(`
|
|
11297
|
+
`),c=/\{([^}:]+)(?::[^}]*)?\}/g,f,p=new Set;for(let m=0;m<o.length;m++)if(o[m].name){if(p.has(o[m].name))throw y({token:e.token,errorMessage:`Duplicate asm operand name: '${o[m].name}'.`});p.add(o[m].name)}for(;(f=c.exec(_))!==null;){let m=f[1];if(m==="{"||m==="}")continue;let g=parseInt(m,10);if(isNaN(g)){if(!p.has(m))throw y({token:e.token,errorMessage:`asm template references undefined operand '{${m}}'.`})}else if(g<0||g>=o.length)throw y({token:e.token,errorMessage:`asm template references positional operand {${g}} but only ${o.length} operands are defined.`})}return e.$={env:t,type:u,value:void 0,pathCollection:[]},e}function Jp({expr:e,env:t,context:n}){if(e.args.length===0)throw y({token:e.token,errorMessage:"global_asm() requires at least one argument (the assembly string)."});let r=e.args[0],i=S({expr:r,env:t,context:{...n}});if(!i.$?.value||!xe(i.$.value)&&!(de(i.$.value)&&Et(i.$.value.type)))throw y({token:r.token,errorMessage:"global_asm() argument must be a compile-time string."});return e.$={env:t,type:H.type,value:void 0,pathCollection:[]},e}function ed({expr:e,env:t}){if(E(e,k.__yo_process_platform)){if(e.args.length!==0)throw y({token:e.token,errorMessage:`__yo_process_platform expects 0 arguments, got ${e.args.length}`});let n=Wo(),r=n.os,i=on(r);return e.$={env:t,type:Vt(),value:i,pathCollection:[]},e}if(E(e,k.__yo_process_arch)){if(e.args.length!==0)throw y({token:e.token,errorMessage:`__yo_process_arch expects 0 arguments, got ${e.args.length}`});let n=Wo(),r=n.arch,i=on(r);return e.$={env:t,type:Vt(),value:i,pathCollection:[]},e}if(E(e,k.__yo_pointer_size_bits)){if(e.args.length!==0)throw y({token:e.token,errorMessage:`__yo_pointer_size_bits expects 0 arguments, got ${e.args.length}`});let n=Zn(),r=Bn(BigInt(n));return e.$={env:t,type:fr(),value:r,pathCollection:[]},e}throw y({token:e.token,errorMessage:`Unknown process function: ${e.func.token.value}`})}var Ol=class{constructor(){this.artifacts=[];this.testSuites=[];this.runSteps=[];this.steps=[];this.dependencies=[];this.pathDependencies=[];this.systemLibraries=[];this.dependencyArtifacts=[];this.modules=[];this.cliOptions=new Map;this.declaredOptions=new Map}setCliOptions(t){this.cliOptions=t}registerExecutable(t){this.artifacts.push({kind:"executable",...t})}registerStaticLibrary(t){this.artifacts.push({kind:"static_library",...t})}registerSharedLibrary(t){this.artifacts.push({kind:"shared_library",...t})}registerTest(t){this.testSuites.push(t)}registerRun(t,n){let r=`run:${t}`;this.runSteps.push({name:r,artifactName:t,args:n})}registerStep(t,n,r=[]){this.steps.push({name:t,description:n,dependencyNames:r})}addStepDependency(t,n){let r=this.findStep(t);r&&(r.dependencyNames.includes(n)||r.dependencyNames.push(n))}registerDependency(t){this.dependencies.push(t)}registerPathDependency(t){this.pathDependencies.push(t)}registerSystemLibrary(t){this.systemLibraries.push(t)}registerDependencyArtifact(t){this.dependencyArtifacts.some(n=>n.dependencyName===t.dependencyName&&n.artifactName===t.artifactName)||this.dependencyArtifacts.push(t)}registerModule(t){this.modules.some(n=>n.name===t.name)||this.modules.push(t)}registerModuleLink(t,n){let r=this.modules.find(i=>i.name===t);r&&!r.linkedSystemLibraries.includes(n)&&r.linkedSystemLibraries.push(n)}registerImportedModule(t,n){let r=this.findArtifact(t);if(r){if(r.importedModules.some(i=>i.importName===n.importName))return;r.importedModules.push(n)}}findModule(t){return this.modules.find(n=>n.name===t)}registerLink(t,n){let r=this.findArtifact(t);r&&(r.linkedArtifacts.includes(n)||r.linkedArtifacts.push(n))}findArtifact(t){return this.artifacts.find(n=>n.name===t)}findTest(t){return this.testSuites.find(n=>n.name===t)}findRunStep(t){return this.runSteps.find(n=>n.name===t)}findStep(t){return this.steps.find(n=>n.name===t)}findDependency(t){return this.dependencies.find(n=>n.name===t)}findPathDependency(t){return this.pathDependencies.find(n=>n.name===t)}findSystemLibrary(t){return this.systemLibraries.find(n=>n.name===t)}getStepNames(){return this.steps.map(t=>t.name)}resolveDependency(t){let n=this.findArtifact(t);if(n)return{kind:"artifact",value:n};let r=this.findTest(t);if(r)return{kind:"test",value:r};let i=this.findRunStep(t);if(i)return{kind:"run",value:i};let o=this.findStep(t);if(o)return{kind:"step",value:o}}resolveDependencies(t){let n=[],r=[],i=[];for(let o of t.dependencyNames){let a=this.resolveDependency(o);if(a)switch(a.kind){case"artifact":n.some(s=>s.name===a.value.name)||n.push(a.value);break;case"test":r.some(s=>s.name===a.value.name)||r.push(a.value);break;case"run":i.some(s=>s.name===a.value.name)||i.push(a.value);{let s=this.findArtifact(a.value.artifactName);s&&!n.some(l=>l.name===s.name)&&n.push(s)}break;case"step":{let s=this.resolveDependencies(a.value);for(let l of s.artifacts)n.some(u=>u.name===l.name)||n.push(l);for(let l of s.tests)r.some(u=>u.name===l.name)||r.push(l);for(let l of s.runs)i.some(u=>u.name===l.name)||i.push(l);break}}}return{artifacts:n,tests:r,runs:i}}clear(){this.artifacts=[],this.testSuites=[],this.runSteps=[],this.steps=[],this.dependencies=[],this.pathDependencies=[],this.systemLibraries=[],this.dependencyArtifacts=[],this.modules=[]}},Ml,ah,sh=new Map;function td(){return ah}function nd(e){return sh.get(e)}function Rl(){return Ml||(Ml=new Ol),Ml}function Re(e,t,n){if(!xe(e))throw y({token:n,errorMessage:`Build function: expected comptime_string for "${t}", got ${e?"non-string":"undefined"}`});return e.value}function mn(e,t){return e.$={env:t,type:Vn(),value:H,pathCollection:[]},e}function _o(e,t,n){return e.$={env:t,type:Vt(),value:on(n),pathCollection:[]},e}function lh(e){for(let t of e.args){if(t===void 0)continue;let n=t.$?.value;if(n===void 0||de(n))return!0}return!1}function rd({expr:e,env:t}){if(lh(e)){if(E(e,k.__yo_build_target_host)){let r=Wr();return _o(e,t,r.triple)}return E(e,k.__yo_build_option)?_o(e,t,""):mn(e,t)}let n=Rl();if(E(e,k.__yo_build_executable)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_executable expects at least 2 arguments (name, root), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"name",e.token),i=Re(e.args[1].$?.value,"root",e.token),o=e.args.length>2?Re(e.args[2].$?.value,"target",e.token):Wr().triple,a=e.args.length>3?Re(e.args[3].$?.value,"optimize",e.token):"debug",s=e.args.length>4?Re(e.args[4].$?.value,"allocator",e.token):"mimalloc",l=e.args.length>5?Re(e.args[5].$?.value,"sanitize",e.token):"none";return n.registerExecutable({name:r,root:i,target:o,optimize:a,allocator:s,sanitize:l,linkLibraries:[],includePaths:[],libraryPaths:[],cSources:[],cFlags:[],defines:[],strip:!1,staticLink:!1,runtimeFiles:[],linkedArtifacts:[],linkedSystemLibraries:[],importedModules:[]}),mn(e,t)}if(E(e,k.__yo_build_static_library)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_static_library expects at least 2 arguments (name, root), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"name",e.token),i=Re(e.args[1].$?.value,"root",e.token),o=e.args.length>2?Re(e.args[2].$?.value,"target",e.token):Wr().triple,a=e.args.length>3?Re(e.args[3].$?.value,"optimize",e.token):"debug";return n.registerStaticLibrary({name:r,root:i,target:o,optimize:a,allocator:"mimalloc",sanitize:"none",linkLibraries:[],includePaths:[],libraryPaths:[],cSources:[],cFlags:[],defines:[],strip:!1,staticLink:!1,runtimeFiles:[],linkedArtifacts:[],linkedSystemLibraries:[],importedModules:[]}),mn(e,t)}if(E(e,k.__yo_build_shared_library)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_shared_library expects at least 2 arguments (name, root), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"name",e.token),i=Re(e.args[1].$?.value,"root",e.token),o=e.args.length>2?Re(e.args[2].$?.value,"target",e.token):Wr().triple,a=e.args.length>3?Re(e.args[3].$?.value,"optimize",e.token):"debug";return n.registerSharedLibrary({name:r,root:i,target:o,optimize:a,allocator:"mimalloc",sanitize:"none",linkLibraries:[],includePaths:[],libraryPaths:[],cSources:[],cFlags:[],defines:[],strip:!1,staticLink:!1,runtimeFiles:[],linkedArtifacts:[],linkedSystemLibraries:[],importedModules:[]}),mn(e,t)}if(E(e,k.__yo_build_link)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_link expects 2 arguments (artifact_name, library_name), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"artifact_name",e.token),i=Re(e.args[1].$?.value,"library_name",e.token);if(n.findSystemLibrary(i)){let o=n.findArtifact(r);o&&(o.linkedSystemLibraries.includes(i)||o.linkedSystemLibraries.push(i))}else n.registerLink(r,i);return mn(e,t)}if(E(e,k.__yo_build_link_system_library)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_link_system_library expects 2 arguments (artifact_name, system_lib_name), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"artifact_name",e.token),i=Re(e.args[1].$?.value,"system_lib_name",e.token),o=n.findArtifact(r);return o&&(o.linkedSystemLibraries.includes(i)||o.linkedSystemLibraries.push(i)),mn(e,t)}if(E(e,k.__yo_build_test)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_test expects at least 2 arguments (name, root), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"name",e.token),i=Re(e.args[1].$?.value,"root",e.token),o=e.args.length>2?Re(e.args[2].$?.value,"target",e.token):Wr().triple;return n.registerTest({name:r,root:i,target:o,verbose:!1,bail:!1,parallel:1}),mn(e,t)}if(E(e,k.__yo_build_run)){if(e.args.length<1)throw y({token:e.token,errorMessage:`__yo_build_run expects at least 1 argument (artifact_name), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"artifact_name",e.token);return n.registerRun(r,[]),mn(e,t)}if(E(e,k.__yo_build_step)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_step expects 2 arguments (name, description), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"name",e.token),i=Re(e.args[1].$?.value,"description",e.token);return n.registerStep(r,i),mn(e,t)}if(E(e,k.__yo_build_step_depend_on)){if(e.args.length<3)throw y({token:e.token,errorMessage:`__yo_build_step_depend_on expects 3 arguments (step_name, dep_name, dep_kind), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"step_name",e.token),i=Re(e.args[1].$?.value,"dep_name",e.token),o=e.args[2].$?.value,a=i;return o&&It(o)&&o.variantName==="Run"&&(a=`run:${i}`),n.addStepDependency(r,a),mn(e,t)}if(E(e,k.__yo_build_target_host)){let r=Wr();return _o(e,t,r.triple)}if(E(e,k.__yo_build_target_parse)){if(e.args.length!==1)throw y({token:e.token,errorMessage:`__yo_build_target_parse expects 1 argument (triple), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"triple",e.token),i=d_(r);return _o(e,t,i.triple)}if(E(e,k.__yo_build_dependency)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_dependency expects at least 2 arguments (name, url), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"name",e.token),i=Re(e.args[1].$?.value,"url",e.token),o=e.args.length>2?Re(e.args[2].$?.value,"ref",e.token):"HEAD",a=e.args.length>3?Re(e.args[3].$?.value,"path",e.token):"";return n.registerDependency({name:r,url:i,ref:o,path:a}),mn(e,t)}if(E(e,k.__yo_build_path_dependency)){if(e.args.length!==2)throw y({token:e.token,errorMessage:`__yo_build_path_dependency expects 2 arguments (name, path), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"name",e.token),i=Re(e.args[1].$?.value,"path",e.token);return n.registerPathDependency({name:r,path:i}),mn(e,t)}if(E(e,k.__yo_build_system_library)){if(e.args.length<1)throw y({token:e.token,errorMessage:`__yo_build_system_library expects at least 1 argument (name), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"name",e.token),i=e.args.length>1?Re(e.args[1].$?.value,"fallback_include",e.token):"",o=e.args.length>2?Re(e.args[2].$?.value,"fallback_lib",e.token):"",a=e.args.length>3?Re(e.args[3].$?.value,"fallback_link",e.token):"",s=e.args.length>4?Re(e.args[4].$?.value,"defines",e.token).split(/\s+/).filter(Boolean):[];return n.registerSystemLibrary({name:r,fallbackInclude:i,fallbackLib:o,fallbackLink:a,defines:s}),mn(e,t)}if(E(e,k.__yo_build_option)){if(e.args.length<3)throw y({token:e.token,errorMessage:`__yo_build_option expects 3 arguments (name, description, default), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"name",e.token),i=Re(e.args[1].$?.value,"description",e.token),o=Re(e.args[2].$?.value,"default",e.token);n.declaredOptions.set(r,{description:i,defaultValue:o});let a=n.cliOptions.get(r)??o;return _o(e,t,a)}if(E(e,k.__yo_build_dep_artifact)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_dep_artifact expects 2 arguments (dependency_name, artifact_name), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"dependency_name",e.token),i=Re(e.args[1].$?.value,"artifact_name",e.token);return n.registerDependencyArtifact({dependencyName:r,artifactName:i}),mn(e,t)}if(E(e,k.__yo_build_module)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_module expects 2 arguments (name, root), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"name",e.token),i=Re(e.args[1].$?.value,"root",e.token);return n.registerModule({name:r,root:i,linkedSystemLibraries:[]}),mn(e,t)}if(E(e,k.__yo_build_module_link)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_module_link expects 2 arguments (module_name, system_library_name), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"module_name",e.token),i=Re(e.args[1].$?.value,"system_library_name",e.token);return n.registerModuleLink(r,i),mn(e,t)}if(E(e,k.__yo_build_add_import)){if(e.args.length<4)throw y({token:e.token,errorMessage:`__yo_build_add_import expects 4 arguments (artifact_name, import_name, module_name, dependency_name), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"artifact_name",e.token),i=Re(e.args[1].$?.value,"import_name",e.token),o=Re(e.args[2].$?.value,"module_name",e.token),a=Re(e.args[3].$?.value,"dependency_name",e.token),s=n.findArtifact(r);if(s){let l=s.importedModules.find(u=>u.importName===i);if(l)throw y({token:e.token,errorMessage:`Duplicate import name "${i}" on artifact "${r}". Already imported from module "${l.moduleName}".`})}return n.registerImportedModule(r,{importName:i,moduleName:o,dependencyName:a}),mn(e,t)}if(E(e,k.__yo_build_add_cflags)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_add_cflags expects 2 arguments (artifact_name, flags), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"artifact_name",e.token),i=Re(e.args[1].$?.value,"flags",e.token),o=n.findArtifact(r);if(o){let a=i.trim().split(/\s+/).filter(s=>s.length>0);o.cFlags.push(...a)}return mn(e,t)}if(E(e,k.__yo_build_dep_module)){if(e.args.length<2)throw y({token:e.token,errorMessage:`__yo_build_dep_module expects 2 arguments (dependency_name, module_name), got ${e.args.length}`});let r=Re(e.args[0].$?.value,"dependency_name",e.token),i=Re(e.args[1].$?.value,"module_name",e.token);return _o(e,t,`${r}\0${i}`)}throw y({token:e.token,errorMessage:`Unknown build function: ${e.func.token.value}`})}function id({expr:e,env:t,context:n}){he(e,k.__yo_address_of,1);let r=e.args[0],i=n.expectedType;i&&Ie(i.type)&&(i={...i,type:i.type.childType});let o=S({expr:r,env:t,context:{...n,expectedType:i}});if(!o.$)throw y({token:r.token,errorMessage:`Failed to evaluate the argument expression for reference:
|
|
11298
11298
|
${w(r)}`});if(t=o.$.env,O(o.$.value))throw y({token:r.token,errorMessage:`Cannot create a pointer to a type. Did you mean to use "*"?
|
|
11299
11299
|
${w(r)}`});{let a=o.$.type;if(vt(a)||Nt(a)||Et(a)){let _=yt({type:a,expectedType:i?.type,expr:o,env:t});o.$.type=_,o.$.convertedRuntimeType=_,a=_}let s=fi(a),l=o.$.sourceVariable,u=o.$.arrayElementRef;if(u){let _=ss(s,[u.arrayValue],u.index);e.$={env:t,type:s,value:_,pathCollection:o.$.pathCollection}}else if(l&&l.value){let _=ss(s,l.value);e.$={env:t,type:s,value:_,pathCollection:o.$.pathCollection}}else e.$={env:t,type:s,value:void 0,pathCollection:o.$.pathCollection};return Ge(e,!1),e}}function od({expr:e,env:t,context:n}){he(e,k.rc,1);let r=e.args[0],i=S({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:"Failed to evaluate expression."});return t=i.$.env,sn(i.$.type)?e.$={env:t,type:gt(),value:void 0,pathCollection:[]}:e.$={env:t,type:gt(),value:Xt("Usize",1),pathCollection:[]},e}function ad({expr:e,env:t,context:n}){he(e,k.sizeof,1);let r=e.args[0],i=S({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:"Failed to evaluate expression."});t=i.$.env;let o;i.$.value&&O(i.$.value)?o=i.$.value.value:o=i.$.type;let a=Ur(o),s;return a===null?s=K(gt(),{env:t,context:n}):s=Xt("Usize",Math.ceil(a/8)),e.$={env:t,type:gt(),value:s,pathCollection:[]},e}function Mr({expr:e,type:t,env:n,context:r}){if(we(t)&&F(e)&&E(e,I.tuple)){if(t.fields.length!==e.args.length)throw y({token:e.token,errorMessage:`Tuple size mismatch: expected ${t.fields.length} fields, got ${e.args.length}`});for(let i=0;i<t.fields.length;i++){let o=t.fields[i].type,a=e.args[i],{env:s}=Mr({expr:a,type:o,env:n,context:{...r}});n=s}return e.$={env:n,type:t,pathCollection:[]},{expr:e,type:t,env:n}}else if(F(e)&&E(e,"_"))if(_e(t)||it(t)||Te(t)||De(t)){let i=Rn({expr:e,env:n,givenFunc:{type:Ft(t),value:ee(t)},context:{...r}});if(!i.$?.type||!i.$?.env)throw y({token:e.token,errorMessage:`Failed to evaluate expr and type for struct:
|
|
11300
11300
|
${w(e)}`});return{expr:i,type:i.$?.type,env:i.$?.env}}else throw y({token:e.token,errorMessage:`Cannot use _ with type ${A(t)}. Only supported with struct types.`});else if(F(e)&&E(e,".",1))if(ge(t)){let i=e.args[0];if(!U(i))throw y({token:e.token,errorMessage:`Expected identifier for enum variant, got ${w(i)}`});let o=i.token.value;if(!t.variants.find(l=>l.name===o))throw y({token:e.token,errorMessage:`Enum variant "${o}" not found in ${A(t)}`});let s={...t,selectedVariantName:o};return e.$={type:s,env:n,pathCollection:[]},{expr:e,type:s,env:n}}else throw y({token:e.token,errorMessage:`Cannot use . with type ${A(t)}. Only supported with enum types.`});else if(F(e)&&F(e.func)&&E(e.func,".",1))if(ge(t)){let i=e.func,o=i.args[0];if(!U(o))throw y({token:i.token,errorMessage:`Expected identifier for enum variant, got ${w(o)}`});let a=o.token.value;if(!t.variants.find(_=>_.name===a))throw y({token:e.token,errorMessage:`Enum variant "${a}" not found in ${A(t)}`});let l={...t,selectedVariantName:a},u=Rn({expr:e,env:n,givenFunc:{type:Ft(l),value:ee(l)},context:{...r}});if(!u.$?.type||!u.$?.env)throw y({token:e.token,errorMessage:`Failed to evaluate expr and type for enum variant:
|
|
@@ -11378,13 +11378,13 @@ Type expressions are required for return types in trait fields to support proper
|
|
|
11378
11378
|
Trait field "${o??"unnamed"}" has type: ${A(p)}
|
|
11379
11379
|
|
|
11380
11380
|
To avoid circular dependency issues, please explicitly provide the value for this field.`});s&&(s.$={env:n,type:p,value:f??K(p,{variableName:o,env:n,context:r}),pathCollection:[]}),e!==l&&(e.$={env:n,value:H,type:H.type,pathCollection:[]});let h;if(i&&!f&&He(p)&&p.level===0){if(o){let d=X(n,o),v=d[d.length-1];v?.value&&O(v.value[0])&&V(v.value[0].value)&&(h=v.value[0].value)}h||(h=Cn(p,o??`__associated_type_${Ye(n.modulePath)}`,{env:n,context:r}))}return{field:{label:o??`__field_${Ye(n.modulePath)}`,type:p,exprs:{expr:e,labelExpr:s,typeExpr:l,defaultValueExpr:u,assignedValueExpr:c},defaultValue:_,assignedValue:f,unassignedSomeType:h},env:n}}function xd({expr:e,env:t,context:n}){if(!E(e,I.trait))throw y({token:e.token,errorMessage:`Expected "trait", got:
|
|
11381
|
-
${w(e)}`});let r=Oe(t),i=[];r.fields=i,n.currentModulePath&&(r.definedInModulePath=n.currentModulePath),t=
|
|
11381
|
+
${w(e)}`});let r=Oe(t),i=[];r.fields=i,n.currentModulePath&&(r.definedInModulePath=n.currentModulePath),t=ze(t);let o=e.args,a=Cn(tt(),"Self",{env:t,context:n});a.trait=r,xn(t,"Runtime")&&(t=tn("Runtime",a,t,n));let l;if(o.length>0){let f=o[o.length-1];if(F(f)&&E(f,I.where)&&(l=f.args,l.length===0))throw y({token:f.token,errorMessage:"The where clause must have at least one constraint."})}let u=[],_={...n,SelfTraitType:r};if(l&&l.length>0){let f=Sd({constraintExprs:l,env:t,context:_,selfType:a,traitType:r,collectPendingTraits:!0});t=f.env,u=f.pendingTraits}for(let f=0;f<o.length;f++){let p=o[f];if(F(p)&&E(p,I.where)){if(f!==o.length-1)throw y({token:p.token,errorMessage:"The where clause must be the last argument in a trait definition."});continue}{let{field:m,env:g}=ph({expr:p,env:t,traitFieldIndex:f,context:{..._,SelfType:a,SelfTraitType:r},isForEvaluatingTraitType:!0});if(i.find(d=>d.label===m.label))throw y({token:F(p)?p.args[0]?.token??p.token:p.token,errorMessage:`Duplicate label 3 "${m.label}" in trait`});if(i.push(m),t=g,m.unassignedSomeType){let d=X(t,m.label),v=d[d.length-1];if((v?.value&&O(v.value[0])&&V(v.value[0].value)?v.value[0].value:void 0)?.id!==m.unassignedSomeType.id){let $=ee(m.unassignedSomeType),b=m.exprs.labelExpr?.token??m.exprs.expr.token??p.token,{env:L}=me({env:t,variable:{name:m.label,type:$.type,isCompileTimeOnly:!0,value:[$],token:b,initializedAtToken:b,consumedAtToken:void 0,isOwningTheRcValue:!1,isOwningTheSameRcValueAs:void 0,isReassignable:!1},allowVariableShadowing:!0});t=L}}}}if(u.length>0){let f=[];for(let p of u){let m=fh({lhsExpr:p.lhsExpr,traitExpr:p.traitExpr,originalConstraintExpr:p.originalConstraintExpr,env:t,context:_,selfType:a,traitType:r});t=m.env,m.success||f.push(p)}if(f.length>0){let p=f[0];Sd({constraintExprs:[p.originalConstraintExpr],env:t,context:_,selfType:a,traitType:r,collectPendingTraits:!1})}}t=_t(t,!0);let c=ee(r);return e.$={env:t,value:c,type:c.type,pathCollection:[]},e.func.$=e.$,e}function dh({args:e,env:t,context:n,forType:r}){let i=[];for(let a=0;a<e.length;a++){let s=e[a],{field:l,env:u}=Qr({expr:s,env:t,tupleFieldIndex:a,context:{...n},forType:r});if(l.label&&i.find(c=>c.label===l.label))throw y({token:F(s)?s.args[0]?.token??s.token:s.token,errorMessage:`Duplicate label "${l.label}" in tuple`});i.push(l),t=u}return{type:Yi(i),env:t}}function Vd({expr:e,env:t,context:n}){if(e.args.length===0){let o=ee(Vn());return e.$={env:t,value:o,type:o.type,pathCollection:[]},e}let{type:r,env:i}=dh({args:e.args,env:t,context:{...n},forType:"tuple"});return t=i,r.fields.forEach(o=>{if(o.exprs.defaultValueExpr)throw y({token:o.exprs.defaultValueExpr.token,errorMessage:"Tuple type cannot have default value."})}),t=hu({env:t,context:n,tupleType:r,errorToken:e.token}),e.$={env:t,value:ee(r),type:Ft(r),pathCollection:[]},e}function Dd({expr:e,env:t,context:n}){if(!E(e,I.union))throw y({token:e.token,errorMessage:`Expected "union", got:
|
|
11382
11382
|
${w(e)}`});let r=Nu(t);n.currentModulePath&&(r.definedInModulePath=n.currentModulePath,r.trait.definedInModulePath=n.currentModulePath);let i=[];r.fields=i;let o=e.args;for(let s=0;s<o.length;s++){let l=o[s],{field:u,env:_}=Qr({expr:l,env:t,tupleFieldIndex:s,context:{...n,SelfType:r},forType:"union"});if(i.find(f=>f.label===u.label))throw y({token:F(l)?l.args[0]?.token??l.token:l.token,errorMessage:`Duplicate label "${u.label}" in union field.`});if(u.defaultValue)throw y({token:u.exprs.defaultValueExpr?.token??u.exprs.expr.token,errorMessage:"Union type cannot have default value for its fields."});if(ui(u.type,t)||!Ar(u.type,t))throw y({token:u.exprs.expr.token,errorMessage:"Union type fields must be runtime types."});if(Le(u.type))throw y({token:u.exprs.expr.token,errorMessage:"Union type cannot have field with garbage-collected type."});i.push(u),t=_}t=du({unionType:r,env:t,context:n}),t=mu({unionType:r,env:t,context:n}),t=yu({unionType:r,env:t,context:n});let a=ee(r);return e.$={env:t,value:a,type:a.type,pathCollection:[]},e.func.$=e.$,e}function Ja({expr:e,env:t,context:n}){let r=n.expectedType?.type;if(!r)throw y({token:e.token,errorMessage:`Expected a function type, got:
|
|
11383
11383
|
${w(e)}`});let i,o=!1,a,s;if(G(r))i=r;else if(V(r)){let Y=nn(r);if(Y)a=Y,i=Y.isFn.callType,o=!0,s=r;else throw y({token:e.token,errorMessage:`Expected a function type or Impl(Fn(...)), got:
|
|
11384
11384
|
${A(r)}`})}else throw y({token:e.token,errorMessage:`Expected a function type or Impl(Fn(...)), got:
|
|
11385
11385
|
${A(r)}${Ce(r)?`
|
|
11386
11386
|
Use 'dyn((x) => expr)' for dynamic dispatch`:""}`});let l=o?"=>":"->",u=o?"closure":"function";if(!E(e,l,2))throw y({token:e.token,errorMessage:`Expected ${l} for anonymous ${u}, got:
|
|
11387
|
-
${w(e)}`});let _=e.args[0],c=e.args[1],f=[];F(_)&&E(_,I.tuple)?f=_.args:f=[_];let p=[],m=[],g=[];for(let Y=0;Y<f.length;Y++){let Z=f[Y];if(F(Z)&&E(Z,I.forall)){if(Y!==0)throw y({token:Z.token,errorMessage:"forall(...) must be the first parameter expression"});p=Z.args}else F(Z)&&E(Z,I.using)?m=Z.args:g.push(Z)}if(g.length!==i.parameters.length)throw y({token:e.token,errorMessage:`Expected ${i.parameters.length} regular parameters, got ${g.length}`});let h=t;t=
|
|
11387
|
+
${w(e)}`});let _=e.args[0],c=e.args[1],f=[];F(_)&&E(_,I.tuple)?f=_.args:f=[_];let p=[],m=[],g=[];for(let Y=0;Y<f.length;Y++){let Z=f[Y];if(F(Z)&&E(Z,I.forall)){if(Y!==0)throw y({token:Z.token,errorMessage:"forall(...) must be the first parameter expression"});p=Z.args}else F(Z)&&E(Z,I.using)?m=Z.args:g.push(Z)}if(g.length!==i.parameters.length)throw y({token:e.token,errorMessage:`Expected ${i.parameters.length} regular parameters, got ${g.length}`});let h=t;t=ze(a_(t));for(let Y=0;Y<p.length;Y++){let Z=p[Y],se=i.forallParameters[Y];if(!U(Z))throw y({token:Z.token,errorMessage:`Expected parameter name for forall parameter, got ${w(Z)}`});let Se=Z.token.value;if(Se!==se.label)throw y({token:Z.token,errorMessage:`Forall parameter name must match expected name.
|
|
11388
11388
|
Expected: "${se.label}"
|
|
11389
11389
|
Got: "${Se}"`})}for(let Y=0;Y<i.forallParameters.length;Y++){let Z=p[Y],se=i.forallParameters[Y],{env:Se}=me({env:t,variable:{name:se.label,type:se.type,isCompileTimeOnly:se.isCompileTimeOnly,value:[K(se.type,{variableName:se.label,env:t,context:n})],token:Z?.token??ae,initializedAtToken:Z?.token??ae,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});t=Se,Z&&(Z.$={env:t,type:se.type,value:K(se.type,{variableName:se.label,env:t,context:n}),pathCollection:[]})}let d=i.implicitParameters.some(Y=>Y.isEffectRowSpread),v,T;if(d&&m.length>0){v=[];for(let Y of m)if(F(Y)&&E(Y,":",2)){let Z=Y.args[0],se=Y.args[1];if(!U(Z))throw y({token:Z.token,errorMessage:`Expected identifier for effect name, got ${w(Z)}`});let Se=Z.token.value,pe=S({expr:Ae(se),env:h,context:{...n,isEvaluatingFunctionType:!0}});if(!pe.$?.value||!O(pe.$.value))throw y({token:se.token,errorMessage:`Expected a type for effect parameter "${Se}", got ${w(se)}`});let Ve=pe.$.value.value;v.push({label:Se,type:Ve,isCompileTimeOnly:!0,isImplicit:!0,isOwningTheRcValue:!1,isQuote:!1,exprs:{expr:Y,labelExpr:Z,typeExpr:se,defaultValueExpr:void 0}})}else if(U(Y)){let Z=Y.token.value,Se=X(h,Z).at(-1);if(!Se)throw y({token:Y.token,errorMessage:`Variable "${Z}" not found. Cannot infer type for using() parameter.`});v.push({label:Z,type:Se.type,isCompileTimeOnly:!0,isImplicit:!0,isOwningTheRcValue:!1,isQuote:!1,exprs:{expr:Y,labelExpr:Y,typeExpr:Y,defaultValueExpr:void 0}})}else throw y({token:Y.token,errorMessage:`Expected "name : Type" or identifier in using(), got ${w(Y)}`});T=Ir(v);for(let Y of i.implicitParameters)Y.isEffectRowSpread&&V(Y.type)&&Y.type.isEffectsRow&&(Y.type.resolvedConcreteType=T)}else if(m.length>0){let Y=[];for(let se of m)if(F(se)&&E(se,":",2)){let Se=se.args[0],pe=se.args[1];if(!U(Se))throw y({token:Se.token,errorMessage:`Expected identifier for effect name, got ${w(Se)}`});let Ve=S({expr:Ae(pe),env:h,context:{...n,isEvaluatingFunctionType:!0}});if(!Ve.$?.value||!O(Ve.$.value))throw y({token:pe.token,errorMessage:`Expected a type for effect parameter "${Se.token.value}", got ${w(pe)}`});Y.push({name:Se.token.value,type:Ve.$.value.value,nameExpr:Se})}else if(U(se))Y.push({name:se.token.value,type:void 0,nameExpr:se});else throw y({token:se.token,errorMessage:`Expected "name : Type" or identifier in using(), got ${w(se)}`});if(Y.some(se=>se.type!==void 0)){if(Y.length!==i.implicitParameters.length)throw y({token:e.token,errorMessage:`Effect row mismatch: closure declares ${Y.length} effects, but call site resolved ${i.implicitParameters.length} effects.`});let se=new Set,Se=[];for(let pe=0;pe<Y.length;pe++){let Ve=Y[pe];if(!Ve.type){Se.push({...i.implicitParameters[pe],label:Ve.name,exprs:{...i.implicitParameters[pe].exprs,expr:Ve.nameExpr,labelExpr:Ve.nameExpr}}),se.add(pe);continue}let Ke=!1;for(let J=0;J<i.implicitParameters.length;J++){if(se.has(J))continue;let Q=i.implicitParameters[J];if(q({type:Ve.type,env:h},{type:Q.type,env:h})){Se.push({...Q,label:Ve.name,exprs:{...Q.exprs,expr:Ve.nameExpr,labelExpr:Ve.nameExpr}}),se.add(J),Ke=!0;break}}if(!Ke)throw y({token:Ve.nameExpr.token,errorMessage:`Effect row type mismatch for "${Ve.name}": closure declares ${A(Ve.type)}, but no matching resolved effect found.`})}v=Se,T=Ir(v)}else{if(m.length!==i.implicitParameters.length)throw y({token:e.token,errorMessage:`Expected ${i.implicitParameters.length} implicit parameters in using(...), got ${m.length}`});v=i.implicitParameters}}else v=i.implicitParameters;let $=[];for(let Y=0;Y<v.length;Y++){let Z=v[Y],se=T?Z.exprs?.labelExpr:m[Y],Se=Z.label;se&&U(se)&&(Se=se.token.value);let pe;if(G(Z.type)){let oe=i.implicitParameters[Y]?.label,ue=[Z.label];oe&&oe!==Z.label&&ue.push(oe);for(let ye of ue){let ie=X(h,ye),Ne=ie[ie.length-1];if(Ne?.value&&Ne.value.length>0){let $e=Ne.value[0];if($e&&ne($e)){pe=$e;break}}}if(!pe){let ie=pn(h,Ne=>Ne.isImplicit===!0&&Ne.isCompileTimeOnly===!0&&ne(Ne.value?.[0])&&q({type:Z.type,env:h},{type:Ne.type,env:h})).at(-1);ie?.value?.[0]&&ne(ie.value[0])&&(pe=ie.value[0])}}let Ve=pe||K(Z.type,{variableName:Se,env:t,context:n}),Ke=n.isInsideIoAsyncCall&&o&&G(Z.type)&&!pe;if(Ke&&$.push({name:Se,type:Z.type,token:se?.token??ae}),!Ke&&n.isInsideIoAsyncCall&&o&&Te(Z.type)&&!pe){let oe=Z.type;for(let ue of oe.fields)G(ue.type)&&$.push({name:ue.label,type:ue.type,token:se?.token??ae})}let{env:Q}=me({env:t,variable:{name:Se,type:Z.type,isCompileTimeOnly:!Ke,isImplicit:!0,value:Ke?void 0:[Ve],token:se?.token??ae,initializedAtToken:se?.token??ae,consumedAtToken:void 0,isOwningTheRcValue:!1,isEffectParam:Ke||void 0},allowVariableShadowing:!0});t=Q,se&&(se.$={env:t,type:Z.type,value:Ke?void 0:Ve,pathCollection:[]})}for(let Y=0;Y<g.length;Y++){let Z=g[Y],se=i.parameters[Y];if(se.isCompileTimeOnly){if(!U(Z))throw y({token:Z.token,errorMessage:`Expected parameter name for compile-time parameter, got ${w(Z)}`});let Ke=Z.token.value;if(Ke!=="_"&&Ke!==se.label)throw y({token:Z.token,errorMessage:`Compile-time parameter name must match expected name.
|
|
11390
11390
|
Expected: "${se.label}"
|
|
@@ -11393,7 +11393,7 @@ Got: "${Ke}"`})}let Se=Z.token.value,pe=se.label,{env:Ve}=me({env:t,variabl
|
|
|
11393
11393
|
- Got : ${A(z)}`});D.$?.env&&(t=D.$?.env),t=_t(t,!0),t=h;let re;if(R&&x&&x.size>0&&(re=ja({capturedVariables:x,env:t})),R&&$.length>0){re||(re=new Map);for(let Y of $)re.set(Y.name,{frameLevel:0,usageType:"read",token:Y.token,value:void 0,type:Y.type,isEffectParam:!0})}let j,W,le,ce,ve=C;if((n.isAnalyzingCtfeCapability||n.forceCompileTimeBindings)&&!o){let Y=ro(C,t,n);Y&&(ve=Y)}if(o&&a&&s){ce=Ha({expectedCaptureType:void 0,capturedVariablesWithValues:re,env:t,closureToken:e.token,context:{...n}}).captureType;let Z=Du(L,t),{capturedVariableDupExpressions:se,env:Se}=Ka({capturedVariablesWithValues:re,env:t,context:n});le=se,t=Se,C.funcId=`closure_${Ye(t.modulePath)}`,C.closureInfo={closureType:Z,captureType:ce,effectParamNames:$.length>0?$.map(pe=>pe.name):void 0},V(s)&&ce&&qa({wrapperType:s,captureType:ce,env:t,errorToken:e.token}),s.resolvedConcreteType=ce,j={...s,resolvedConcreteType:ce},W=void 0}else j=ve.type,W=ve;return e.$={env:t,type:j,value:W,pathCollection:R&&x?so(x):[],deferredDupExpressions:o&&le?le:void 0,captureType:o?ce:void 0,closureFunctionValue:o?ve:void 0,isAnonymousFunctionDefinition:!0},R&&Ge(e,!0),e}function Md({expr:e,env:t,context:n}){let r=e.args;if(r.length===0)throw y({token:e.token,errorMessage:`Expected at least one element in array, got ${r.length}`});let i=r.length,o,a;n.expectedType&&ke(n.expectedType.type)&&(a=n.expectedType.type.childType);let s=[],l=[];for(let c=0;c<r.length;c++){let f=r[c],p=S({expr:f,env:t,context:{...n,expectedType:a?{type:a,env:t}:void 0}});if(Yt(p,n),!p.$)throw y({token:f.token,errorMessage:`Failed to evaluate array element: ${w(f)}`});if(t=p.$.env,s.push(p.$.value),!o)o=a||p.$.type;else if(!q({type:o,env:t},{type:p.$.type,env:t}))if(q({type:yt({type:o,expectedType:void 0,expr:void 0,env:t}),env:t},{type:p.$.type,env:t}))o=p.$.type;else throw y({token:f.token,errorMessage:`Array element type mismatch:
|
|
11394
11394
|
Expected type: ${A(o)}
|
|
11395
11395
|
Given type: ${A(p.$.type)}`});l.push(p)}let u=hr(o,Xt("Usize",i)),_=s.every(c=>!!c)?Rr(u,s):void 0;return e.$={env:t,type:u,value:_,pathCollection:[],runtimeArgExprsInOrder:l},Ge(e,!0),e}function Od(e,t){if(e.token.type==="bool"){let n=e.token.value==="true",r=pt(n);return e.$={env:t,value:r,type:r.type,pathCollection:[]},e}else throw y({token:e.token,errorMessage:`Expected bool literal, got ${e.tag}`})}function Rd(e,t){if(e.token.type==="char"){let n=mh(e.token.value),r=Bn(BigInt(n));return e.$={env:t,value:r,type:r.type,pathCollection:[]},e}else throw y({token:e.token,errorMessage:`Expected char literal, got ${e.tag}`})}function mh(e){let t=e.slice(1,-1);if(t.length===1)return t.charCodeAt(0);if(t.length===2&&t[0]==="\\"){let n=t[1];switch(n){case"n":return 10;case"t":return 9;case"r":return 13;case"\\":return 92;case"'":return 39;case'"':return 34;case"0":return 0;case"a":return 7;case"b":return 8;case"f":return 12;case"v":return 11;default:throw new Error(`Unknown escape sequence: \\${n}`)}}else throw new Error(`Invalid char literal: ${e}`)}function Pd({expr:e,env:t,context:n}){let r=[],i=e.args;if(i.length===0)throw y({token:e.token,errorMessage:`Expected at least one element in comptime_list, got ${i.length}`});let o;n.expectedType&&xt(n.expectedType.type)&&(o=n.expectedType.type.childType);for(let s=0;s<i.length;s++){let l=i[s],u=S({expr:l,env:t,context:{...n}});if(!u.$||!u.$.value)throw y({token:l.token,errorMessage:`Failed to evaluate expr_list element. Expected compile-time known value:
|
|
11396
|
-
${w(l)}`});t=u.$.env;let _=u.$.value;if(r.push(_),!o)o=u.$.type;else if(!q({type:o,env:t},{type:u.$.type,env:t}))throw y({token:l.token,errorMessage:`Mismatched element types in comptime_list. Expected element of type ${A(o)}, got ${A(u.$.type)}`})}let a=Un(o,r);return e.$={env:t,type:a.type,value:a,pathCollection:[]},e}function zd(e,t,n){let i=X(t,"Box").find(p=>p.value&&ne(p.value[0])&&G(p.type));if(!i||!i.value||!ne(i.value[0]))throw new Error("Cannot find Box type constructor in environment");let o=i.value[0],a=o.type,s=a.parameters[0],l=ee(e),u=
|
|
11396
|
+
${w(l)}`});t=u.$.env;let _=u.$.value;if(r.push(_),!o)o=u.$.type;else if(!q({type:o,env:t},{type:u.$.type,env:t}))throw y({token:l.token,errorMessage:`Mismatched element types in comptime_list. Expected element of type ${A(o)}, got ${A(u.$.type)}`})}let a=Un(o,r);return e.$={env:t,type:a.type,value:a,pathCollection:[]},e}function zd(e,t,n){let i=X(t,"Box").find(p=>p.value&&ne(p.value[0])&&G(p.type));if(!i||!i.value||!ne(i.value[0]))throw new Error("Cannot find Box type constructor in environment");let o=i.value[0],a=o.type,s=a.parameters[0],l=ee(e),u=ze(a.env),{env:_}=me({env:u,variable:{name:s.label,token:ae,type:l.type,isCompileTimeOnly:!0,initializedAtToken:ae,consumedAtToken:void 0,value:[l],isOwningTheRcValue:!1}}),{value:c,callerEnv:f}=oo({functionCalleeExpr:void 0,functionType:a,functionValue:o,argValues:{forallArgs:[],args:[{value:l,parameterType:s.type,argType:tt()}],variadicArgs:[]},callerEnv:t,calleeEnv:_,context:n});if(!O(c)||!ft(c.value))throw new Error("Box type constructor did not return a type value");return{boxType:c.value,env:f}}function yh(e,t,n){try{let r=S({expr:e,env:t,context:n});if(!r.$)return!1;let i=r.$.value;return ne(i)?!!X(t,"box").find(s=>s.value&&ne(s.value[0])&&s.value[0]===i):O(i)?!!i.value?.typeName?.startsWith("Box("):!1}catch{return!1}}function Ud({expr:e,env:t,context:n}){he(e,I.dyn,1);let r=e.args[0],i=n.expectedType,o;if(n.expectedType&&Ce(n.expectedType.type)){let h=n.expectedType.type;if(o=Cn(tt(),"",{requiredTraits:h.requiredTraits.map(d=>d.traitType),negativeTraits:h.negativeTraits.map(d=>d.traitType),env:t,context:n}),F(r)&&yh(r.func,t,{...n})&&E(r.args[0],"=>")){let{boxType:d,env:v}=zd(o,t,n);t=v,i={type:d,env:t}}else i={type:o,env:n.expectedType.env}}else i=void 0;let a=S({expr:r,env:t,context:{...n,expectedType:i}});if(!a.$)throw y({token:r.token,errorMessage:`Failed to evaluate the value expression for 'dyn':
|
|
11397
11397
|
${w(r)}`});let s=a.$.type,l=s,u=a;if(!ft(l)&&!(V(l)&&be(l))){let{boxType:h,env:d}=zd(l,t,{...n});t=d;let v={tag:"Atom",token:{...r.token,value:"box",type:"identifier"},$:void 0},T={tag:"FnCall",func:v,args:[a],token:r.token,$:void 0},$=S({expr:T,env:t,context:{...n,expectedType:{type:h,env:t}}});if(!$.$)throw y({token:r.token,errorMessage:`Failed to auto-box value for 'dyn':
|
|
11398
11398
|
${w(r)}`});t=$.$.env,l=$.$.type,u=$,e.args[0]=$}else t=a.$.env;Yt(u,n),t=u.$.env;let _=[],c=[],f=new Set,p;if(n.expectedType&&Ce(n.expectedType.type))p=n.expectedType.type;else if($n(l)){let h=l.fields[0].type;if(h.trait){let d=[];for(let v of h.trait.fields)v.assignedValue&&Tt(v.assignedValue)&&d.push(v.assignedValue.type);p=Do({requiredTraits:d,negativeTraits:[],env:t}),t=No({dynType:p,env:t,context:n})}else throw y({token:e.token,errorMessage:`'${I.dyn}' with Box(T) requires T to have a trait. Got boxed type: ${A(h)}`})}else if(l.trait){let h=[];for(let d of l.trait.fields)d.assignedValue&&Tt(d.assignedValue)&&h.push(d.assignedValue.type);p=Do({requiredTraits:h,negativeTraits:[],env:t}),t=No({dynType:p,env:t,context:n})}else throw y({token:e.token,errorMessage:`'${I.dyn}' requires either an expected Dyn type context, a SomeType (Impl) value, or a type with a trait. Got value type: ${A(l)}`});let m=[];if($n(l)){let h=l.fields[0].type;(V(h)||Ce(h))&&m.push(...h.negativeTraits.map(d=>d.traitType)??[])}for(let{traitType:h}of p.requiredTraits)for(let d of m)if(q({type:h,env:t},{type:d,env:t}))throw y({token:e.token,errorMessage:`Required trait ${A(h)} is in the negative traits list and cannot be used.`});for(let{traitType:h}of p.requiredTraits)if(!f.has(h))if($n(l)&&(V(l.fields[0].type)||Ce(l.fields[0].type))){let d=l.fields[0].type,v=!1,T=V(d)&&d.resolvedConcreteType?d.resolvedConcreteType:s!==l?s:void 0;if(T?.trait){for(let $ of T.trait.fields)if($.assignedValue&&Tt($.assignedValue)&&q({type:h,env:t},{type:$.assignedValue.type,env:t})){c.push($.assignedValue),_.push($.assignedValue.type),f.add(h),v=!0;break}}if(!v){let $=d.requiredTraits.map(b=>b.traitType);for(let b of $)if(q({type:h,env:t},{type:b,env:t})){let L=[];for(let R=0;R<h.fields.length;R++){let N=h.fields[R],B=b.fields.findIndex(D=>D.label===N.label);B===-1?L.push(void 0):L.push(b.fields[B].assignedValue)}let C=Fi(h,L);c.push(C),_.push(C.type),f.add(h),v=!0;break}if(!v)throw y({token:e.token,errorMessage:`Required trait ${A(h)} not found in SomeType's requiredTraits.`})}}else{let d=$n(l)?l.fields[0].type:l;if(d.trait){let v=!1;for(let T of d.trait.fields)if(T.assignedValue&&Tt(T.assignedValue)&&q({type:h,env:t},{type:T.assignedValue.type,env:t})){c.push(T.assignedValue),_.push(T.assignedValue.type),f.add(h),v=!0;break}if(!v)throw y({token:e.token,errorMessage:`Required trait ${A(h)} is not implemented by type ${A(l)}.`})}else throw y({token:e.token,errorMessage:`Cannot find trait ${A(h)} for value type ${A(l)}.`})}let g=[];for(let{traitType:h}of p.requiredTraits){let d=_.findIndex(v=>q({type:h,env:t},{type:v,env:t}));if(d===-1)throw y({token:e.token,errorMessage:`No trait value found for expected trait type ${A(h)}.`});g.push(c[d])}return e.$={env:t,value:void 0,type:p,pathCollection:a.$.pathCollection,dynCallTraitValues:g},Ge(e,!0),e}function Bd(e,t,n){if(e.token.type==="float"){let r=parseFloat(e.token.value),i="ComptimeFloat";if(n.expectedType){let a=n.expectedType.type;Fo(a)?i="F32":Lo(a)&&(i="F64")}let o=Xt(i,r);return e.$={env:t,value:o,type:o.type,pathCollection:[]},e}else throw y({token:e.token,errorMessage:`Expected float literal, got ${e.tag}`})}function Gd(e,t,n){if(e.token.type==="integer"){let r=e.token.value.replace(/_/g,""),i=10;r.match(/^0x/i)?(i=16,r=r.slice(2)):r.match(/^0b/i)?(i=2,r=r.slice(2)):r.match(/^0o/i)&&(i=8,r=r.slice(2));let o="ComptimeInt";if(n.expectedType){let u=n.expectedType.type;ho(u)?o="Usize":vo(u)?o="Isize":Kn(u)?o="U8":To(u)?o="I8":Eo(u)?o="U16":$o(u)?o="I16":bo(u)?o="U32":Co(u)?o="I32":ko(u)?o="U64":wo(u)&&(o="I64")}let a=o==="U64"||o==="I64"||o==="Usize"||o==="Isize",s;a||o==="ComptimeInt"?i===16?s=BigInt("0x"+r):i===8?s=BigInt("0o"+r):i===2?s=BigInt("0b"+r):s=BigInt(r):s=parseInt(r,i);let l=Xt(o,s);return e.$={env:t,value:l,type:l.type,pathCollection:[]},e}else throw y({token:e.token,errorMessage:`Expected integer literal, got ${e.tag}`})}function Wd(e,t){if(e.token.type==="string"){let n=on(JSON.parse(e.token.value));return e.$={env:t,value:n,type:n.type,pathCollection:[]},e}else throw y({token:e.token,errorMessage:`Expected string literal, got ${e.tag}`})}function gh({expr:e,tupleFieldIndex:t,env:n,context:r,elementIndex:i,runtimeArgExprsInOrder:o}){let a=e,s=e,l;if(F(a)&&E(a,":",2)){let p=a.args[0];throw y({token:p.token,errorMessage:"Labelled field is not allowed in tuple value."})}let u=r.expectedType?.type,_;if(u){if(!we(u))throw y({token:e.token,errorMessage:`(2) Failed to evaluate the tuple fields. Expected type to be:
|
|
11399
11399
|
${A(u)}`});let p=u.fields[t];if(!p)throw y({token:e.token,errorMessage:`Failed to get the tuple field at index ${t}`});_=p.type}let c=S({expr:s,env:n,context:{...r,expectedType:_?{type:_,env:n}:void 0}});if(Yt(c,r),!c.$)throw y({token:s.token,errorMessage:`Failed to evaluate the tuple field: ${w(s)}`});n=c.$.env;let f=c.$.value;if(f&&O(c.$.value))throw y({token:s.token,errorMessage:`Cannot store a type value in tuple, please use module instead:
|
|
@@ -11404,7 +11404,7 @@ ${A(s)}`});if(mr(s,t)&&l)throw y({token:r.token,errorMessage:`Unexpected "compti
|
|
|
11404
11404
|
${A(s)}
|
|
11405
11405
|
|
|
11406
11406
|
Generic functions must be compile-time known to enable monomorphization. Consider using:
|
|
11407
|
-
comptime(${_}) : ${A(s)}`});let{env:c}=me({env:t,variable:{name:_,type:s,isCompileTimeOnly:l,value:l?[K(s,{variableName:_,env:t,context:n})]:void 0,token:r.token,initializedAtToken:void 0,consumedAtToken:void 0,isReassignable:!0,isOwningTheRcValue:Le(s),isImplicit:u}});return t=c,r.$={env:t,type:s,pathCollection:[[_]]},e.$={env:t,type:H.type,value:H,pathCollection:[]},{expr:e,variableExpr:r,variableName:_}}function ts({expr:e,env:t,context:n,throwErrorOnUndefined:r}){let i=e.token.value;if(i==="Type"){let o=ee(tt());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="Module"){let o=ee(
|
|
11407
|
+
comptime(${_}) : ${A(s)}`});let{env:c}=me({env:t,variable:{name:_,type:s,isCompileTimeOnly:l,value:l?[K(s,{variableName:_,env:t,context:n})]:void 0,token:r.token,initializedAtToken:void 0,consumedAtToken:void 0,isReassignable:!0,isOwningTheRcValue:Le(s),isImplicit:u}});return t=c,r.$={env:t,type:s,pathCollection:[[_]]},e.$={env:t,type:H.type,value:H,pathCollection:[]},{expr:e,variableExpr:r,variableName:_}}function ts({expr:e,env:t,context:n,throwErrorOnUndefined:r}){let i=e.token.value;if(i==="Type"){let o=ee(tt());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="Module"){let o=ee(hn(1));return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="Trait"){let o=ee(hn(1));return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="unit"){let o=ee(Vn());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="comptime_int"){let o=ee(fr());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="comptime_float"){let o=ee(Li());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="comptime_string"){let o=ee(Vt());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="bool"){let o=ee(Je());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="usize"){let o=ee(gt());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="isize"){let o=ee(Ai());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="u8"){let o=ee(Ii());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="i8"){let o=ee(Si());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="u16"){let o=ee(Ni());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="i16"){let o=ee(xi());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="u32"){let o=ee(Vi());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="i32"){let o=ee(Pr());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="u64"){let o=ee(Di());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="i64"){let o=ee(Mi());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="f32"){let o=ee(Oi());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="f64"){let o=ee(zr());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="char"){let o=ee(Tu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="short"){let o=ee(Eu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="ushort"){let o=ee($u());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="int"){let o=ee(bu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="uint"){let o=ee(Cu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="long"){let o=ee(ku());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="ulong"){let o=ee(wu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="longlong"){let o=ee(Fu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="ulonglong"){let o=ee(Lu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="longdouble"){let o=ee(Au());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="void"){let o=ee(Iu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="Expr"){let o=ee(cn());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="Self"&&n.SelfType){let o=ee(n.SelfType);return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="SelfTrait"&&n.SelfTraitType){let o=ee(n.SelfTraitType);return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="SelfModule"&&n.SelfModuleType){let o=ee(n.SelfModuleType);return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else{let o=X(t,i);if(o.length){let a=o[o.length-1];if(!a.initializedAtToken&&r&&!G(a.type)&&!O(a.value?.[0]))throw y({token:e.token,errorMessage:`Variable "${i}" is not initialized`});let s=a.type.isExtern==="c"&&de(a.value?.[0])&&!(G(a.type)||He(a.type))?void 0:a.value?.[0];if(e.$={env:t,type:a.type,value:s,originType:a.type,variableName:a.name,pathCollection:[[a.name]],sourceVariable:a},n.isEvaluatingFunctionBodyOrAsyncBlock&&n.isEvaluatingFunctionBodyOrAsyncBlock.kind==="function-body"&&n.capturedVariables&&n.isEvaluatingFunctionBodyOrAsyncBlock.evaluationEnv){let l=n.isEvaluatingFunctionBodyOrAsyncBlock.evaluationEnv.frames.length;a.frameLevel<l&&ao(a.name,a.frameLevel,"own",e.token,n)}if(n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="async-block"){let l=n.isEvaluatingFunctionBodyOrAsyncBlock.evaluationEnv.frames.length;a.frameLevel<l&&ao(a.name,a.frameLevel,"own",e.token,n)}return e}else throw y({token:e.token,errorMessage:`Variable "${i}" not found.`})}}function Pl(e,t){let n=uu(t),r=`Right-hand side contains "${n}" from function.`;throw F(e)&&E(e,I.cond)?r=`Cannot assign "cond" expression to variable when all cases contain "${n}" statements. Consider using the "cond" result directly without assignment, or ensure at least one case doesn't return.`:F(e)&&E(e,I.match)?r=`Cannot assign "match" expression to variable when all cases contain "${n}" statements. Consider using the "match" result directly without assignment, or ensure at least one case doesn't return.`:F(e)&&E(e,I.begin)&&(r=`Cannot assign "begin" expression to variable when it contains "${n}" statement.`),y({token:e.token,errorMessage:r})}function vh(e,t){if(ke(e)&&de(e.length)){let n=e.length;if(n.variableName){let r=X(t,n.variableName);if(r.length>0){let i=r[r.length-1];if(i.value?.[0]&&!de(i.value[0]))return hr(e.childType,i.value[0])}}}return e}function qd({expr:e,env:t,context:n}){if(!E(e,"=",2))throw y({token:e.token,errorMessage:'Expected "=" for assignment.'});let r=e.args[0],i=e.args[1];if(U(r)||F(r)&&E(r,":",2)){let o;if(U(r)){let d=ts({expr:r,env:t,context:{...n},throwErrorOnUndefined:!1});if(!d.$)throw y({token:r.token,errorMessage:`Failed to evaluate left-hand side of assignment: ${w(r)}`});t=d.$.env,r=d,o=r.token.value}else{let{expr:d,variableExpr:v,variableName:T}=es({expr:r,env:t,context:{...n}});d.$?.env&&(t=d.$?.env),r=v,o=T}let a=X(t,o);if(!a.length)throw y({token:r.token,errorMessage:`Variable ${o} not found in the environment`});let s=a[a.length-1];if(!s.isReassignable)throw y({token:r.token,errorMessage:`Cannot reassign "${o}".
|
|
11408
11408
|
You can mutate fields (e.g., ${o}.field = value) but cannot reassign itself.`});if(i=S({expr:i,env:t,context:{...n,expectedType:{type:s.type,env:t},isInsideGivenHandler:s.isImplicit?!0:n.isInsideGivenHandler}}),!i.$)throw y({token:i.token,errorMessage:`Failed to evaluate right-hand side of assignment: ${w(i)}`});t=i.$.env,oi(i,t),Gr(i),Yt(i,n),t=i.$.env,nt(i.$?.controlFlow)&&Pl(i,i.$.controlFlow);let l=i.$?.type;if(!l)try{let{expr:d,type:v,env:T}=Mr({expr:i,type:s.type,env:t,context:{...n}});i=d,l=v,t=T}catch(d){throw y({token:i.token,errorMessage:`(evaluateAssignment) Failed to synthesize type for expression: ${w(i)}
|
|
11409
11409
|
${d}`})}if(s.isCompileTimeOnly||(l=yt({type:l,expectedType:s.type,expr:i,env:t})),!q({type:s.type,env:t},{type:l,env:t}))if(Pi(s.type))try{let{expr:d,type:v,env:T}=Mr({expr:i,type:s.type,env:t,context:{...n}});if(q({type:s.type,env:T},{type:v,env:T})){i=d,l=v,t=T;let $=vh(s.type,t);t=Be(t,s,{...s,type:$})}else throw y({token:r.token,errorMessage:`Incompatible types:
|
|
11410
11410
|
- Expected: ${A(s.type)}
|
|
@@ -11417,9 +11417,9 @@ Impl(...) uses static dispatch and the concrete type is fixed at first assignmen
|
|
|
11417
11417
|
Consider using Dyn(...) for dynamic dispatch if you need to reassign to different implementations.`},{token:s.initializedAtToken??s.token,errorMessage:"First assigned here:"}]);if(n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"&&n.capturedVariables&&n.isEvaluatingFunctionBodyOrAsyncBlock.evaluationEnv){let b=n.isEvaluatingFunctionBodyOrAsyncBlock.evaluationEnv.frames.length;s.frameLevel<b&&ao(s.name,s.frameLevel,"own",r.token,n)}let d=s.isCompileTimeOnly&&c?an(c):void 0,v=ii(t.modulePath,o),T=Oo(i,t,t.modulePath),$=T;T?.consumedAtToken&&($=void 0),t=Be(t,s,{...s,id:v,value:d?[d]:void 0,type:f,isOwningTheRcValue:Le(f),isOwningTheSameRcValueAs:$}),p=!0}else{if(n.isEvaluatingLoopBody&&s.frameLevel<n.isEvaluatingLoopBody.env.frames.length)throw lt([{token:r.token,errorMessage:"Cannot initialize a variable that is defined outside the while loop."},{token:s.token,errorMessage:"Defined here:"}]);if(n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"&&s.frameLevel<n.isEvaluatingFunctionBodyOrAsyncBlock.type.env.frames.length)throw lt([{token:r.token,errorMessage:"Cannot initialize a variable that is defined outside the function body."},{token:s.token,errorMessage:"Defined here:"}]);let d=s.isCompileTimeOnly&&c?an(c):void 0,v=Oo(i,t,t.modulePath),T=v;v?.consumedAtToken&&(T=void 0),t=Be(t,s,{...s,initializedAtToken:r.token,value:d?[d]:void 0,type:f,isOwningTheRcValue:Le(f),isOwningTheSameRcValueAs:T})}let g=X(t,o),h=g[g.length-1];return r.$={env:t,type:h.type,value:h.isCompileTimeOnly?c:void 0,pathCollection:[[o]]},p?(e.$={env:t,value:s.value?.[0],type:s.type,pathCollection:[],isCompileTimeOnlyAssignment:s.isCompileTimeOnly},Ge(e,!0,m?.frameLevel===t.frames.length-1?m:void 0)):e.$={env:t,value:H,type:H.type,pathCollection:[],isCompileTimeOnlyAssignment:s.isCompileTimeOnly},e}else{let o=S({expr:r,env:t,context:{...n,expectedType:void 0,isLhsOfAssignment:!0}});if(!o.$)throw y({token:r.token,errorMessage:`Failed to evaluate left-hand side of assignment: ${w(r)}`});if(n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"&&o.$.pathCollection){for(let f of o.$.pathCollection)if(f.length>0){let p=f[0];if(typeof p=="string"){let m=X(t,p);if(m.length>0){let g=m[m.length-1];ao(p,g.frameLevel,"write",r.token,n)}}}}let a=o.$.type;if(i=S({expr:i,env:t,context:{...n,expectedType:{type:a,env:t}}}),!i.$)throw y({token:i.token,errorMessage:`Failed to evaluate right-hand side of assignment: ${w(i)}`});t=i.$.env,oi(i,t),Gr(i),Yt(i,n),t=i.$.env;let s=i.$?.type;if(!s)try{let{expr:f,type:p,env:m}=Mr({expr:i,type:a,env:t,context:{...n}});i=f,s=p,t=m}catch(f){throw y({token:i.token,errorMessage:`(evaluateAssignment) Failed to synthesize type for expression: ${w(i)}
|
|
11418
11418
|
${f}`})}if(!q({type:a,env:t},{type:s,env:t}))throw y({token:r.token,errorMessage:`Incompatible types:
|
|
11419
11419
|
- Expected: ${A(a)}
|
|
11420
|
-
- Given : ${A(s)}`});let l=!1;if(o.$.pathCollection&&o.$.pathCollection.length>0){let f=o.$.pathCollection[0];if(f&&f.length>=2){let p=f[0],m=f[1],g=X(t,p);if(g.length>0){let h=g[g.length-1];if(h.isCompileTimeOnly&&h.value?.[0]){let d=h.value[0];if(i.$?.value&&(l=!0),bn(d)||
|
|
11420
|
+
- Given : ${A(s)}`});let l=!1;if(o.$.pathCollection&&o.$.pathCollection.length>0){let f=o.$.pathCollection[0];if(f&&f.length>=2){let p=f[0],m=f[1],g=X(t,p);if(g.length>0){let h=g[g.length-1];if(h.isCompileTimeOnly&&h.value?.[0]){let d=h.value[0];if(i.$?.value&&(l=!0),bn(d)||vn(d)){let v=h.type,T=v.fields.findIndex($=>$.label===m);if(T>=0&&i.$?.value)if(_e(h.type)&&h.type.isReferenceSemantics){let $=[...d.fields];$[T]=i.$.value;let b=Gn(h.type,$),L=pn(t,C=>C.isCompileTimeOnly&&C.value?.[0]===d);for(let C of L)t=Be(t,C,{...C,value:[b]})}else{let $=[...d.fields];$[T]=i.$.value;let b;bn(d)?b=Gn(v,$):b=ca(v,$),t=Be(t,h,{...h,value:[b]})}}else if(zn(d)){let v=parseInt(m,10);if(!isNaN(v)&&v>=0&&v<d.elements.length&&i.$?.value){let T=[...d.elements];T[v]=i.$.value;let $=h.type,b=Rr($,T);t=Be(t,h,{...h,value:[b]})}}else if(It(d)){let v=h.type,T=v.variants.find($=>$.name===d.variantName);if(T){let $=(T.fields??[]).findIndex(b=>b.label===m);if($>=0&&i.$?.value){let b=[...d.fields];b[$]=i.$.value;let L=ei(v,d.variantName,b);t=Be(t,h,{...h,value:[L]})}}}}}}}let u=o.$.ptrTargetValue,_=o.$.ptrTargetIndex??0;if(u&&i.$?.value){let f=u[0];zn(f)?f.elements[_]=i.$.value:u[0]=i.$.value,l=!0}let c=o.$.arrayElementRef;return c&&i.$?.value&&(c.arrayValue.elements[c.index]=i.$.value,l=!0),!l&&o.$?.value!==void 0&&i.$?.value!==void 0&&(l=!0),e.$={env:t,value:o.$.value,type:o.$.type,pathCollection:[],isCompileTimeOnlyAssignment:l},l||Ge(e,!0),e}}function Hd({expr:e,env:t,context:n}){if(!E(e,I.c_include))throw y({token:e.token,errorMessage:`Expected c_include, got ${e.tag}`});let r,i=e.args;if(e.args[0]&&U(e.args[0])){let a=e.args[0];i=e.args.slice(1);let s=S({expr:a,env:t,context:{...n}});if(!s.$||!s.$.value)throw y({token:a.token,errorMessage:`Failed to evaluate C header file argument: ${w(a)}`});t=s.$.env;let l=s.$.value;if(!xe(l))throw y({token:a.token,errorMessage:`Expected string for C header file argument, got ${w(a)}`});r=l.value}if(!r)throw y({token:e.token,errorMessage:`Expected C header file as first argument to c_include, such as:
|
|
11421
11421
|
|
|
11422
|
-
c_include "<stdio.h>" ...;`});let o=[];for(let a=0;a<i.length;a++){let s=i[a],{field:l,env:u}=na({expr:s,env:t,moduleFieldIndex:a,context:{...n,SelfType:void 0},isForEvaluatingModuleType:!1});if(o.find(f=>f.label===l.label))throw y({token:F(s)?s.args[0]?.token??s.token:s.token,errorMessage:`Duplicate label "${l.label}" in module`});if(He(l.type)||G(l.type)?l.type={...l.type,isExtern:"c",cInclude:r,externName:l.label}:l.type={...l.type,isExtern:"c",cInclude:r},l.assignedValue&&O(l.assignedValue)&&(_e(l.assignedValue.value)||ge(l.assignedValue.value)||it(l.assignedValue.value))){let f=l.assignedValue.value;f.isExtern="c",f.cInclude=r,f.externName=l.label}o.push(l),t=u;let{env:c}=me({env:t,variable:{name:l.label,type:l.type,value:[l.assignedValue??K(l.type,{variableName:l.label,env:t,context:n})],isCompileTimeOnly:!0,token:l.exprs.expr.token,initializedAtToken:l.exprs.expr.token,consumedAtToken:void 0,isOwningTheRcValue:!1}});t=c}return e.$={env:t,value:H,type:H.type,pathCollection:[]},e.func.$={env:t,value:H,type:H.type,pathCollection:[]},e}function jd({expr:e,env:t,context:n}){if(!E(e,I.cond))throw y({token:e.token,errorMessage:`Expected "cond", got ${e.tag}`});let r=e.args;if(r.length===0)throw y({token:e.token,errorMessage:`Expected at least one statement in "cond", got ${r.length}`});let i=[];for(let _=0;_<r.length;_++){let c=r[_];if(!F(c)||!E(c,"=>",2))throw y({token:c.token,errorMessage:`Expected => for cond statement, got ${c.tag}`});let f=c.args[0],p=c.args[1],m=t;i.push({condExpr:f,caseBodyExpr:p,caseEnv:m})}let o=[];for(let _=0;_<i.length;_++){let{condExpr:c,caseBodyExpr:f,caseEnv:p}=i[_],m=U(c)?S({expr:c,env:p,context:{...n,expectedType:{type:Je(),env:p}}}):ht({expr:c,env:p,context:{...n,expectedType:{type:Je(),env:p}},variablesToAdd:[]});if(!m.$)throw y({token:m.token,errorMessage:`Failed to evaluate condition expression: ${w(m)}`});if(!_n(m.$.type))throw y({token:m.token,errorMessage:`Expected bool for cond statement, got ${w(m)} of type ${A(m.$.type)}`});let g=m.$.value,h=m.$.env;if(_===i.length-1&&!(
|
|
11422
|
+
c_include "<stdio.h>" ...;`});let o=[];for(let a=0;a<i.length;a++){let s=i[a],{field:l,env:u}=na({expr:s,env:t,moduleFieldIndex:a,context:{...n,SelfType:void 0},isForEvaluatingModuleType:!1});if(o.find(f=>f.label===l.label))throw y({token:F(s)?s.args[0]?.token??s.token:s.token,errorMessage:`Duplicate label "${l.label}" in module`});if(He(l.type)||G(l.type)?l.type={...l.type,isExtern:"c",cInclude:r,externName:l.label}:l.type={...l.type,isExtern:"c",cInclude:r},l.assignedValue&&O(l.assignedValue)&&(_e(l.assignedValue.value)||ge(l.assignedValue.value)||it(l.assignedValue.value))){let f=l.assignedValue.value;f.isExtern="c",f.cInclude=r,f.externName=l.label}o.push(l),t=u;let{env:c}=me({env:t,variable:{name:l.label,type:l.type,value:[l.assignedValue??K(l.type,{variableName:l.label,env:t,context:n})],isCompileTimeOnly:!0,token:l.exprs.expr.token,initializedAtToken:l.exprs.expr.token,consumedAtToken:void 0,isOwningTheRcValue:!1}});t=c}return e.$={env:t,value:H,type:H.type,pathCollection:[]},e.func.$={env:t,value:H,type:H.type,pathCollection:[]},e}function jd({expr:e,env:t,context:n}){if(!E(e,I.cond))throw y({token:e.token,errorMessage:`Expected "cond", got ${e.tag}`});let r=e.args;if(r.length===0)throw y({token:e.token,errorMessage:`Expected at least one statement in "cond", got ${r.length}`});let i=[];for(let _=0;_<r.length;_++){let c=r[_];if(!F(c)||!E(c,"=>",2))throw y({token:c.token,errorMessage:`Expected => for cond statement, got ${c.tag}`});let f=c.args[0],p=c.args[1],m=t;i.push({condExpr:f,caseBodyExpr:p,caseEnv:m})}let o=[];for(let _=0;_<i.length;_++){let{condExpr:c,caseBodyExpr:f,caseEnv:p}=i[_],m=U(c)?S({expr:c,env:p,context:{...n,expectedType:{type:Je(),env:p}}}):ht({expr:c,env:p,context:{...n,expectedType:{type:Je(),env:p}},variablesToAdd:[]});if(!m.$)throw y({token:m.token,errorMessage:`Failed to evaluate condition expression: ${w(m)}`});if(!_n(m.$.type))throw y({token:m.token,errorMessage:`Expected bool for cond statement, got ${w(m)} of type ${A(m.$.type)}`});let g=m.$.value,h=m.$.env;if(_===i.length-1&&!(Pe(g)&&g.value===!0))throw y({token:m.token,errorMessage:'Expect the last condition to be compile-time known "true".'});if(o.push({condExpr:m,caseBodyExpr:f,caseEnv:h,condValue:g}),Pe(g)&&g.value===!0)break}let a=-1;for(let _=0;_<o.length;_++){let{condValue:c}=o[_];if(Pe(c)&&c.value===!0&&o.slice(0,_).every(({condValue:f})=>Pe(f)&&f.value===!1)){a=_;break}}let s=[],l=[],u;if(a!==-1){let{caseBodyExpr:_,caseEnv:c,condExpr:f}=o[a];f.$&&(f.$.caseExecuted=!0);let p=ht({expr:_,env:c,context:{...n},variablesToAdd:[]});if(nt(p.$?.controlFlow))return e.$={env:p.$.env,type:n.expectedType?.type??p.$.type,value:p.$.value,pathCollection:p.$.pathCollection,controlFlow:p.$.controlFlow},e;{if(!p.$?.type)throw y({token:p.token,errorMessage:`Expected type for cond statement, got ${w(p)}`});s.push(p),l.push(p.$.value),u={type:p.$.type,env:p.$.env},t=p.$.env;let m;return m=l[0],e.$={env:t,type:n.expectedType?.type??u.type,value:m,pathCollection:[],variableName:p.$.variableName},p.$.variableName||Ge(e,!0),e}}else{let _=!1,c=[],f=[];for(let{condExpr:m,condValue:g,caseBodyExpr:h,caseEnv:d}of o){if(Pe(g)&&g.value===!1)continue;m.$&&(m.$.caseExecuted=!0);let v=ht({expr:h,env:d,context:{...n,isExecuting:!1},variablesToAdd:[]});if(nt(v.$?.controlFlow)){c.push(v.$.controlFlow),et(v.$.controlFlow,"return")&&f.push(v);continue}else _=!0;if(!v.$?.type)throw y({token:v.token,errorMessage:`Expected type for cond statement, got ${w(v)}`});if(s.push(v),l.push(v.$.value),n.expectedType&&!q(n.expectedType,{type:v.$.type,env:v.$.env}))throw y({token:v.token,errorMessage:`Incompatible type with expected type:
|
|
11423
11423
|
- Expected: ${A(n.expectedType.type)}
|
|
11424
11424
|
- Actual : ${A(v.$.type)}`});if(!nt(v.$.controlFlow)){if(!u)u={type:v.$.type,env:v.$.env};else if(!q({type:u.type,env:u.env},{type:v.$.type,env:v.$.env}))if(q({type:yt({type:u.type,expectedType:void 0,expr:void 0,env:u.env}),env:u.env},{type:v.$.type,env:v.$.env}))u={type:v.$.type,env:v.$.env};else throw y({token:v.token,errorMessage:`Incompatible types:
|
|
11425
11425
|
- Previous: ${A(u.type)}
|
|
@@ -11435,13 +11435,13 @@ Actual: ${n}
|
|
|
11435
11435
|
Path: ${r}
|
|
11436
11436
|
Run 'yo fetch' to refetch this dependency.`}function om(e,t,n=""){let r=Jd(e),i=em(r,t);if(!i||!i.commit)return;let o=bh(),a=Ih(o,t,i);if(a.status!=="missing_path"){if(a.status==="missing_hash")throw new Error(`Dependency "${t}" is cached at "${a.cachedPath}" but its yo.lock entry is missing a content hash. Run 'yo fetch' to refresh yo.lock.`);if(a.status==="hash_mismatch")throw new Error(Sh(t,i.hash,a.actualHash??"<unknown>",a.cachedPath));return n?$i.join(a.cachedPath,n):a.cachedPath}}function am({expr:e,env:t,context:n,stdPath:r}){if(!E(e,I.import,1))throw y({token:e.token,errorMessage:`Expected "import" with 1 argument, got:
|
|
11437
11437
|
${w(e)}`});let i=e.args[0],a=S({expr:i,env:t,context:{...n}}).$?.value;if(!xe(a))throw y({token:i.token,errorMessage:`Expected comptime_string for module path, got:
|
|
11438
|
-
${w(i)}`});let s=a.value;if(s
|
|
11438
|
+
${w(i)}`});let s=a.value;if(s==="std/prelude"||s==="std/prelude.yo")throw y({token:i.token,errorMessage:"Importing the prelude module is not allowed \u2014 it is automatically loaded for every file."});if(s.startsWith("std/")?(s=Zt.relative(Zt.dirname(t.modulePath.replace(/^file:\/\//,"")),Zt.resolve(r,s.replace("std/","./"))),s.startsWith(".")||(s="./"+s)):s==="std"&&(s=Zt.relative(Zt.dirname(t.modulePath.replace(/^file:\/\//,"")),Zt.resolve(r,"./index.yo")),s.startsWith(".")||(s="./"+s)),!s.startsWith(".")){let _=nd(s);if(_){let c=t.modulePath.replace(/^file:\/\//,"");s=Zt.relative(Zt.dirname(c),_),s.startsWith(".")||(s="./"+s)}}if(!s.startsWith(".")){let _=t.modulePath.replace(/^file:\/\//,""),c=Nh(_);if(c){let f=h=>{try{return om(h,s)}catch(d){throw y({token:i.token,errorMessage:d instanceof Error?d.message:String(d)})}},m=Rl().findPathDependency(s),g;if(m?g=Zt.resolve(c,m.path):g=f(c),!g){let h=td();h&&h!==c&&(g=f(h))}if(g){let h=xh(g,s);s=Zt.relative(Zt.dirname(_),h),s.startsWith(".")||(s="./"+s)}}if(!s.startsWith("."))throw y({token:i.token,errorMessage:`Module "${s}" not found. If this is a dependency, add it to build.yo and run 'yo fetch'.
|
|
11439
11439
|
${w(e)}`})}let l="file://"+Zt.resolve(Zt.dirname(t.modulePath.replace(/^file:\/\//,"")),s);if(!Zt.extname(l)){let _=l.replace(/^file:\/\//,"")+".yo",c=Zt.join(l.replace(/^file:\/\//,""),"index.yo"),f=po(_),p=po(c);if(f&&p)throw y({token:i.token,errorMessage:`Ambiguous import "${s}": both "${s}.yo" and "${s}/index.yo" exist. Use an explicit path to resolve the ambiguity.`});if(f)l="file://"+_;else if(p)l="file://"+c;else throw y({token:i.token,errorMessage:`Module not found: tried "${"file://"+_}" and "${c}"`})}if(!n.loadModule)throw y({token:i.token,errorMessage:"Module loader is not provided in the context."});try{let{moduleValue:_}=n.loadModule(l);return e.$={env:t,type:_.type,value:_,pathCollection:[]},e}catch(_){throw y({token:i.token,errorMessage:`Failed to import module "${s}":
|
|
11440
|
-
${_ instanceof
|
|
11440
|
+
${_ instanceof gn||_ instanceof Sn?_.toString():_ instanceof Error?_.message:String(_)}`})}}function Nh(e){let t=Zt.dirname(e),n=Zt.parse(t).root;for(;t!==n;){if(po(Zt.join(t,"yo.lock"))||po(Zt.join(t,"build.yo")))return t;t=Zt.dirname(t)}}function xh(e,t){let n=Zt.join(e,"index.yo"),r=Zt.join(e,t+".yo");return po(n)?n:po(r)?r:e}function Bl({lhsFunc:e,lhsFields:t,rhsFields:n,rhsValue:r,rhsType:i,lhs:o,env:a,isCompileTimeOnly:s,isDestructuringAtomVariable:l}){let u=!we(i),_=e.token.value;if(u&&_!=="_")throw y({token:e.token,errorMessage:`Expected "_" for non-tuple destructuring, got "${_}"`});if(it(i)&&t.length!==1)throw y({token:o.token,errorMessage:`Destructuring union type requires a single field, got ${t.length}`});if(t.length>n.length)throw y({token:o.token,errorMessage:`Too many fields in destructuring pattern. Expected at most ${n.length}, got ${t.length}`});let c={};for(let p=0;p<t.length;p++){let m=t[p],g=p,h,d=n[g],v,T,$,b;if(F(m)&&E(m,":",2)&&m.args[0].token.value==="..."&&m.args[1].token.value==="..."||U(m)&&m.token.value==="..."){if(it(i))throw y({token:m.token,errorMessage:`Cannot destructure union type with _, got ${A(i)}`});for(let L=0;L<n.length;L++){let C=n[L];if(c[C.label])continue;c[C.label]={label:C.label,variableName:C.label,type:C.type};let R=vn(r)||bn(r)||We(r)||It(r)?r.fields[L]:void 0;if(!R&&s)throw y({token:m.token,errorMessage:`Destructuring field "${C.label}" is not defined in compile-time only context.`});let{env:N}=me({env:a,variable:{name:C.label,value:R?[an(R)]:void 0,type:C.type,isCompileTimeOnly:s,token:m.token,initializedAtToken:m.token,consumedAtToken:void 0,isCreatedFromDestructuringAtomVariable:l,isReassignable:!1,isOwningTheRcValue:!1}});a=N}m.$={env:a,type:i,value:r,pathCollection:[]};continue}else if(F(m)&&E(m,":",2)){let L=m.args[0],C=m.args[1];if(!U(L)||!je(L))throw y({token:L.token,errorMessage:`Expected identifier for label in destructuring pattern, got ${w(L)}`});$=L;let R=$.token.value,N=n.findIndex(D=>D.label===R);if(N===-1)throw y({token:m.token,errorMessage:`Label "${R}" being destructured not found.`});g=N,d=n[g];let B;if((vn(r)||bn(r)||We(r)||It(r))&&(B=r.fields[g]),h=B,U(C)&&je(C))b=C,v=C.token.value,T=C.token;else throw y({token:C.token,errorMessage:`Nested destructuring is not supported:
|
|
11441
11441
|
|
|
11442
11442
|
${w(C)}`});if(c[d.label])throw y({token:m.token,errorMessage:`Label "${R}" being destructured already exists.`});c[d.label]={label:d.label,variableName:v,type:d.type}}else{if(F(m))throw y({token:m.token,errorMessage:`Nested destructuring is not supported:
|
|
11443
11443
|
|
|
11444
|
-
${w(m)}`});if(U(m)&&je(m)){if(it(i))throw y({token:m.token,errorMessage:`Cannot destructure union type with positional destructuring, got ${A(i)}`});if(c[d.label])throw y({token:m.token,errorMessage:`Label "${d.label}" being destructured already exists.`});c[d.label]={label:d.label,variableName:m.token.value,type:d.type},(
|
|
11444
|
+
${w(m)}`});if(U(m)&&je(m)){if(it(i))throw y({token:m.token,errorMessage:`Cannot destructure union type with positional destructuring, got ${A(i)}`});if(c[d.label])throw y({token:m.token,errorMessage:`Label "${d.label}" being destructured already exists.`});c[d.label]={label:d.label,variableName:m.token.value,type:d.type},(vn(r)||bn(r)||It(r)||We(r))&&(h=r.fields[g]),v=m.token.value,T=m.token}else throw y({token:m.token,errorMessage:`Unsupported destructuring pattern for: ${w(m)}`})}if(v&&T){if(!h&&s)throw y({token:m.token,errorMessage:`Destructuring field "${v}" is not defined in compile-time only context.`});let{env:L}=me({env:a,variable:{name:v,type:d.type,isCompileTimeOnly:s,value:h?[an(h)]:void 0,token:T,initializedAtToken:T,consumedAtToken:void 0,isCreatedFromDestructuringAtomVariable:l,isReassignable:!1,isOwningTheRcValue:!1}});a=L,m.$={env:a,type:d.type,value:h,pathCollection:[]},$&&($.$={env:a,type:d.type,value:h,pathCollection:[]}),b&&(b.$={env:a,type:d.type,value:h,pathCollection:[]})}}let f=[];for(let p in c){let m=c[p];f.push({label:m.label,type:m.type,variableName:m.variableName})}return{env:a,runtimeDestructurings:f}}function sm({lhs:e,rhs:t,env:n,isCompileTimeOnly:r,context:i}){if(!t.$?.type)throw y({token:t.token,errorMessage:`(1) Expected type for right-hand side, got ${w(t)}`});let o=t.$.type,a=t.$.value;if((_e(o)||it(o)||Te(o))&&F(e))return Bl({lhsFunc:e.func,lhsFields:e.args,rhsFields:o.fields,rhsValue:a,rhsType:o,lhs:e,env:n,context:{...i},isCompileTimeOnly:r,isDestructuringAtomVariable:U(t)});if(we(o)&&F(e)&&E(e,I.tuple))return Bl({lhsFunc:e.func,lhsFields:e.args,rhsFields:o.fields,rhsValue:a,rhsType:o,lhs:e,env:n,context:{...i},isCompileTimeOnly:r,isDestructuringAtomVariable:U(t)});if(ge(o)&&F(e)){let s=o.selectedVariantName;if(!s)throw y({token:t.token,errorMessage:`Expected enum variant name to be determined, got ${A(o)}`});let l=o.variants.find(u=>u.name===s);if(!l)throw y({token:t.token,errorMessage:`Expected enum variant "${s}" to be defined, got ${A(o)}`});if(!l.fields)throw y({token:t.token,errorMessage:`Cannot destructure enum variant "${s}" without fields, got ${A(o)}`});return Bl({lhsFunc:e.func,lhsFields:e.args,rhsFields:l.fields,rhsValue:a,rhsType:o,lhs:e,env:n,context:{...i},isCompileTimeOnly:r,isDestructuringAtomVariable:U(t)})}throw we(o)||_e(o)||it(o)||Te(o)?y({token:e.token,errorMessage:`Destructuring assignment not supported for the left-hand pattern:
|
|
11445
11445
|
|
|
11446
11446
|
${w(e)}`}):y({token:t.token,errorMessage:`Destructuring assignment not supported for the right-hand type:
|
|
11447
11447
|
|
|
@@ -11456,13 +11456,13 @@ Type:
|
|
|
11456
11456
|
${A(l.$.type)}`});if(u&&mr(l.$.type,t))throw y({token:e.token,errorMessage:`Expected ":=" instead of "::" for value type "${A(l.$.type)}" which can only be used at the runtime:
|
|
11457
11457
|
${w(e)}`});let f=a.$?.value;if(O(f)&&!f.value.typeName&&f.value!==n.SelfType?f.value.typeName=l.token.value:ne(f)&&!f.funcName?(f.funcName=l.token.value,f.funcId+=`_${l.token.value}`):(We(f)||Tt(f))&&!f.type.typeName&&f.type!==n.SelfType&&(f.type.typeName=l.token.value),s&&ne(f)&&(f.isModuleEffectMember=!0),!f&&u)throw y({token:l.token,errorMessage:`Expected compile-time value for "${l.token.value}".
|
|
11458
11458
|
Got runtime value. Please consider using ":=" instead of "::":
|
|
11459
|
-
${w(a)}`});l.$={...l.$,env:t,type:l.$.type,value:u?f?an(f):K(l.$.type,{variableName:l.token.value,env:t,context:n}):void 0,pathCollection:[]};let p=l.$.type;V(p)&&c&&V(c)&&c.resolvedConcreteType&&(p={...p,resolvedConcreteType:c.resolvedConcreteType},l.$.type=p);let m=Oo(a,t,t.modulePath),g=m;m?.consumedAtToken&&(g=void 0);let{env:h}=me({env:t,variable:{name:l.token.value,type:p,isCompileTimeOnly:u,value:l.$.value?[l.$.value]:void 0,token:l.token,initializedAtToken:l.token,consumedAtToken:void 0,isOwningTheRcValue:Le(p),isOwningTheSameRcValueAs:g,isReassignable:!s,isImplicit:s}});return t=h,l.$.env=t,s&&(o.$={env:t,value:H,type:H.type,pathCollection:[]}),e.$={env:t,value:H,type:H.type,pathCollection:[],isCompileTimeOnlyAssignment:u},e}else{let u=s||r,{env:_,runtimeDestructurings:c}=sm({lhs:l,rhs:a,env:t,isCompileTimeOnly:s||r,context:{...n}});return t=_,e.$={env:t,value:H,type:H.type,pathCollection:[],runtimeDestructurings:c,isCompileTimeOnlyAssignment:u},e}}function Vh(e){return F(e)?E(e,"|",2):!1}function Gl(e){if(!Vh(e))return[e];let t=e,n=t.args[0],r=t.args[1];return[...Gl(n),...Gl(r)]}function Dh(e){return lr(e)||ur(e)||Xn(e)||_n(e)||vt(e)||Nt(e)||Et(e)}function um({expr:e,env:t,context:n}){if(!E(e,I.match))throw y({token:e.token,errorMessage:`Expected "match", got ${e.tag}`});let r=e.args;if(r.length<2)throw y({token:e.token,errorMessage:`Expected at least 2 arguments for "match", got ${r.length}`});let i=r[0],o=U(i)?S({expr:i,env:t,context:{...n,expectedType:void 0}}):ht({expr:i,env:t,context:{...n,expectedType:void 0},variablesToAdd:[]});if(!o.$||!o.$.variableName)throw y({token:i.token,errorMessage:`Failed to evaluate the match scrutinee expression: ${w(i)}`});t=o.$.env;let a=o.$.type,s=o.$.value,l,u;if(Ie(a)?(u=a.childType,l=a.tag):u=a,Dh(u))return Mh({expr:e,env:t,context:n,scrutineeExpr:o,scrutineeType:u,scrutineeValue:s});if(!ge(u))throw y({token:i.token,errorMessage:`Expected enum type or primitive type (integer, bool) for match expression, got ${a?A(a):"unknown type"}`});let _=u,c=r.slice(1),f=[],p,m=new Set,g=!1,h=!1,d=[],v=[];for(let $=0;$<c.length;$++){let b=c[$],L=t;if(!F(b)||!E(b,"=>",2))throw y({token:b.token,errorMessage:`Expected ":" for match pattern, got ${w(b)}`});let C=b.args[0],R=b.args[1];if(F(C)&&E(C,".",1)||dt(C,"_")){if(h)throw y({token:C.token,errorMessage:'Wildcard pattern "_" can only be used once and must be the last match arm in a "match" expression.'});let N;if(F(C)){if(N=C.args[0],!U(N))throw y({token:C.token,errorMessage:`Expected identifier for enum variant, got ${w(N)}`})}else h=!0,N=C;let B=N.token.value,D=_.variants.find(le=>le.name===B);if(!D&&B!=="_")throw y({token:C.token,errorMessage:`Enum variant "${B}" not found in ${A(_)}`});if(D&&D.fields&&D.fields.length>0)throw y({token:C.token,errorMessage:`Enum variant "${B}" has ${D.fields.length} field(s) and must be destructured. Use .${B}(...) instead of .${B}`});if(m.add(B),B!=="_"&&It(s)&&s.variantName!==B)continue;let x={..._,selectedVariantName:B==="_"?void 0:B};N.$={env:L,type:x,value:void 0,pathCollection:[]};let z=x;l&&l==="Ptr"&&(z=fi(x));let re=R;L=
|
|
11459
|
+
${w(a)}`});l.$={...l.$,env:t,type:l.$.type,value:u?f?an(f):K(l.$.type,{variableName:l.token.value,env:t,context:n}):void 0,pathCollection:[]};let p=l.$.type;V(p)&&c&&V(c)&&c.resolvedConcreteType&&(p={...p,resolvedConcreteType:c.resolvedConcreteType},l.$.type=p);let m=Oo(a,t,t.modulePath),g=m;m?.consumedAtToken&&(g=void 0);let{env:h}=me({env:t,variable:{name:l.token.value,type:p,isCompileTimeOnly:u,value:l.$.value?[l.$.value]:void 0,token:l.token,initializedAtToken:l.token,consumedAtToken:void 0,isOwningTheRcValue:Le(p),isOwningTheSameRcValueAs:g,isReassignable:!s,isImplicit:s}});return t=h,l.$.env=t,s&&(o.$={env:t,value:H,type:H.type,pathCollection:[]}),e.$={env:t,value:H,type:H.type,pathCollection:[],isCompileTimeOnlyAssignment:u},e}else{let u=s||r,{env:_,runtimeDestructurings:c}=sm({lhs:l,rhs:a,env:t,isCompileTimeOnly:s||r,context:{...n}});return t=_,e.$={env:t,value:H,type:H.type,pathCollection:[],runtimeDestructurings:c,isCompileTimeOnlyAssignment:u},e}}function Vh(e){return F(e)?E(e,"|",2):!1}function Gl(e){if(!Vh(e))return[e];let t=e,n=t.args[0],r=t.args[1];return[...Gl(n),...Gl(r)]}function Dh(e){return lr(e)||ur(e)||Xn(e)||_n(e)||vt(e)||Nt(e)||Et(e)}function um({expr:e,env:t,context:n}){if(!E(e,I.match))throw y({token:e.token,errorMessage:`Expected "match", got ${e.tag}`});let r=e.args;if(r.length<2)throw y({token:e.token,errorMessage:`Expected at least 2 arguments for "match", got ${r.length}`});let i=r[0],o=U(i)?S({expr:i,env:t,context:{...n,expectedType:void 0}}):ht({expr:i,env:t,context:{...n,expectedType:void 0},variablesToAdd:[]});if(!o.$||!o.$.variableName)throw y({token:i.token,errorMessage:`Failed to evaluate the match scrutinee expression: ${w(i)}`});t=o.$.env;let a=o.$.type,s=o.$.value,l,u;if(Ie(a)?(u=a.childType,l=a.tag):u=a,Dh(u))return Mh({expr:e,env:t,context:n,scrutineeExpr:o,scrutineeType:u,scrutineeValue:s});if(!ge(u))throw y({token:i.token,errorMessage:`Expected enum type or primitive type (integer, bool) for match expression, got ${a?A(a):"unknown type"}`});let _=u,c=r.slice(1),f=[],p,m=new Set,g=!1,h=!1,d=[],v=[];for(let $=0;$<c.length;$++){let b=c[$],L=t;if(!F(b)||!E(b,"=>",2))throw y({token:b.token,errorMessage:`Expected ":" for match pattern, got ${w(b)}`});let C=b.args[0],R=b.args[1];if(F(C)&&E(C,".",1)||dt(C,"_")){if(h)throw y({token:C.token,errorMessage:'Wildcard pattern "_" can only be used once and must be the last match arm in a "match" expression.'});let N;if(F(C)){if(N=C.args[0],!U(N))throw y({token:C.token,errorMessage:`Expected identifier for enum variant, got ${w(N)}`})}else h=!0,N=C;let B=N.token.value,D=_.variants.find(le=>le.name===B);if(!D&&B!=="_")throw y({token:C.token,errorMessage:`Enum variant "${B}" not found in ${A(_)}`});if(D&&D.fields&&D.fields.length>0)throw y({token:C.token,errorMessage:`Enum variant "${B}" has ${D.fields.length} field(s) and must be destructured. Use .${B}(...) instead of .${B}`});if(m.add(B),B!=="_"&&It(s)&&s.variantName!==B)continue;let x={..._,selectedVariantName:B==="_"?void 0:B};N.$={env:L,type:x,value:void 0,pathCollection:[]};let z=x;l&&l==="Ptr"&&(z=fi(x));let re=R;L=ze(L),C.$={env:L,type:z,value:void 0,pathCollection:[],caseExecuted:!0};let j=ht({expr:re,env:L,context:{...n,isExecuting:It(s)&&s.variantName===B},variablesToAdd:[]});if(!j.$?.type)throw y({token:re.token,errorMessage:`Expected type for match result expression, got ${w(re)}`});let W=_t(j.$.env,!0);if(L=W,j.$={...j.$,env:W},n.expectedType&&!q(n.expectedType,{type:j.$.type,env:j.$.env}))throw y({token:j.token,errorMessage:`Incompatible type with expected type:
|
|
11460
11460
|
- Expected: ${A(n.expectedType.type)}
|
|
11461
11461
|
- Actual : ${A(j.$.type)}`});if(s===void 0&&j.$&&(j.$.value=void 0),nt(j.$.controlFlow)?(d.push(j.$.controlFlow),et(j.$.controlFlow,"return")&&v.push(j),s&&!de(s)&&It(s)?e.$={env:j.$.env,type:n.expectedType?.type??j.$.type,value:j.$.value,pathCollection:j.$.pathCollection,controlFlow:j.$.controlFlow}:s===void 0&&(e.$={env:j.$.env,type:n.expectedType?.type??j.$.type,value:void 0,pathCollection:j.$.pathCollection,controlFlow:j.$.controlFlow})):g=!0,L=j.$.env,f.push(j),n.expectedType&&!q(n.expectedType,{type:j.$.type,env:j.$.env}))throw y({token:j.token,errorMessage:`Incompatible type with expected type:
|
|
11462
11462
|
- Expected: ${A(n.expectedType.type)}
|
|
11463
11463
|
- Actual : ${A(j.$.type)}`});if(!nt(j.$.controlFlow)){if(!p)p={type:j.$?.type,env:L};else if(!q({type:p.type,env:L},{type:j.$?.type,env:t}))if(q({type:yt({type:p.type,expectedType:void 0,expr:void 0,env:p.env}),env:p.env},{type:j.$.type,env:L}))p={type:j.$.type,env:L};else throw y({token:j.token,errorMessage:`Incompatible types:
|
|
11464
11464
|
- Previous: ${A(p.type)}
|
|
11465
|
-
- Current : ${A(j.$.type)}`})}}else if(F(C)&&F(C.func)&&E(C.func,".",1)){if(h)throw y({token:C.token,errorMessage:'Wildcard pattern "_" can only be used once and must be the last match arm in a "match" expression.'});let N=C.func.args[0];if(!U(N))throw y({token:C.token,errorMessage:`Expected identifier for enum variant, got ${w(N)}`});let B=N.token.value,D=_.variants.find(ce=>ce.name===B);if(!D)throw y({token:C.token,errorMessage:`Enum variant "${B}" not found in ${A(_)}`});if(m.add(B),It(s)&&s.variantName!==B)continue;let x=C.args;if(D.fields&&D.fields.length>0){if(!x.some(ve=>F(ve)&&E(ve,":",2))&&x.length!==D.fields.length)throw y({token:C.token,errorMessage:`Variant "${B}" expects ${D.fields.length} parameters, got ${x.length}`})}else if(x.length>0)throw y({token:C.token,errorMessage:`Variant "${B}" has no fields, but destructuring parameters were provided`});let z={..._,selectedVariantName:B};N.$={env:L,type:z,value:void 0,pathCollection:[]};let re=z;if(l&&l==="Ptr"&&(re=fi(z)),L=
|
|
11465
|
+
- Current : ${A(j.$.type)}`})}}else if(F(C)&&F(C.func)&&E(C.func,".",1)){if(h)throw y({token:C.token,errorMessage:'Wildcard pattern "_" can only be used once and must be the last match arm in a "match" expression.'});let N=C.func.args[0];if(!U(N))throw y({token:C.token,errorMessage:`Expected identifier for enum variant, got ${w(N)}`});let B=N.token.value,D=_.variants.find(ce=>ce.name===B);if(!D)throw y({token:C.token,errorMessage:`Enum variant "${B}" not found in ${A(_)}`});if(m.add(B),It(s)&&s.variantName!==B)continue;let x=C.args;if(D.fields&&D.fields.length>0){if(!x.some(ve=>F(ve)&&E(ve,":",2))&&x.length!==D.fields.length)throw y({token:C.token,errorMessage:`Variant "${B}" expects ${D.fields.length} parameters, got ${x.length}`})}else if(x.length>0)throw y({token:C.token,errorMessage:`Variant "${B}" has no fields, but destructuring parameters were provided`});let z={..._,selectedVariantName:B};N.$={env:L,type:z,value:void 0,pathCollection:[]};let re=z;if(l&&l==="Ptr"&&(re=fi(z)),L=ze(L),D.fields&&D.fields.length>0){let ce=new Set;for(let ve=0;ve<x.length;ve++){let Y=x[ve];if(F(Y)&&E(Y,":",2)){let Z=Y.args[0],se=Y.args[1];if(!U(Z))throw y({token:Z.token,errorMessage:`Expected identifier for label in destructuring pattern, got ${w(Z)}`});let Se=Z.token.value,pe=D.fields.findIndex(Q=>Q.label===Se);if(pe===-1)throw y({token:Z.token,errorMessage:`Label "${Se}" not found in variant "${B}". Available labels: ${D.fields.map(Q=>Q.label).join(", ")}`});if(ce.has(Se))throw y({token:Z.token,errorMessage:`Label "${Se}" is already destructured`});ce.add(Se);let Ve=D.fields[pe],Ke=It(s)&&!de(s),J=Ke?s.fields[pe]:void 0;if(U(se)){let Q=se.token.value;if(Q!=="_"){let{env:oe}=me({env:L,variable:{name:Q,type:Ve.type,isCompileTimeOnly:Ke,value:J!==void 0?[J]:void 0,token:se.token,initializedAtToken:se.token,consumedAtToken:void 0,isReassignable:!1,isOwningTheRcValue:!1}});L=oe}se.$={env:L,type:Ve.type,value:void 0,pathCollection:[]},Z.$={env:L,type:Ve.type,value:void 0,pathCollection:[]}}else throw y({token:se.token,errorMessage:`Expected identifier or "_" for variable in labeled destructuring, got ${w(se)}`})}else if(U(Y)){let Z=Y.token.value,se=D.fields[ve],Se=It(s)&&!de(s),pe=Se?s.fields[ve]:void 0;if(Z!=="_"){let{env:Ve}=me({env:L,variable:{name:Z,type:se.type,isCompileTimeOnly:Se,value:pe!==void 0?[pe]:void 0,token:Y.token,initializedAtToken:Y.token,consumedAtToken:void 0,isReassignable:!1,isOwningTheRcValue:!1}});L=Ve}Y.$={env:L,type:se.type,value:void 0,pathCollection:[]}}else throw y({token:Y.token,errorMessage:`Expected identifier, "_", or labeled pattern (label: variable) for destructuring parameter, got ${w(Y)}`})}}C.$={env:L,type:re,value:void 0,pathCollection:[],caseExecuted:!0};let j=R,W=ht({expr:j,env:L,context:{...n,isExecuting:It(s)&&s.variantName===B},variablesToAdd:[]});if(!W.$?.type)throw y({token:j.token,errorMessage:`Expected type for match result expression, got ${w(j)}`});let le=_t(W.$.env,!0);if(L=le,W.$={...W.$,env:le},s===void 0&&W.$&&(W.$.value=void 0),nt(W.$.controlFlow)?(d.push(W.$.controlFlow),et(W.$.controlFlow,"return")&&v.push(W),s&&!de(s)&&It(s)?e.$={env:W.$.env,type:n.expectedType?.type??W.$.type,value:W.$.value,pathCollection:W.$.pathCollection,controlFlow:W.$.controlFlow}:s===void 0&&(e.$={env:W.$.env,type:n.expectedType?.type??W.$.type,value:void 0,pathCollection:W.$.pathCollection,controlFlow:W.$.controlFlow})):g=!0,L=W.$.env,f.push(W),!nt(W.$.controlFlow)){if(!p)p={type:W.$?.type,env:L};else if(!q({type:p.type,env:L},{type:W.$?.type,env:t}))if(q({type:yt({type:p.type,expectedType:void 0,expr:void 0,env:p.env}),env:p.env},{type:W.$.type,env:L}))p={type:W.$.type,env:L};else throw y({token:W.token,errorMessage:`Incompatible types:
|
|
11466
11466
|
- Previous: ${A(p.type)}
|
|
11467
11467
|
- Current : ${A(W.$.type)}`})}}else throw y({token:C.token,errorMessage:`Invalid pattern in match expression: ${w(C)}
|
|
11468
11468
|
Supported patterns:
|
|
@@ -11471,18 +11471,18 @@ Supported patterns:
|
|
|
11471
11471
|
- _ (wildcard pattern)`})}let T=d.length>0?So(d):void 0;if(g||!nt(T)){if(g&&!p)throw y({token:e.token,errorMessage:"Failed to determine the type of value from the cond."});if(p||(p={type:H.type,env:t}),!m.has("_")){let L=_.variants.filter(C=>!m.has(C.name));if(L.length>0)throw y({token:e.token,errorMessage:`Match expression is not exhaustive. Missing cases for variants:
|
|
11472
11472
|
|
|
11473
11473
|
- ${L.map(C=>C.name).join(`
|
|
11474
|
-
- `)}`})}let $=f.filter(L=>L.$&&!et(L.$.controlFlow,"return")&&!et(L.$.controlFlow,"escape")),b;It(s)&&!de(s)&&$.length===1&&$[0].$?(t=$[0].$.env,b=$[0].$.value):It(s)&&$.length===1&&$[0].$?t=$[0].$.env:t=Gi(t,$),e.$={env:t,type:n.expectedType?.type??p.type,value:s===void 0?void 0:b!==void 0?b:K(p.type,{env:t,context:n}),pathCollection:[]},Ge(e,!0)}else{if(d.length===0)throw y({token:e.token,errorMessage:"No control flows found but expected some."});if(et(T,"return")){if(!n.isEvaluatingFunctionBodyOrAsyncBlock)throw y({token:e.token,errorMessage:"All cases in match are returning from function, but not evaluating in function body."});let $;if(v.length>0&&v[0].$?$=v[0].$.type:n.isEvaluatingFunctionBodyOrAsyncBlock.kind==="function-body"?$=n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type:n.expectedType&&($=n.expectedType.type),!$)throw y({token:e.token,errorMessage:"Failed to determine the return type for match statement."});e.$={env:t,type:$,value:n.isEvaluatingFunctionBodyOrAsyncBlock.kind==="function-body"&&Ao(n.isEvaluatingFunctionBodyOrAsyncBlock.type)?K($,{env:t,context:n}):void 0,pathCollection:[],controlFlow:T}}else if(et(T,"escape")){if(!n.enclosingFunctionReturnType)throw y({token:e.token,errorMessage:'All cases in match use "escape", but not inside a function with an enclosing function.'});let $=n.enclosingFunctionReturnType;e.$={env:t,type:$,value:void 0,pathCollection:[],controlFlow:T}}else if(et(T,"break")){if(!n.isEvaluatingLoopBody)throw y({token:e.token,errorMessage:"All cases in match are breaking from loop, but not inside a loop."});e.$={env:t,type:H.type,value:H,pathCollection:[],controlFlow:T}}else if(et(T,"continue")){if(!n.isEvaluatingLoopBody)throw y({token:e.token,errorMessage:"All cases in match are continuing loop, but not inside a loop."});e.$={env:t,type:H.type,value:H,pathCollection:[],controlFlow:T}}return e}return e}function Mh({expr:e,env:t,context:n,scrutineeExpr:r,scrutineeType:i,scrutineeValue:o}){let a=e.args.slice(1),s=[],l,u=new Set,_=!1,c=!1,f=[],p=[];for(let g=0;g<a.length;g++){let h=a[g],d=t;if(!F(h)||!E(h,"=>",2))throw y({token:h.token,errorMessage:`Expected "=>" for match pattern, got ${w(h)}`});let v=h.args[0],T=h.args[1];if(dt(v,"_")){if(c)throw y({token:v.token,errorMessage:'Wildcard pattern "_" can only be used once and must be the last match arm in a "match" expression.'});c=!0,v.$={env:d,type:i,value:void 0,pathCollection:[],caseExecuted:!0},d=
|
|
11474
|
+
- `)}`})}let $=f.filter(L=>L.$&&!et(L.$.controlFlow,"return")&&!et(L.$.controlFlow,"escape")),b;It(s)&&!de(s)&&$.length===1&&$[0].$?(t=$[0].$.env,b=$[0].$.value):It(s)&&$.length===1&&$[0].$?t=$[0].$.env:t=Gi(t,$),e.$={env:t,type:n.expectedType?.type??p.type,value:s===void 0?void 0:b!==void 0?b:K(p.type,{env:t,context:n}),pathCollection:[]},Ge(e,!0)}else{if(d.length===0)throw y({token:e.token,errorMessage:"No control flows found but expected some."});if(et(T,"return")){if(!n.isEvaluatingFunctionBodyOrAsyncBlock)throw y({token:e.token,errorMessage:"All cases in match are returning from function, but not evaluating in function body."});let $;if(v.length>0&&v[0].$?$=v[0].$.type:n.isEvaluatingFunctionBodyOrAsyncBlock.kind==="function-body"?$=n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type:n.expectedType&&($=n.expectedType.type),!$)throw y({token:e.token,errorMessage:"Failed to determine the return type for match statement."});e.$={env:t,type:$,value:n.isEvaluatingFunctionBodyOrAsyncBlock.kind==="function-body"&&Ao(n.isEvaluatingFunctionBodyOrAsyncBlock.type)?K($,{env:t,context:n}):void 0,pathCollection:[],controlFlow:T}}else if(et(T,"escape")){if(!n.enclosingFunctionReturnType)throw y({token:e.token,errorMessage:'All cases in match use "escape", but not inside a function with an enclosing function.'});let $=n.enclosingFunctionReturnType;e.$={env:t,type:$,value:void 0,pathCollection:[],controlFlow:T}}else if(et(T,"break")){if(!n.isEvaluatingLoopBody)throw y({token:e.token,errorMessage:"All cases in match are breaking from loop, but not inside a loop."});e.$={env:t,type:H.type,value:H,pathCollection:[],controlFlow:T}}else if(et(T,"continue")){if(!n.isEvaluatingLoopBody)throw y({token:e.token,errorMessage:"All cases in match are continuing loop, but not inside a loop."});e.$={env:t,type:H.type,value:H,pathCollection:[],controlFlow:T}}return e}return e}function Mh({expr:e,env:t,context:n,scrutineeExpr:r,scrutineeType:i,scrutineeValue:o}){let a=e.args.slice(1),s=[],l,u=new Set,_=!1,c=!1,f=[],p=[];for(let g=0;g<a.length;g++){let h=a[g],d=t;if(!F(h)||!E(h,"=>",2))throw y({token:h.token,errorMessage:`Expected "=>" for match pattern, got ${w(h)}`});let v=h.args[0],T=h.args[1];if(dt(v,"_")){if(c)throw y({token:v.token,errorMessage:'Wildcard pattern "_" can only be used once and must be the last match arm in a "match" expression.'});c=!0,v.$={env:d,type:i,value:void 0,pathCollection:[],caseExecuted:!0},d=ze(d);let N=ht({expr:T,env:d,context:{...n,isExecuting:o!==void 0&&!de(o)},variablesToAdd:[]});if(!N.$?.type)throw y({token:T.token,errorMessage:`Expected type for match result expression, got ${w(T)}`});let B=_t(N.$.env,!0);if(d=B,N.$={...N.$,env:B},n.expectedType&&!q(n.expectedType,{type:N.$.type,env:N.$.env}))throw y({token:N.token,errorMessage:`Incompatible type with expected type:
|
|
11475
11475
|
- Expected: ${A(n.expectedType.type)}
|
|
11476
11476
|
- Actual : ${A(N.$.type)}`});if(o===void 0&&N.$&&(N.$.value=void 0),nt(N.$.controlFlow))f.push(N.$.controlFlow),et(N.$.controlFlow,"return")&&p.push(N),o!==void 0&&!de(o)?e.$={env:N.$.env,type:n.expectedType?.type??N.$.type,value:N.$.value,pathCollection:N.$.pathCollection,controlFlow:N.$.controlFlow}:o===void 0&&(e.$={env:N.$.env,type:n.expectedType?.type??N.$.type,value:void 0,pathCollection:N.$.pathCollection,controlFlow:N.$.controlFlow});else if(_=!0,o!==void 0&&!de(o))return t=Gi(t,s.filter(D=>D.$&&!et(D.$.controlFlow,"return")&&!et(D.$.controlFlow,"escape"))),e.$={env:t,type:n.expectedType?.type??N.$.type,value:N.$.value,pathCollection:[],isPrimitiveMatch:!0},Ge(e,!0),e;if(d=N.$.env,s.push(N),!nt(N.$.controlFlow)){if(!l)l={type:N.$.type,env:d};else if(!q({type:l.type,env:d},{type:N.$.type,env:t}))throw y({token:N.token,errorMessage:`Incompatible types in match branches:
|
|
11477
11477
|
- Previous: ${A(l.type)}
|
|
11478
11478
|
- Current : ${A(N.$.type)}`})}continue}let $=Gl(v),b=[];for(let N of $){let B=S({expr:N,env:d,context:{...n,expectedType:{type:i,env:d}}});if(!B.$)throw y({token:N.token,errorMessage:`Failed to evaluate pattern expression: ${w(N)}`});if(!q({type:i,env:d},{type:B.$.type,env:B.$.env}))throw y({token:N.token,errorMessage:`Pattern type ${A(B.$.type)} is not compatible with scrutinee type ${A(i)}`});let D=B.$.value;if(D===void 0)throw y({token:N.token,errorMessage:`Match patterns must be compile-time known values. "${w(N)}" is a runtime value.
|
|
11479
|
-
Hint: Use "::" to define compile-time constants, e.g., "myConst :: 42"`});let x=Me(D);if(x){if(u.has(x))throw y({token:N.token,errorMessage:`Duplicate pattern value: ${Me(D)}`});u.add(x)}b.push({expr:B,value:D})}let L=!1;if(o!==void 0&&!de(o)){for(let{value:N,expr:B}of b)if(At({value:o,env:r.$.env},{value:N,env:B.$.env})){L=!0;break}}v.$={env:d,type:i,value:void 0,pathCollection:[],caseExecuted:!0,primitivePatternValues:b.map(N=>N.value)},d=
|
|
11479
|
+
Hint: Use "::" to define compile-time constants, e.g., "myConst :: 42"`});let x=Me(D);if(x){if(u.has(x))throw y({token:N.token,errorMessage:`Duplicate pattern value: ${Me(D)}`});u.add(x)}b.push({expr:B,value:D})}let L=!1;if(o!==void 0&&!de(o)){for(let{value:N,expr:B}of b)if(At({value:o,env:r.$.env},{value:N,env:B.$.env})){L=!0;break}}v.$={env:d,type:i,value:void 0,pathCollection:[],caseExecuted:!0,primitivePatternValues:b.map(N=>N.value)},d=ze(d);let C=ht({expr:T,env:d,context:{...n,isExecuting:L},variablesToAdd:[]});if(!C.$?.type)throw y({token:T.token,errorMessage:`Expected type for match result expression, got ${w(T)}`});let R=_t(C.$.env,!0);if(d=R,C.$={...C.$,env:R},n.expectedType&&!q(n.expectedType,{type:C.$.type,env:C.$.env}))throw y({token:C.token,errorMessage:`Incompatible type with expected type:
|
|
11480
11480
|
- Expected: ${A(n.expectedType.type)}
|
|
11481
11481
|
- Actual : ${A(C.$.type)}`});if(o===void 0&&C.$&&(C.$.value=void 0),nt(C.$.controlFlow)){if(f.push(C.$.controlFlow),et(C.$.controlFlow,"return")&&p.push(C),o!==void 0&&L)return e.$={env:C.$.env,type:n.expectedType?.type??C.$.type,value:C.$.value,pathCollection:C.$.pathCollection,controlFlow:C.$.controlFlow},e;o===void 0&&(e.$={env:C.$.env,type:n.expectedType?.type??C.$.type,value:void 0,pathCollection:C.$.pathCollection,controlFlow:C.$.controlFlow})}else if(_=!0,o!==void 0&&!de(o)&&L)return e.$={env:C.$.env,type:n.expectedType?.type??C.$.type,value:C.$.value,pathCollection:C.$.pathCollection,isPrimitiveMatch:!0},Ge(e,!0),e;if(d=C.$.env,s.push(C),!nt(C.$.controlFlow)){if(!l)l={type:C.$.type,env:d};else if(!q({type:l.type,env:d},{type:C.$.type,env:t}))if(q({type:yt({type:l.type,expectedType:void 0,expr:void 0,env:l.env}),env:l.env},{type:C.$.type,env:d}))l={type:C.$.type,env:d};else throw y({token:C.token,errorMessage:`Incompatible types in match branches:
|
|
11482
11482
|
- Previous: ${A(l.type)}
|
|
11483
11483
|
- Current : ${A(C.$.type)}`})}}if(!c)if(_n(i)){let g=u.has("true"),h=u.has("false");if(!g||!h)throw y({token:e.token,errorMessage:`Match expression on bool is not exhaustive. Missing cases for: ${g?"":"true"}${!g&&!h?", ":""}${h?"":"false"}`})}else throw y({token:e.token,errorMessage:`Match expression on ${A(i)} requires a wildcard pattern "_" for exhaustiveness.`});let m=f.length>0?So(f):void 0;if(_||!nt(m)){if(_&&!l)throw y({token:e.token,errorMessage:"Failed to determine the type of value from the match."});l||(l={type:H.type,env:t});let g=s.filter(h=>h.$&&!et(h.$.controlFlow,"return")&&!et(h.$.controlFlow,"escape"));o!==void 0&&!de(o)&&g.length===1&&g[0].$?t=g[0].$.env:t=Gi(t,g),e.$={env:t,type:n.expectedType?.type??l.type,value:o===void 0?void 0:K(l.type,{env:t,context:n}),pathCollection:[],isPrimitiveMatch:!0},Ge(e,!0)}else{if(f.length===0)throw y({token:e.token,errorMessage:"No control flows found but expected some."});if(et(m,"return")){if(!n.isEvaluatingFunctionBodyOrAsyncBlock)throw y({token:e.token,errorMessage:"All cases in match are returning from function, but not evaluating in function body."});let g;if(p.length>0&&p[0].$?g=p[0].$.type:n.isEvaluatingFunctionBodyOrAsyncBlock.kind==="function-body"?g=n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type:n.expectedType&&(g=n.expectedType.type),!g)throw y({token:e.token,errorMessage:"Failed to determine the return type for match statement."});e.$={env:t,type:g,value:n.isEvaluatingFunctionBodyOrAsyncBlock.kind==="function-body"&&Ao(n.isEvaluatingFunctionBodyOrAsyncBlock.type)?K(g,{env:t,context:n}):void 0,pathCollection:[],controlFlow:m,isPrimitiveMatch:!0}}else if(et(m,"escape")){if(!n.enclosingFunctionReturnType)throw y({token:e.token,errorMessage:'All cases in match use "escape", but not inside a function with an enclosing function.'});let g=n.enclosingFunctionReturnType;e.$={env:t,type:g,value:void 0,pathCollection:[],controlFlow:m,isPrimitiveMatch:!0}}else if(et(m,"break")){if(!n.isEvaluatingLoopBody)throw y({token:e.token,errorMessage:"All cases in match are breaking from loop, but not inside a loop."});e.$={env:t,type:H.type,value:H,pathCollection:[],controlFlow:m,isPrimitiveMatch:!0}}else if(et(m,"continue")){if(!n.isEvaluatingLoopBody)throw y({token:e.token,errorMessage:"All cases in match are continuing loop, but not inside a loop."});e.$={env:t,type:H.type,value:H,pathCollection:[],controlFlow:m,isPrimitiveMatch:!0}}return e}return e}function _m({expr:e,env:t,context:n}){let r=e.args[0];if(!r)throw y({token:e.token,errorMessage:`Expected "using" with 1 argument, got:
|
|
11484
11484
|
${w(e)}`});{let l=r;for(;E(l,".")&&l.args.length>=1;)l=l.args[0];if(U(l)){let u=X(t,l.token.value),_=u[u.length-1];if(_?.isImplicit)throw y({token:r.token,errorMessage:`Cannot use "open" on implicit variable "${_.name}". Implicit variables must be passed via using() parameters.`})}}let i=S({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:i.token,errorMessage:`Failed to evaluate the module argument:
|
|
11485
|
-
${w(i)}`});let o=i.$.type,a=i.$.value,s;if(We(a)){let l=a,u=l.type;for(let _=0;_<u.fields.length;_++){let c=l.fields[_],f=u.fields[_],{env:p}=me({env:t,variable:{name:f.label,type:f.type,isCompileTimeOnly:!0,value:[c],token:f.exprs.labelExpr?.token??f.exprs.expr.token,initializedAtToken:f.exprs.labelExpr?.token??f.exprs.expr.token,consumedAtToken:void 0,isReassignable:!1,isOwningTheRcValue:!1}});t=p}}else if(_e(o)){let l=a,u=o;s=[];for(let _=0;_<u.fields.length;_++){let c;bn(l)&&(c=l.fields[_]);let f=u.fields[_];try{let{env:p}=me({env:t,variable:{name:f.label,type:f.type,isCompileTimeOnly:!!c,value:c?[c]:void 0,token:f.exprs.labelExpr?.token??f.exprs.expr.token,initializedAtToken:f.exprs.labelExpr?.token??f.exprs.expr.token,consumedAtToken:void 0,isReassignable:!1,isOwningTheRcValue:!1}});t=p,s.push({label:f.label,variableName:f.label,type:f.type})}catch(p){throw lt([{token:r.token,errorMessage:`Failed to import struct field "${f.label}"`},...p instanceof
|
|
11485
|
+
${w(i)}`});let o=i.$.type,a=i.$.value,s;if(We(a)){let l=a,u=l.type;for(let _=0;_<u.fields.length;_++){let c=l.fields[_],f=u.fields[_],{env:p}=me({env:t,variable:{name:f.label,type:f.type,isCompileTimeOnly:!0,value:[c],token:f.exprs.labelExpr?.token??f.exprs.expr.token,initializedAtToken:f.exprs.labelExpr?.token??f.exprs.expr.token,consumedAtToken:void 0,isReassignable:!1,isOwningTheRcValue:!1}});t=p}}else if(_e(o)){let l=a,u=o;s=[];for(let _=0;_<u.fields.length;_++){let c;bn(l)&&(c=l.fields[_]);let f=u.fields[_];try{let{env:p}=me({env:t,variable:{name:f.label,type:f.type,isCompileTimeOnly:!!c,value:c?[c]:void 0,token:f.exprs.labelExpr?.token??f.exprs.expr.token,initializedAtToken:f.exprs.labelExpr?.token??f.exprs.expr.token,consumedAtToken:void 0,isReassignable:!1,isOwningTheRcValue:!1}});t=p,s.push({label:f.label,variableName:f.label,type:f.type})}catch(p){throw lt([{token:r.token,errorMessage:`Failed to import struct field "${f.label}"`},...p instanceof gn?p.tokenAndErrorList:[{token:r.token,errorMessage:p instanceof Error?p.message:String(p)}]])}}}else throw y({token:r.token,errorMessage:`Expected module/struct for "${I.open}", got:
|
|
11486
11486
|
${w(r)}`});return e.$={env:t,value:H,type:H.type,pathCollection:[],runtimeDestructurings:s},e}function cm({expr:e,env:t,context:n}){if(!E(e,"."))throw y({token:e.token,errorMessage:`Expected "." for property access, got:
|
|
11487
11487
|
${w(e)}`});if(E(e,".",1)){let s=e.args[0];if(!U(s)&&!je(s))throw y({token:s.token,errorMessage:`Expected identifier for enum variant access, got:
|
|
11488
11488
|
${w(s)}`});let l=n.expectedType?.type;if(!ge(l))throw y({token:e.token,errorMessage:"Failed to infer enum variant type."});let u=s.token.value,_=l,c=_.variants.find(p=>p.name===u);if(!c)throw y({token:s.token,errorMessage:`Enum variant "${u}" not found in enum`});let f={..._,selectedVariantName:u};if(!c.fields)e.$={env:t,type:f,value:ei(f,u,[]),pathCollection:[]},s.$={env:t,type:f,pathCollection:[]};else{let p=ee(f);e.$={env:t,value:p,type:p.type,pathCollection:[]},s.$=e.$}return e}if(!E(e,".",2))throw y({token:e.token,errorMessage:`Expected "." with 2 arguments, got:
|
|
@@ -11492,7 +11492,7 @@ ${w(i)}`});let l=i.token.value,u=s.value.trait.fields.findLast(_=>_.label===l);i
|
|
|
11492
11492
|
${w(i)}`});let l=i.token.value,_=s.value.fields.find(c=>c.label===l);return _?(e.$={env:t,type:_.type,value:_.assignedValue??K(_.type,{variableName:_.label,env:t,context:n}),pathCollection:[],isAccessingProperty:!0},i.$=e.$,e):(e.$=void 0,e)}else if(De(s.value)){if(!je(i))throw y({token:i.token,errorMessage:`Expected identifier for type method, got:
|
|
11493
11493
|
${w(i)}`});let l=i.token.value,u=s.value;if(u.receiverType&&u.receiverType.trait){for(let f of u.receiverType.trait.fields)if(f.label===""&&f.assignedValue&&Tt(f.assignedValue)){let p=f.assignedValue,m=p.type;if(!q({type:u,env:t},{type:m,env:t}))continue;let g=m.fields.findIndex(h=>h.label===l&&G(h.type));if(g>=0){let h=m.fields[g];if(G(h.type)){let d=p.fields[g];if(d){let v=h.type;return ne(d)&&d.specializedType&&(v=d.specializedType),e.$={env:t,type:v,value:d,pathCollection:[],isAccessingProperty:!0},i.$=e.$,e}}}}let c=Ku({concreteType:u.receiverType,traitType:u,methodName:l,env:t});if(c)return e.$={env:t,type:c.type,value:c.value,pathCollection:[],isAccessingProperty:!0},i.$=e.$,e}let _=u.fields.find(c=>c.label===l);return _?(e.$={env:t,type:_.type,value:_.assignedValue??K(_.type,{variableName:_.label,env:t,context:n}),pathCollection:[],isAccessingProperty:!0},i.$=e.$,e):(e.$=void 0,e)}}let o=r.$?.type,a=r.$?.type;for(;o&&Ie(o);)o=o.childType;if(we(o)||_e(o)||it(o)){let s=o.fields,l=r.$.value;if(U(i)){if(i.token.type==="integer"){if(!we(r.$?.type))throw y({token:i.token,errorMessage:"Accessing tuple field by index is only allowed for tuples."});let u=parseInt(i.token.value,10);if(isNaN(u))throw y({token:i.token,errorMessage:`Expected integer for tuple index, got:
|
|
11494
11494
|
${w(i)}`});let _=s.length;if(u<0||u>=_)throw y({token:i.token,errorMessage:`Index out of bounds: ${u} for accessing field in:
|
|
11495
|
-
${A(r.$?.type)}`});let c=s[u],f=r.$.originType||a,p=r.$.pathCollection&&r.$.pathCollection.length>0?r.$.pathCollection.map(m=>[...m,i.token.value]):[[r.$.variableName??"?",i.token.value]];if(e.$={env:t,type:c.type,originType:f,isAccessingProperty:!0,pathCollection:p},i.$=e.$,l){let m=[];(
|
|
11495
|
+
${A(r.$?.type)}`});let c=s[u],f=r.$.originType||a,p=r.$.pathCollection&&r.$.pathCollection.length>0?r.$.pathCollection.map(m=>[...m,i.token.value]):[[r.$.variableName??"?",i.token.value]];if(e.$={env:t,type:c.type,originType:f,isAccessingProperty:!0,pathCollection:p},i.$=e.$,l){let m=[];(vn(l)||bn(l))&&(m=l.fields),e.$.value=m?.[u]}return Ge(e,!1),e}else if(je(i)){let u=i.token.value;{let _=s.findIndex(m=>m.label===u);if(_<0){if(Te(r.$?.type))throw y({token:i.token,errorMessage:`Module field "${u}" not found in module type`});return e.$=void 0,e}let c=s[_],f=r.$?.originType||a,p=r.$.pathCollection&&r.$.pathCollection.length>0?r.$.pathCollection.map(m=>[...m,i.token.value]):[[r.$.variableName??"?",i.token.value]];if(e.$={env:t,type:c.type,originType:f,isAccessingProperty:!0,pathCollection:p},i.$=e.$,l)if(de(l))e.$.value=K(c.type,{env:t,context:n});else{let m=[];(vn(l)||bn(l))&&(m=l.fields);let g=m?.[_];g||(g=K(c.type,{env:t,context:n})),e.$.value=g}return Ge(e,!1),e}}}}else if(Te(o)){let s=o.fields,l=r.$.value;if(U(i)){if(i.token.type==="integer")throw y({token:i.token,errorMessage:`Accessomg module field by index is not allowed, got:
|
|
11496
11496
|
${w(i)}`});if(je(i)){let u=i.token.value;{let _=s.findIndex(p=>p.label===u);if(_<0){if(Te(r.$?.type))throw y({token:i.token,errorMessage:`Module field "${u}" not found in module type`});return e.$=void 0,e}let c=s[_],f=r.$.pathCollection&&r.$.pathCollection.length>0?r.$.pathCollection.map(p=>[...p,i.token.value]):[[r.$.variableName??"?",i.token.value]];if(e.$={env:t,type:c.type,isAccessingProperty:!0,pathCollection:f},i.$=e.$,l)if(de(l))e.$.value=K(c.type,{env:t,context:n});else{let p=[];We(l)&&(p=l.fields);let m=p?.[_];m||(m=K(c.type,{env:t,context:n})),e.$.value=m}return e}}}}else if(ge(o)&&U(i)){if(!je(i))throw y({token:i.token,errorMessage:`Expected identifier for enum variant property, got:
|
|
11497
11497
|
${w(i)}`});let s=i.token.value,l=o.variants.find(u=>u.name===o.selectedVariantName);if(l){let u=(l.fields??[]).findIndex(f=>f.label===s);if(u<0)return e.$=void 0,e;let _=(l.fields??[])[u];e.$={env:t,type:_.type,value:void 0,pathCollection:[[r.$.variableName??"?",i.token.value]],isAccessingProperty:!0};let c=r.$?.value;return c&&It(c)&&c.variantName===l.name&&(e.$.value=c.fields[u]),i.$=e.$,e}}return e.$=void 0,e}function fm({expr:e,env:t,context:n}){if(n.isEvaluatingFunctionBodyOrAsyncBlock?.kind!=="function-body")throw y({token:e.token,errorMessage:`Expected a function type for recur, got:
|
|
11498
11498
|
${w(e)}`});let r=n.isEvaluatingFunctionBodyOrAsyncBlock.type;if(!E(e,I.recur))throw y({token:e.token,errorMessage:`Expected recur, got:
|
|
@@ -11504,9 +11504,9 @@ ${w(r)}`});let o=i.$.type,a=ee(o);return e.$={env:t,type:a.type,value:a,pathColl
|
|
|
11504
11504
|
If this is an infinite runtime loop, use \`while runtime(true), { ... }\` instead.
|
|
11505
11505
|
To increase the limit, set the YO_MAX_COMPTIME_LOOP_ITERATIONS environment variable.`}):y({token:e.token,errorMessage:"Infinite compile-time while loop detected. The condition is compile-time `true` but the loop body has no `break`, `return`, or `escape` to terminate it.\nIf you need an infinite runtime loop, use `while runtime(true), { ... }` instead of `while true, { ... }`.\nTo increase the limit, set the YO_MAX_COMPTIME_LOOP_ITERATIONS environment variable."})}function ns({expr:e,env:t,context:n,_comptimeIterationCount:r=0}){if(e.args.length!==2&&e.args.length!==3)throw y({token:e.token,errorMessage:`Expected 2 or 3 arguments for while loop, got ${e.args.length}`});let i=e.args[0],o,a;e.args.length===3?(o=e.args[1],a=e.args[2]):a=e.args[1];let s=ht({expr:i,env:t,context:{...n},variablesToAdd:[]});if(!s.$)throw y({token:i.token,errorMessage:`Failed to evaluate the condition expression:
|
|
11506
11506
|
${w(i)}`});if(!_n(s.$.type))throw y({token:i.token,errorMessage:`Expected bool type for condition expression, got:
|
|
11507
|
-
${w(i)}`});let l=s.$.value,u=l!==void 0;if(
|
|
11508
|
-
${w(a)}`});if(nt(_.$.controlFlow)){if(et(_.$.controlFlow,"return")||et(_.$.controlFlow,"escape"))if(
|
|
11509
|
-
${w(o)}`});p=m.$.env}if(
|
|
11507
|
+
${w(i)}`});let l=s.$.value,u=l!==void 0;if(Pe(l)&&l.value===!1)return e.$={env:t,pathCollection:[],type:H.type,value:u?H:void 0},e;{let _=ht({expr:a,env:t,context:{...n,isEvaluatingLoopBody:{kind:"while",env:t}},variablesToAdd:[]});if(!_.$)throw y({token:a.token,errorMessage:`Failed to evaluate the body expression:
|
|
11508
|
+
${w(a)}`});if(nt(_.$.controlFlow)){if(et(_.$.controlFlow,"return")||et(_.$.controlFlow,"escape"))if(Pe(l)&&l.value===!0){let p={};et(_.$.controlFlow,"return")&&(p.return=!0),et(_.$.controlFlow,"escape")&&(p.escape=!0),e.$={env:_.$.env,pathCollection:_.$.pathCollection,type:_.$.type,value:_.$.value,controlFlow:p}}else e.$={env:t,pathCollection:[],type:H.type,value:u?H:void 0};else if(et(_.$.controlFlow,"break"))e.$={env:_.$.env,pathCollection:[],type:H.type,value:u?H:void 0};else if(et(_.$.controlFlow,"continue")){let p=_.$.env;if(o){let m=S({expr:o,env:p,context:{...n}});if(!m.$)throw y({token:o.token,errorMessage:`Failed to evaluate the step expression:
|
|
11509
|
+
${w(o)}`});p=m.$.env}if(Pe(l))return ns({expr:e,env:p,context:{...n},_comptimeIterationCount:r+1});e.$={env:p,pathCollection:[],type:H.type,value:u?H:void 0}}return e}if(!Pe(l)||l.value!==!0?!1:!!(dt(i,"true")||E(i,"begin")&&i.args.length===1&&dt(i.args[0],"true"))){let{guaranteed:p,possible:m}=gm(a,_.$.controlFlow);if(!p&&!m&&Wl(e,a,_.$.controlFlow),!p&&m)return e.$={env:_.$.env,pathCollection:[],type:H.type,value:void 0},e}if(!fe(_.$.type))throw y({token:a.token,errorMessage:`Expected the while loop body to return unit, but got:
|
|
11510
11510
|
${A(_.$.type)}`});let f=_.$.value===void 0;if(t=_.$.env,o){let p=S({expr:o,env:t,context:{...n}});if(!p.$)throw y({token:o.token,errorMessage:`Failed to evaluate the step expression:
|
|
11511
|
-
${w(o)}`});t=p.$.env}if(
|
|
11512
|
-
${w(e)}`})}else if(E(e,":",2)){let{expr:r}=es({expr:e,env:t,context:n});return r}else{if(E(e,":=",2)||E(e,"::",2))return lm({expr:e,env:t,context:n});if(E(e,"=",2))return qd({expr:e,env:t,context:n});if(E(e,"->",2))return F(e.args[0])&&(E(e.args[0],I.fn)||E(e.args[0],I.unsafe_fn))?Ya({expr:e,env:t,context:{...n,isUnsafeFunctionType:E(e.args[0],I.unsafe_fn)}}):F(e.args[0])&&E(e.args[0],I.Fn)?kd({expr:e,env:t,context:{...n}}):Ja({expr:e,env:t,context:{...n}});if(E(e,"=>",2))return F(e.args[0])&&E(e.args[0],I.fn)?Td({expr:e,env:t,context:{...n}}):Ja({expr:e,env:t,context:{...n}});if(E(e,"=>>",2))return Ja({expr:e,env:t,context:{...n}});if(E(e,I.recur))return fm({expr:e,env:t,context:{...n}});if(E(e,I.runtime))return pm({expr:e,env:t,context:{...n}});if(E(e,I.extern))return Xd({expr:e,env:t,context:{...n}});if(E(e,I.c_include))return Hd({expr:e,env:t,context:{...n}});if(E(e,I.test))return mm({expr:e,env:t,context:{...n}});if(E(e,I.cond))return jd({expr:e,env:t,context:{...n}});if(E(e,I.match))return um({expr:e,env:t,context:{...n}});if(E(e,I.tuple))return Yd({expr:e,env:t,context:{...n}});if(E(e,I.array))return Md({expr:e,env:t,context:{...n}});if(E(e,I.comptime_list))return Pd({expr:e,env:t,context:{...n}});if(E(e,I.dyn))return Ud({expr:e,env:t,context:{...n}});if(E(e,I.struct))return co({expr:e,env:t,context:{...n}});if(E(e,I.object))return Ad({expr:e,env:t,context:{...n}});if(E(e,I.newtype))return Ld({expr:e,env:t,context:{...n}});if(E(e,I.enum))return Cd({expr:e,env:t,context:{...n}});if(E(e,I.union))return Dd({expr:e,env:t,context:{...n}});if(E(e,"."))return cm({expr:e,env:t,context:{...n}});if(E(e,I.begin))return ht({expr:e,env:t,context:{...n},variablesToAdd:[]});if(E(e,I.module))return Fd({expr:e,env:t,context:{...n}});if(E(e,I.trait))return xd({expr:e,env:t,context:{...n}});if(E(e,I.Impl))return Gp({expr:e,env:t,context:{...n}});if(E(e,I.impl))return Xu({expr:e,env:t,context:{...n}});if(E(e,k.typeof))return ym({expr:e,env:t,context:{...n}});if(E(e,k.sizeof))return ad({expr:e,env:t,context:{...n}});if(E(e,k.alignof))return kf({expr:e,env:t,context:{...n}});if(E(e,k.typeid))return pd({expr:e,env:t,context:{...n}});if(E(e,k.downcast))return ap({expr:e,env:t,context:{...n}});if(E(e,k.rc))return od({expr:e,env:t,context:{...n}});if(E(e,"<:"))return dm({expr:e,env:t,context:{...n}});if(E(e,k.the))return sd({expr:e,env:t,context:{...n}});if(E(e,I.import))return am({expr:e,env:t,context:{...n},stdPath:n.stdPath});if(E(e,I.open))return _m({expr:e,env:t,context:{...n}});if(E(e,I.Ptr,1))return hd({expr:e,env:t,context:{...n}});if(E(e,I.Iso,1))return Fp({expr:e,env:t,context:{...n}});if(E(e,I.Arc,1))return dp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_address_of,1))return id({expr:e,env:t,context:{...n}});if(E(e,I.Tuple))return Vd({expr:e,env:t,context:{...n}});if(E(e,I.Array))return vd({expr:e,env:t,context:{...n}});if(E(e,k.__yo_array_fill,2))return Ff({expr:e,env:t,context:{...n}});if(E(e,I.Slice))return Id({expr:e,env:t,context:{...n}});if(E(e,I.ComptimeList))return Ed({expr:e,env:t,context:{...n}});if(E(e,I.Future))return wd({expr:e,env:t,context:{...n}});if(E(e,I.Concrete))return $d({expr:e,env:t,context:{...n}});if(E(e,I.Dyn))return bd({expr:e,env:t,context:{...n}});if(E(e,k.comptime_expect_error))return If({expr:e,env:t,context:{...n}});if(E(e,k.comptime_assert))return Lf({expr:e,env:t,context:{...n}});if(E(e,k.comptime_fn))return Sf({expr:e,env:t,context:{...n}});if(E(e,k.comptime_print))return Uf({expr:e,env:t,context:{...n}});if(E(e,k.panic))return qp({expr:e,env:t,context:{...n}});if(E(e,k.asm))return Zp({expr:e,env:t,context:{...n}});if(E(e,k.global_asm))return Jp({expr:e,env:t,context:{...n}});if(E(e,k.macro_expand))return Yp({expr:e,env:t,context:{...n}});if(E(e,I.op_and)||E(e,I.op_or))return wf({expr:e,env:t,context:{...n}});if(E(e,I.escape))return Kd({expr:e,env:t,context:{...n}});if(E(e,k.consume))return Gf({expr:e,env:t,context:{...n}});if(E(e,k.___drop))return xp({expr:e,env:t,context:{...n}});if(E(e,k.___dup))return Vp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_decr_rc))return Wf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_incr_rc))return Yf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_decr_rc_atomic))return Hf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_incr_rc_atomic))return qf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_iso_extract))return Jf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_iso_dispose))return ep({expr:e,env:t,context:{...n}});if(E(e,k.__yo_arc_dispose))return tp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_drop_array_element))return np({expr:e,env:t,context:{...n}});if(E(e,k.__yo_dup_array_element))return rp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_drop_tuple_element))return ip({expr:e,env:t,context:{...n}});if(E(e,k.__yo_dup_tuple_element))return op({expr:e,env:t,context:{...n}});if(E(e,k.__yo_rc_own))return jf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_dyn_drop))return Kf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_dyn_dup))return Xf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_sometype_drop))return Qf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_sometype_dup))return Zf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_gc_collect))return Up({expr:e,env:t,context:{...n}});if(E(e,I.quote))return Wp({expr:e,env:t,context:{...n}});if(E(e,I.gensym))return Bp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_is_atom))return Dp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_is_fn_call))return Mp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_get_callee))return Op({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_get_args))return Rp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_to_string))return Pp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_eq))return zp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_car))return Nf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_cdr))return xf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_cons))return Vf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_append))return Df({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_length))return Mf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_element_type))return Of({expr:e,env:t,context:{...n}});if(F(e)&&e.func.tag==="Atom"&&typeof e.func.token.value=="string"&&(e.func.token.value.startsWith("__yo_comptime_u8_")||e.func.token.value.startsWith("__yo_comptime_i8_")||e.func.token.value.startsWith("__yo_comptime_u16_")||e.func.token.value.startsWith("__yo_comptime_i16_")||e.func.token.value.startsWith("__yo_comptime_u32_")||e.func.token.value.startsWith("__yo_comptime_i32_")||e.func.token.value.startsWith("__yo_comptime_u64_")||e.func.token.value.startsWith("__yo_comptime_i64_")||e.func.token.value.startsWith("__yo_comptime_usize_")||e.func.token.value.startsWith("__yo_comptime_isize_")||e.func.token.value.startsWith("__yo_comptime_f32_")||e.func.token.value.startsWith("__yo_comptime_f64_")||e.func.token.value.startsWith("__yo_comptime_int_")||e.func.token.value.startsWith("__yo_comptime_float_")))return zf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_bool_and,2)||E(e,k.__yo_comptime_bool_or,2)||E(e,k.__yo_comptime_bool_eq,2)||E(e,k.__yo_comptime_bool_neq,2)||E(e,k.__yo_comptime_bool_not,1)||E(e,k.__yo_comptime_bool_to_comptime_string,1))return Af({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_string_concat,2)||E(e,k.__yo_comptime_string_eq,2)||E(e,k.__yo_comptime_string_neq,2)||E(e,k.__yo_comptime_string_lt,2)||E(e,k.__yo_comptime_string_lte,2)||E(e,k.__yo_comptime_string_gt,2)||E(e,k.__yo_comptime_string_gte,2)||E(e,k.__yo_comptime_string_length,1)||E(e,k.__yo_comptime_string_to_upper,1)||E(e,k.__yo_comptime_string_to_lower,1)||E(e,k.__yo_comptime_string_slice))return Bf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_type_to_comptime_string,1))return ld({expr:e,env:t,context:{...n}});if(E(e,k.__yo_are_types_compatible,2))return ud({expr:e,env:t,context:{...n}});if(E(e,k.__yo_type_contains_rc_type,1))return _d({expr:e,env:t,context:{...n}});if(E(e,k.__yo_type_can_form_rc_cycle,1))return cd({expr:e,env:t,context:{...n}});if(E(e,k.__yo_type_impls,2))return fd({expr:e,env:t,context:{...n}});if(E(e,k.__yo_var_print_info,1))return md({expr:e,env:t,context:{...n}});if(E(e,k.__yo_var_is_owning_the_rc_value))return yd({expr:e,env:t,context:{...n}});if(E(e,k.__yo_var_has_other_aliases))return gd({expr:e,env:t,context:{...n}});if(E(e,k.__yo_process_platform)||E(e,k.__yo_process_arch)||E(e,k.__yo_pointer_size_bits))return ed({expr:e,env:t,context:{...n}});if(E(e,k.__yo_build_executable)||E(e,k.__yo_build_static_library)||E(e,k.__yo_build_shared_library)||E(e,k.__yo_build_test)||E(e,k.__yo_build_run)||E(e,k.__yo_build_step)||E(e,k.__yo_build_step_depend_on)||E(e,k.__yo_build_target_host)||E(e,k.__yo_build_target_parse)||E(e,k.__yo_build_dependency)||E(e,k.__yo_build_path_dependency)||E(e,k.__yo_build_system_library)||E(e,k.__yo_build_link)||E(e,k.__yo_build_link_system_library)||E(e,k.__yo_build_option)||E(e,k.__yo_build_dep_artifact)||E(e,k.__yo_build_module)||E(e,k.__yo_build_module_link)||E(e,k.__yo_build_add_import)||E(e,k.__yo_build_dep_module)){for(let r=0;r<e.args.length;r++)e.args[r]=Xr({expr:e.args[r],env:t,context:{...n}});return rd({expr:e,env:t,context:{...n}})}else return E(e,I.while)?ns({expr:e,env:t,context:{...n}}):E(e,k.va_start)?dd({expr:e,env:t,context:{...n}}):Rn({expr:e,env:t,context:{...n}})}}function Ph(e){let t=e;for(;;){let n=ia.join(t,"std");if(Rh(n))return n;let r=ia.dirname(t);if(r===t)break;t=r}return ia.join(__dirname,"../std")}var Tm=class{constructor(t){this.modules=new Map;this.dependencies=new Map;this.dependents=new Map;this.allowPartialModule=t?.allowPartialModule??!1,this.stdPath=t?.stdPath??Ph(__dirname),this.codeGenratorC=new Ua,jl(Xr),v_(Cf)}getRelativePath(t){let n=t.match(/\/std\/(.+)$/);if(n)return`std/${n[1]}`;let r=t.match(/\/tests\/(.+)$/);return r?`tests/${r[1]}`:null}isWorkspaceModule(t){return!t.includes("/extensions/")&&!t.includes("/.vscode/")}findExtensionDuplicates(t){if(!this.isWorkspaceModule(t))return[];let n=this.getRelativePath(t);if(!n)return[];let r=[];for(let[i]of this.modules)i!==t&&!this.isWorkspaceModule(i)&&this.getRelativePath(i)===n&&r.push(i);if(n.startsWith("std/"))for(let[i]of this.modules)!this.isWorkspaceModule(i)&&(i.endsWith("/std/prelude.yo")||i.endsWith("/prelude.yo"))&&!r.includes(i)&&r.push(i);return r}deleteModuleAndDependents(t){let n=this.getDependentModules(t);for(let r of n)Uo(r),zo(r),this.clearDependencies(r),ya(r),this.modules.delete(r);Uo(t),zo(t),this.clearDependencies(t),ya(t),this.modules.delete(t)}addDependency(t,n){this.dependencies.has(t)||this.dependencies.set(t,new Set),this.dependencies.get(t).add(n),this.dependents.has(n)||this.dependents.set(n,new Set),this.dependents.get(n).add(t)}getDependentModules(t){let n=new Set,r=[t];for(;r.length>0;){let i=r.pop(),o=this.dependents.get(i);if(o)for(let a of o)n.has(a)||(n.add(a),r.push(a))}return n}clearDependencies(t){let n=this.dependencies.get(t);if(n)for(let r of n){let i=this.dependents.get(r);i&&i.delete(t)}this.dependencies.delete(t)}resetAllState(){for(let t of this.modules.keys())Uo(t),zo(t),ya(t);this.modules.clear(),this.dependencies.clear(),this.dependents.clear(),el(),r_(),lu()}loadModule(t,n,r){if(!t.match(/^file:\/\//))throw new Error(`Invalid file protocol: ${t}. Only file:// is supported for now. `);r&&this.addDependency(r,t);let i=this.modules.get(t);if(i)return{moduleValue:i.moduleValue,moduleError:i.moduleError};let o=this.findExtensionDuplicates(t);for(let _ of o)this.deleteModuleAndDependents(_);let a=t,s=new Go({modulePath:t,stdPath:this.stdPath,loadModule:_=>this.loadModule(_,void 0,a),inputString:n,allowPartialModule:this.allowPartialModule}),l=s.getModuleValue(),u=s.getModuleError();return this.modules.set(t,{moduleValue:l,moduleError:u,evaluator:s}),{moduleValue:l,moduleError:u}}deleteModule(t){if(!t.match(/^file:\/\//))throw new Error(`Invalid file protocol: ${t}. Only file:// is supported for now. `);let n=[t];if(this.isWorkspaceModule(t))for(let[i]of this.modules)!this.isWorkspaceModule(i)&&!n.includes(i)&&n.push(i);if(t.endsWith("/std/prelude.yo")||t.endsWith("/prelude.yo"))for(let[i]of this.modules)(i.endsWith("/std/prelude.yo")||i.endsWith("/prelude.yo"))&&i!==t&&!n.includes(i)&&n.push(i);for(let i of n)this.deleteModuleAndDependents(i)}compileModule(t,{emitC:n,debugGc:r,debugParallelism:i,debugAsyncAwait:o,allocator:a,isLibrary:s}={}){let{moduleValue:l,moduleError:u}=this.loadModule(t);if(u)throw u.toString();if(!this.modules.get(t))throw new Error(`Module data not found for ${t}`);this.codeGenratorC.compileModule(t,l,{debugGc:r,debugParallelism:i,debugAsyncAwait:o,allocator:a,isLibrary:s}),n&&console.log(this.codeGenratorC.print())}getGeneratedCode(){return this.codeGenratorC.print()}getExportedFunctionNames(){return this.codeGenratorC.getExportedFunctionNames()}get needsIntelAsmSyntax(){return this.codeGenratorC.needsIntelAsmSyntax}get usesParallelism(){return this.codeGenratorC.usesParallelism}};export{bi as Emitter,is as IdentifierRegex,Tm as ModuleManager,rs as Operators,ae as PlaceholderToken,Bh as RAIIToken,jt as TokenType,yo as charIsOperator,el as clearAllGlobalImplState,zo as clearGenericImplsFromModule,Uo as clearImplsFromModule,g$ as debug,Hl as findMatchingBracketTokenIndex,Jt as generateExprFromCode,sr as stringIsOperator,Kl as tokenize};
|
|
11511
|
+
${w(o)}`});t=p.$.env}if(Pe(l)&&l.value===!0&&f){let p=Ae(i),g=ht({expr:p,env:t,context:{...n},variablesToAdd:[]}).$?.value;if(Pe(g)){let h=[a],d=t,v=g.value;for(let T=1;v&&T<Yl;T++){let $=Ae(a),b=ht({expr:$,env:d,context:{...n,isEvaluatingLoopBody:{kind:"while",env:d}},variablesToAdd:[]});if(!b.$)break;if(h.push($),d=b.$.env,o){let N=Ae(o),B=S({expr:N,env:d,context:{...n}});if(!B.$)break;d=B.$.env}let L=Ae(i),R=ht({expr:L,env:d,context:{...n},variablesToAdd:[]}).$?.value;if(Pe(R)&&R.value===!1)v=!1;else if(Pe(R)&&R.value===!0)v=!0;else return e.$={env:d,pathCollection:[],type:H.type,value:void 0,comptimeUnrolledBodies:h},e}if(!v)return e.$={env:d,pathCollection:[],type:H.type,value:void 0,comptimeUnrolledBodies:h},e}Wl(e,a,_.$.controlFlow)}if(Pe(l)&&l.value===!0){let p=r+1;return p>=Yl&&Wl(e,a,_.$.controlFlow),ns({expr:e,env:t,context:{...n},_comptimeIterationCount:p})}else return e.$={env:t,pathCollection:[],type:H.type,value:u?H:void 0},e}}function hm(e){let t=process.env[e];return t==="1"||t?.toLowerCase()==="true"}var Oh=hm("YO_DEBUG_EVAL")||hm("YO_DEBUG_EVAL_PROFILE"),vm=globalThis,mo=vm.__yoEvalProfilerState??(vm.__yoEvalProfilerState={evalCount:0,evalStart:0});function Xr({expr:e,env:t,context:n}){if(Oh&&(mo.evalStart||(mo.evalStart=Date.now()),mo.evalCount++,mo.evalCount%1e5===0&&console.log(`[EVAL] ${mo.evalCount} calls, ${Date.now()-mo.evalStart}ms elapsed`)),U(e))switch(e.token.type){case"identifier":case"operator":return ts({expr:e,env:t,context:{...n},throwErrorOnUndefined:!0});case"integer":return Gd(e,t,{...n});case"float":return Bd(e,t,{...n});case"string":return Wd(e,t);case"char":return Rd(e,t);case"bool":return Od(e,t);default:throw y({token:e.token,errorMessage:`(1) Evaluating the expression (tag: ${e.tag}, token: ${e.token.type}) below is not implemented:
|
|
11512
|
+
${w(e)}`})}else if(E(e,":",2)){let{expr:r}=es({expr:e,env:t,context:n});return r}else{if(E(e,":=",2)||E(e,"::",2))return lm({expr:e,env:t,context:n});if(E(e,"=",2))return qd({expr:e,env:t,context:n});if(E(e,"->",2))return F(e.args[0])&&(E(e.args[0],I.fn)||E(e.args[0],I.unsafe_fn))?Ya({expr:e,env:t,context:{...n,isUnsafeFunctionType:E(e.args[0],I.unsafe_fn)}}):F(e.args[0])&&E(e.args[0],I.Fn)?kd({expr:e,env:t,context:{...n}}):Ja({expr:e,env:t,context:{...n}});if(E(e,"=>",2))return F(e.args[0])&&E(e.args[0],I.fn)?Td({expr:e,env:t,context:{...n}}):Ja({expr:e,env:t,context:{...n}});if(E(e,"=>>",2))return Ja({expr:e,env:t,context:{...n}});if(E(e,I.recur))return fm({expr:e,env:t,context:{...n}});if(E(e,I.runtime))return pm({expr:e,env:t,context:{...n}});if(E(e,I.extern))return Xd({expr:e,env:t,context:{...n}});if(E(e,I.c_include))return Hd({expr:e,env:t,context:{...n}});if(E(e,I.test))return mm({expr:e,env:t,context:{...n}});if(E(e,I.cond))return jd({expr:e,env:t,context:{...n}});if(E(e,I.match))return um({expr:e,env:t,context:{...n}});if(E(e,I.tuple))return Yd({expr:e,env:t,context:{...n}});if(E(e,I.array))return Md({expr:e,env:t,context:{...n}});if(E(e,I.comptime_list))return Pd({expr:e,env:t,context:{...n}});if(E(e,I.dyn))return Ud({expr:e,env:t,context:{...n}});if(E(e,I.struct))return co({expr:e,env:t,context:{...n}});if(E(e,I.object))return Ad({expr:e,env:t,context:{...n}});if(E(e,I.newtype))return Ld({expr:e,env:t,context:{...n}});if(E(e,I.enum))return Cd({expr:e,env:t,context:{...n}});if(E(e,I.union))return Dd({expr:e,env:t,context:{...n}});if(E(e,"."))return cm({expr:e,env:t,context:{...n}});if(E(e,I.begin))return ht({expr:e,env:t,context:{...n},variablesToAdd:[]});if(E(e,I.module))return Fd({expr:e,env:t,context:{...n}});if(E(e,I.trait))return xd({expr:e,env:t,context:{...n}});if(E(e,I.Impl))return Gp({expr:e,env:t,context:{...n}});if(E(e,I.impl))return Xu({expr:e,env:t,context:{...n}});if(E(e,k.typeof))return ym({expr:e,env:t,context:{...n}});if(E(e,k.sizeof))return ad({expr:e,env:t,context:{...n}});if(E(e,k.alignof))return kf({expr:e,env:t,context:{...n}});if(E(e,k.typeid))return pd({expr:e,env:t,context:{...n}});if(E(e,k.downcast))return ap({expr:e,env:t,context:{...n}});if(E(e,k.rc))return od({expr:e,env:t,context:{...n}});if(E(e,"<:"))return dm({expr:e,env:t,context:{...n}});if(E(e,k.the))return sd({expr:e,env:t,context:{...n}});if(E(e,I.import))return am({expr:e,env:t,context:{...n},stdPath:n.stdPath});if(E(e,I.open))return _m({expr:e,env:t,context:{...n}});if(E(e,I.Ptr,1))return hd({expr:e,env:t,context:{...n}});if(E(e,I.Iso,1))return Fp({expr:e,env:t,context:{...n}});if(E(e,I.Arc,1))return dp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_address_of,1))return id({expr:e,env:t,context:{...n}});if(E(e,I.Tuple))return Vd({expr:e,env:t,context:{...n}});if(E(e,I.Array))return vd({expr:e,env:t,context:{...n}});if(E(e,k.__yo_array_fill,2))return Ff({expr:e,env:t,context:{...n}});if(E(e,I.Slice))return Id({expr:e,env:t,context:{...n}});if(E(e,I.ComptimeList))return Ed({expr:e,env:t,context:{...n}});if(E(e,I.Future))return wd({expr:e,env:t,context:{...n}});if(E(e,I.Concrete))return $d({expr:e,env:t,context:{...n}});if(E(e,I.Dyn))return bd({expr:e,env:t,context:{...n}});if(E(e,k.comptime_expect_error))return If({expr:e,env:t,context:{...n}});if(E(e,k.comptime_assert))return Lf({expr:e,env:t,context:{...n}});if(E(e,k.comptime_fn))return Sf({expr:e,env:t,context:{...n}});if(E(e,k.comptime_print))return Uf({expr:e,env:t,context:{...n}});if(E(e,k.panic))return qp({expr:e,env:t,context:{...n}});if(E(e,k.asm))return Zp({expr:e,env:t,context:{...n}});if(E(e,k.global_asm))return Jp({expr:e,env:t,context:{...n}});if(E(e,k.macro_expand))return Yp({expr:e,env:t,context:{...n}});if(E(e,I.op_and)||E(e,I.op_or))return wf({expr:e,env:t,context:{...n}});if(E(e,I.escape))return Kd({expr:e,env:t,context:{...n}});if(E(e,k.consume))return Gf({expr:e,env:t,context:{...n}});if(E(e,k.___drop))return xp({expr:e,env:t,context:{...n}});if(E(e,k.___dup))return Vp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_decr_rc))return Wf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_incr_rc))return Yf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_decr_rc_atomic))return Hf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_incr_rc_atomic))return qf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_iso_extract))return Jf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_iso_dispose))return ep({expr:e,env:t,context:{...n}});if(E(e,k.__yo_arc_dispose))return tp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_drop_array_element))return np({expr:e,env:t,context:{...n}});if(E(e,k.__yo_dup_array_element))return rp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_drop_tuple_element))return ip({expr:e,env:t,context:{...n}});if(E(e,k.__yo_dup_tuple_element))return op({expr:e,env:t,context:{...n}});if(E(e,k.__yo_rc_own))return jf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_dyn_drop))return Kf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_dyn_dup))return Xf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_sometype_drop))return Qf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_sometype_dup))return Zf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_gc_collect))return Up({expr:e,env:t,context:{...n}});if(E(e,I.quote))return Wp({expr:e,env:t,context:{...n}});if(E(e,I.gensym))return Bp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_is_atom))return Dp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_is_fn_call))return Mp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_get_callee))return Op({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_get_args))return Rp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_to_string))return Pp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_eq))return zp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_car))return Nf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_cdr))return xf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_cons))return Vf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_append))return Df({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_length))return Mf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_element_type))return Of({expr:e,env:t,context:{...n}});if(F(e)&&e.func.tag==="Atom"&&typeof e.func.token.value=="string"&&(e.func.token.value.startsWith("__yo_comptime_u8_")||e.func.token.value.startsWith("__yo_comptime_i8_")||e.func.token.value.startsWith("__yo_comptime_u16_")||e.func.token.value.startsWith("__yo_comptime_i16_")||e.func.token.value.startsWith("__yo_comptime_u32_")||e.func.token.value.startsWith("__yo_comptime_i32_")||e.func.token.value.startsWith("__yo_comptime_u64_")||e.func.token.value.startsWith("__yo_comptime_i64_")||e.func.token.value.startsWith("__yo_comptime_usize_")||e.func.token.value.startsWith("__yo_comptime_isize_")||e.func.token.value.startsWith("__yo_comptime_f32_")||e.func.token.value.startsWith("__yo_comptime_f64_")||e.func.token.value.startsWith("__yo_comptime_int_")||e.func.token.value.startsWith("__yo_comptime_float_")))return zf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_bool_and,2)||E(e,k.__yo_comptime_bool_or,2)||E(e,k.__yo_comptime_bool_eq,2)||E(e,k.__yo_comptime_bool_neq,2)||E(e,k.__yo_comptime_bool_not,1)||E(e,k.__yo_comptime_bool_to_comptime_string,1))return Af({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_string_concat,2)||E(e,k.__yo_comptime_string_eq,2)||E(e,k.__yo_comptime_string_neq,2)||E(e,k.__yo_comptime_string_lt,2)||E(e,k.__yo_comptime_string_lte,2)||E(e,k.__yo_comptime_string_gt,2)||E(e,k.__yo_comptime_string_gte,2)||E(e,k.__yo_comptime_string_length,1)||E(e,k.__yo_comptime_string_to_upper,1)||E(e,k.__yo_comptime_string_to_lower,1)||E(e,k.__yo_comptime_string_slice))return Bf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_type_to_comptime_string,1))return ld({expr:e,env:t,context:{...n}});if(E(e,k.__yo_are_types_compatible,2))return ud({expr:e,env:t,context:{...n}});if(E(e,k.__yo_type_contains_rc_type,1))return _d({expr:e,env:t,context:{...n}});if(E(e,k.__yo_type_can_form_rc_cycle,1))return cd({expr:e,env:t,context:{...n}});if(E(e,k.__yo_type_impls,2))return fd({expr:e,env:t,context:{...n}});if(E(e,k.__yo_var_print_info,1))return md({expr:e,env:t,context:{...n}});if(E(e,k.__yo_var_is_owning_the_rc_value))return yd({expr:e,env:t,context:{...n}});if(E(e,k.__yo_var_has_other_aliases))return gd({expr:e,env:t,context:{...n}});if(E(e,k.__yo_process_platform)||E(e,k.__yo_process_arch)||E(e,k.__yo_pointer_size_bits))return ed({expr:e,env:t,context:{...n}});if(E(e,k.__yo_build_executable)||E(e,k.__yo_build_static_library)||E(e,k.__yo_build_shared_library)||E(e,k.__yo_build_test)||E(e,k.__yo_build_run)||E(e,k.__yo_build_step)||E(e,k.__yo_build_step_depend_on)||E(e,k.__yo_build_target_host)||E(e,k.__yo_build_target_parse)||E(e,k.__yo_build_dependency)||E(e,k.__yo_build_path_dependency)||E(e,k.__yo_build_system_library)||E(e,k.__yo_build_link)||E(e,k.__yo_build_link_system_library)||E(e,k.__yo_build_option)||E(e,k.__yo_build_dep_artifact)||E(e,k.__yo_build_module)||E(e,k.__yo_build_module_link)||E(e,k.__yo_build_add_import)||E(e,k.__yo_build_add_cflags)||E(e,k.__yo_build_dep_module)){for(let r=0;r<e.args.length;r++)e.args[r]=Xr({expr:e.args[r],env:t,context:{...n}});return rd({expr:e,env:t,context:{...n}})}else return E(e,I.while)?ns({expr:e,env:t,context:{...n}}):E(e,k.va_start)?dd({expr:e,env:t,context:{...n}}):Rn({expr:e,env:t,context:{...n}})}}function Ph(e){let t=e;for(;;){let n=ia.join(t,"std");if(Rh(n))return n;let r=ia.dirname(t);if(r===t)break;t=r}return ia.join(__dirname,"../std")}var Tm=class{constructor(t){this.modules=new Map;this.dependencies=new Map;this.dependents=new Map;this.allowPartialModule=t?.allowPartialModule??!1,this.stdPath=t?.stdPath??Ph(__dirname),this.codeGenratorC=new Ua,jl(Xr),v_(Cf)}getRelativePath(t){let n=t.match(/\/std\/(.+)$/);if(n)return`std/${n[1]}`;let r=t.match(/\/tests\/(.+)$/);return r?`tests/${r[1]}`:null}isWorkspaceModule(t){return!t.includes("/extensions/")&&!t.includes("/.vscode/")}findExtensionDuplicates(t){if(!this.isWorkspaceModule(t))return[];let n=this.getRelativePath(t);if(!n)return[];let r=[];for(let[i]of this.modules)i!==t&&!this.isWorkspaceModule(i)&&this.getRelativePath(i)===n&&r.push(i);if(n.startsWith("std/"))for(let[i]of this.modules)!this.isWorkspaceModule(i)&&(i.endsWith("/std/prelude.yo")||i.endsWith("/prelude.yo"))&&!r.includes(i)&&r.push(i);return r}deleteModuleAndDependents(t){let n=this.getDependentModules(t);for(let r of n)Uo(r),zo(r),this.clearDependencies(r),ya(r),this.modules.delete(r);Uo(t),zo(t),this.clearDependencies(t),ya(t),this.modules.delete(t)}addDependency(t,n){this.dependencies.has(t)||this.dependencies.set(t,new Set),this.dependencies.get(t).add(n),this.dependents.has(n)||this.dependents.set(n,new Set),this.dependents.get(n).add(t)}getDependentModules(t){let n=new Set,r=[t];for(;r.length>0;){let i=r.pop(),o=this.dependents.get(i);if(o)for(let a of o)n.has(a)||(n.add(a),r.push(a))}return n}clearDependencies(t){let n=this.dependencies.get(t);if(n)for(let r of n){let i=this.dependents.get(r);i&&i.delete(t)}this.dependencies.delete(t)}resetAllState(){for(let t of this.modules.keys())Uo(t),zo(t),ya(t);this.modules.clear(),this.dependencies.clear(),this.dependents.clear(),el(),r_(),lu()}loadModule(t,n,r){if(!t.match(/^file:\/\//))throw new Error(`Invalid file protocol: ${t}. Only file:// is supported for now. `);r&&this.addDependency(r,t);let i=this.modules.get(t);if(i)return{moduleValue:i.moduleValue,moduleError:i.moduleError};let o=this.findExtensionDuplicates(t);for(let _ of o)this.deleteModuleAndDependents(_);let a=t,s=new Go({modulePath:t,stdPath:this.stdPath,loadModule:_=>this.loadModule(_,void 0,a),inputString:n,allowPartialModule:this.allowPartialModule}),l=s.getModuleValue(),u=s.getModuleError();return this.modules.set(t,{moduleValue:l,moduleError:u,evaluator:s}),{moduleValue:l,moduleError:u}}deleteModule(t){if(!t.match(/^file:\/\//))throw new Error(`Invalid file protocol: ${t}. Only file:// is supported for now. `);let n=[t];if(this.isWorkspaceModule(t))for(let[i]of this.modules)!this.isWorkspaceModule(i)&&!n.includes(i)&&n.push(i);if(t.endsWith("/std/prelude.yo")||t.endsWith("/prelude.yo"))for(let[i]of this.modules)(i.endsWith("/std/prelude.yo")||i.endsWith("/prelude.yo"))&&i!==t&&!n.includes(i)&&n.push(i);for(let i of n)this.deleteModuleAndDependents(i)}compileModule(t,{emitC:n,debugGc:r,debugParallelism:i,debugAsyncAwait:o,allocator:a,isLibrary:s}={}){let{moduleValue:l,moduleError:u}=this.loadModule(t);if(u)throw u.toString();if(!this.modules.get(t))throw new Error(`Module data not found for ${t}`);this.codeGenratorC.compileModule(t,l,{debugGc:r,debugParallelism:i,debugAsyncAwait:o,allocator:a,isLibrary:s}),n&&console.log(this.codeGenratorC.print())}getGeneratedCode(){return this.codeGenratorC.print()}getExportedFunctionNames(){return this.codeGenratorC.getExportedFunctionNames()}get needsIntelAsmSyntax(){return this.codeGenratorC.needsIntelAsmSyntax}get usesParallelism(){return this.codeGenratorC.usesParallelism}};export{bi as Emitter,is as IdentifierRegex,Tm as ModuleManager,rs as Operators,ae as PlaceholderToken,Bh as RAIIToken,jt as TokenType,yo as charIsOperator,el as clearAllGlobalImplState,zo as clearGenericImplsFromModule,Uo as clearImplsFromModule,g$ as debug,Hl as findMatchingBracketTokenIndex,Jt as generateExprFromCode,sr as stringIsOperator,Kl as tokenize};
|