@shd101wyy/yo 0.0.28 → 0.0.29
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/README.md +1 -1
- package/out/cjs/index.cjs +57 -57
- package/out/cjs/yo-cli.cjs +72 -72
- package/out/esm/index.mjs +62 -62
- package/out/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/std/regex/compiler.yo +355 -0
- package/std/regex/flags.yo +104 -0
- package/std/regex/match.yo +83 -0
- package/std/regex/node.yo +283 -0
- package/std/regex/parser.yo +847 -0
- package/std/regex/regex.yo +714 -0
- package/std/regex/unicode.yo +365 -0
- package/std/regex/vm.yo +737 -0
- package/std/time/sleep.yo +18 -0
- package/std/time.yo +0 -13
package/out/esm/index.mjs
CHANGED
|
@@ -12,7 +12,7 @@ ${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
14
|
${Al({token:e})}`;return new pn([{token:e,errorMessage:o+(n?.message?`
|
|
15
|
-
`+n.message:"")}],r,i)}function at(e,t,n){if(e.length===0)throw new Error("tokenAndErrorList must not be empty");return new pn(e,t,n)}var Xt=($=>($.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",$))(Xt||{}),ie={modulePath:"_",inputString:"_",type:"identifier",value:"_",position:{row:0,column:0,character:0}},xg={modulePath:"drop",inputString:"drop",type:"identifier",value:"drop",position:{row:0,column:0,character:0}},Wa=["=","+","-","*","/","<",">","@","$","~","&","%","|","!","?","^",".",":","\\","#"];function oo(e){return Wa.includes(e)}function
|
|
15
|
+
`+n.message:"")}],r,i)}function at(e,t,n){if(e.length===0)throw new Error("tokenAndErrorList must not be empty");return new pn(e,t,n)}var Xt=($=>($.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",$))(Xt||{}),ie={modulePath:"_",inputString:"_",type:"identifier",value:"_",position:{row:0,column:0,character:0}},xg={modulePath:"drop",inputString:"drop",type:"identifier",value:"drop",position:{row:0,column:0,character:0}},Wa=["=","+","-","*","/","<",">","@","$","~","&","%","|","!","?","^",".",":","\\","#"];function oo(e){return Wa.includes(e)}function Zn(e){let t=!0;for(let n=0;n<e.length;n++){let r=e[n];if(!oo(r)){t=!1;break}}return t}var qa=/^[_a-zA-Z\xA0-\uFFFF][_a-zA-Z0-9\xA0-\uFFFF]*[!?]?$/;function Il(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 Ha;function Nl(e){Ha=e}function N({expr:e,env:t,context:n}){if(!Ha)throw new Error("Internal Error: evaluateExpression function is not set.");return Ha({expr:e,env:t,context:n})}function Sl(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="",c=o;if(e[c]===".")for(;e[c]===".";)u+=e[c],c=c+1;else for(;oo(e[c])&&e[c]!==".";)u+=e[c],c=c+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=c-1;continue}switch(a){case" ":case" ":case`
|
|
16
16
|
`:case"\r":{let f="",p=o,_=r;for(;e[p]===" "||e[p]===" "||e[p]===`
|
|
17
17
|
`||e[p]==="\r";)f+=e[p],e[p]===`
|
|
18
18
|
`&&(r++,i=p+1),p=p+1;n.push({type:"whitespace",value:f,position:{row:_,column:s,character:l},modulePath:t,inputString:e}),o=p-1;break}case"/":if(e[o+1]==="/"){let f="",p=o;for(;e[p]!==`
|
|
@@ -39,13 +39,13 @@ ${e}
|
|
|
39
39
|
`,inputString:e});if(t.getParserError())throw t.getParserError();let n=t.getProgram();if(n.length!==1)throw new Error(`Expected exactly one expression from parsed code, got ${n.length}: "${e}"
|
|
40
40
|
${n.map(r=>w(r)).join(`
|
|
41
41
|
`)}
|
|
42
|
-
`);return n[0]}function ao(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 ue(e){return e?.tag==="unit"}function gt(e){return e?.tag==="comptime_int"}function St(e){return e?.tag==="comptime_float"}function Ft(e){return e?.tag==="comptime_string"}function xt(e){return e?.tag==="ComptimeList"}function jr(e){return xt(e)&&Lt(e.childType)}function gn(e){return e?.tag==="bool"}function so(e){return e?.tag==="usize"}function lo(e){return e?.tag==="isize"}function Wn(e){return e?.tag==="u8"}function uo(e){return e?.tag==="i8"}function co(e){return e?.tag==="u16"}function fo(e){return e?.tag==="i16"}function po(e){return e?.tag==="u32"}function _o(e){return e?.tag==="i32"}function mo(e){return e?.tag==="u64"}function yo(e){return e?.tag==="i64"}function go(e){return e?.tag==="f32"}function ho(e){return e?.tag==="f64"}function Lt(e){return e?.tag==="Expr"}function ke(e){return e?.tag==="Array"}function Xe(e){return e?.tag==="Slice"}function we(e){return e?.tag==="Tuple"}function _t(e){return e?.tag==="Union"}function ye(e){return e?.tag==="Enum"}function ce(e){return e?.tag==="Struct"}function ct(e){return e?.tag==="Struct"&&e.isReferenceSemantics}function
|
|
43
|
-
Insert some indirection (e.g., a pointer '*' or reference '&') to break the cycle.`});if(ct(a))continue;let s=[...n,o],l=kt(a,s);qe(l)&&(i=Math.max(i,l.level),l.tag==="Type"&&(r=!0))}return i>0?_n(i):r?et(e):et(e)}function kt(e,t=[]){if(be(e))return et(e);if(ao(e))return et(e);if(qe(e))return _n(e.level+1);if(gt(e)||St(e)||Ft(e)||xt(e))return et(e);if(Lt(e))return et(e);if(z(e))return et(e);if(Ct(e))return et(e);if(ke(e))return kt(e.childType,t);if(Xe(e))return et(e);if(we(e))return Qo(e,e.fields,t);if(ce(e))return Qo(e,e.fields,t);if(ye(e)){let n=[];for(let r of e.variants)r.fields&&n.push(...r.fields);return Qo(e,n,t)}else{if(_t(e))return Qo(e,e.fields,t);if(ve(e))return _n(1,e);if(Ve(e))return _n(1,e);if(x(e))return e.parentType;if(Ne(e))return et(e);if(bt(e))return et(e);if(Tt(e))return et(e);if(qt(e))return et(e);if(mr(e))return et(e);if(rt(e))return _n(1);throw new Error(`Unknown type tag: ${e.tag}`)}}function Dl(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 De(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(De).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(De).join(", ")}${e.elements.length===1?",":""}]`;case"Slice":return`slice[${e.sourceArray[0].elements.slice(e.startIndex,e.endIndex).map(De).join(", ")}]`;case"Tuple":return e.fields.length===0?"()":`(${e.fields.map(De).join(", ")}${e.fields.length===1?",":""})`;case"Struct":return`${e.type.typeName??"_"}(${e.fields.map((t,n)=>{let r=e.type.fields[n].label;return Qn(r)&&(r=`(${r})`),`${r}: ${De(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 Qn(i)&&(i=`(${i})`),`${i}: ${De(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 Qn(r)&&(r=`(${r})`),`${r}: ${De(t)}`}).join(", ")})`;case"Trait":return`${e.type.typeName??"_"}(${e.fields.map((t,n)=>{let r=e.type.fields[n].label;return Qn(r)&&(r=`(${r})`),`${r}: ${De(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 Rn(t)?`<ptr to ${De(t.elements[e.targetIndex])}>`:`<ptr to ${De(t)}>`}default:throw new Error("valueToString: Unsupported value")}}function D(e){return e?.tag==="Type"}function Fn(e){return e?.tag==="ComptimeInt"}function Jo(e){return e?.tag==="ComptimeFloat"}function He(e){return e?.tag==="ComptimeString"}function Jn(e){return e?.tag==="ComptimeList"}function Ml(e){return Jn(e)&&Lt(e.type.childType)}function Re(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 Ue(e){return e?.tag==="Bool"}function ne(e){return e?.tag==="Function"}function _e(e){return e?.tag==="Unknown"}function dn(e){return e?.tag==="Tuple"}function vn(e){return e?.tag==="Struct"}function Rn(e){return e?.tag==="Array"}function Zo(e){return e?.tag==="Slice"}function It(e){return e?.tag==="Enum"}function ze(e){return e?.tag==="Module"}function ht(e){return e?.tag==="Trait"}function vi(e){return e?.tag==="Ptr"}function an(e){return e?.tag==="Expr"}function J(e){return{tag:"Type",type:kt(e),value:e}}function nn(e){return{tag:"ComptimeString",type:Vt(),value:e}}function Pn(e,t){return{tag:"ComptimeList",type:To(e),elements:t}}function Ht(e,t){let n;if(e==="ComptimeInt")n=xr();else if(e==="ComptimeFloat")n=Ei();else if(e==="U8")n=Ci();else if(e==="I8")n=bi();else if(e==="U16")n=ki();else if(e==="I16")n=wi();else if(e==="U32")n=Fi();else if(e==="I32")n=Vr();else if(e==="U64")n=Li();else if(e==="I64")n=Ai();else if(e==="F32")n=Ii();else if(e==="F64")n=Dr();else if(e==="Usize")n=yt();else if(e==="Isize")n=$i();else throw new Error(`createNumberValue: Unsupported tag: ${e}`);return{tag:e,type:n,value:t}}function er(e){return Ht("ComptimeInt",e)}function ea(e){return Ht("ComptimeFloat",e)}function ft(e){return{tag:"Bool",type:Ze(),value:e}}function Y(e,{variableName:t,recursiveTypeRef:n,env:r,context:i}){if(qe(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=En(e,t,{recursiveTypeRef:n,env:r,context:i});return J(o)}return{tag:"Unknown",type:e,variableName:t}}function Un(e,t){return{tag:"Struct",type:e,fields:t}}function ta(e,t){return{tag:"Module",type:e,fields:t}}function Ti(e,t){return{tag:"Trait",type:e,fields:t}}function na(e,t){return{tag:"Tuple",type:e,fields:t}}function Kr(e,t,n){return{tag:"Enum",type:e,variantName:t,fields:n}}function Sr(e,t){return{tag:"Array",type:e,elements:t}}function ra(e,t,n,r){return{tag:"Slice",type:e,sourceArray:t,startIndex:n,endIndex:r}}function zn(e){return{tag:"Expr",type:ln(),value:e}}function ja(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(He(n)&&He(r))return n.value===r.value;if(Jn(n)&&Jn(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(Re(n)&&Re(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(Ue(n)&&Ue(r))return n.value===r.value;if(Rn(n)&&Rn(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(Zo(n)&&Zo(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(dn(n)&&dn(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(vn(n)&&vn(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(ze(n)&&ze(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(ht(n)&&ht(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(an(n)&&an(r))return n.value===r.value||ia(n.value,r.value);if(_e(n)&&_e(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&&!_e(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&&!_e(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(_e(n)&&!_e(r)){if(n.variableName){let i=X(e.env,n.variableName);if(i.length>0){let o=i[i.length-1];if(o.value&&!_e(o.value[0]))return At({value:o.value[0],env:e.env},{value:r,env:t.env})}}return!1}else if(!_e(n)&&_e(r)){if(r.variableName){let i=X(t.env,r.variableName);if(i.length>0){let o=i[i.length-1];if(o.value&&!_e(o.value[0]))return At({value:n,env:e.env},{value:o.value[0],env:t.env})}}return!1}else return vi(n)&&vi(r)?n.targetValue===r.targetValue&&n.targetIndex===r.targetIndex:!1}}}function nr(e,t){return e?Qr(e,t):!1}function rr(e,t){return e?Rd(e,t):!1}function Qr(e,t){return Hn(e,t)&&!Er(e,t)}function Rd(e,t){let n=Hn(e,t),r=Er(e,t);return!n&&r}function Le(e,t=[]){if(!e||t.includes(e)||(t.push(e),e.isExtern))return!1;if(on(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 Ce(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),x(e))return e.isExtern?!1:e.resolvedConcreteType?Fe(e.resolvedConcreteType,t):!(Yt(e)||Ce(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 yr(e,t=new Set){return t.has(e.id)?!1:(t.add(e.id),ke(e)?_e(e.length)?!0:yr(e.childType,t):Ne(e)||Xe(e)?yr(e.childType,t):we(e)?e.fields.some(n=>yr(n.type,t)):ce(e)?e.fields.some(n=>yr(n.type,t)):ye(e)?e.variants.some(n=>n.fields?.some(r=>yr(r.type,t))):_t(e)?e.fields.some(n=>yr(n.type,t)):!1)}function Xa(e){let t=new Set,n=new Set;function r(i){if(!(i&&n.has(i))){if(i&&n.add(i),x(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 Si(e){if(!e)return!1;switch(e.tag){case"Array":{let t=e;return _e(t.length)||Si(t.childType)}case"SomeType":return!0;case"Module":return!1;case"Trait":{let t=e;return t.isFn?Si(t.isFn.callType):!1}default:return!1}}function dt({type:e,expectedType:t,expr:n,env:r}){let i;if(gt(e))i=Vr();else if(St(e))i=Dr();else if(Ft(e))t&&(Ne(t)&&(Wn(t.childType)||hi(t.childType))||Xe(t))&&(i=t),i||(i=Ul(r));else return e;return i&&n?.$&&(n.$.convertedRuntimeType=i),i??e}function Ka(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 Ni(e,t=new Set){let n=e.label;Qn(n)&&(n=`(${n})`);let r=e.defaultValue?De(e.defaultValue):"",i=e.assignedValue?De(e.assignedValue):"";return r?`(${n}: ${A(e.type,t)}) ?= ${r}`:i?`(${n}: ${A(e.type,t)}) = ${i}`:`${n}: ${A(e.type,t)}`}function Ol(e,t=new Set){let n=e.label;Qn(n)&&(n=`(${n})`);let r=e.defaultValue?De(e.defaultValue):"",i=e.assignedValue?De(e.assignedValue):"";return r?`(${n} : ${A(e.type,t)}) ?= ${r}`:i?`(${n} : ${A(e.type,t)}) = ${i}`:`${n} : ${A(e.type,t)}`}function Rl(e,t=new Set){let n=e.parameters.map(f=>Ka(f,t)).join(", "),r=e.forallParameters.length>0?`forall(${e.forallParameters.map(f=>Ka(f,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(f=>f.isEffectRowSpread?`...(${f.label})`:Ka(f,t)).join(", ")})`:"",l=[r,n,s,i].filter(f=>!!f).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 Pd(e,t)}finally{e.id&&t.delete(e.id)}}function Pd(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)}; ${De(e.length)}]`;case"Slice":return`[${A(e.childType,t)}]`;case"Tuple":return e.fields.length===0?"()":`(${e.fields.map(n=>Ni(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=>Ni(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=>Ni(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=>Ni(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=>Ol(i,t)).join(", ")})`,r}case"Trait":{let n=e;if(Ct(n))return`Fn${Rl(n.isFn.callType,t).slice(2)}`;if(qt(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=>Ol(i,t)).join(", ")})`,n.receiverType&&(r=`(${A(n.receiverType,t)} <: ${r})`),r}case"Function":{let n=e;return n.typeName?n.typeName:Rl(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 Pl=64;function hr(){return Pl}function oa(){return Pl/8}function Ud(e){let t=Mr(e.childType);if(t===null)return null;if(t===-1)return-1;let n=e.length;if(Re(n)){let r=BigInt(n.value);if(r<0)throw new Error("Array length cannot be negative");return Number(r)*t}return null}function zd(e){let t=0;for(let n of e.fields){let r=Mr(n.type);if(r===null)return null;if(r===-1)return-1;t+=r}return t}function Bd(e){let t=0;for(let n of e.fields){let r=Mr(n.type);if(r===null)return null;if(r===-1)return-1;t+=r}return t}function Gd(e){let t=0,n=0;for(let m of e.variants){let g=0;if(m.fields)for(let h of m.fields){let d=Mr(h.type);if(d===null)return null;if(d===-1)return-1;g+=d;let v=gr(h.type);if(v===null)return null;n=Math.max(n,v*8)}t=Math.max(t,g)}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,c=r+u+t,f=c/8,p=a/8,_=(p-f%p)%p*8;return c+_}function Wd(e){let t=0;for(let n of e.fields){let r=Mr(n.type);if(r===null)return null;if(r===-1)return-1;t=Math.max(t,r)}return t}function gr(e){if(x(e))return null;if(ue(e)||qe(e)||gt(e)||St(e)||Ft(e)||xt(e)||ve(e)||Ve(e)||Lt(e))return 1;if(gn(e))return 1;if(so(e)||lo(e))return oa();if(Wn(e)||uo(e))return 1;if(co(e)||fo(e))return 2;if(po(e)||_o(e))return 4;if(mo(e)||yo(e))return 8;if(go(e))return 4;if(ho(e))return 8;if(ke(e))return gr(e.childType);if(we(e)){let t=1;for(let n of e.fields){let r=gr(n.type);if(r===null)return null;t=Math.max(t,r)}return t}else if(ce(e)){if(e.isReferenceSemantics)return oa();if(e.isNewtype)return gr(e.fields[0].type);let t=1;for(let n of e.fields){let r=gr(n.type);if(r===null)return null;t=Math.max(t,r)}return t}else if(ye(e)){let t=1;for(let n of e.variants)if(n.fields)for(let r of n.fields){let i=gr(r.type);if(i===null)return null;t=Math.max(t,i)}return t}else if(_t(e)){let t=1;for(let n of e.fields){let r=gr(n.type);if(r===null)return null;t=Math.max(t,r)}return t}else{if(z(e))return oa();if(Ne(e))return oa()}return null}function Mr(e){return x(e)?null:ue(e)||qe(e)||gt(e)||St(e)||Ft(e)||xt(e)||ve(e)||Ve(e)||Lt(e)?0:gn(e)?8:so(e)||lo(e)?hr():Wn(e)||uo(e)?8:co(e)||fo(e)?16:po(e)||_o(e)?32:mo(e)||yo(e)?64:go(e)?32:ho(e)?64:ke(e)?Ud(e):we(e)?zd(e):ce(e)?e.isReferenceSemantics?hr():e.isNewtype?Mr(e.fields[0].type):Bd(e):ye(e)?Gd(e):_t(e)?Wd(e):z(e)||Ne(e)?hr():null}function vr(e,t){if(mr(e))throw at([{token:t,errorMessage:`Cannot use 'void' type here.
|
|
42
|
+
`);return n[0]}function ao(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 ue(e){return e?.tag==="unit"}function gt(e){return e?.tag==="comptime_int"}function St(e){return e?.tag==="comptime_float"}function Ft(e){return e?.tag==="comptime_string"}function xt(e){return e?.tag==="ComptimeList"}function jr(e){return xt(e)&&Lt(e.childType)}function gn(e){return e?.tag==="bool"}function so(e){return e?.tag==="usize"}function lo(e){return e?.tag==="isize"}function Wn(e){return e?.tag==="u8"}function uo(e){return e?.tag==="i8"}function co(e){return e?.tag==="u16"}function fo(e){return e?.tag==="i16"}function po(e){return e?.tag==="u32"}function _o(e){return e?.tag==="i32"}function mo(e){return e?.tag==="u64"}function yo(e){return e?.tag==="i64"}function go(e){return e?.tag==="f32"}function ho(e){return e?.tag==="f64"}function Lt(e){return e?.tag==="Expr"}function ke(e){return e?.tag==="Array"}function Xe(e){return e?.tag==="Slice"}function we(e){return e?.tag==="Tuple"}function _t(e){return e?.tag==="Union"}function ye(e){return e?.tag==="Enum"}function ce(e){return e?.tag==="Struct"}function ct(e){return e?.tag==="Struct"&&e.isReferenceSemantics}function mr(e){return e?.tag==="Struct"&&e.isNewtype}function ve(e){return e?.tag==="Module"}function Ve(e){return e?.tag==="Trait"}function Ct(e){return Ve(e)&&e.isFn!==void 0}function z(e){return e?.tag==="Function"}function vo(e){return e?.tag==="Function"&&e.return.isCompileTimeOnly}function qe(e){return e?.tag==="Type"}function xl(e){return qe(e)&&e.tag==="Type"&&e.level===0}function x(e){return e?.tag==="SomeType"}function Ne(e){return e?.tag==="Ptr"}function bt(e){return e?.tag==="Iso"}function Tt(e){return e?.tag==="Arc"}function be(e){return e?.tag==="Dyn"}function on(e){if(x(e)){let t=e;if(Ce(t))return!0;if(t.resolvedConcreteType)return on(t.resolvedConcreteType)}return ct(e)||be(e)||bt(e)||Tt(e)}function Ir(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 Nr(e){return e?.tag==="f32"||e?.tag==="f64"}function Vl(e){return e?.tag==="i8"||e?.tag==="i16"||e?.tag==="i32"||e?.tag==="i64"||e?.tag==="isize"}function hi(e){return e?.tag==="char"}function yr(e){return e?.tag==="void"}function qt(e){return Ve(e)&&e.isFuture!==void 0}function Xo(e){return Ve(e)&&e.isConcrete!==void 0}function qn(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 On(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&&x(r.type)&&!Ce(r.type));return t||n}function Jn(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&&x(r.type)&&!Ce(r.type));return t||n}function Ya(e){let t=e.type;return t?On(t)&&(e.specializedFunctionCaches?.length??0)>0:!1}function hn(e){return ct(e)?e.fields.length===1&&e.fields[0].label==="*"&&!!e.typeName?.startsWith("Box("):!1}function rt(e){return e?.tag==="EffectsRow"}function Qo(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}"
|
|
43
|
+
Insert some indirection (e.g., a pointer '*' or reference '&') to break the cycle.`});if(ct(a))continue;let s=[...n,o],l=kt(a,s);qe(l)&&(i=Math.max(i,l.level),l.tag==="Type"&&(r=!0))}return i>0?_n(i):r?et(e):et(e)}function kt(e,t=[]){if(be(e))return et(e);if(ao(e))return et(e);if(qe(e))return _n(e.level+1);if(gt(e)||St(e)||Ft(e)||xt(e))return et(e);if(Lt(e))return et(e);if(z(e))return et(e);if(Ct(e))return et(e);if(ke(e))return kt(e.childType,t);if(Xe(e))return et(e);if(we(e))return Qo(e,e.fields,t);if(ce(e))return Qo(e,e.fields,t);if(ye(e)){let n=[];for(let r of e.variants)r.fields&&n.push(...r.fields);return Qo(e,n,t)}else{if(_t(e))return Qo(e,e.fields,t);if(ve(e))return _n(1,e);if(Ve(e))return _n(1,e);if(x(e))return e.parentType;if(Ne(e))return et(e);if(bt(e))return et(e);if(Tt(e))return et(e);if(qt(e))return et(e);if(yr(e))return et(e);if(rt(e))return _n(1);throw new Error(`Unknown type tag: ${e.tag}`)}}function Dl(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 De(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(De).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(De).join(", ")}${e.elements.length===1?",":""}]`;case"Slice":return`slice[${e.sourceArray[0].elements.slice(e.startIndex,e.endIndex).map(De).join(", ")}]`;case"Tuple":return e.fields.length===0?"()":`(${e.fields.map(De).join(", ")}${e.fields.length===1?",":""})`;case"Struct":return`${e.type.typeName??"_"}(${e.fields.map((t,n)=>{let r=e.type.fields[n].label;return Zn(r)&&(r=`(${r})`),`${r}: ${De(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 Zn(i)&&(i=`(${i})`),`${i}: ${De(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 Zn(r)&&(r=`(${r})`),`${r}: ${De(t)}`}).join(", ")})`;case"Trait":return`${e.type.typeName??"_"}(${e.fields.map((t,n)=>{let r=e.type.fields[n].label;return Zn(r)&&(r=`(${r})`),`${r}: ${De(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 Rn(t)?`<ptr to ${De(t.elements[e.targetIndex])}>`:`<ptr to ${De(t)}>`}default:throw new Error("valueToString: Unsupported value")}}function D(e){return e?.tag==="Type"}function Fn(e){return e?.tag==="ComptimeInt"}function Jo(e){return e?.tag==="ComptimeFloat"}function He(e){return e?.tag==="ComptimeString"}function er(e){return e?.tag==="ComptimeList"}function Ml(e){return er(e)&&Lt(e.type.childType)}function Re(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 Ue(e){return e?.tag==="Bool"}function ne(e){return e?.tag==="Function"}function _e(e){return e?.tag==="Unknown"}function dn(e){return e?.tag==="Tuple"}function vn(e){return e?.tag==="Struct"}function Rn(e){return e?.tag==="Array"}function Zo(e){return e?.tag==="Slice"}function It(e){return e?.tag==="Enum"}function ze(e){return e?.tag==="Module"}function ht(e){return e?.tag==="Trait"}function vi(e){return e?.tag==="Ptr"}function an(e){return e?.tag==="Expr"}function J(e){return{tag:"Type",type:kt(e),value:e}}function nn(e){return{tag:"ComptimeString",type:Vt(),value:e}}function Pn(e,t){return{tag:"ComptimeList",type:To(e),elements:t}}function Ht(e,t){let n;if(e==="ComptimeInt")n=xr();else if(e==="ComptimeFloat")n=Ei();else if(e==="U8")n=Ci();else if(e==="I8")n=bi();else if(e==="U16")n=ki();else if(e==="I16")n=wi();else if(e==="U32")n=Fi();else if(e==="I32")n=Vr();else if(e==="U64")n=Li();else if(e==="I64")n=Ai();else if(e==="F32")n=Ii();else if(e==="F64")n=Dr();else if(e==="Usize")n=yt();else if(e==="Isize")n=$i();else throw new Error(`createNumberValue: Unsupported tag: ${e}`);return{tag:e,type:n,value:t}}function tr(e){return Ht("ComptimeInt",e)}function ea(e){return Ht("ComptimeFloat",e)}function ft(e){return{tag:"Bool",type:Ze(),value:e}}function Y(e,{variableName:t,recursiveTypeRef:n,env:r,context:i}){if(qe(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=En(e,t,{recursiveTypeRef:n,env:r,context:i});return J(o)}return{tag:"Unknown",type:e,variableName:t}}function Un(e,t){return{tag:"Struct",type:e,fields:t}}function ta(e,t){return{tag:"Module",type:e,fields:t}}function Ti(e,t){return{tag:"Trait",type:e,fields:t}}function na(e,t){return{tag:"Tuple",type:e,fields:t}}function Kr(e,t,n){return{tag:"Enum",type:e,variantName:t,fields:n}}function Sr(e,t){return{tag:"Array",type:e,elements:t}}function ra(e,t,n,r){return{tag:"Slice",type:e,sourceArray:t,startIndex:n,endIndex:r}}function zn(e){return{tag:"Expr",type:ln(),value:e}}function ja(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(He(n)&&He(r))return n.value===r.value;if(er(n)&&er(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(Re(n)&&Re(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(Ue(n)&&Ue(r))return n.value===r.value;if(Rn(n)&&Rn(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(Zo(n)&&Zo(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(dn(n)&&dn(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(vn(n)&&vn(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(ze(n)&&ze(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(ht(n)&&ht(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(an(n)&&an(r))return n.value===r.value||ia(n.value,r.value);if(_e(n)&&_e(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&&!_e(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&&!_e(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(_e(n)&&!_e(r)){if(n.variableName){let i=X(e.env,n.variableName);if(i.length>0){let o=i[i.length-1];if(o.value&&!_e(o.value[0]))return At({value:o.value[0],env:e.env},{value:r,env:t.env})}}return!1}else if(!_e(n)&&_e(r)){if(r.variableName){let i=X(t.env,r.variableName);if(i.length>0){let o=i[i.length-1];if(o.value&&!_e(o.value[0]))return At({value:n,env:e.env},{value:o.value[0],env:t.env})}}return!1}else return vi(n)&&vi(r)?n.targetValue===r.targetValue&&n.targetIndex===r.targetIndex:!1}}}function rr(e,t){return e?Qr(e,t):!1}function ir(e,t){return e?Rd(e,t):!1}function Qr(e,t){return Yn(e,t)&&!Er(e,t)}function Rd(e,t){let n=Yn(e,t),r=Er(e,t);return!n&&r}function Le(e,t=[]){if(!e||t.includes(e)||(t.push(e),e.isExtern))return!1;if(on(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 Ce(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),x(e))return e.isExtern?!1:e.resolvedConcreteType?Fe(e.resolvedConcreteType,t):!(Yt(e)||Ce(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 gr(e,t=new Set){return t.has(e.id)?!1:(t.add(e.id),ke(e)?_e(e.length)?!0:gr(e.childType,t):Ne(e)||Xe(e)?gr(e.childType,t):we(e)?e.fields.some(n=>gr(n.type,t)):ce(e)?e.fields.some(n=>gr(n.type,t)):ye(e)?e.variants.some(n=>n.fields?.some(r=>gr(r.type,t))):_t(e)?e.fields.some(n=>gr(n.type,t)):!1)}function Xa(e){let t=new Set,n=new Set;function r(i){if(!(i&&n.has(i))){if(i&&n.add(i),x(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 Si(e){if(!e)return!1;switch(e.tag){case"Array":{let t=e;return _e(t.length)||Si(t.childType)}case"SomeType":return!0;case"Module":return!1;case"Trait":{let t=e;return t.isFn?Si(t.isFn.callType):!1}default:return!1}}function dt({type:e,expectedType:t,expr:n,env:r}){let i;if(gt(e))i=Vr();else if(St(e))i=Dr();else if(Ft(e))t&&(Ne(t)&&(Wn(t.childType)||hi(t.childType))||Xe(t))&&(i=t),i||(i=Ul(r));else return e;return i&&n?.$&&(n.$.convertedRuntimeType=i),i??e}function Ka(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 Ni(e,t=new Set){let n=e.label;Zn(n)&&(n=`(${n})`);let r=e.defaultValue?De(e.defaultValue):"",i=e.assignedValue?De(e.assignedValue):"";return r?`(${n}: ${A(e.type,t)}) ?= ${r}`:i?`(${n}: ${A(e.type,t)}) = ${i}`:`${n}: ${A(e.type,t)}`}function Ol(e,t=new Set){let n=e.label;Zn(n)&&(n=`(${n})`);let r=e.defaultValue?De(e.defaultValue):"",i=e.assignedValue?De(e.assignedValue):"";return r?`(${n} : ${A(e.type,t)}) ?= ${r}`:i?`(${n} : ${A(e.type,t)}) = ${i}`:`${n} : ${A(e.type,t)}`}function Rl(e,t=new Set){let n=e.parameters.map(f=>Ka(f,t)).join(", "),r=e.forallParameters.length>0?`forall(${e.forallParameters.map(f=>Ka(f,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(f=>f.isEffectRowSpread?`...(${f.label})`:Ka(f,t)).join(", ")})`:"",l=[r,n,s,i].filter(f=>!!f).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 Pd(e,t)}finally{e.id&&t.delete(e.id)}}function Pd(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)}; ${De(e.length)}]`;case"Slice":return`[${A(e.childType,t)}]`;case"Tuple":return e.fields.length===0?"()":`(${e.fields.map(n=>Ni(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=>Ni(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=>Ni(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=>Ni(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=>Ol(i,t)).join(", ")})`,r}case"Trait":{let n=e;if(Ct(n))return`Fn${Rl(n.isFn.callType,t).slice(2)}`;if(qt(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=>Ol(i,t)).join(", ")})`,n.receiverType&&(r=`(${A(n.receiverType,t)} <: ${r})`),r}case"Function":{let n=e;return n.typeName?n.typeName:Rl(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 Pl=64;function hr(){return Pl}function oa(){return Pl/8}function Ud(e){let t=Mr(e.childType);if(t===null)return null;if(t===-1)return-1;let n=e.length;if(Re(n)){let r=BigInt(n.value);if(r<0)throw new Error("Array length cannot be negative");return Number(r)*t}return null}function zd(e){let t=0,n=1;for(let r of e.fields){let i=Mr(r.type);if(i===null)return null;if(i===-1)return-1;let o=Hn(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 Bd(e){let t=0,n=1;for(let r of e.fields){let i=Mr(r.type);if(i===null)return null;if(i===-1)return-1;let o=Hn(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 Gd(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=Mr(v.type);if(T===null)return null;if(T===-1)return-1;let $=Hn(v.type);if($===null)return null;let C=Math.ceil(T/8);g=Math.ceil(g/$)*$,g+=C,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,c=r+u+t,f=c/8,p=a/8,_=(p-f%p)%p*8;return c+_}function Wd(e){let t=0;for(let n of e.fields){let r=Mr(n.type);if(r===null)return null;if(r===-1)return-1;t=Math.max(t,r)}return t}function Hn(e){if(x(e))return null;if(ue(e)||qe(e)||gt(e)||St(e)||Ft(e)||xt(e)||ve(e)||Ve(e)||Lt(e))return 1;if(gn(e))return 1;if(so(e)||lo(e))return oa();if(Wn(e)||uo(e))return 1;if(co(e)||fo(e))return 2;if(po(e)||_o(e))return 4;if(mo(e)||yo(e))return 8;if(go(e))return 4;if(ho(e))return 8;if(ke(e))return Hn(e.childType);if(we(e)){let t=1;for(let n of e.fields){let r=Hn(n.type);if(r===null)return null;t=Math.max(t,r)}return t}else if(ce(e)){if(e.isReferenceSemantics)return oa();if(e.isNewtype)return Hn(e.fields[0].type);let t=1;for(let n of e.fields){let r=Hn(n.type);if(r===null)return null;t=Math.max(t,r)}return t}else if(ye(e)){let t=1;for(let n of e.variants)if(n.fields)for(let r of n.fields){let i=Hn(r.type);if(i===null)return null;t=Math.max(t,i)}return t}else if(_t(e)){let t=1;for(let n of e.fields){let r=Hn(n.type);if(r===null)return null;t=Math.max(t,r)}return t}else{if(z(e))return oa();if(Ne(e))return oa()}return null}function Mr(e){return x(e)?null:ue(e)||qe(e)||gt(e)||St(e)||Ft(e)||xt(e)||ve(e)||Ve(e)||Lt(e)?0:gn(e)?8:so(e)||lo(e)?hr():Wn(e)||uo(e)?8:co(e)||fo(e)?16:po(e)||_o(e)?32:mo(e)||yo(e)?64:go(e)?32:ho(e)?64:ke(e)?Ud(e):we(e)?zd(e):ce(e)?e.isReferenceSemantics?hr():e.isNewtype?Mr(e.fields[0].type):Bd(e):ye(e)?Gd(e):_t(e)?Wd(e):z(e)||Ne(e)?hr():null}function vr(e,t){if(yr(e))throw at([{token:t,errorMessage:`Cannot use 'void' type here.
|
|
44
44
|
Please consider use 'unit' type instead.
|
|
45
|
-
`}])}function Tr(e,t,n){if(!ct(e)||Zr(e,n))return!1;if(t.has(e.id))return!0;t.add(e.id);try{for(let r of e.fields)if(Xr(r.type,e,t,n))return!0;return!1}finally{t.delete(e.id)}}function Xr(e,t,n,r){if(ce(e)&&e.id===t.id)return!0;if(ce(e)&&e.isReferenceSemantics)return Tr(e,new Set(n),r);if(ye(e)){for(let i of e.variants)if(i.fields){for(let o of i.fields)if(Xr(o.type,t,n,r))return!0}}if(x(e))return Zr(e,r)?!1:e.resolvedConcreteType?Xr(e.resolvedConcreteType,t,n,r):!0;if(ke(e)||Xe(e))return Xr(e.childType,t,n,r);if(we(e)){for(let i of e.fields)if(Xr(i.type,t,n,r))return!0}if(_t(e)){for(let i of e.fields)if(Xr(i.type,t,n,r))return!0}return be(e)?!0:(Ne(e),!1)}function
|
|
45
|
+
`}])}function Tr(e,t,n){if(!ct(e)||Zr(e,n))return!1;if(t.has(e.id))return!0;t.add(e.id);try{for(let r of e.fields)if(Xr(r.type,e,t,n))return!0;return!1}finally{t.delete(e.id)}}function Xr(e,t,n,r){if(ce(e)&&e.id===t.id)return!0;if(ce(e)&&e.isReferenceSemantics)return Tr(e,new Set(n),r);if(ye(e)){for(let i of e.variants)if(i.fields){for(let o of i.fields)if(Xr(o.type,t,n,r))return!0}}if(x(e))return Zr(e,r)?!1:e.resolvedConcreteType?Xr(e.resolvedConcreteType,t,n,r):!0;if(ke(e)||Xe(e))return Xr(e.childType,t,n,r);if(we(e)){for(let i of e.fields)if(Xr(i.type,t,n,r))return!0}if(_t(e)){for(let i of e.fields)if(Xr(i.type,t,n,r))return!0}return be(e)?!0:(Ne(e),!1)}function nr(e,t){return t?e.id===t.id?!0:ke(e)||Xe(e)||Ne(e)?nr(e.childType,t):we(e)?e.fields.some(n=>nr(n.type,t)):ce(e)?e.fields.some(n=>nr(n.type,t)):_t(e)?e.fields.some(n=>nr(n.type,t)):ye(e)?e.variants.some(n=>n.fields?.some(r=>nr(r.type,t))):z(e)?nr(e.return.type,t):!1:!1}import{createHash as zl}from"crypto";function xi(e){return"yo"+zl("sha1").update(e).digest("hex").slice(0,8)}var aa=new Map;function Ge(e){let t=aa.get(e);return t===void 0&&(t=0),aa.set(e,t+1),`${xi(e)}_id_${t}`}function sa(e){aa.delete(e)}var Bl=1;function Gl(e){return`_${xi(e)}_temp_`}function Wl(e){return`${Gl(e)}${Bl++}`}function st(e,t){return t.startsWith(Gl(e))}var Qa=new Map;function Jr(e,t){let n="";for(let o=0;o<t.length;o++)if(oo(t[o])){let a=Wa.indexOf(t[o]);n+=`${a}`}else n+=t[o];let r=xi(e)+"_"+n,i=Qa.get(r);return i===void 0?i=0:i++,Qa.set(r,i),r+(i==0?"":`_${i}`)}function Za(e){return zl("sha1").update(e).digest("hex").slice(0,10)}function ql(){aa.clear(),Qa.clear(),Bl=1}function Or(e){return{[e]:!0}}function nt(e,t){return e?.[t]===!0}function mt(e){return e!==void 0&&(e.return===!0||e.escape===!0||e.break===!0||e.continue===!0)}function Eo(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 Hl(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 xe(e){switch(e.tag){case"Atom":return{...e,$:void 0};case"FnCall":return{...e,func:xe(e.func),args:e.args.map(xe),$:void 0}}}function F(e){return e?.tag==="FnCall"}function U(e){return e?.tag==="Atom"}function Et(e,t){return e.tag==="Atom"&&(typeof t=="string"?e.token.value===t:t.includes(e.token.value))}function Vi(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 ge(e,t,n){if(!F(e))throw y({token:e.token,errorMessage:`Expected function call, got atom:
|
|
46
46
|
${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:
|
|
47
47
|
${w(e)}`});if(n!==void 0&&e.args.length!==n)throw y({token:e.token,errorMessage:`Expected ${n} arguments, got ${e.args.length}:
|
|
48
|
-
${w(e)}`})}function ia(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(!ia(e.func,t.func)||e.args.length!==t.args.length)return!1;for(let n=0;n<e.args.length;n++)if(!ia(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:["||"],not:["not"],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_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_build_project:["__yo_build_project"],__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"]};function Di(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?$n(e,r):ir(e)}function ir(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}${ir(e.args[0])}`:t=`${e.func.token.value}(${ir(e.args[0])})`;break}else if(e.args.length===2&&e.isInfix){let i=ir(e.args[0]),o=ir(e.args[1]);i=Di(e.args[0])||Vi(e.args[0])?`(${i})`:i,o=Di(e.args[1])||Vi(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=`(${ir(e.args[0])},)`:t=`(${e.args.map(i=>ir(i)).join(", ").trim()})`;break}let n=ir(e.func);n=Di(e.func)||Vi(e.func)?`(${n})`:n;let r=e.args.map(i=>ir(i)).join(", ").trim();t=`${n}(${r})`;break}}return t}function $n(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}${$n(e.args[0],t)}`;{let u=$n(e.args[0],t);return`${e.func.token.value}(${u})`}}else if(e.args.length===2&&e.isInfix){let u=$n(e.args[0],t),c=$n(e.args[1],t);return u=Di(e.args[0])||Vi(e.args[0])?`(${u})`:u,c=Di(e.args[1])||Vi(e.args[1])?`(${c})`:c,e.func.token.value==="."?`(${u}.${c})`:`${u} ${e.func.token.value} ${c}`}}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`(${$n(e.args[0],t)},)`;{let u=e.args.map(f=>$n(f,t)),c=`(${u.join(", ")})`;return c.length<=t.maxLineLength?c:`(
|
|
48
|
+
${w(e)}`})}function ia(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(!ia(e.func,t.func)||e.args.length!==t.args.length)return!1;for(let n=0;n<e.args.length;n++)if(!ia(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:["||"],not:["not"],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_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_build_project:["__yo_build_project"],__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"]};function Di(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?$n(e,r):or(e)}function or(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}${or(e.args[0])}`:t=`${e.func.token.value}(${or(e.args[0])})`;break}else if(e.args.length===2&&e.isInfix){let i=or(e.args[0]),o=or(e.args[1]);i=Di(e.args[0])||Vi(e.args[0])?`(${i})`:i,o=Di(e.args[1])||Vi(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=`(${or(e.args[0])},)`:t=`(${e.args.map(i=>or(i)).join(", ").trim()})`;break}let n=or(e.func);n=Di(e.func)||Vi(e.func)?`(${n})`:n;let r=e.args.map(i=>or(i)).join(", ").trim();t=`${n}(${r})`;break}}return t}function $n(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}${$n(e.args[0],t)}`;{let u=$n(e.args[0],t);return`${e.func.token.value}(${u})`}}else if(e.args.length===2&&e.isInfix){let u=$n(e.args[0],t),c=$n(e.args[1],t);return u=Di(e.args[0])||Vi(e.args[0])?`(${u})`:u,c=Di(e.args[1])||Vi(e.args[1])?`(${c})`:c,e.func.token.value==="."?`(${u}.${c})`:`${u} ${e.func.token.value} ${c}`}}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`(${$n(e.args[0],t)},)`;{let u=e.args.map(f=>$n(f,t)),c=`(${u.join(", ")})`;return c.length<=t.maxLineLength?c:`(
|
|
49
49
|
${i}${u.join(`,
|
|
50
50
|
${i}`)}
|
|
51
51
|
${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=$n(e.func,t);if(s=Di(e.func)||Vi(e.func)?`(${s})`:s,e.args.length===0)return`${s}()`;if(!a){let u=e.args.map(f=>$n(f,t)),c=`${s}(${u.join(", ")})`;if(c.length<=t.maxLineLength)return c}if(a){if(o===I.begin[0]){if(e.args.length===1){let c=$n(e.args[0],t);if(c.length<=t.maxLineLength&&!c.includes(`
|
|
@@ -61,14 +61,14 @@ ${i}`)}
|
|
|
61
61
|
${n})`}}let l=e.args.map(u=>$n(u,r));return`${s}(
|
|
62
62
|
${i}${l.join(`,
|
|
63
63
|
${i}`)}
|
|
64
|
-
${n})`}}return
|
|
64
|
+
${n})`}}return or(e)}function Pe(e,t,n){if(!e.$)throw new Error(`Expected expression to be evaluated, but it is not:
|
|
65
65
|
${w(e)}`);let{env:r,type:i,value:o,originType:a}=e.$,s=r.modulePath,l=t&&Le(i);if(e.$.variableName){let f=X(r,e.$.variableName);if(f.length>0){let _=f[f.length-1],m=_.isOwningTheRcValue?l:!1,g={..._,type:i,value:m?void 0:o?[o]:void 0,isCompileTimeOnly:m?!1:!!o,isOwningTheRcValue:m,isOwningTheSameRcValueAs:n};e.$.env=Be(r,_,g),a||(e.$.originType=i);return}let{env:p}=fe({env:r,variable:{name:e.$.variableName,type:i,value:l?void 0:o?[o]:void 0,isCompileTimeOnly:l?!1:!!o,initializedAtToken:e.token,isOwningTheRcValue:l,isOwningTheSameRcValueAs:n,consumedAtToken:void 0,token:e.token},addToBeginBlockFrame:!0});a||(e.$.originType=i),e.$.env=p;return}let u=Wl(s),{env:c}=fe({env:r,variable:{name:u,type:i,value:l?void 0:o?[o]:void 0,isCompileTimeOnly:l?!1:!!o,initializedAtToken:e.token,isOwningTheRcValue:l,isOwningTheSameRcValueAs:n,consumedAtToken:void 0,token:e.token},addToBeginBlockFrame:!0});e.$.variableName=u,a||(e.$.originType=i),e.$.env=c}function Mi(e,t){let n=e.frames.length-1,r=[];for(let i=0;i<t.length;i++){let o=t[i];if(!o.$)throw at([{token:o.token,errorMessage:"Expected the body of the case to be evaluated, but it is not."}]);let a=o.$.env;r.push(a)}for(let i=0;i<r.length;i++)if(r[i].frames.length-1!==n)throw at([{token:t[i].token,errorMessage:"Frame level is different for different cases."}]);for(let i=0;i<=n;i++){let o=i,a=e.frames[i],s=[...a.variables],l=[[]];s.forEach(f=>{l[0].push({consumedAtToken:f.consumedAtToken,initializedAtToken:f.initializedAtToken,type:f.type,isOwningTheRcValue:f.isOwningTheRcValue??!1})});for(let f=0;f<r.length;f++){let m=r[f].frames[i].variables;if(i!==n&&s.length!==m.length)if(m.length>s.length){let g=[...m].slice(s.length);if(g.every(d=>st(e.modulePath,d.name))){for(let v of g)s.push(v),l[0].push({consumedAtToken:void 0,initializedAtToken:v.initializedAtToken,type:v.type,isOwningTheRcValue:v.isOwningTheRcValue??!1});let d={...a,variables:[...s]};e={...e,frames:e.frames.map((v,T)=>T===i?d:v)}}else throw at([{token:t[f].token,errorMessage:`Frame level ${i} has different number of values for different cases.`}])}else throw at([{token:t[f].token,errorMessage:`Frame level ${i} has different number of values for different cases.`}]);for(let g=0;g<s.length;g++){let h=s[g],d=m[g];if(h.name!==d.name){if(st(e.modulePath,h.name)&&st(e.modulePath,d.name))continue;throw at([{token:t[f].token,errorMessage:`Frame level ${i} has different variable names for different cases.`}])}}l.push([]),m.forEach(g=>{l[l.length-1].push({consumedAtToken:g.consumedAtToken,initializedAtToken:g.initializedAtToken,type:g.type,isOwningTheRcValue:g.isOwningTheRcValue??!1})})}let u=l.length,c=l[0].length;for(let f=0;f<c;f++){let p=s[f].name,_=[],m=[],g=[],h=[];for(let C=1;C<u;C++){let b=r[C-1].frames[o].variables;_.push(l[C][f].initializedAtToken),m.push(l[C][f].isOwningTheRcValue?b[f].token:void 0),g.push(l[C][f].consumedAtToken),h.push(l[C][f].type)}let d=_.map((C,L)=>({token:C,index:L})).filter(({token:C})=>!!C);if(d.length>1){let C=h[d[0].index],L=r[d[0].index];for(let b=1;b<d.length;b++){let R=h[d[b].index],S=r[d[b].index];if(x(C)&&x(R)){let G=C.resolvedConcreteType,P=R.resolvedConcreteType;if(G&&P&&!q({type:G,env:L},{type:P,env:S}))throw at([{token:t[d[0].index].token,errorMessage:`Variable "${p}" has type Impl(...) but different concrete types across branches.
|
|
66
66
|
Impl(...) uses static dispatch and requires the same concrete type in all branches.
|
|
67
67
|
Consider using Dyn(...) for dynamic dispatch if different concrete types are needed.`},{token:_[d[0].index],errorMessage:`First branch has concrete type: ${A(G)}`},{token:_[d[b].index],errorMessage:`Conflicting branch has concrete type: ${A(P)}`}])}if(C!==R&&!q({type:C,env:L},{type:R,env:S}))throw at([{token:t[d[0].index].token,errorMessage:`Variable "${p}" has incompatible types across different cases:`},{token:_[d[0].index],errorMessage:`First initialization: ${A(C)}`},{token:_[d[b].index],errorMessage:`Conflicting initialization: ${A(R)}`}])}}if(_.length===1){if(_[0]&&!s[f].initializedAtToken)throw at([{token:s[f].token,errorMessage:`Variable "${s[f].name}" might not be initialized in all cases.`},{token:_[0],errorMessage:"Might be initialized here:"}])}else if(!s[f].initializedAtToken&&_.every(C=>C)){let C={...s[f],initializedAtToken:_[0]};e=Be(e,s[f],C),s[f]=C}else{let C=_.filter(b=>!!b),L=_.filter(b=>!b);if(C.length>0&&L.length>0)throw at(_.map((b,R)=>({errorMessage:(R===0?`Variable "${p}" might be initialized in some cases but not initialized in other cases:
|
|
68
68
|
`:"")+(b?"Might be initialized here:":"Not initialized here:"),token:b??t[R].token})))}if(g.length===1){if(g[0]&&!s[f].consumedAtToken){let C={...s[f],consumedAtToken:g[0]};e=Be(e,s[f],C),s[f]=C}}else if(!s[f].consumedAtToken&&g.every(C=>C)){let C={...s[f],consumedAtToken:g[0]};e=Be(e,s[f],C),s[f]=C}else{let C=g.filter(b=>!!b),L=g.filter(b=>!b);if(C.length>0&&L.length>0)throw at(g.map((b,R)=>({errorMessage:(R===0?`Variable "${p}" is consumed in some cases but not in other cases:
|
|
69
69
|
`:"")+(b?"Consumed here:":"Not consumed here:"),token:b??t[R].token})))}if(!s[f].isOwningTheRcValue&&m.every(C=>C)){let C={...s[f],isOwningTheRcValue:!0,isOwningTheSameRcValueAs:void 0};e=Be(e,s[f],C),s[f]=C}else{let C=m.filter(b=>!!b),L=m.filter(b=>!b);if(C.length>0&&L.length>0)throw at(m.map((b,R)=>({errorMessage:(R===0?`Variable "${p}" might be holding the Rc value in some cases but not holding the Rc value in other cases:
|
|
70
|
-
`:"")+(b?"Might be owning the Rc value here:":"Might be not owning the Rc value here:"),token:b??t[R].token})))}let v=s[f].id,T=[];for(let C=1;C<u;C++){let R=r[C-1].frames[o].variables[f];T.push(R.id)}if(T.some(C=>C!==v)){let C=Jr(e.modulePath,p),L={...s[f],id:C,isOwningTheSameRcValueAs:void 0};e=Be(e,s[f],L),s[f]=L}}}return e}function
|
|
71
|
-
${w(e)}`});if(Le(e.$.type)){if(st(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=Qt(`${k.___dup[0]}(${n})`),i=N({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 ei(e,t){let n=e.$?.variableName;if(!n)return;let r=X(t,n);if(r.length===0)throw at([{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 at([{token:e.token,errorMessage:o},{token:i.consumedAtToken,errorMessage:"value moved here"}])}}var pt="__yo_self";function ti(e,t,n){if(ce(e)){if(e.isReferenceSemantics)return!1;if(n.has(e.id))return!0;n.add(e.id);let r=e.fields.every(i=>ti(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=>ti(i.type,t,n));return n.delete(e.id),r}if(ye(e)){if(n.has(e.id))return!0;n.add(e.id);let r=e.variants.every(i=>(i.fields??[]).every(o=>ti(o.type,t,n)));return n.delete(e.id),r}return ke(e)||Xe(e)||Ne(e)?ti(e.childType,t,n):
|
|
70
|
+
`:"")+(b?"Might be owning the Rc value here:":"Might be not owning the Rc value here:"),token:b??t[R].token})))}let v=s[f].id,T=[];for(let C=1;C<u;C++){let R=r[C-1].frames[o].variables[f];T.push(R.id)}if(T.some(C=>C!==v)){let C=Jr(e.modulePath,p),L={...s[f],id:C,isOwningTheSameRcValueAs:void 0};e=Be(e,s[f],L),s[f]=L}}}return e}function ar(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 la(e,t){F(e)||(e.tag=t.tag),ar(e,t)}function yn(e,t,n=!1){if(e.$?.value&&D(e.$?.value))return t;let r=e.$?.variableName;if(!r)return t;let i=X(t,r);if(i.length===0)throw at([{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 at([{token:e.token,errorMessage:a},{token:o.consumedAtToken,errorMessage:"value moved here"}])}else t=Be(t,o,{...o,consumedAtToken:e.token});return t}function zt(e,t){if(!e.$||!e.$.variableName)return;if(e.$.value){let r=e.$.variableName;if(r&&st(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:
|
|
71
|
+
${w(e)}`});if(Le(e.$.type)){if(st(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=Qt(`${k.___dup[0]}(${n})`),i=N({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 ei(e,t){let n=e.$?.variableName;if(!n)return;let r=X(t,n);if(r.length===0)throw at([{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 at([{token:e.token,errorMessage:o},{token:i.consumedAtToken,errorMessage:"value moved here"}])}}var pt="__yo_self";function ti(e,t,n){if(ce(e)){if(e.isReferenceSemantics)return!1;if(n.has(e.id))return!0;n.add(e.id);let r=e.fields.every(i=>ti(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=>ti(i.type,t,n));return n.delete(e.id),r}if(ye(e)){if(n.has(e.id))return!0;n.add(e.id);let r=e.variants.every(i=>(i.fields??[]).every(o=>ti(o.type,t,n)));return n.delete(e.id),r}return ke(e)||Xe(e)||Ne(e)?ti(e.childType,t,n):Yn(e,t)}function ni(e,t,n){if(ce(e)){if(e.isReferenceSemantics||n.has(e.id))return!0;n.add(e.id);let r=e.fields.every(i=>ni(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=>ni(i.type,t,n));return n.delete(e.id),r}if(ye(e)){if(n.has(e.id))return!0;n.add(e.id);let r=e.variants.every(i=>(i.fields??[]).every(o=>ni(o.type,t,n)));return n.delete(e.id),r}return ke(e)||Xe(e)||Ne(e)?ni(e.childType,t,n):Er(e,t)}function Yl(e,t,n,r){let i=Qt(e),o=N({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 Oi({label:e,functionSignature:t,SelfType:n,env:r,context:i}){let{expr:o,env:a}=Yl(t,n,r,i);if(F(o)&&o.$&&o.$.value&&D(o.$.value)&&z(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(c=>c.label===e);u>=0?n.trait.fields[u]=l:n.trait.fields.push(l)}}return a}function Cn({label:e,functionCode:t,SelfType:n,env:r,context:i}){let{expr:o,env:a}=Yl(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 Ja=`(fn(${pt} : Self) -> unit)`,ua=`(fn(${pt} : Self) -> unit)`,ca=`(fn(${pt} : Self) -> Self)`;function qd(e){return e.replace(/[^a-zA-Z0-9_]/g,t=>`_u${t.charCodeAt(0)}_`)}function Hd(e){return/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e)}function es(e,t){if(e.length===0)return{destructuringExpr:"",callsExpr:""};let n=[],r=[];for(let i of e)if(Hd(i)){let o=Ge("field_"+i);n.push(`${i} : ${o}`),r.push(`(${t})(${o});`)}else{let o=Ge("field_"+qd(i));n.push(`(${i}) : ${o}`),r.push(`(${t})(${o});`)}return{destructuringExpr:`{ ${n.join(", ")} } := ${pt};`,callsExpr:r.join(`
|
|
72
72
|
`)}}function Yd(e){let t=Ja;if(!on(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}=es(n,k.___drop[0]),o=`
|
|
73
73
|
${r}
|
|
74
74
|
${i}
|
|
@@ -145,9 +145,9 @@ ${l}
|
|
|
145
145
|
})`}function um(e){return`((fn(${pt} : Self) -> Self) { // ___dup for Arc
|
|
146
146
|
${k.__yo_incr_rc_atomic[0]}(${pt});
|
|
147
147
|
return ${k.__yo_rc_own[0]}(${pt});
|
|
148
|
-
})`}function Xl({arcType:e,env:t,context:n}){let r=sm(e),i=lm(e),o=um(e);return t=Cn({label:k.___dispose[0],functionCode:r,SelfType:e,env:t,context:n}),t=Cn({label:k.___drop[0],functionCode:i,SelfType:e,env:t,context:n}),t=Cn({label:k.___dup[0],functionCode:o,SelfType:e,env:t,context:n}),t}function Jt(e,t,n,r){let i=`${e}()`,o=Qt(i),a=N({expr:o,env:n,context:{...r,expectedType:void 0,ReceiverType:t}});if(!a.$||!ht(a.$.value))return n;n=a.$.env;let s=a.$.value;s.type.receiverType=t;let l={label:"",type:_n(1),assignedValue:s,sourceModulePath:r.currentModulePath,exprs:{expr:o}};return t.trait.fields.push(l),n}function cm({structType:e,env:t,context:n}){return e.isReferenceSemantics||e.fields.every(i=>Co(i.type,t))&&(t=Jt("Send",e,t,n)),t}function fm({structType:e,env:t,context:n}){return e.isReferenceSemantics&&(t=Jt("Rc",e,t,n)),t}function pm({enumType:e,env:t,context:n}){return e.variants.every(i=>!i.fields||i.fields.length===0?!0:i.fields.every(o=>Co(o.type,t)))&&(t=Jt("Send",e,t,n)),t}function Ql({unionType:e,env:t,context:n}){return e.fields.every(i=>Co(i.type,t))&&(t=Jt("Send",e,t,n)),t}function _m({structType:e,env:t,context:n}){return e.isReferenceSemantics?Tr(e,new Set,t)||(t=Jt("Acyclic",e,t,n)):e.fields.every(i=>Zr(i.type,t))&&(t=Jt("Acyclic",e,t,n)),t}function dm({enumType:e,env:t,context:n}){return e.variants.every(i=>!i.fields||i.fields.length===0?!0:i.fields.every(o=>Zr(o.type,t)))&&(t=Jt("Acyclic",e,t,n)),t}function Zl({unionType:e,env:t,context:n}){return e.fields.every(i=>Zr(i.type,t))&&(t=Jt("Acyclic",e,t,n)),t}function mm({structType:e,env:t,context:n}){return e.isReferenceSemantics||e.fields.every(i=>ti(i.type,t,new Set([e.id])))&&(t=Jt("Comptime",e,t,n)),t}function ym({enumType:e,env:t,context:n}){return e.variants.every(i=>!i.fields||i.fields.length===0?!0:i.fields.every(o=>ti(o.type,t,new Set([e.id]))))&&(t=Jt("Comptime",e,t,n)),t}function gm({structType:e,env:t,context:n}){return e.isReferenceSemantics?(t=Jt("Runtime",e,t,n),t):(e.fields.every(i=>ni(i.type,t,new Set([e.id])))&&(t=Jt("Runtime",e,t,n)),t)}function hm({enumType:e,env:t,context:n}){return e.variants.every(i=>!i.fields||i.fields.length===0?!0:i.fields.every(o=>ni(o.type,t,new Set([e.id]))))&&(t=Jt("Runtime",e,t,n)),t}function Jl({unionType:e,env:t,context:n}){return t=Jt("Runtime",e,t,n),t}function vm({tupleType:e,env:t,context:n}){return e.fields.every(i=>Co(i.type,t))&&(t=Jt("Send",e,t,n)),t}function Tm({tupleType:e,env:t,context:n}){return e.fields.every(i=>ti(i.type,t,new Set([e.id])))&&(t=Jt("Comptime",e,t,n)),t}function Em({tupleType:e,env:t,context:n}){return e.fields.every(i=>ni(i.type,t,new Set([e.id])))&&(t=Jt("Runtime",e,t,n)),t}function ri({structType:e,env:t,context:n,errorToken:r}){return t=cm({structType:e,env:t,context:n}),t=fm({structType:e,env:t,context:n}),t=_m({structType:e,env:t,context:n}),t=mm({structType:e,env:t,context:n}),t=gm({structType:e,env:t,context:n}),t=Xd({structType:e,env:t,context:n}),fa(e,t,r,n),t}function eu({enumType:e,env:t,context:n,errorToken:r}){return t=pm({enumType:e,env:t,context:n}),t=dm({enumType:e,env:t,context:n}),t=ym({enumType:e,env:t,context:n}),t=hm({enumType:e,env:t,context:n}),t=Jd({enumType:e,env:t,context:n}),fa(e,t,r,n),t}function tu({tupleType:e,env:t,context:n,errorToken:r}){return t=vm({tupleType:e,env:t,context:n}),t=Tm({tupleType:e,env:t,context:n}),t=Em({tupleType:e,env:t,context:n}),fa(e,t,r,n),t}function Nn(e,t){let n=X(e,t);if(n.length===0)return;let r=n[n.length-1];if(r.value&&D(r.value[0])){let i=r.value[0];if(Ve(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||x(s.value)&&s.value.id===t.id)return t;x(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(x(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 c=u.value[0];if(c?.tag==="Type"&&c.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 c=u.value[0];if(c?.tag==="Type"){let f=c;if(f.value===t){a=!0;break}if(x(f.value)&&f.value.id!==t.id)return t}}if(a)break}}if(!a)return t;break}}while(x(t));return r.value}var rs=null;function xr(){if(rs)return rs;let e=it(),t=Me(e),n={id:"comptime_int",tag:"comptime_int",trait:t};return t.receiverType=n,rs=n,n}var is=null;function Ei(){if(is)return is;let e=it(),t=Me(e),n={id:"comptime_float",tag:"comptime_float",trait:t};return t.receiverType=n,is=n,n}var os=null;function Vt(){if(os)return os;let e=it(),t=Me(e),n={id:"comptime_string",tag:"comptime_string",trait:t};return t.receiverType=n,os=n,n}var as=null;function ln(){if(as)return as;let e=it(),t=Me(e),n={id:"Expr",tag:"Expr",trait:t};return t.receiverType=n,as=n,n}var ss=new Map;function To(e){if(ss.has(e))return ss.get(e);let t=it(),n=Me(t),i={id:`comptime_list_${e.id}`,tag:"ComptimeList",childType:e,trait:n};return n.receiverType=i,ss.set(e,i),i}function bo(){return To(ln())}var ls=null;function Ze(){if(ls)return ls;let e=it(),t=Me(e),n={id:"bool",tag:"bool",trait:t};return t.receiverType=n,ls=n,n}var us=null;function yt(){if(us)return us;let e=it(),t=Me(e),n={id:"usize",tag:"usize",trait:t};return t.receiverType=n,us=n,n}var cs=null;function $i(){if(cs)return cs;let e=it(),t=Me(e),n={id:"isize",tag:"isize",trait:t};return t.receiverType=n,cs=n,n}var fs=null;function Ci(){if(fs)return fs;let e=it(),t=Me(e),n={id:"u8",tag:"u8",trait:t};return t.receiverType=n,fs=n,n}var ps=null;function bi(){if(ps)return ps;let e=it(),t=Me(e),n={id:"i8",tag:"i8",trait:t};return t.receiverType=n,ps=n,n}var _s=null;function ki(){if(_s)return _s;let e=it(),t=Me(e),n={id:"u16",tag:"u16",trait:t};return t.receiverType=n,_s=n,n}var ds=null;function wi(){if(ds)return ds;let e=it(),t=Me(e),n={id:"i16",tag:"i16",trait:t};return t.receiverType=n,ds=n,n}var ms=null;function Fi(){if(ms)return ms;let e=it(),t=Me(e),n={id:"u32",tag:"u32",trait:t};return t.receiverType=n,ms=n,n}var ys=null;function Vr(){if(ys)return ys;let e=it(),t=Me(e),n={id:"i32",tag:"i32",trait:t};return t.receiverType=n,ys=n,n}var gs=null;function Li(){if(gs)return gs;let e=it(),t=Me(e),n={id:"u64",tag:"u64",trait:t};return t.receiverType=n,gs=n,n}var hs=null;function Ai(){if(hs)return hs;let e=it(),t=Me(e),n={id:"i64",tag:"i64",trait:t};return t.receiverType=n,hs=n,n}var vs=null;function Ii(){if(vs)return vs;let e=it(),t=Me(e),n={id:"f32",tag:"f32",trait:t};return t.receiverType=n,vs=n,n}var Ts=null;function Dr(){if(Ts)return Ts;let e=it(),t=Me(e),n={id:"f64",tag:"f64",trait:t};return t.receiverType=n,Ts=n,n}var Es=null;function Sn(){if(Es)return Es;let e=it(),t=Me(e),n={id:"unit",tag:"unit",trait:t};return t.receiverType=n,Es=n,n}var $s=null;function ru(){if($s)return $s;let e=it(),t=Me(e),n={id:"char",tag:"char",trait:t};return t.receiverType=n,$s=n,n}var Cs=null;function iu(){if(Cs)return Cs;let e=it(),t=Me(e),n={id:"short",tag:"short",trait:t};return t.receiverType=n,Cs=n,n}var bs=null;function ou(){if(bs)return bs;let e=it(),t=Me(e),n={id:"ushort",tag:"ushort",trait:t};return t.receiverType=n,bs=n,n}var ks=null;function au(){if(ks)return ks;let e=it(),t=Me(e),n={id:"int",tag:"int",trait:t};return t.receiverType=n,ks=n,n}var ws=null;function su(){if(ws)return ws;let e=it(),t=Me(e),n={id:"uint",tag:"uint",trait:t};return t.receiverType=n,ws=n,n}var Fs=null;function lu(){if(Fs)return Fs;let e=it(),t=Me(e),n={id:"long",tag:"long",trait:t};return t.receiverType=n,Fs=n,n}var Ls=null;function uu(){if(Ls)return Ls;let e=it(),t=Me(e),n={id:"ulong",tag:"ulong",trait:t};return t.receiverType=n,Ls=n,n}var As=null;function cu(){if(As)return As;let e=it(),t=Me(e),n={id:"longlong",tag:"longlong",trait:t};return t.receiverType=n,As=n,n}var Is=null;function fu(){if(Is)return Is;let e=it(),t=Me(e),n={id:"ulonglong",tag:"ulonglong",trait:t};return t.receiverType=n,Is=n,n}var Ns=null;function pu(){if(Ns)return Ns;let e=it(),t=Me(e),n={id:"longdouble",tag:"longdouble",trait:t};return t.receiverType=n,Ns=n,n}function et(e){return _n(0,e)}function ar(e,t){let n=it(),r=Me(n),i={id:`array_${e.id+"_"+Za(De(t))}`,tag:"Array",childType:e,length:t,trait:r};return r.receiverType=i,i}var Ss=new Map;function _a(e){if(Ss.has(e))return Ss.get(e);let t=it(),n=Me(t),r={id:`slice_${e.id}`,tag:"Slice",childType:e,trait:n};return n.receiverType=r,Ss.set(e,r),r}function Ul(e){let n=X(e,"str").find(r=>D(r.value?.[0])&&r.value[0].type);if(!n||!D(n.value?.[0]))throw new Error("'str' type not found in environment. Make sure prelude is loaded.");return n.value[0].value}var xs;function _u(){if(xs)return xs;let e=it(),t=Me(e),n={id:"void",tag:"void",trait:t};return t.receiverType=n,xs=n,n}function da(e){let t=it(),n=Me(t),r={id:`tuple_${e.map(i=>i.type.id).join("_")}`,tag:"Tuple",fields:e,trait:n};return n.receiverType=r,r}function oi(e,t=!1,n=!1){let r=Me(e),i={id:`struct_${Ge(e.modulePath)}`,tag:"Struct",isReferenceSemantics:t,isNewtype:n,fields:[],trait:r,env:e};return r.receiverType=i,i}function ma(e){return{id:`module_${Ge(e.modulePath)}`,tag:"Module",fields:[],env:e,trait:void 0}}function Me(e){return{id:`trait_${Ge(e.modulePath)}`,tag:"Trait",fields:[],env:e,trait:void 0}}function du(e){let t=Me(e),n={id:`enum_${Ge(e.modulePath)}`,tag:"Enum",variants:[],trait:t,env:e};return t.receiverType=n,n}function mu(e){let t=Me(e),n={id:`union_${Ge(e.modulePath)}`,tag:"Union",fields:[],trait:t,env:e};return t.receiverType=n,n}function ai({parameters:e,forallParameters:t,implicitParameters:n,variadicParameter:r,whereClauseExprs:i,return_:o,env:a,parametersFrame:s,SelfType:l,SelfTraitType:u,SelfModuleType:c,isClosure:f}){let p=it(),_=Me(p),m={id:`fn_${Ge(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:c,trait:_,isClosure:f};return _.receiverType=m,m}var Vs=new Map;function si(e){if(Vs.has(e))return Vs.get(e);let t=it(),n=Me(t),r={id:`ptr_${e.id}`,tag:"Ptr",childType:e,trait:n};return n.receiverType=r,Vs.set(e,r),r}var Ds=new Map;function yu(e,t){if(Ds.has(e))return Ds.get(e);let n=Me(t),r={id:`iso_${e.id}`,tag:"Iso",childType:e,trait:n,env:t};return n.receiverType=r,Ds.set(e,r),r}var Ms=new Map;function gu(e,t){if(Ms.has(e))return Ms.get(e);let n=Me(t),r={id:`arc_${e.id}`,tag:"Arc",childType:e,trait:n,env:t};return n.receiverType=r,Ms.set(e,r),r}function En(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=Me(a),u=r?.map(p=>({traitType:p,frameLevel:-1}))??[],c=i?.map(p=>({traitType:p,frameLevel:-1}))??[],f={id:n??`sometype_${Ge(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:c,trait:l,isExtern:e.isExtern,externName:e.externName,recursiveTypeRef:o};return l.receiverType=f,Nn(a,"Runtime")&&Jt("Runtime",f,a,s),jl({someType:f,env:a,context:{SelfType:f,stdPath:""}}),f}var pa=new Map;function li(e,t){let n=Me(t),r=_n(1),i={id:`effects_row_sometype_${Ge(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 $r(e){let t=it(),n=Me(t),r={id:`EffectsRow_${Ge(t.modulePath)}`,tag:"EffectsRow",implicitParameters:e,trait:n};return n.receiverType=r,r}function _n(e,t){if(pa.has(e)){let i=pa.get(e);if(i.has(t))return i.get(t)}else pa.set(e,new Map);let n=Me(it()),r={id:`Type(${e})`,tag:"Type",level:e,baseType:t,trait:n};return n.receiverType=r,pa.get(e).set(t,r),r}function ui({expr:e,labelExpr:t,typeExpr:n,defaultValueExpr:r,assignedValueExpr:i}){return{expr:e,labelExpr:t,typeExpr:n,defaultValueExpr:r,assignedValueExpr:i}}function hu(e,t){let n=`fn_trait_${e.id}`,r=Me(t);return r.isFn={callType:e},r.id=n,r.receiverType=void 0,r}function nu(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 ko({requiredTraits:e,env:t,negativeTraits:n}){let r=Me(t),i=e.map(c=>nu(c)).join("__"),o=n?n.map(c=>nu(c)).join("__"):"",a=`dyn_${Za(i+(o?`_neg_${o}`:""))}`,s=e.map(c=>({traitType:c,frameLevel:-1}))??[],l=n?.map(c=>({traitType:c,frameLevel:-1}))??[],u={id:a,tag:"Dyn",requiredTraits:s,negativeTraits:l,trait:r,env:t};return r.receiverType=u,u}function vu(e,t){return!qe(e)||!qe(t)?!1:t.level===e.level&&(t.tag===e.tag||e.tag==="Type")}function xn(e,t,n=new Set){if(n.has(t.id))return!1;if(n.add(t.id),x(t))return e===t.id;if(ce(t))return t.fields.some(r=>xn(e,r.type,n));if(ye(t))return t.variants.some(r=>r.fields?r.fields.some(i=>xn(e,i.type,n)):!1);if(we(t))return t.fields.some(r=>xn(e,r.type,n));if(ke(t)||Xe(t)||xt(t))return xn(e,t.childType,n);if(Ne(t))return!1;if(bt(t)||Tt(t))return xn(e,t.childType,n);if(z(t))return t.parameters.some(r=>xn(e,r.type,n))||xn(e,t.return.type,n);if(qt(t)){if(xn(e,t.isFuture.outputType,n))return!0;for(let r of t.isFuture.effects)if(xn(e,r.type,n))return!0;return!1}return Ct(t)?xn(e,t.isFn.callType,n):!1}function Qe(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}),x(e.type)&&x(t.type)){let r=Ot(e.env,e.type),i=Ot(t.env,t.type);if(x(r))if(x(i)){if(r!==i){let o=J(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}=fe({env:e.env,variable:{name:e.type.name,value:[o],type:o.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,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}=fe({env:t.env,variable:{name:t.type.name,value:[o],type:o.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});t.env=l}}}}else{let o=J(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}=fe({env:e.env,variable:{name:e.type.name,value:[o],type:o.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=l}}else{let o=J(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}=fe({env:t.env,variable:{name:t.type.name,value:[o],type:o.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,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(Ct(l)){let u=a.find(c=>Ct(c.traitType));if(u&&Ct(u.traitType)){let{expectedEnv:c,givenEnv:f}=Qe({type:l.isFn.callType,env:e.env},{type:u.traitType.isFn.callType,env:t.env},n);e.env=c,t.env=f}}else if(qt(l)){let u=a.find(c=>qt(c.traitType));if(u&&qt(u.traitType)){let{expectedEnv:c,givenEnv:f}=Qe({type:l.isFuture.outputType,env:e.env},{type:u.traitType.isFuture.outputType,env:t.env},n);e.env=c,t.env=f,Os(l.isFuture.effects,u.traitType.isFuture.effects,e,t,n)}}}}}else if(x(e.type)){let r=Ot(e.env,e.type);if(x(r)&&(r.id===e.type.id||r.name===e.type.name)){if(xn(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=J(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}=fe({env:e.env,variable:{name:e.type.name,value:[i],type:i.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=s}if(e.type.requiredTraits){for(let{traitType:s}of e.type.requiredTraits)if(Ct(s)&&z(t.type)){let l=s.isFn.callType,{expectedEnv:u,givenEnv:c}=Qe({type:l,env:e.env},{type:t.type,env:t.env},n);e.env=u,t.env=c}else if(qt(s)&&qt(t.type)){let{expectedEnv:l,givenEnv:u}=Qe({type:s.isFuture.outputType,env:e.env},{type:t.type.isFuture.outputType,env:t.env},n);e.env=l,t.env=u,Os(s.isFuture.effects,t.type.isFuture.effects,e,t,n)}}}else if(!x(r)){let{expectedEnv:i,givenEnv:o}=Qe({type:r,env:e.env},{type:t.type,env:t.env},n);e.env=i,t.env=o}}else if(x(t.type)){let r=Ot(t.env,t.type);if(x(r)){if(xn(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=J(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}=fe({env:t.env,variable:{name:t.type.name,value:[i],type:i.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});t.env=s}}else{let{expectedEnv:i,givenEnv:o}=Qe({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}=Qe({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(ce(e.type)&&ce(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}=Qe({type:i.type,env:e.env},{type:o.type,env:t.env},n);if(e.env=a,t.env=s,i.assignedValue&&o.assignedValue&&D(i.assignedValue)&&D(o.assignedValue)){let{expectedEnv:l,givenEnv:u}=Qe({type:i.assignedValue.value,env:e.env},{type:o.assignedValue.value,env:t.env},n);e.env=l,t.env=u}}}else if(ye(e.type)&&ye(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:c}=Qe({type:a[l].type,env:e.env},{type:s[l].type,env:t.env},n);e.env=u,t.env=c}}else{if(ye(e.type)&&ye(t.type))throw new Error(`Cannot unify incompatible enum types: "${A(e.type)}" and "${A(t.type)}"`);if(ve(e.type)&&ve(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}=Qe({type:i.type,env:e.env},{type:o.type,env:t.env},n);if(e.env=a,t.env=s,i.assignedValue&&o.assignedValue&&D(i.assignedValue)&&D(o.assignedValue)){let{expectedEnv:l,givenEnv:u}=Qe({type:i.assignedValue.value,env:e.env},{type:o.assignedValue.value,env:t.env},n);e.env=l,t.env=u}}else if(Ve(e.type)&&Ve(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}=Qe({type:i.type,env:e.env},{type:o.type,env:t.env},n);if(e.env=a,t.env=s,i.assignedValue&&o.assignedValue&&D(i.assignedValue)&&D(o.assignedValue)){let{expectedEnv:l,givenEnv:u}=Qe({type:i.assignedValue.value,env:e.env},{type:o.assignedValue.value,env:t.env},n);e.env=l,t.env=u}}else if(Ne(e.type)&&Ne(t.type)){let{expectedEnv:r,givenEnv:i}=Qe({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}=Qe({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);e.env=r,t.env=i}else if(Tt(e.type)&&Tt(t.type)){let{expectedEnv:r,givenEnv:i}=Qe({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}=Qe({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);if(e.env=r,t.env=i,_e(e.type.length)&&e.type.length.variableName&&!_e(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}=fe({env:e.env,variable:{name:o,value:[a],type:t.type.length.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=u}}}else if(Xe(e.type)&&Xe(t.type)){let{expectedEnv:r,givenEnv:i}=Qe({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}=Qe({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);e.env=r,t.env=i}else if(qt(e.type)&&qt(t.type)){let{expectedEnv:r,givenEnv:i}=Qe({type:e.type.isFuture.outputType,env:e.env},{type:t.type.isFuture.outputType,env:t.env},n);e.env=r,t.env=i,Os(e.type.isFuture.effects,t.type.isFuture.effects,e,t,n)}else if(Ct(e.type)&&Ct(t.type)){let r=e.type,i=t.type,{expectedEnv:o,givenEnv:a}=Qe({type:r.isFn.callType,env:e.env},{type:i.isFn.callType,env:t.env},n);e.env=o,t.env=a}else if(z(e.type)&&z(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:c,givenEnv:f}=Qe({type:l.type,env:e.env},{type:u.type,env:t.env},n);e.env=c,t.env=f}for(let s=0;s<r.parameters.length;s++){let{expectedEnv:l,givenEnv:u}=Qe({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 _ of i.implicitParameters)_.isEffectRowSpread?rt(_.type)&&l.push(..._.type.implicitParameters):l.push(_);let u=[],c=[],f=[];for(let _ of s)_.isEffectRowSpread?rt(_.type)?c.push(_):x(_.type)&&_.type.isEffectsRow&&f.push(_):u.push(_);if(f.length>1)throw new Error(`Ambiguous effect row unification: multiple unsolved effect row variables (${f.map(_=>_.label).join(", ")}). At most one effect row spread can be unsolved during type unification.`);let p=new Set;for(let _ of u)for(let m=0;m<l.length;m++)if(!p.has(m)&&_.type.id===l[m].type.id){let{expectedEnv:g,givenEnv:h}=Qe({type:_.type,env:e.env},{type:l[m].type,env:t.env},n);e.env=g,t.env=h,p.add(m);break}for(let _ of c){let m=_.type.implicitParameters;for(let g of m)for(let h=0;h<l.length;h++)if(!p.has(h)&&g.type.id===l[h].type.id){let{expectedEnv:d,givenEnv:v}=Qe({type:g.type,env:e.env},{type:l[h].type,env:t.env},n);e.env=d,t.env=v,p.add(h);break}}if(f.length===1){let _=f[0],m=[];for(let g=0;g<l.length;g++)p.has(g)||m.push(l[g]);if(x(_.type)&&_.type.isEffectsRow){let g=$r(m),h=J(g),d=X(e.env,_.type.name),v=d[d.length-1];if(v)e.env=Be(e.env,v,{...v,value:[h]});else{let{env:T}=fe({env:e.env,variable:{name:_.type.name,value:[h],type:h.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=T}}}}let{expectedEnv:o,givenEnv:a}=Qe({type:r.return.type,env:e.env},{type:i.return.type,env:t.env},n);e.env=o,t.env=a}else if(!(qe(e.type)&&!qe(t.type))){if(e.type.tag!==t.type.tag)throw new Error(`Cannot unify incompatible types:
|
|
148
|
+
})`}function Xl({arcType:e,env:t,context:n}){let r=sm(e),i=lm(e),o=um(e);return t=Cn({label:k.___dispose[0],functionCode:r,SelfType:e,env:t,context:n}),t=Cn({label:k.___drop[0],functionCode:i,SelfType:e,env:t,context:n}),t=Cn({label:k.___dup[0],functionCode:o,SelfType:e,env:t,context:n}),t}function Jt(e,t,n,r){let i=`${e}()`,o=Qt(i),a=N({expr:o,env:n,context:{...r,expectedType:void 0,ReceiverType:t}});if(!a.$||!ht(a.$.value))return n;n=a.$.env;let s=a.$.value;s.type.receiverType=t;let l={label:"",type:_n(1),assignedValue:s,sourceModulePath:r.currentModulePath,exprs:{expr:o}};return t.trait.fields.push(l),n}function cm({structType:e,env:t,context:n}){return e.isReferenceSemantics||e.fields.every(i=>Co(i.type,t))&&(t=Jt("Send",e,t,n)),t}function fm({structType:e,env:t,context:n}){return e.isReferenceSemantics&&(t=Jt("Rc",e,t,n)),t}function pm({enumType:e,env:t,context:n}){return e.variants.every(i=>!i.fields||i.fields.length===0?!0:i.fields.every(o=>Co(o.type,t)))&&(t=Jt("Send",e,t,n)),t}function Ql({unionType:e,env:t,context:n}){return e.fields.every(i=>Co(i.type,t))&&(t=Jt("Send",e,t,n)),t}function _m({structType:e,env:t,context:n}){return e.isReferenceSemantics?Tr(e,new Set,t)||(t=Jt("Acyclic",e,t,n)):e.fields.every(i=>Zr(i.type,t))&&(t=Jt("Acyclic",e,t,n)),t}function dm({enumType:e,env:t,context:n}){return e.variants.every(i=>!i.fields||i.fields.length===0?!0:i.fields.every(o=>Zr(o.type,t)))&&(t=Jt("Acyclic",e,t,n)),t}function Zl({unionType:e,env:t,context:n}){return e.fields.every(i=>Zr(i.type,t))&&(t=Jt("Acyclic",e,t,n)),t}function mm({structType:e,env:t,context:n}){return e.isReferenceSemantics||e.fields.every(i=>ti(i.type,t,new Set([e.id])))&&(t=Jt("Comptime",e,t,n)),t}function ym({enumType:e,env:t,context:n}){return e.variants.every(i=>!i.fields||i.fields.length===0?!0:i.fields.every(o=>ti(o.type,t,new Set([e.id]))))&&(t=Jt("Comptime",e,t,n)),t}function gm({structType:e,env:t,context:n}){return e.isReferenceSemantics?(t=Jt("Runtime",e,t,n),t):(e.fields.every(i=>ni(i.type,t,new Set([e.id])))&&(t=Jt("Runtime",e,t,n)),t)}function hm({enumType:e,env:t,context:n}){return e.variants.every(i=>!i.fields||i.fields.length===0?!0:i.fields.every(o=>ni(o.type,t,new Set([e.id]))))&&(t=Jt("Runtime",e,t,n)),t}function Jl({unionType:e,env:t,context:n}){return t=Jt("Runtime",e,t,n),t}function vm({tupleType:e,env:t,context:n}){return e.fields.every(i=>Co(i.type,t))&&(t=Jt("Send",e,t,n)),t}function Tm({tupleType:e,env:t,context:n}){return e.fields.every(i=>ti(i.type,t,new Set([e.id])))&&(t=Jt("Comptime",e,t,n)),t}function Em({tupleType:e,env:t,context:n}){return e.fields.every(i=>ni(i.type,t,new Set([e.id])))&&(t=Jt("Runtime",e,t,n)),t}function ri({structType:e,env:t,context:n,errorToken:r}){return t=cm({structType:e,env:t,context:n}),t=fm({structType:e,env:t,context:n}),t=_m({structType:e,env:t,context:n}),t=mm({structType:e,env:t,context:n}),t=gm({structType:e,env:t,context:n}),t=Xd({structType:e,env:t,context:n}),fa(e,t,r,n),t}function eu({enumType:e,env:t,context:n,errorToken:r}){return t=pm({enumType:e,env:t,context:n}),t=dm({enumType:e,env:t,context:n}),t=ym({enumType:e,env:t,context:n}),t=hm({enumType:e,env:t,context:n}),t=Jd({enumType:e,env:t,context:n}),fa(e,t,r,n),t}function tu({tupleType:e,env:t,context:n,errorToken:r}){return t=vm({tupleType:e,env:t,context:n}),t=Tm({tupleType:e,env:t,context:n}),t=Em({tupleType:e,env:t,context:n}),fa(e,t,r,n),t}function Nn(e,t){let n=X(e,t);if(n.length===0)return;let r=n[n.length-1];if(r.value&&D(r.value[0])){let i=r.value[0];if(Ve(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||x(s.value)&&s.value.id===t.id)return t;x(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(x(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 c=u.value[0];if(c?.tag==="Type"&&c.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 c=u.value[0];if(c?.tag==="Type"){let f=c;if(f.value===t){a=!0;break}if(x(f.value)&&f.value.id!==t.id)return t}}if(a)break}}if(!a)return t;break}}while(x(t));return r.value}var rs=null;function xr(){if(rs)return rs;let e=it(),t=Me(e),n={id:"comptime_int",tag:"comptime_int",trait:t};return t.receiverType=n,rs=n,n}var is=null;function Ei(){if(is)return is;let e=it(),t=Me(e),n={id:"comptime_float",tag:"comptime_float",trait:t};return t.receiverType=n,is=n,n}var os=null;function Vt(){if(os)return os;let e=it(),t=Me(e),n={id:"comptime_string",tag:"comptime_string",trait:t};return t.receiverType=n,os=n,n}var as=null;function ln(){if(as)return as;let e=it(),t=Me(e),n={id:"Expr",tag:"Expr",trait:t};return t.receiverType=n,as=n,n}var ss=new Map;function To(e){if(ss.has(e))return ss.get(e);let t=it(),n=Me(t),i={id:`comptime_list_${e.id}`,tag:"ComptimeList",childType:e,trait:n};return n.receiverType=i,ss.set(e,i),i}function bo(){return To(ln())}var ls=null;function Ze(){if(ls)return ls;let e=it(),t=Me(e),n={id:"bool",tag:"bool",trait:t};return t.receiverType=n,ls=n,n}var us=null;function yt(){if(us)return us;let e=it(),t=Me(e),n={id:"usize",tag:"usize",trait:t};return t.receiverType=n,us=n,n}var cs=null;function $i(){if(cs)return cs;let e=it(),t=Me(e),n={id:"isize",tag:"isize",trait:t};return t.receiverType=n,cs=n,n}var fs=null;function Ci(){if(fs)return fs;let e=it(),t=Me(e),n={id:"u8",tag:"u8",trait:t};return t.receiverType=n,fs=n,n}var ps=null;function bi(){if(ps)return ps;let e=it(),t=Me(e),n={id:"i8",tag:"i8",trait:t};return t.receiverType=n,ps=n,n}var _s=null;function ki(){if(_s)return _s;let e=it(),t=Me(e),n={id:"u16",tag:"u16",trait:t};return t.receiverType=n,_s=n,n}var ds=null;function wi(){if(ds)return ds;let e=it(),t=Me(e),n={id:"i16",tag:"i16",trait:t};return t.receiverType=n,ds=n,n}var ms=null;function Fi(){if(ms)return ms;let e=it(),t=Me(e),n={id:"u32",tag:"u32",trait:t};return t.receiverType=n,ms=n,n}var ys=null;function Vr(){if(ys)return ys;let e=it(),t=Me(e),n={id:"i32",tag:"i32",trait:t};return t.receiverType=n,ys=n,n}var gs=null;function Li(){if(gs)return gs;let e=it(),t=Me(e),n={id:"u64",tag:"u64",trait:t};return t.receiverType=n,gs=n,n}var hs=null;function Ai(){if(hs)return hs;let e=it(),t=Me(e),n={id:"i64",tag:"i64",trait:t};return t.receiverType=n,hs=n,n}var vs=null;function Ii(){if(vs)return vs;let e=it(),t=Me(e),n={id:"f32",tag:"f32",trait:t};return t.receiverType=n,vs=n,n}var Ts=null;function Dr(){if(Ts)return Ts;let e=it(),t=Me(e),n={id:"f64",tag:"f64",trait:t};return t.receiverType=n,Ts=n,n}var Es=null;function Sn(){if(Es)return Es;let e=it(),t=Me(e),n={id:"unit",tag:"unit",trait:t};return t.receiverType=n,Es=n,n}var $s=null;function ru(){if($s)return $s;let e=it(),t=Me(e),n={id:"char",tag:"char",trait:t};return t.receiverType=n,$s=n,n}var Cs=null;function iu(){if(Cs)return Cs;let e=it(),t=Me(e),n={id:"short",tag:"short",trait:t};return t.receiverType=n,Cs=n,n}var bs=null;function ou(){if(bs)return bs;let e=it(),t=Me(e),n={id:"ushort",tag:"ushort",trait:t};return t.receiverType=n,bs=n,n}var ks=null;function au(){if(ks)return ks;let e=it(),t=Me(e),n={id:"int",tag:"int",trait:t};return t.receiverType=n,ks=n,n}var ws=null;function su(){if(ws)return ws;let e=it(),t=Me(e),n={id:"uint",tag:"uint",trait:t};return t.receiverType=n,ws=n,n}var Fs=null;function lu(){if(Fs)return Fs;let e=it(),t=Me(e),n={id:"long",tag:"long",trait:t};return t.receiverType=n,Fs=n,n}var Ls=null;function uu(){if(Ls)return Ls;let e=it(),t=Me(e),n={id:"ulong",tag:"ulong",trait:t};return t.receiverType=n,Ls=n,n}var As=null;function cu(){if(As)return As;let e=it(),t=Me(e),n={id:"longlong",tag:"longlong",trait:t};return t.receiverType=n,As=n,n}var Is=null;function fu(){if(Is)return Is;let e=it(),t=Me(e),n={id:"ulonglong",tag:"ulonglong",trait:t};return t.receiverType=n,Is=n,n}var Ns=null;function pu(){if(Ns)return Ns;let e=it(),t=Me(e),n={id:"longdouble",tag:"longdouble",trait:t};return t.receiverType=n,Ns=n,n}function et(e){return _n(0,e)}function sr(e,t){let n=it(),r=Me(n),i={id:`array_${e.id+"_"+Za(De(t))}`,tag:"Array",childType:e,length:t,trait:r};return r.receiverType=i,i}var Ss=new Map;function _a(e){if(Ss.has(e))return Ss.get(e);let t=it(),n=Me(t),r={id:`slice_${e.id}`,tag:"Slice",childType:e,trait:n};return n.receiverType=r,Ss.set(e,r),r}function Ul(e){let n=X(e,"str").find(r=>D(r.value?.[0])&&r.value[0].type);if(!n||!D(n.value?.[0]))throw new Error("'str' type not found in environment. Make sure prelude is loaded.");return n.value[0].value}var xs;function _u(){if(xs)return xs;let e=it(),t=Me(e),n={id:"void",tag:"void",trait:t};return t.receiverType=n,xs=n,n}function da(e){let t=it(),n=Me(t),r={id:`tuple_${e.map(i=>i.type.id).join("_")}`,tag:"Tuple",fields:e,trait:n};return n.receiverType=r,r}function oi(e,t=!1,n=!1){let r=Me(e),i={id:`struct_${Ge(e.modulePath)}`,tag:"Struct",isReferenceSemantics:t,isNewtype:n,fields:[],trait:r,env:e};return r.receiverType=i,i}function ma(e){return{id:`module_${Ge(e.modulePath)}`,tag:"Module",fields:[],env:e,trait:void 0}}function Me(e){return{id:`trait_${Ge(e.modulePath)}`,tag:"Trait",fields:[],env:e,trait:void 0}}function du(e){let t=Me(e),n={id:`enum_${Ge(e.modulePath)}`,tag:"Enum",variants:[],trait:t,env:e};return t.receiverType=n,n}function mu(e){let t=Me(e),n={id:`union_${Ge(e.modulePath)}`,tag:"Union",fields:[],trait:t,env:e};return t.receiverType=n,n}function ai({parameters:e,forallParameters:t,implicitParameters:n,variadicParameter:r,whereClauseExprs:i,return_:o,env:a,parametersFrame:s,SelfType:l,SelfTraitType:u,SelfModuleType:c,isClosure:f}){let p=it(),_=Me(p),m={id:`fn_${Ge(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:c,trait:_,isClosure:f};return _.receiverType=m,m}var Vs=new Map;function si(e){if(Vs.has(e))return Vs.get(e);let t=it(),n=Me(t),r={id:`ptr_${e.id}`,tag:"Ptr",childType:e,trait:n};return n.receiverType=r,Vs.set(e,r),r}var Ds=new Map;function yu(e,t){if(Ds.has(e))return Ds.get(e);let n=Me(t),r={id:`iso_${e.id}`,tag:"Iso",childType:e,trait:n,env:t};return n.receiverType=r,Ds.set(e,r),r}var Ms=new Map;function gu(e,t){if(Ms.has(e))return Ms.get(e);let n=Me(t),r={id:`arc_${e.id}`,tag:"Arc",childType:e,trait:n,env:t};return n.receiverType=r,Ms.set(e,r),r}function En(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=Me(a),u=r?.map(p=>({traitType:p,frameLevel:-1}))??[],c=i?.map(p=>({traitType:p,frameLevel:-1}))??[],f={id:n??`sometype_${Ge(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:c,trait:l,isExtern:e.isExtern,externName:e.externName,recursiveTypeRef:o};return l.receiverType=f,Nn(a,"Runtime")&&Jt("Runtime",f,a,s),jl({someType:f,env:a,context:{SelfType:f,stdPath:""}}),f}var pa=new Map;function li(e,t){let n=Me(t),r=_n(1),i={id:`effects_row_sometype_${Ge(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 $r(e){let t=it(),n=Me(t),r={id:`EffectsRow_${Ge(t.modulePath)}`,tag:"EffectsRow",implicitParameters:e,trait:n};return n.receiverType=r,r}function _n(e,t){if(pa.has(e)){let i=pa.get(e);if(i.has(t))return i.get(t)}else pa.set(e,new Map);let n=Me(it()),r={id:`Type(${e})`,tag:"Type",level:e,baseType:t,trait:n};return n.receiverType=r,pa.get(e).set(t,r),r}function ui({expr:e,labelExpr:t,typeExpr:n,defaultValueExpr:r,assignedValueExpr:i}){return{expr:e,labelExpr:t,typeExpr:n,defaultValueExpr:r,assignedValueExpr:i}}function hu(e,t){let n=`fn_trait_${e.id}`,r=Me(t);return r.isFn={callType:e},r.id=n,r.receiverType=void 0,r}function nu(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 ko({requiredTraits:e,env:t,negativeTraits:n}){let r=Me(t),i=e.map(c=>nu(c)).join("__"),o=n?n.map(c=>nu(c)).join("__"):"",a=`dyn_${Za(i+(o?`_neg_${o}`:""))}`,s=e.map(c=>({traitType:c,frameLevel:-1}))??[],l=n?.map(c=>({traitType:c,frameLevel:-1}))??[],u={id:a,tag:"Dyn",requiredTraits:s,negativeTraits:l,trait:r,env:t};return r.receiverType=u,u}function vu(e,t){return!qe(e)||!qe(t)?!1:t.level===e.level&&(t.tag===e.tag||e.tag==="Type")}function xn(e,t,n=new Set){if(n.has(t.id))return!1;if(n.add(t.id),x(t))return e===t.id;if(ce(t))return t.fields.some(r=>xn(e,r.type,n));if(ye(t))return t.variants.some(r=>r.fields?r.fields.some(i=>xn(e,i.type,n)):!1);if(we(t))return t.fields.some(r=>xn(e,r.type,n));if(ke(t)||Xe(t)||xt(t))return xn(e,t.childType,n);if(Ne(t))return!1;if(bt(t)||Tt(t))return xn(e,t.childType,n);if(z(t))return t.parameters.some(r=>xn(e,r.type,n))||xn(e,t.return.type,n);if(qt(t)){if(xn(e,t.isFuture.outputType,n))return!0;for(let r of t.isFuture.effects)if(xn(e,r.type,n))return!0;return!1}return Ct(t)?xn(e,t.isFn.callType,n):!1}function Qe(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}),x(e.type)&&x(t.type)){let r=Ot(e.env,e.type),i=Ot(t.env,t.type);if(x(r))if(x(i)){if(r!==i){let o=J(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}=fe({env:e.env,variable:{name:e.type.name,value:[o],type:o.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,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}=fe({env:t.env,variable:{name:t.type.name,value:[o],type:o.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});t.env=l}}}}else{let o=J(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}=fe({env:e.env,variable:{name:e.type.name,value:[o],type:o.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=l}}else{let o=J(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}=fe({env:t.env,variable:{name:t.type.name,value:[o],type:o.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,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(Ct(l)){let u=a.find(c=>Ct(c.traitType));if(u&&Ct(u.traitType)){let{expectedEnv:c,givenEnv:f}=Qe({type:l.isFn.callType,env:e.env},{type:u.traitType.isFn.callType,env:t.env},n);e.env=c,t.env=f}}else if(qt(l)){let u=a.find(c=>qt(c.traitType));if(u&&qt(u.traitType)){let{expectedEnv:c,givenEnv:f}=Qe({type:l.isFuture.outputType,env:e.env},{type:u.traitType.isFuture.outputType,env:t.env},n);e.env=c,t.env=f,Os(l.isFuture.effects,u.traitType.isFuture.effects,e,t,n)}}}}}else if(x(e.type)){let r=Ot(e.env,e.type);if(x(r)&&(r.id===e.type.id||r.name===e.type.name)){if(xn(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=J(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}=fe({env:e.env,variable:{name:e.type.name,value:[i],type:i.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=s}if(e.type.requiredTraits){for(let{traitType:s}of e.type.requiredTraits)if(Ct(s)&&z(t.type)){let l=s.isFn.callType,{expectedEnv:u,givenEnv:c}=Qe({type:l,env:e.env},{type:t.type,env:t.env},n);e.env=u,t.env=c}else if(qt(s)&&qt(t.type)){let{expectedEnv:l,givenEnv:u}=Qe({type:s.isFuture.outputType,env:e.env},{type:t.type.isFuture.outputType,env:t.env},n);e.env=l,t.env=u,Os(s.isFuture.effects,t.type.isFuture.effects,e,t,n)}}}else if(!x(r)){let{expectedEnv:i,givenEnv:o}=Qe({type:r,env:e.env},{type:t.type,env:t.env},n);e.env=i,t.env=o}}else if(x(t.type)){let r=Ot(t.env,t.type);if(x(r)){if(xn(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=J(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}=fe({env:t.env,variable:{name:t.type.name,value:[i],type:i.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});t.env=s}}else{let{expectedEnv:i,givenEnv:o}=Qe({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}=Qe({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(ce(e.type)&&ce(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}=Qe({type:i.type,env:e.env},{type:o.type,env:t.env},n);if(e.env=a,t.env=s,i.assignedValue&&o.assignedValue&&D(i.assignedValue)&&D(o.assignedValue)){let{expectedEnv:l,givenEnv:u}=Qe({type:i.assignedValue.value,env:e.env},{type:o.assignedValue.value,env:t.env},n);e.env=l,t.env=u}}}else if(ye(e.type)&&ye(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:c}=Qe({type:a[l].type,env:e.env},{type:s[l].type,env:t.env},n);e.env=u,t.env=c}}else{if(ye(e.type)&&ye(t.type))throw new Error(`Cannot unify incompatible enum types: "${A(e.type)}" and "${A(t.type)}"`);if(ve(e.type)&&ve(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}=Qe({type:i.type,env:e.env},{type:o.type,env:t.env},n);if(e.env=a,t.env=s,i.assignedValue&&o.assignedValue&&D(i.assignedValue)&&D(o.assignedValue)){let{expectedEnv:l,givenEnv:u}=Qe({type:i.assignedValue.value,env:e.env},{type:o.assignedValue.value,env:t.env},n);e.env=l,t.env=u}}else if(Ve(e.type)&&Ve(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}=Qe({type:i.type,env:e.env},{type:o.type,env:t.env},n);if(e.env=a,t.env=s,i.assignedValue&&o.assignedValue&&D(i.assignedValue)&&D(o.assignedValue)){let{expectedEnv:l,givenEnv:u}=Qe({type:i.assignedValue.value,env:e.env},{type:o.assignedValue.value,env:t.env},n);e.env=l,t.env=u}}else if(Ne(e.type)&&Ne(t.type)){let{expectedEnv:r,givenEnv:i}=Qe({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}=Qe({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);e.env=r,t.env=i}else if(Tt(e.type)&&Tt(t.type)){let{expectedEnv:r,givenEnv:i}=Qe({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}=Qe({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);if(e.env=r,t.env=i,_e(e.type.length)&&e.type.length.variableName&&!_e(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}=fe({env:e.env,variable:{name:o,value:[a],type:t.type.length.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=u}}}else if(Xe(e.type)&&Xe(t.type)){let{expectedEnv:r,givenEnv:i}=Qe({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}=Qe({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},n);e.env=r,t.env=i}else if(qt(e.type)&&qt(t.type)){let{expectedEnv:r,givenEnv:i}=Qe({type:e.type.isFuture.outputType,env:e.env},{type:t.type.isFuture.outputType,env:t.env},n);e.env=r,t.env=i,Os(e.type.isFuture.effects,t.type.isFuture.effects,e,t,n)}else if(Ct(e.type)&&Ct(t.type)){let r=e.type,i=t.type,{expectedEnv:o,givenEnv:a}=Qe({type:r.isFn.callType,env:e.env},{type:i.isFn.callType,env:t.env},n);e.env=o,t.env=a}else if(z(e.type)&&z(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:c,givenEnv:f}=Qe({type:l.type,env:e.env},{type:u.type,env:t.env},n);e.env=c,t.env=f}for(let s=0;s<r.parameters.length;s++){let{expectedEnv:l,givenEnv:u}=Qe({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 _ of i.implicitParameters)_.isEffectRowSpread?rt(_.type)&&l.push(..._.type.implicitParameters):l.push(_);let u=[],c=[],f=[];for(let _ of s)_.isEffectRowSpread?rt(_.type)?c.push(_):x(_.type)&&_.type.isEffectsRow&&f.push(_):u.push(_);if(f.length>1)throw new Error(`Ambiguous effect row unification: multiple unsolved effect row variables (${f.map(_=>_.label).join(", ")}). At most one effect row spread can be unsolved during type unification.`);let p=new Set;for(let _ of u)for(let m=0;m<l.length;m++)if(!p.has(m)&&_.type.id===l[m].type.id){let{expectedEnv:g,givenEnv:h}=Qe({type:_.type,env:e.env},{type:l[m].type,env:t.env},n);e.env=g,t.env=h,p.add(m);break}for(let _ of c){let m=_.type.implicitParameters;for(let g of m)for(let h=0;h<l.length;h++)if(!p.has(h)&&g.type.id===l[h].type.id){let{expectedEnv:d,givenEnv:v}=Qe({type:g.type,env:e.env},{type:l[h].type,env:t.env},n);e.env=d,t.env=v,p.add(h);break}}if(f.length===1){let _=f[0],m=[];for(let g=0;g<l.length;g++)p.has(g)||m.push(l[g]);if(x(_.type)&&_.type.isEffectsRow){let g=$r(m),h=J(g),d=X(e.env,_.type.name),v=d[d.length-1];if(v)e.env=Be(e.env,v,{...v,value:[h]});else{let{env:T}=fe({env:e.env,variable:{name:_.type.name,value:[h],type:h.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});e.env=T}}}}let{expectedEnv:o,givenEnv:a}=Qe({type:r.return.type,env:e.env},{type:i.return.type,env:t.env},n);e.env=o,t.env=a}else if(!(qe(e.type)&&!qe(t.type))){if(e.type.tag!==t.type.tag)throw new Error(`Cannot unify incompatible types:
|
|
149
149
|
Expected: "${A(e.type)}"
|
|
150
|
-
Given: "${A(t.type)}"`)}}}return{expectedEnv:e.env,givenEnv:t.env}}function Os(e,t,n,r,i){if(e.length===0&&t.length===0)return;let o=[],a=[],s=[];for(let c of e)c.isEffectRowSpread?rt(c.type)?a.push(c):x(c.type)&&c.type.isEffectsRow&&s.push(c):o.push(c);if(s.length>1)throw new Error(`Ambiguous effect row unification: multiple unsolved effect row variables (${s.map(c=>c.label).join(", ")}). At most one effect row spread can be unsolved during type unification.`);let l=[];for(let c of t)c.isEffectRowSpread?rt(c.type)&&l.push(...c.type.implicitParameters):l.push(c);let u=new Set;for(let c of o)for(let f=0;f<l.length;f++)if(!u.has(f)&&c.type.id===l[f].type.id){let{expectedEnv:p,givenEnv:_}=Qe({type:c.type,env:n.env},{type:l[f].type,env:r.env},i);n.env=p,r.env=_,u.add(f);break}for(let c of a){let f=c.type.implicitParameters;for(let p of f)for(let _=0;_<l.length;_++)if(!u.has(_)&&p.type.id===l[_].type.id){let{expectedEnv:m,givenEnv:g}=Qe({type:p.type,env:n.env},{type:l[_].type,env:r.env},i);n.env=m,r.env=g,u.add(_);break}}if(s.length===1){let c=s[0],f=[];for(let p=0;p<l.length;p++)u.has(p)||f.push(l[p]);if(x(c.type)&&c.type.isEffectsRow){let p=$r(f),_=J(p),m=X(n.env,c.type.name),g=m[m.length-1];if(g)n.env=Be(n.env,g,{...g,value:[_]});else{let{env:h}=fe({env:n.env,variable:{name:c.type.name,value:[_],type:_.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});n.env=h}}}}function Rs(e,t){let n=new Map;for(let i of t.requiredTraits??[])n.set(i.traitType.id,i.traitType);let r=Bn(e,t);if(r)for(let i of r.requiredTraits)n.set(i.id,i);return[...n.values()]}function Tu(e,t){let n=new Map;for(let i of t.negativeTraits??[])n.set(i.traitType.id,i.traitType);let r=Bn(e,t);if(r)for(let i of r.negativeTraits)n.set(i.id,i);return[...n.values()]}function Ps(e){let t=[];for(let n of e)n.isEffectRowSpread&&rt(n.type)?t.push(...Ps(n.type.implicitParameters)):(n.isEffectRowSpread&&x(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&&(ce(e.type)||ye(e.type)||_t(e.type))&&(ce(t.type)||ye(t.type)||_t(t.type))){let a=`${i}:${o}`;if(r.has(a))return!0;r.add(a)}if(ao(e.type)&&ao(t.type))return e.type.tag===t.type.tag;if((gt(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"||qn(e.type))&>(t.type))return!(n&&!gt(e.type));if((St(e.type)||e.type.tag==="f32"||e.type.tag==="f64")&&St(t.type))return!(n&&!St(e.type));if((Ft(e.type)||Xe(e.type)&&Wn(e.type.childType)||Ne(e.type)&&(Wn(e.type.childType)||hi(e.type.childType))||dr(e.type)&&e.type.typeName==="str")&&Ft(t.type))return!0;if(qn(e.type)&&qn(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(Xe(e.type)&&Xe(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(ce(e.type)&&ce(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(ye(e.type)&&ye(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 c=s.fields[u],f=l.fields[u];if(c.label!==f.label||!q({type:c.type,env:e.env},{type:f.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(_t(e.type)&&_t(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(ve(e.type)&&ve(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(Ve(e.type)){if(Ve(t.type)){if(Ct(e.type))return!(!Ct(t.type)||!Eu({type:e.type.isFn.callType,env:e.env},{type:t.type.isFn.callType,env:t.env},n));if(qt(e.type)){if(!qt(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=Ps(e.type.isFuture.effects),s=Ps(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 c=!1;for(let f=0;f<s.length;f++)if(!l.has(f)&&q({type:u.type,env:e.env},{type:s[f].type,env:t.env},n,r)){l.add(f),c=!0;break}if(!c)return!1}}return!0}return e.type.id===t.type.id}return qe(t.type)&&t.type.baseType&&t.type.baseType.trait&&Ve(e.type)?q({type:e.type,env:e.env},{type:t.type.baseType.trait,env:t.env},n,r):!1}if(z(e.type)&&z(t.type))return Eu({type:e.type,env:e.env},{type:t.type,env:t.env},n);if(qe(e.type)&&qe(t.type))return vu(e.type,t.type);if(Ne(e.type)&&Ne(t.type))return q({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},!0,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(Tt(e.type)&&Tt(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(be(e.type)&&be(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(x(e.type)){if(be(t.type))return!0;if(x(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=Rs(e.env,e.type),s=Rs(t.env,t.type);if(n&&a.length!==s.length)return!1;for(let u of a)if(!s.find(f=>q({type:u,env:e.env},{type:f,env:t.env},n,r)))return!1;let l=Tu(e.env,e.type);if(l.length>0){for(let u of l)if(s.find(f=>q({type:u,env:e.env},{type:f,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=Rs(e.env,e.type);if(a.length===0)return!n;if(a.length>0){for(let c of a)if(!Nt({targetType:t.type,traitType:c,env:e.env}))break;let l=Tu(e.env,e.type);if(l.length>0){for(let c of l)if(Nt({targetType:t.type,traitType:c,env:e.env}))return!1}let u=!0;for(let c of a)if(!Nt({targetType:t.type,traitType:c,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(x(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 Eu(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}=Qe({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 Us(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 zs(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 Yn(e){if(U(e))return Et(e,I.escape);if(F(e)){if(e.$?.macroExpansion)return Yn(e.$.macroExpansion);if(E(e,I.cond)||E(e,I.match))return zs(e,Yn);if(Us(e)||F(e.func)&&e.func.$?.value!==void 0&&D(e.func.$.value)&&z(e.func.$.value.value)||F(e.func)&&e.func.$?.value!==void 0&&D(e.func.$.value)&&Yt(e.func.$.value.value))return!1;if(Yn(e.func))return!0;for(let t of e.args)if(Yn(t))return!0}return!1}function Ri(e){if(U(e))return Et(e,I.return)||Et(e,I.escape);if(F(e)){if(E(e,I.return)||E(e,I.escape))return!0;if(e.$?.macroExpansion)return Ri(e.$.macroExpansion);if(E(e,I.cond)||E(e,I.match))return zs(e,Ri);if(Us(e)||F(e.func)&&e.func.$?.value!==void 0&&D(e.func.$.value)&&z(e.func.$.value.value)||F(e.func)&&e.func.$?.value!==void 0&&D(e.func.$.value)&&Yt(e.func.$.value.value))return!1;if(Ri(e.func))return!0;for(let t of e.args)if(Ri(t))return!0}return!1}function sn(e){if(F(e)){if(e.func.$?.type?.ioBuiltin==="io_await")return!0;if(e.$?.macroExpansion)return sn(e.$.macroExpansion);if(E(e,I.cond)||E(e,I.match))return zs(e,sn);if(e.func.$?.type?.ioBuiltin==="io_async"||Us(e)||D(e.func.$?.value)&&z(e.func.$.value.value)||F(e.func)&&e.func.$?.value!==void 0&&D(e.func.$.value)&&Yt(e.func.$.value.value))return!1;if(sn(e.func))return!0;for(let t of e.args)if(sn(t))return!0}return!1}var j={tag:"Unit",type:Sn()};function wo(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 ya(e,t){let n=[],r=new Map,i=new Map,o=new Map;if(sr(e,n,r,i,o,t),e.$?.deferredDropExpressions)for(let a of e.$.deferredDropExpressions)sr(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 sr(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 c=u[u.length-1];if(c&&!n.has(c.id)&&!c.isCompileTimeOnly){let f=`${c.name}:${c.frameLevel}`,p=r.get(f);if(p&&p!==c.id)i.set(c.id,p);else if(c.isOwningTheSameRcValueAs){let _=c.isOwningTheSameRcValueAs;if(!n.has(_.id)){let m={id:_.id,name:_.name,type:_.type,isOwningTheSameRcValueAs:void 0};n.set(_.id,m);let g=`${_.name}:${_.frameLevel}`;r.has(g)||r.set(g,_.id)}}else n.set(c.id,{id:c.id,name:s,type:l,isOwningTheSameRcValueAs:void 0}),r.has(f)||r.set(f,c.id)}}}break;case"FnCall":{if(E(e,I.while)){let s=t.length;sr(e.func,t,n,r,i,o,e);for(let u of e.args)sr(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)){$u(e,t,n,r,i,o);break}if(E(e,I.match)){$u(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)sr(s,t,n,r,i,o,e);break}sr(e.func,t,n,r,i,o,e);for(let s of e.args)sr(s,t,n,r,i,o,e);if(e.$?.deferredDropExpressions)for(let s of e.$.deferredDropExpressions)sr(s,t,n,r,i,o,e);break}}}function $u(e,t,n,r,i,o){if(e.tag!=="FnCall")return;let a=t.length;sr(e.func,t,n,r,i,o,e);let s=new Map(r),l=[];for(let c of e.args){let f=t.length;sr(c,t,n,r,i,o,e),l.push(t.slice(f))}r.clear();for(let[c,f]of s)r.set(c,f);let u=Math.max(...l.map(c=>c.length),0);if(u>0){t.splice(a);let c=a;for(let f=0;f<u;f++){let p;for(let _ of l)if(f<_.length){p=_[f];break}p&&(p.index=t.length,p.isInsideCond=!0,f===0&&(p.needsOwnCondBranchField=!0),f>0&&(p.condBranchSourceIndex=c),t.push(p))}}}function Cu(e){let n=ya(e,{detect(i,o,a){if(i.tag==="FnCall"&&Tn(i)){let s=i.args[0];if(!s)return;let l=s.$?.type;if(l&&Ce(l)){let u=Dt(l);if(!u)return;let c=u.isFuture.outputType,f;if(s.tag==="Atom"&&s.token.type==="identifier"&&s.$){let _=s.token.value,m=X(s.$.env,_);if(m.length>0){let g=m[m.length-1];g.isOwningTheSameRcValueAs?f=g.isOwningTheSameRcValueAs.id:f=g.id}}let p=wo(o);a.push({index:a.length,expr:i,resultType:c,futureType:u,targetVariableId:p,futureVariableId:f})}}},shouldSkipBody(i){return Bt(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 Bt(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="io_async"}function Tn(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="io_await"}function bu(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="io_state"}function ku(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="io_spawn"}function wu(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="join_handle_await"}function Ye(e){return U(e)&&e.token.type==="identifier"||e.token.type==="operator"}function Fo(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 Rr(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 ga=!0;function Fu({variablesToDrop:e,env:t,context:n}){let r=[],i=t;for(let o of e){let a=Qt(`${k.___drop[0]}(${o.name})`),s=N({expr:a,env:i,context:{...n,expectedType:{env:i,type:j.type}}});r.push(s),s.$&&s.$.env&&(i=s.$.env)}return{deferredDropExpressions:r.length>0?r:void 0,env:i}}function Lo(e,t,n){if(F(e)&&Bt(e))return;if(e.$?.deferredDupExpressions)for(let s of e.$.deferredDupExpressions)Lo(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(mt(s.$?.controlFlow))return!0;if(F(s)&&E(s,I.begin)){let l=s.args[s.args.length-1];if(mt(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=[],f=[];for(let _=l;_<s.args.length;_++){let m=s.args[_];if(F(m)&&E(m,"=>",2)){let g=m.args[1],h=Lu(g);u.push(h),c.push(i(g)),f.push(o(g))}}let p=new Set;for(let _ of u){for(let m of _.dupCalls.keys())p.add(m);for(let m of _.varsWithPartialBranchDups)n.add(m)}if(u.length>0)for(let _ of p){let m=[],g=[];for(let h=0;h<u.length;h++){let d=u[h],v=d.dupCalls.has(_),T=c[h];if(v){let $=d.dupCalls.get(_);T?m.push(...$):g.push(...$)}}for(let h of m)t.has(_)||t.set(_,[]),h.__isEarlyReturnDup=!0,t.get(_).push(h);if(g.length>0){let h=0,d=0;for(let v=0;v<u.length;v++)c[v]||(h++,u[v].dupCalls.has(_)&&d++);if(d===h){t.has(_)||t.set(_,[]);for(let v of g)t.get(_).push(v)}else n.add(_)}}}if(F(e)&&E(e,I.cond)){a(e,0);return}if(F(e)&&E(e,I.match)){e.args[0]&&Lo(e.args[0],t,n),a(e,1);return}if(F(e)){Lo(e.func,t,n);for(let s of e.args)Lo(s,t,n)}}function Lu(e){let t=new Map,n=new Set;return Lo(e,t,n),{dupCalls:t,varsWithPartialBranchDups:n}}function ha(e){return F(e)&&E(e,I.tuple,0)}function Bs(e,t){if(e.$?.deferredDupExpressions&&(e.$.deferredDupExpressions=e.$.deferredDupExpressions.filter(n=>!t.has(n)),e.$.deferredDupExpressions.length===0&&(e.$.deferredDupExpressions=void 0)),F(e)){Bs(e.func,t);for(let n of e.args)Bs(n,t)}}function vt({expr:e,env:t,context:n,variablesToAdd:r=[],isEvaluatingFunctionBodyBeginBlock:i=!1}){if(!F(e)||!E(e,I.begin)){let $={tag:"FnCall",func:{tag:"Atom",token:{...e.token,value:I.begin[0]}},args:[xe(e)],token:{...e.token,value:I.begin[0]}};or(e,$),e=e}let o=e.args,a=n.expectedType;if(o.length===0)return e.$={env:t,type:j.type,value:j,pathCollection:[]},e;t=Oe(t,void 0,!0);for(let $=0;$<r.length;$++){let C=r[$],{env:L}=fe({env:t,variable:C});t=L}let s=o[o.length-1],l,u=!1;for(let $=0;$<o.length;$++){let C=o[$];if(U(C)&&Et(C,I.return)||F(C)&&E(C,I.return)){if($!==o.length-1&&!($===o.length-2&&ha(o[o.length-1])))throw y({token:C.token,errorMessage:'The "return" keyword can only be used as the last expression.'});if(F(C)&&ge(C,I.return,1),!n.isEvaluatingFunctionBodyOrAsyncBlock)throw y({token:C.token,errorMessage:'The "return" keyword can only be used inside a function body or async block.'});if(l=C,U(C)){C.$={env:t,type:j.type,value:j,pathCollection:[],controlFlow:Or("return")},s=C;break}else{ge(C,I.return,1);let L=C.args[0],b=N({expr:L,env:t,context:{...n,expectedType:n.isEvaluatingFunctionBodyOrAsyncBlock.kind==="function-body"?{type:n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type,env:t}:n.expectedType}});if(!b.$)throw y({token:L.token,errorMessage:`Return expression is not evaluated correctly:
|
|
150
|
+
Given: "${A(t.type)}"`)}}}return{expectedEnv:e.env,givenEnv:t.env}}function Os(e,t,n,r,i){if(e.length===0&&t.length===0)return;let o=[],a=[],s=[];for(let c of e)c.isEffectRowSpread?rt(c.type)?a.push(c):x(c.type)&&c.type.isEffectsRow&&s.push(c):o.push(c);if(s.length>1)throw new Error(`Ambiguous effect row unification: multiple unsolved effect row variables (${s.map(c=>c.label).join(", ")}). At most one effect row spread can be unsolved during type unification.`);let l=[];for(let c of t)c.isEffectRowSpread?rt(c.type)&&l.push(...c.type.implicitParameters):l.push(c);let u=new Set;for(let c of o)for(let f=0;f<l.length;f++)if(!u.has(f)&&c.type.id===l[f].type.id){let{expectedEnv:p,givenEnv:_}=Qe({type:c.type,env:n.env},{type:l[f].type,env:r.env},i);n.env=p,r.env=_,u.add(f);break}for(let c of a){let f=c.type.implicitParameters;for(let p of f)for(let _=0;_<l.length;_++)if(!u.has(_)&&p.type.id===l[_].type.id){let{expectedEnv:m,givenEnv:g}=Qe({type:p.type,env:n.env},{type:l[_].type,env:r.env},i);n.env=m,r.env=g,u.add(_);break}}if(s.length===1){let c=s[0],f=[];for(let p=0;p<l.length;p++)u.has(p)||f.push(l[p]);if(x(c.type)&&c.type.isEffectsRow){let p=$r(f),_=J(p),m=X(n.env,c.type.name),g=m[m.length-1];if(g)n.env=Be(n.env,g,{...g,value:[_]});else{let{env:h}=fe({env:n.env,variable:{name:c.type.name,value:[_],type:_.type,isCompileTimeOnly:!0,token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});n.env=h}}}}function Rs(e,t){let n=new Map;for(let i of t.requiredTraits??[])n.set(i.traitType.id,i.traitType);let r=Bn(e,t);if(r)for(let i of r.requiredTraits)n.set(i.id,i);return[...n.values()]}function Tu(e,t){let n=new Map;for(let i of t.negativeTraits??[])n.set(i.traitType.id,i.traitType);let r=Bn(e,t);if(r)for(let i of r.negativeTraits)n.set(i.id,i);return[...n.values()]}function Ps(e){let t=[];for(let n of e)n.isEffectRowSpread&&rt(n.type)?t.push(...Ps(n.type.implicitParameters)):(n.isEffectRowSpread&&x(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&&(ce(e.type)||ye(e.type)||_t(e.type))&&(ce(t.type)||ye(t.type)||_t(t.type))){let a=`${i}:${o}`;if(r.has(a))return!0;r.add(a)}if(ao(e.type)&&ao(t.type))return e.type.tag===t.type.tag;if((gt(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"||qn(e.type))&>(t.type))return!(n&&!gt(e.type));if((St(e.type)||e.type.tag==="f32"||e.type.tag==="f64")&&St(t.type))return!(n&&!St(e.type));if((Ft(e.type)||Xe(e.type)&&Wn(e.type.childType)||Ne(e.type)&&(Wn(e.type.childType)||hi(e.type.childType))||mr(e.type)&&e.type.typeName==="str")&&Ft(t.type))return!0;if(qn(e.type)&&qn(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(Xe(e.type)&&Xe(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(ce(e.type)&&ce(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(ye(e.type)&&ye(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 c=s.fields[u],f=l.fields[u];if(c.label!==f.label||!q({type:c.type,env:e.env},{type:f.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(_t(e.type)&&_t(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(ve(e.type)&&ve(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(Ve(e.type)){if(Ve(t.type)){if(Ct(e.type))return!(!Ct(t.type)||!Eu({type:e.type.isFn.callType,env:e.env},{type:t.type.isFn.callType,env:t.env},n));if(qt(e.type)){if(!qt(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=Ps(e.type.isFuture.effects),s=Ps(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 c=!1;for(let f=0;f<s.length;f++)if(!l.has(f)&&q({type:u.type,env:e.env},{type:s[f].type,env:t.env},n,r)){l.add(f),c=!0;break}if(!c)return!1}}return!0}return e.type.id===t.type.id}return qe(t.type)&&t.type.baseType&&t.type.baseType.trait&&Ve(e.type)?q({type:e.type,env:e.env},{type:t.type.baseType.trait,env:t.env},n,r):!1}if(z(e.type)&&z(t.type))return Eu({type:e.type,env:e.env},{type:t.type,env:t.env},n);if(qe(e.type)&&qe(t.type))return vu(e.type,t.type);if(Ne(e.type)&&Ne(t.type))return q({type:e.type.childType,env:e.env},{type:t.type.childType,env:t.env},!0,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(Tt(e.type)&&Tt(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(be(e.type)&&be(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(x(e.type)){if(be(t.type))return!0;if(x(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=Rs(e.env,e.type),s=Rs(t.env,t.type);if(n&&a.length!==s.length)return!1;for(let u of a)if(!s.find(f=>q({type:u,env:e.env},{type:f,env:t.env},n,r)))return!1;let l=Tu(e.env,e.type);if(l.length>0){for(let u of l)if(s.find(f=>q({type:u,env:e.env},{type:f,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=Rs(e.env,e.type);if(a.length===0)return!n;if(a.length>0){for(let c of a)if(!Nt({targetType:t.type,traitType:c,env:e.env}))break;let l=Tu(e.env,e.type);if(l.length>0){for(let c of l)if(Nt({targetType:t.type,traitType:c,env:e.env}))return!1}let u=!0;for(let c of a)if(!Nt({targetType:t.type,traitType:c,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(x(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 Eu(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}=Qe({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 Us(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 zs(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 jn(e){if(U(e))return Et(e,I.escape);if(F(e)){if(e.$?.macroExpansion)return jn(e.$.macroExpansion);if(E(e,I.cond)||E(e,I.match))return zs(e,jn);if(Us(e)||F(e.func)&&e.func.$?.value!==void 0&&D(e.func.$.value)&&z(e.func.$.value.value)||F(e.func)&&e.func.$?.value!==void 0&&D(e.func.$.value)&&Yt(e.func.$.value.value))return!1;if(jn(e.func))return!0;for(let t of e.args)if(jn(t))return!0}return!1}function Ri(e){if(U(e))return Et(e,I.return)||Et(e,I.escape);if(F(e)){if(E(e,I.return)||E(e,I.escape))return!0;if(e.$?.macroExpansion)return Ri(e.$.macroExpansion);if(E(e,I.cond)||E(e,I.match))return zs(e,Ri);if(Us(e)||F(e.func)&&e.func.$?.value!==void 0&&D(e.func.$.value)&&z(e.func.$.value.value)||F(e.func)&&e.func.$?.value!==void 0&&D(e.func.$.value)&&Yt(e.func.$.value.value))return!1;if(Ri(e.func))return!0;for(let t of e.args)if(Ri(t))return!0}return!1}function sn(e){if(F(e)){if(e.func.$?.type?.ioBuiltin==="io_await")return!0;if(e.$?.macroExpansion)return sn(e.$.macroExpansion);if(E(e,I.cond)||E(e,I.match))return zs(e,sn);if(e.func.$?.type?.ioBuiltin==="io_async"||Us(e)||D(e.func.$?.value)&&z(e.func.$.value.value)||F(e.func)&&e.func.$?.value!==void 0&&D(e.func.$.value)&&Yt(e.func.$.value.value))return!1;if(sn(e.func))return!0;for(let t of e.args)if(sn(t))return!0}return!1}var j={tag:"Unit",type:Sn()};function wo(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 ya(e,t){let n=[],r=new Map,i=new Map,o=new Map;if(lr(e,n,r,i,o,t),e.$?.deferredDropExpressions)for(let a of e.$.deferredDropExpressions)lr(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 lr(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 c=u[u.length-1];if(c&&!n.has(c.id)&&!c.isCompileTimeOnly){let f=`${c.name}:${c.frameLevel}`,p=r.get(f);if(p&&p!==c.id)i.set(c.id,p);else if(c.isOwningTheSameRcValueAs){let _=c.isOwningTheSameRcValueAs;if(!n.has(_.id)){let m={id:_.id,name:_.name,type:_.type,isOwningTheSameRcValueAs:void 0};n.set(_.id,m);let g=`${_.name}:${_.frameLevel}`;r.has(g)||r.set(g,_.id)}}else n.set(c.id,{id:c.id,name:s,type:l,isOwningTheSameRcValueAs:void 0}),r.has(f)||r.set(f,c.id)}}}break;case"FnCall":{if(E(e,I.while)){let s=t.length;lr(e.func,t,n,r,i,o,e);for(let u of e.args)lr(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)){$u(e,t,n,r,i,o);break}if(E(e,I.match)){$u(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)lr(s,t,n,r,i,o,e);break}lr(e.func,t,n,r,i,o,e);for(let s of e.args)lr(s,t,n,r,i,o,e);if(e.$?.deferredDropExpressions)for(let s of e.$.deferredDropExpressions)lr(s,t,n,r,i,o,e);break}}}function $u(e,t,n,r,i,o){if(e.tag!=="FnCall")return;let a=t.length;lr(e.func,t,n,r,i,o,e);let s=new Map(r),l=[];for(let c of e.args){let f=t.length;lr(c,t,n,r,i,o,e),l.push(t.slice(f))}r.clear();for(let[c,f]of s)r.set(c,f);let u=Math.max(...l.map(c=>c.length),0);if(u>0){t.splice(a);let c=a;for(let f=0;f<u;f++){let p;for(let _ of l)if(f<_.length){p=_[f];break}p&&(p.index=t.length,p.isInsideCond=!0,f===0&&(p.needsOwnCondBranchField=!0),f>0&&(p.condBranchSourceIndex=c),t.push(p))}}}function Cu(e){let n=ya(e,{detect(i,o,a){if(i.tag==="FnCall"&&Tn(i)){let s=i.args[0];if(!s)return;let l=s.$?.type;if(l&&Ce(l)){let u=Dt(l);if(!u)return;let c=u.isFuture.outputType,f;if(s.tag==="Atom"&&s.token.type==="identifier"&&s.$){let _=s.token.value,m=X(s.$.env,_);if(m.length>0){let g=m[m.length-1];g.isOwningTheSameRcValueAs?f=g.isOwningTheSameRcValueAs.id:f=g.id}}let p=wo(o);a.push({index:a.length,expr:i,resultType:c,futureType:u,targetVariableId:p,futureVariableId:f})}}},shouldSkipBody(i){return Bt(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 Bt(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="io_async"}function Tn(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="io_await"}function bu(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="io_state"}function ku(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="io_spawn"}function wu(e){return e.tag!=="FnCall"?!1:e.func.$?.type?.ioBuiltin==="join_handle_await"}function Ye(e){return U(e)&&e.token.type==="identifier"||e.token.type==="operator"}function Fo(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 Rr(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 ga=!0;function Fu({variablesToDrop:e,env:t,context:n}){let r=[],i=t;for(let o of e){let a=Qt(`${k.___drop[0]}(${o.name})`),s=N({expr:a,env:i,context:{...n,expectedType:{env:i,type:j.type}}});r.push(s),s.$&&s.$.env&&(i=s.$.env)}return{deferredDropExpressions:r.length>0?r:void 0,env:i}}function Lo(e,t,n){if(F(e)&&Bt(e))return;if(e.$?.deferredDupExpressions)for(let s of e.$.deferredDupExpressions)Lo(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(mt(s.$?.controlFlow))return!0;if(F(s)&&E(s,I.begin)){let l=s.args[s.args.length-1];if(mt(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=[],f=[];for(let _=l;_<s.args.length;_++){let m=s.args[_];if(F(m)&&E(m,"=>",2)){let g=m.args[1],h=Lu(g);u.push(h),c.push(i(g)),f.push(o(g))}}let p=new Set;for(let _ of u){for(let m of _.dupCalls.keys())p.add(m);for(let m of _.varsWithPartialBranchDups)n.add(m)}if(u.length>0)for(let _ of p){let m=[],g=[];for(let h=0;h<u.length;h++){let d=u[h],v=d.dupCalls.has(_),T=c[h];if(v){let $=d.dupCalls.get(_);T?m.push(...$):g.push(...$)}}for(let h of m)t.has(_)||t.set(_,[]),h.__isEarlyReturnDup=!0,t.get(_).push(h);if(g.length>0){let h=0,d=0;for(let v=0;v<u.length;v++)c[v]||(h++,u[v].dupCalls.has(_)&&d++);if(d===h){t.has(_)||t.set(_,[]);for(let v of g)t.get(_).push(v)}else n.add(_)}}}if(F(e)&&E(e,I.cond)){a(e,0);return}if(F(e)&&E(e,I.match)){e.args[0]&&Lo(e.args[0],t,n),a(e,1);return}if(F(e)){Lo(e.func,t,n);for(let s of e.args)Lo(s,t,n)}}function Lu(e){let t=new Map,n=new Set;return Lo(e,t,n),{dupCalls:t,varsWithPartialBranchDups:n}}function ha(e){return F(e)&&E(e,I.tuple,0)}function Bs(e,t){if(e.$?.deferredDupExpressions&&(e.$.deferredDupExpressions=e.$.deferredDupExpressions.filter(n=>!t.has(n)),e.$.deferredDupExpressions.length===0&&(e.$.deferredDupExpressions=void 0)),F(e)){Bs(e.func,t);for(let n of e.args)Bs(n,t)}}function vt({expr:e,env:t,context:n,variablesToAdd:r=[],isEvaluatingFunctionBodyBeginBlock:i=!1}){if(!F(e)||!E(e,I.begin)){let $={tag:"FnCall",func:{tag:"Atom",token:{...e.token,value:I.begin[0]}},args:[xe(e)],token:{...e.token,value:I.begin[0]}};ar(e,$),e=e}let o=e.args,a=n.expectedType;if(o.length===0)return e.$={env:t,type:j.type,value:j,pathCollection:[]},e;t=Oe(t,void 0,!0);for(let $=0;$<r.length;$++){let C=r[$],{env:L}=fe({env:t,variable:C});t=L}let s=o[o.length-1],l,u=!1;for(let $=0;$<o.length;$++){let C=o[$];if(U(C)&&Et(C,I.return)||F(C)&&E(C,I.return)){if($!==o.length-1&&!($===o.length-2&&ha(o[o.length-1])))throw y({token:C.token,errorMessage:'The "return" keyword can only be used as the last expression.'});if(F(C)&&ge(C,I.return,1),!n.isEvaluatingFunctionBodyOrAsyncBlock)throw y({token:C.token,errorMessage:'The "return" keyword can only be used inside a function body or async block.'});if(l=C,U(C)){C.$={env:t,type:j.type,value:j,pathCollection:[],controlFlow:Or("return")},s=C;break}else{ge(C,I.return,1);let L=C.args[0],b=N({expr:L,env:t,context:{...n,expectedType:n.isEvaluatingFunctionBodyOrAsyncBlock.kind==="function-body"?{type:n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type,env:t}:n.expectedType}});if(!b.$)throw y({token:L.token,errorMessage:`Return expression is not evaluated correctly:
|
|
151
151
|
${w(L)}`});if(n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"&&x(n.isEvaluatingFunctionBodyOrAsyncBlock.type.return.type)&&n.functionReturnImplConcreteType){let R=b.$.type;if(n.functionReturnImplConcreteType.length>0){let S=n.functionReturnImplConcreteType[0];if(!q({type:S.concreteType,env:S.env},{type:R,env:t}))throw at([{token:C.token,errorMessage:`All return statements must return the same concrete type for Impl(...).
|
|
152
152
|
Impl(...) uses static dispatch and requires the same concrete type across all returns.
|
|
153
153
|
Consider using Dyn(...) for dynamic dispatch if different concrete types are needed.`},{token:S.token,errorMessage:`First return has concrete type: ${A(S.concreteType)}`},{token:C.token,errorMessage:`Conflicting return has concrete type: ${A(R)}`}])}else n.functionReturnImplConcreteType.push({concreteType:R,env:t,token:C.token})}Pe(b,!0),t=b.$.env,C.$={env:t,type:b.$.type,value:b.$.value,pathCollection:b.$.pathCollection,variableName:b.$.variableName,controlFlow:Or("return")},s=C;break}}else if(U(C)&&Et(C,I.break)){if($!==o.length-1&&!($===o.length-2&&ha(o[o.length-1])))throw y({token:C.token,errorMessage:'The "break" keyword can only be used as the last expression.'});if(!n.isEvaluatingLoopBody)throw y({token:C.token,errorMessage:'The "break" keyword can only be used inside a loop.'});C.$={env:t,type:j.type,value:j,pathCollection:[],controlFlow:Or("break")},s=C;break}else if(U(C)&&Et(C,I.continue)){if($!==o.length-1&&!($===o.length-2&&ha(o[o.length-1])))throw y({token:C.token,errorMessage:'The "continue" keyword can only be used as the last expression.'});if(!n.isEvaluatingLoopBody)throw y({token:C.token,errorMessage:'The "continue" keyword can only be used inside a loop.'});C.$={env:t,type:j.type,value:j,pathCollection:[],controlFlow:Or("continue")},s=C;break}else if(F(C)&&E(C,I.escape)){if($!==o.length-1&&!($===o.length-2&&ha(o[o.length-1])))throw y({token:C.token,errorMessage:'The "escape" keyword can only be used as the last expression.'});if(!n.enclosingFunctionReturnType)throw y({token:C.token,errorMessage:'The "escape" keyword can only be used inside a function that has an enclosing function.'});l=C,ge(C,I.escape,1);let L=C.args[0],b=N({expr:L,env:t,context:{...n,expectedType:{type:n.enclosingFunctionReturnType,env:t}}});if(!b.$)throw y({token:L.token,errorMessage:`Escape expression is not evaluated correctly:
|
|
@@ -165,30 +165,30 @@ ${w(v)}`});if(_=v.token.value,!U(T))throw y({token:T.token,errorMessage:`Expecte
|
|
|
165
165
|
${w(T)}`});if(!Ye(T))throw y({token:T.token,errorMessage:`Expected identifier for export, got:
|
|
166
166
|
${w(T)}`});m=T.token.value}let g=X(t,m);if(g.length===0)throw y({token:p.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:p.token,errorMessage:`Variable "${m}" is already exported in the module.`});if(!h.isCompileTimeOnly)throw y({token:p.token,errorMessage:`Variable "${m}" is not a compile-time variable and cannot be exported.`});i.fields.push({label:_,type:h.type,assignedValue:h.isCompileTimeOnly?h.value?.[0]:void 0,defaultValue:void 0,exprs:{expr:p,labelExpr:void 0,typeExpr:void 0,assignedValueExpr:void 0,defaultValueExpr:void 0}}),o.push(h.value?.[0]),p.$={env:t,type:h.type,value:h.value?.[0],pathCollection:[]}}}}else{let c=N({expr:u,env:t,context:{...n,expectedType:void 0}});c.$?.env&&(t=c.$?.env)}}catch(c){if(r){a=c;break}else throw c}}try{a||(t=lt(t))}catch(l){if(r)a=l;else throw l}return{moduleValue:ta({...i},o),moduleType:i,env:t,partialModuleError:a}}function Ta({functionType:e,specializedEnv:t,SelfType:n}){let r=e.parameters.map(u=>{if(!u.exprs.typeExpr)return u;let c=xe(u.exprs.typeExpr),f=N({expr:c,env:t,context:{isEvaluatingGenericImplSpecialization:!0,stdPath:"",isEvaluatingFunctionType:!0,SelfType:n}});return D(f.$?.value)?{...u,type:f.$.value.value,exprs:{...u.exprs}}:u}),i=e.return.type,o=xe(e.return.typeExpr),a=N({expr:o,env:t,context:{isEvaluatingGenericImplSpecialization:!0,stdPath:"",isEvaluatingFunctionType:!0,SelfType:n}});D(a.$?.value)&&(i=a.$.value.value);let s=e.SelfType;n&&(s=n);let l={...e.parametersFrame,variables:e.parametersFrame.variables.map(u=>{let c=r.find(p=>p.label===u.name),f=c?c.type:u.type;return f!==u.type?{...u,type:f}:u})};return{...e,env:t,forallParameters:[],parameters:r,parametersFrame:l,return:{...e.return,type:i},SelfType:s}}var Ao=new Map;function $m({traitExpr:e,traitType:t}){if(!e||!F(e))return{};let n=e.func;if(F(n)){let r=n.args.map(o=>xe(o)),i;if(t.functionValue&&z(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(c=>c.label===l);u&&!z(u.type)&&(r.push(xe(s)),i.push(l))}}if(r.length>0)return{traitTypeArgExprs:r,traitFunctionParamNames:i}}return{}}function Au({fieldExprs:e,env:t,context:n,receiverType:r}){let i=[],o=Me(t),a=[],s=!1,l=r?.trait;r?.trait&&(r.trait={...r.trait,fields:[...r.trait.fields]}),t=Oe(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 f=u.args[0],p=u.args[1];if(!U(f)||!Ye(f))throw y({token:f.token,errorMessage:`Expected identifier for impl field name, got:
|
|
167
167
|
${w(f)}`});let _=f.token.value,m=N({expr:p,env:t,context:{...n,expectedType:void 0,SelfType:r}});if(!m.$?.type)throw y({token:p.token,errorMessage:`Failed to evaluate impl field value for "${_}".`});t=m.$.env;let g=m.$.type,h=m.$.value;if(!h)throw y({token:p.token,errorMessage:`impl field "${_}" must be a compile-time value.`});ne(h)&&!h.funcName&&(h.funcName=_,h.funcId+=`_${_}`);let{env:d}=fe({env:t,variable:{name:_,type:g,isCompileTimeOnly:!0,value:[h],token:f.token,initializedAtToken:f.token,consumedAtToken:void 0,isOwningTheRcValue:!1}});t=d,o.fields.push({label:_,type:g,assignedValue:h,defaultValue:void 0,exprs:{expr:u}}),a.push(h),s=!0,r?.trait&&r.trait.fields.push({label:_,type:g,assignedValue:h,defaultValue:void 0,exprs:{expr:u}});continue}let c=N({expr:u,env:t,context:{...n,expectedType:void 0,ReceiverType:r}});if(!c.$||!ht(c.$.value))throw y({token:u.token,errorMessage:`Expected trait value in impl field list, got:
|
|
168
|
-
${w(u)}`});t=c.$.env,i.push({traitValue:c.$.value,sourceExpr:u,isAnonymousTrait:!1})}if(t=lt(t),r&&(r.trait=l),s){let u=Ti({...o,receiverType:r},a);i.unshift({traitValue:u,sourceExpr:void 0,isAnonymousTrait:!0})}return{env:t,traitEntries:i}}var
|
|
168
|
+
${w(u)}`});t=c.$.env,i.push({traitValue:c.$.value,sourceExpr:u,isAnonymousTrait:!1})}if(t=lt(t),r&&(r.trait=l),s){let u=Ti({...o,receiverType:r},a);i.unshift({traitValue:u,sourceExpr:void 0,isAnonymousTrait:!0})}return{env:t,traitEntries:i}}var ur=new Map,ci=new Map;function Io(e){for(let[t,n]of ur.entries()){let r=n.filter(i=>i.sourceModulePath!==e);r.length===0?ur.delete(t):ur.set(t,r)}}function Cm(e){for(let[t,n]of ci.entries()){let r=n.filter(i=>i.modulePath!==e);r.length===0?ci.delete(t):ci.set(t,r)}}function Gs(){Ao.clear(),ur.clear(),ci.clear()}function Ea(e){return e.functionValue?e.functionValue.funcId:e.typeName||e.id}function Iu(e,t){let n=ur.get(e);n||(n=[],ur.set(e,n)),n.push(t)}function bm({receiverType:e,traitType:t,currentModulePath:n,expr:r}){let i=e.id,a=(ci.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)}".
|
|
169
169
|
First implementation was in: ${a.modulePath||"unknown"}`})}function km({receiverType:e,traitType:t,currentModulePath:n,expr:r}){let i=e.id,o=ci.get(i);o||(o=[],ci.set(i,o)),o.push({traitTypeId:t.id,traitTypeName:t.typeName,modulePath:n||"unknown",expr:r})}function wm({receiverType:e,traitType:t,currentModulePath:n,expr:r}){if(!n)return;let i=t.definedInModulePath===n,o=e.definedInModulePath===n;if(!(n.includes("prelude.yo")||n.includes("std/"))&&!i&&!o)throw y({token:r.token,errorMessage:`Orphan impl: Cannot implement foreign trait "${t.typeName??t.id}" for foreign type "${A(e)}".
|
|
170
170
|
At least one of the trait or the type must be defined in this module.
|
|
171
171
|
Trait defined in: ${t.definedInModulePath||"unknown"}
|
|
172
172
|
Type defined in: ${e.definedInModulePath||"unknown"}
|
|
173
|
-
Current module: ${n}`})}function $a({concreteType:e,traitType:t,env:n}){let r=Ea(t),i=
|
|
173
|
+
Current module: ${n}`})}function $a({concreteType:e,traitType:t,env:n}){let r=Ea(t),i=ur.get(r);if(!(!i||i.length===0)){for(let o of i)if(ba({concreteType:e,impl:o,env:n}).matched)return o}}function cr({concreteType:e,methodName:t,env:n}){if(x(e)){let i=Ot(n,e);x(i)||(e=i)}let r=[];for(let[i,o]of ur.entries())for(let a of o){let s=ba({concreteType:e,impl:a,env:n});if(!s.matched)continue;let l=a.traitType,u=a.traitValue,c=l.fields.findIndex(f=>f.label===t&&z(f.type));if(c>=0){let f=l.fields[c];if(z(f.type)){let p=u.fields[c],_=gr(e);if(ne(p)&&(s.valueSubstitutions.size>0||s.substitutions.size>0)&&!_){let g=a.definitionEnv,h=Oe(g);for(let[C,L]of s.substitutions){let{env:b}=fe({env:h,variable:{name:C,type:et(),isCompileTimeOnly:!0,value:[J(L)],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});h=b}for(let[C,L]of s.valueSubstitutions){let{env:b}=fe({env:h,variable:{name:C,type:L.type,isCompileTimeOnly:!0,value:[L],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});h=b}if(a.traitTypeArgExprs&&a.traitFunctionParamNames&&a.traitTypeArgExprs.length===a.traitFunctionParamNames.length)for(let C=0;C<a.traitTypeArgExprs.length;C++){let L=a.traitTypeArgExprs[C],b=a.traitFunctionParamNames[C],R=N({expr:xe(L),env:h,context:{isEvaluatingGenericImplSpecialization:!0,stdPath:""}});if(R.$&&D(R.$.value)){let{env:S}=fe({env:h,variable:{name:b,type:et(),isCompileTimeOnly:!0,value:[R.$.value],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});h=S}}let d=Ta({functionType:f.type,specializedEnv:h,SelfType:s.substitutions.get("Self")});h=Oe(h,d.parametersFrame);let v=xe(p.body),T=vt({expr:v,env:h,context:{isEvaluatingGenericImplSpecialization:!0,expectedType:{type:d.return.type,env:h},stdPath:"",isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:d,value:p,evaluationEnv:h},functionReturnImplConcreteType:[],SelfType:s.substitutions.get("Self")},variablesToAdd:[],isEvaluatingFunctionBodyBeginBlock:!0}),$={...p,specializedType:d,body:T,funcId:`${p.funcId}_specialized_${[...s.substitutions.entries()].map(([C,L])=>`${C}_${A(L)}`).join("_")}_${[...s.valueSubstitutions.entries()].map(([C,L])=>`${C}_${De(L)}`).join("_")}`,funcName:p.funcName?`${p.funcName}_specialized`:void 0};r.push({type:d,value:$})}else if(_){let g=a.definitionEnv,h=Oe(g);for(let[v,T]of s.substitutions){let{env:$}=fe({env:h,variable:{name:v,type:et(),isCompileTimeOnly:!0,value:[J(T)],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});h=$}for(let[v,T]of s.valueSubstitutions){let{env:$}=fe({env:h,variable:{name:v,type:T.type,isCompileTimeOnly:!0,value:[T],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});h=$}let d=Ta({functionType:f.type,specializedEnv:h,SelfType:s.substitutions.get("Self")});r.push({type:d,value:void 0})}else if(ne(p)){let g={...p,specializedType:f.type};r.push({type:f.type,value:g})}else if(!ne(p)&&(s.substitutions.size>0||s.valueSubstitutions.size>0)){let g=a.definitionEnv,h=Oe(g);for(let[v,T]of s.substitutions){let{env:$}=fe({env:h,variable:{name:v,type:et(),isCompileTimeOnly:!0,value:[J(T)],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});h=$}for(let[v,T]of s.valueSubstitutions){let{env:$}=fe({env:h,variable:{name:v,type:T.type,isCompileTimeOnly:!0,value:[T],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});h=$}let d=Ta({functionType:f.type,specializedEnv:h,SelfType:s.substitutions.get("Self")});r.push({type:d,value:p})}else r.push({type:f.type,value:p})}}}return r}function Ca({concreteType:e,propertyName:t,env:n}){if(x(e)){let r=Ot(n,e);x(r)||(e=r)}for(let[r,i]of ur.entries())for(let o of i){let a;try{a=ba({concreteType:e,impl:o,env:n})}catch{continue}if(!a.matched)continue;let s=o.traitType,l=s.fields.findIndex(f=>f.label===t&&!z(f.type));if(l<0)continue;if(o.traitTypeArgExprs&&o.traitFunctionParamNames&&o.traitTypeArgExprs.length===o.traitFunctionParamNames.length){let f=o.definitionEnv,p=Oe(f);for(let[_,m]of a.substitutions){let{env:g}=fe({env:p,variable:{name:_,type:et(),isCompileTimeOnly:!0,value:[J(m)],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});p=g}for(let _=0;_<o.traitTypeArgExprs.length;_++){let m=o.traitTypeArgExprs[_];if(o.traitFunctionParamNames[_]===t)try{let h=xe(m),d=N({expr:h,env:p,context:{stdPath:"",isEvaluatingGenericImplSpecialization:!0}});if(d.$&&D(d.$.value))return{type:d.$.value.type,value:d.$.value}}catch{}}}let u=s.fields[l],c=o.traitValue.fields[l]??u.assignedValue;if(!(!c||!D(c))){if(!x(c.value))return{type:c.type,value:c};for(let f of o.forallParameters)if(f.kind==="type"&&f.someType===c.value){let p=a.substitutions.get(f.name);if(p){let _=J(p);return{type:_.type,value:_}}}}}}function Su({concreteType:e,traitType:t,methodName:n,env:r}){let i=Ea(t),o=ur.get(i);if(!(!o||o.length===0))for(let a of o){let s=ba({concreteType:e,impl:a,env:r});if(!s.matched)continue;let l=a.traitType,u=a.traitValue,c=l.fields.findIndex(f=>f.label===n&&z(f.type));if(c>=0){let f=l.fields[c];if(z(f.type)){let p=u.fields[c];if(ne(p)&&(s.valueSubstitutions.size>0||s.substitutions.size>0)){let _=a.definitionEnv,m=Oe(_);for(let[T,$]of s.substitutions){let{env:C}=fe({env:m,variable:{name:T,type:et(),isCompileTimeOnly:!0,value:[J($)],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});m=C}for(let[T,$]of s.valueSubstitutions){let{env:C}=fe({env:m,variable:{name:T,type:$.type,isCompileTimeOnly:!0,value:[$],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});m=C}let g=Ta({functionType:f.type,specializedEnv:m,SelfType:s.substitutions.get("Self")});m=Oe(m,g.parametersFrame);let h=xe(p.body),d=vt({expr:h,env:m,context:{isEvaluatingGenericImplSpecialization:!0,expectedType:{type:g.return.type,env:m},stdPath:"",isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:g,value:p,evaluationEnv:m},functionReturnImplConcreteType:[],SelfType:s.substitutions.get("Self")},variablesToAdd:[],isEvaluatingFunctionBodyBeginBlock:!0}),v={...p,specializedType:g,body:d,funcId:`${p.funcId}_specialized_${[...s.substitutions.entries()].map(([T,$])=>`${T}_${A($)}`).join("_")}_${[...s.valueSubstitutions.entries()].map(([T,$])=>`${T}_${De($)}`).join("_")}`,funcName:p.funcName?`${p.funcName}_specialized`:void 0};return{type:g,value:v}}else if(ne(p)){let _={...p,specializedType:f.type};return{type:f.type,value:_}}else return{type:f.type,value:p}}}}}function ba({concreteType:e,impl:t,env:n}){let r={matched:!1,substitutions:new Map,valueSubstitutions:new Map};if(x(e)){let o=Ot(n,e);if(x(o))return r;e=o}let i=Oe(n);for(let o of t.forallParameters)if(o.kind==="type"){let{env:a}=fe({env:i,variable:{name:o.name,type:et(),isCompileTimeOnly:!0,value:[J(o.someType)],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});i=a}else{let{env:a}=fe({env:i,variable:{name:o.name,type:o.type,isCompileTimeOnly:!0,value:[o.unknownValue],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});i=a}try{let{expectedEnv:o}=Qe({type:t.receiverTypePattern,env:i},{type:e,env:n});for(let{someType:l,traitType:u,traitExpr:c}of t.whereConstraints){let f=Nu(o,l);if(!f)return r;let p=u;if(c)try{let _=xe(c),m=N({expr:_,env:o,context:{stdPath:"",isEvaluatingGenericImplSpecialization:!0}});m.$&&D(m.$.value)&&Ve(m.$.value.value)&&(p=m.$.value.value)}catch{}if(p.isNegatedConstraint){if(x(f)){if(!Lm(f,p,n))return r;continue}if(Nt({targetType:f,traitType:p,env:n}))return r;continue}if(x(f)){if(!Fm(f,p,n))return r;continue}if(!Nt({targetType:f,traitType:p,env:o}))return r}let a=new Map,s=new Map;for(let l of t.forallParameters)if(l.kind==="type"){let u=Nu(o,l.someType);u&&!x(u)&&a.set(l.name,u)}else{let u=X(o,l.name),c=u[u.length-1];if(c&&c.value&&!_e(c.value[0])){let f={...c.value[0],type:l.type};s.set(l.name,f)}}return a.set("Self",e),{matched:!0,substitutions:a,valueSubstitutions:s}}catch{return r}}function Fm(e,t,n){if(!t.typeName)return!1;for(let o of e.requiredTraits)if(o.traitType.id===t.id)return!0;let i=Bn(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(ht(o.assignedValue)&&o.assignedValue.type.id===t.id)return!0;return!1}function Lm(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=Bn(n,e);if(i){for(let o of i.negativeTraits)if(o.id===t.id)return!0}return!1}function Am({receiverTypePattern:e,traitType:t,whereConstraints:n,env:r,errorToken:i}){if(t.selfConstraints&&t.selfConstraints.length>0)for(let o of t.selfConstraints){if(Nt({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)}".
|
|
174
174
|
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(Nt({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.
|
|
175
175
|
Consider adding "where(T <: !(${o.typeName??A(o)}))" to the impl.`})}}function Nu(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&&D(i.value[0]))return i.value[0].value}return t}function No(e){let t=Ao.get(e);if(t){for(let n of t)n.fields=n.fields.filter(r=>r.sourceModulePath!==e);Ao.delete(e),Cm(e)}}function Im(e,t){let n=Ao.get(e);n||(n=new Set,Ao.set(e,n)),n.add(t)}function Nm(e,t,n){let r=e.type.receiverType;if(!(!r||!r.trait))if(e.type.typeName&&(wm({receiverType:r,traitType:e.type,currentModulePath:n,expr:t}),bm({receiverType:r,traitType:e.type,currentModulePath:n,expr:t}),km({receiverType:r,traitType:e.type,currentModulePath:n,expr:t})),n&&Im(n,r.trait),e.type.typeName){let i={label:"",type:_n(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],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:
|
|
176
|
-
${w(e)}`});if(e.args.length===1&&F(e.args[0])&&E(e.args[0],I.begin)){let $=e.args[0].args,{moduleType:C,moduleValue:L,env:b}=va({beginExprs:$,env:t,context:{...n,expectedType:void 0,SelfType:n.SelfType}});return t=b,e.$={env:t,type:C,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 $=N({expr:s,env:t,context:{...n}});if(!$.$||!$.$.value||!D($.$.value))throw y({token:s.token,errorMessage:"Expected type for receiver type argument."});t=$.$.env;let C=$.$.value.value,L=Xe(C)||ke(C),{env:b,traitEntries:R}=Au({fieldExprs:l,env:t,context:{...n},receiverType:C});if(t=b,R.length===0)throw y({token:e.token,errorMessage:"impl requires at least one trait or member field."});for(let G of R){let P=G.traitValue,O=P.type;if(G.isAnonymousTrait||Vu({targetType:C,traitType:O,env:t,errorToken:e.token}),L){let B=Ea(O),ae={forallParameters:[],whereConstraints:[],receiverTypePattern:C,traitType:O,traitValue:P,expr:e,sourceModulePath:n.currentModulePath,definitionEnv:t};Iu(B,ae)}else Nm(P,e,n.currentModulePath)}let S=R[0].traitValue;return e.$={env:t,type:S.type,value:S,pathCollection:[]},e}let c=o.args,f=[];t=Oe(t);for(let $ of c){let C,L;if(F($)&&E($,":",2)){let O=$.args[0];if(!U(O))throw y({token:O.token,errorMessage:`Expected identifier for forall parameter name, got: ${w(O)}`});C=O.token.value,L=$.args[1]}else if(U($))C=$.token.value;else throw y({token:$.token,errorMessage:`Expected parameter name or "name : Type" for forall parameter, got: ${w($)}`});let b;if(L){let O=N({expr:L,env:t,context:{...n}});if(O.$?.env&&(t=O.$.env),!O.$||!O.$.value||!D(O.$.value))throw y({token:L.token,errorMessage:`Expected type for forall parameter type, got: ${w(L)}`});b=O.$.value.value}let R=!b||xl(b),S=b||et(),G=Y(S,{variableName:C,env:t,context:n}),{env:P}=fe({env:t,variable:{name:C,type:S,isCompileTimeOnly:!0,value:[G],token:$.token,initializedAtToken:$.token,consumedAtToken:void 0,isOwningTheRcValue:!1}});if(t=P,R){let O=G.value;f.push({kind:"type",name:C,someType:O})}else f.push({kind:"value",name:C,type:S,unknownValue:G})}let p=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 C=N({expr:$,env:t,context:{...n,isInsideWhereClause:!0}});C.$?.env&&(t=C.$.env);let L=$.args[0],b=$.args[1],R=N({expr:L,env:t,context:{...n}});if(!R.$||!R.$.value||!D(R.$.value)||!x(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 S=[];if(F(b)&&E(b,I.tuple))for(let G of b.args)F(G)&&E(G,"!")&&G.args.length===1?S.push({expr:G.args[0],isNegated:!0}):S.push({expr:G,isNegated:!1});else F(b)&&E(b,"!")&&b.args.length===1?S.push({expr:b.args[0],isNegated:!0}):S.push({expr:b,isNegated:!1});for(let{expr:G}of S){let P=N({expr:G,env:t,context:{...n}});if(!P.$||!P.$.value||!D(P.$.value)||!Ve(P.$.value.value))throw y({token:G.token,errorMessage:"Expected trait type for right-hand side expression."});t=P.$.env;let O=P.$.value.value;p.set(O.id,xe(G))}}let _=[];for(let $ of f){if($.kind!=="type")continue;let{someType:C}=$,L=Bn(t,C);if(L){for(let b of L.requiredTraits)_.push({someType:C,traitType:b,traitExpr:p.get(b.id)});for(let b of L.negativeTraits){let R={...b,isNegatedConstraint:!0};_.push({someType:C,traitType:R,traitExpr:p.get(b.id)})}}}let m=N({expr:s,env:t,context:{...n}});if(!m.$||!m.$.value||!D(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}=Au({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 C=$.traitValue,L=C.type;Am({receiverTypePattern:g,traitType:L,whereConstraints:_,env:t,errorToken:e.token});let{traitTypeArgExprs:b,traitFunctionParamNames:R}=$.isAnonymousTrait?{}:$m({traitExpr:$.sourceExpr,traitType:L});v.push({traitType:L,traitValue:C,traitTypeArgExprs:b,traitFunctionParamNames:R})}t=lt(t);for(let $ of v){let C=Ea($.traitType),L={forallParameters:f,whereConstraints:_,receiverTypePattern:g,traitType:$.traitType,traitValue:$.traitValue,expr:e,sourceModulePath:n.currentModulePath,definitionEnv:t,traitTypeArgExprs:$.traitTypeArgExprs,traitFunctionParamNames:$.traitFunctionParamNames};Iu(C,L)}let T=v[0].traitValue;return e.$={env:t,type:T.type,value:T,pathCollection:[]},e}var Ws=new Set;function Mu(e){if(!e||ce(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(qe(e))return!0}function Ou(e){if(!e)return!1;if(ce(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 Du(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&&D(o.assignedValue)){i=o.assignedValue.value;break}if(o.assignedValue&&ht(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&&D(u)&&(i=u.value);break}}if(i)break}}if(!i){let o=Ca({concreteType:e,propertyName:r.label,env:n});o&&D(o.value)&&(i=o.value.value)}if(!i||!q({type:r.constraintType,env:n},{type:i,env:n}))return!1}return!0}function Nt({targetType:e,traitType:t,env:n}){let r=Nn(n,"Comptime");if(r&&t.id===r.id){let l=Mu(e);if(l!==void 0)return l}let i=Nn(n,"Runtime");if(i&&t.id===i.id){let l=Ou(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||!ht(l.assignedValue))continue;let c=l.assignedValue.type;if(q({type:o,env:n},{type:c,env:n})&&Du(e,t,n))return!0}if(be(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(x(e)){let l=!1,u=!1;for(let f of e.requiredTraits)f.traitType.id===t.id&&(l=!0);let c=Bn(n,e);if(c){for(let f of c.requiredTraits)f.id===t.id&&(l=!0);for(let f of c.negativeTraits)f.id===t.id&&(u=!0)}if(e.negativeTraits)for(let f of e.negativeTraits)f.traitType.id===t.id&&(u=!0);if(l)return!u;if(u)return!1}if(x(e)){let l=Ot(n,e);if(x(l))return!1;e=l}let s=`${e.id}:${t.id}`;if(Ws.has(s))return!1;Ws.add(s);try{return $a({concreteType:e,traitType:t,env:n})===void 0?!1:Du(e,t,n)}finally{Ws.delete(s)}}function Vu({targetType:e,traitType:t,env:n,errorToken:r}){if(t.selfConstraints&&t.selfConstraints.length>0){for(let i of t.selfConstraints)if(!Nt({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(Nt({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
|
|
176
|
+
${w(e)}`});if(e.args.length===1&&F(e.args[0])&&E(e.args[0],I.begin)){let $=e.args[0].args,{moduleType:C,moduleValue:L,env:b}=va({beginExprs:$,env:t,context:{...n,expectedType:void 0,SelfType:n.SelfType}});return t=b,e.$={env:t,type:C,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 $=N({expr:s,env:t,context:{...n}});if(!$.$||!$.$.value||!D($.$.value))throw y({token:s.token,errorMessage:"Expected type for receiver type argument."});t=$.$.env;let C=$.$.value.value,L=Xe(C)||ke(C),{env:b,traitEntries:R}=Au({fieldExprs:l,env:t,context:{...n},receiverType:C});if(t=b,R.length===0)throw y({token:e.token,errorMessage:"impl requires at least one trait or member field."});for(let G of R){let P=G.traitValue,O=P.type;if(G.isAnonymousTrait||Vu({targetType:C,traitType:O,env:t,errorToken:e.token}),L){let B=Ea(O),ae={forallParameters:[],whereConstraints:[],receiverTypePattern:C,traitType:O,traitValue:P,expr:e,sourceModulePath:n.currentModulePath,definitionEnv:t};Iu(B,ae)}else Nm(P,e,n.currentModulePath)}let S=R[0].traitValue;return e.$={env:t,type:S.type,value:S,pathCollection:[]},e}let c=o.args,f=[];t=Oe(t);for(let $ of c){let C,L;if(F($)&&E($,":",2)){let O=$.args[0];if(!U(O))throw y({token:O.token,errorMessage:`Expected identifier for forall parameter name, got: ${w(O)}`});C=O.token.value,L=$.args[1]}else if(U($))C=$.token.value;else throw y({token:$.token,errorMessage:`Expected parameter name or "name : Type" for forall parameter, got: ${w($)}`});let b;if(L){let O=N({expr:L,env:t,context:{...n}});if(O.$?.env&&(t=O.$.env),!O.$||!O.$.value||!D(O.$.value))throw y({token:L.token,errorMessage:`Expected type for forall parameter type, got: ${w(L)}`});b=O.$.value.value}let R=!b||xl(b),S=b||et(),G=Y(S,{variableName:C,env:t,context:n}),{env:P}=fe({env:t,variable:{name:C,type:S,isCompileTimeOnly:!0,value:[G],token:$.token,initializedAtToken:$.token,consumedAtToken:void 0,isOwningTheRcValue:!1}});if(t=P,R){let O=G.value;f.push({kind:"type",name:C,someType:O})}else f.push({kind:"value",name:C,type:S,unknownValue:G})}let p=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 C=N({expr:$,env:t,context:{...n,isInsideWhereClause:!0}});C.$?.env&&(t=C.$.env);let L=$.args[0],b=$.args[1],R=N({expr:L,env:t,context:{...n}});if(!R.$||!R.$.value||!D(R.$.value)||!x(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 S=[];if(F(b)&&E(b,I.tuple))for(let G of b.args)F(G)&&E(G,"!")&&G.args.length===1?S.push({expr:G.args[0],isNegated:!0}):S.push({expr:G,isNegated:!1});else F(b)&&E(b,"!")&&b.args.length===1?S.push({expr:b.args[0],isNegated:!0}):S.push({expr:b,isNegated:!1});for(let{expr:G}of S){let P=N({expr:G,env:t,context:{...n}});if(!P.$||!P.$.value||!D(P.$.value)||!Ve(P.$.value.value))throw y({token:G.token,errorMessage:"Expected trait type for right-hand side expression."});t=P.$.env;let O=P.$.value.value;p.set(O.id,xe(G))}}let _=[];for(let $ of f){if($.kind!=="type")continue;let{someType:C}=$,L=Bn(t,C);if(L){for(let b of L.requiredTraits)_.push({someType:C,traitType:b,traitExpr:p.get(b.id)});for(let b of L.negativeTraits){let R={...b,isNegatedConstraint:!0};_.push({someType:C,traitType:R,traitExpr:p.get(b.id)})}}}let m=N({expr:s,env:t,context:{...n}});if(!m.$||!m.$.value||!D(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}=Au({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 C=$.traitValue,L=C.type;Am({receiverTypePattern:g,traitType:L,whereConstraints:_,env:t,errorToken:e.token});let{traitTypeArgExprs:b,traitFunctionParamNames:R}=$.isAnonymousTrait?{}:$m({traitExpr:$.sourceExpr,traitType:L});v.push({traitType:L,traitValue:C,traitTypeArgExprs:b,traitFunctionParamNames:R})}t=lt(t);for(let $ of v){let C=Ea($.traitType),L={forallParameters:f,whereConstraints:_,receiverTypePattern:g,traitType:$.traitType,traitValue:$.traitValue,expr:e,sourceModulePath:n.currentModulePath,definitionEnv:t,traitTypeArgExprs:$.traitTypeArgExprs,traitFunctionParamNames:$.traitFunctionParamNames};Iu(C,L)}let T=v[0].traitValue;return e.$={env:t,type:T.type,value:T,pathCollection:[]},e}var Ws=new Set;function Mu(e){if(!e||ce(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(qe(e))return!0}function Ou(e){if(!e)return!1;if(ce(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 Du(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&&D(o.assignedValue)){i=o.assignedValue.value;break}if(o.assignedValue&&ht(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&&D(u)&&(i=u.value);break}}if(i)break}}if(!i){let o=Ca({concreteType:e,propertyName:r.label,env:n});o&&D(o.value)&&(i=o.value.value)}if(!i||!q({type:r.constraintType,env:n},{type:i,env:n}))return!1}return!0}function Nt({targetType:e,traitType:t,env:n}){let r=Nn(n,"Comptime");if(r&&t.id===r.id){let l=Mu(e);if(l!==void 0)return l}let i=Nn(n,"Runtime");if(i&&t.id===i.id){let l=Ou(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||!ht(l.assignedValue))continue;let c=l.assignedValue.type;if(q({type:o,env:n},{type:c,env:n})&&Du(e,t,n))return!0}if(be(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(x(e)){let l=!1,u=!1;for(let f of e.requiredTraits)f.traitType.id===t.id&&(l=!0);let c=Bn(n,e);if(c){for(let f of c.requiredTraits)f.id===t.id&&(l=!0);for(let f of c.negativeTraits)f.id===t.id&&(u=!0)}if(e.negativeTraits)for(let f of e.negativeTraits)f.traitType.id===t.id&&(u=!0);if(l)return!u;if(u)return!1}if(x(e)){let l=Ot(n,e);if(x(l))return!1;e=l}let s=`${e.id}:${t.id}`;if(Ws.has(s))return!1;Ws.add(s);try{return $a({concreteType:e,traitType:t,env:n})===void 0?!1:Du(e,t,n)}finally{Ws.delete(s)}}function Vu({targetType:e,traitType:t,env:n,errorToken:r}){if(t.selfConstraints&&t.selfConstraints.length>0){for(let i of t.selfConstraints)if(!Nt({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(Nt({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 Yn(e,t){let n=Mu(e);if(n!==void 0)return n;let r=Nn(t,"Comptime");return r?Nt({targetType:e,traitType:r,env:t}):!1}function Er(e,t){let n=Ou(e);if(n!==void 0)return n;let r=Nn(t,"Runtime");return r?Nt({targetType:e,traitType:r,env:t}):!1}function Co(e,t){if(!e)return!1;let n=Nn(t,"Send");return n?Nt({targetType:e,traitType:n,env:t}):!1}function Zr(e,t){if(!e)return!1;let n=Nn(t,"Acyclic");return n?Nt({targetType:e,traitType:n,env:t}):!1}function ii(e,t){return Yn(e,t)&&!Er(e,t)}function Yt(e){if(!e)return!1;if(x(e)||be(e)){for(let{traitType:t}of e.requiredTraits)if(Ct(t))return!0}return!1}function en(e){if(Ct(e))return e;if(x(e)||be(e)){for(let{traitType:t}of e.requiredTraits)if(Ct(t))return t}}function Ce(e){if(!e)return!1;if(x(e)||be(e)){for(let{traitType:t}of e.requiredTraits)if(qt(t))return!0}return!1}function Dt(e){if(qt(e))return e;if(x(e)||be(e)){for(let{traitType:t}of e.requiredTraits)if(qt(t))return t}}function fa(e,t,n,r){if(!Fe(e)&&!Yn(e,t)&&!Er(e,t))throw y({token:n,errorMessage:`Type ${A(e)} has incompatible field contexts and cannot be used in any evaluation context.
|
|
177
177
|
|
|
178
178
|
This typically happens when a struct/enum/array/tuple contains fields with conflicting availability:
|
|
179
179
|
- Compile-time only fields (e.g., comptime_int, Type, Module)
|
|
180
180
|
- Runtime only fields (e.g., *(T), [T], void, C-compatible types)
|
|
181
181
|
|
|
182
|
-
Consider restructuring the type to avoid mixing incompatible field types.`})}function rn(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=[rn(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=>rn(i,t,n))}}case"Struct":{let r=e;return{...r,fields:r.fields.map(i=>rn(i,t,n))}}case"Enum":{let r=e;return{...r,fields:r.fields.map(i=>rn(i,t,n))}}case"Array":{let r=e;return{...r,elements:r.elements.map(i=>rn(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=[rn(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=>rn(i,t,n))}}case"Module":{let r=e;return{...r,fields:r.fields.map(i=>i?rn(i,t,n):void 0)}}case"Trait":{let r=e;return{...r,fields:r.fields.map(i=>i?rn(i,t,n):void 0)}}default:return e}}function qs({modulePath:e,inputString:t}){return{functionDeclarationFrameLevel:-1,frames:[],modulePath:e,inputString:t}}function it(){let e=qs({modulePath:"",inputString:""});return Oe(e)}function Hs(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=rn(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=rn(o.value[0],!1,t);return{...o,value:[s]}},i=o=>({...o,variables:o.variables.map(r),whereClauseConstraints:Sm(o.whereClauseConstraints)});return{...e,frames:e.frames.map(i)}}function Sm(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
|
|
183
|
-
Typeof "${a.name}": ${A(a.type)}`})));if(o.length>0)throw at(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 zu(e){return{id:e.id,name:e.name,type:A(e.type),typeId:e.type.id,value:De(e.value?.[0]),isCompileTimeOnly:e.isCompileTimeOnly,isUndefined:!e.initializedAtToken,isOwningTheRcValue:!!e.isOwningTheRcValue,isOwningTheSameRcValueAs:e.isOwningTheSameRcValueAs?.name,isReassignable:!!e.isReassignable,isConsumed:!!e.consumedAtToken}}function Bu({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&&z(a.type));if(o&&z(o.type)){let a=o.assignedValue;_e(a)&&(a=Y(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&&ht(a.assignedValue)){let s=a.assignedValue,l=s.type,u=l.fields.findIndex(c=>c.label===n&&z(c.type));if(u>=0){let c=l.fields[u];if(z(c.type)){let f=s.fields[u],p=c.type;ne(f)&&f.specializedType&&(p=f.specializedType),i.push({type:p,value:f})}}}if(i.length===0){let a=
|
|
182
|
+
Consider restructuring the type to avoid mixing incompatible field types.`})}function rn(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=[rn(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=>rn(i,t,n))}}case"Struct":{let r=e;return{...r,fields:r.fields.map(i=>rn(i,t,n))}}case"Enum":{let r=e;return{...r,fields:r.fields.map(i=>rn(i,t,n))}}case"Array":{let r=e;return{...r,elements:r.elements.map(i=>rn(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=[rn(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=>rn(i,t,n))}}case"Module":{let r=e;return{...r,fields:r.fields.map(i=>i?rn(i,t,n):void 0)}}case"Trait":{let r=e;return{...r,fields:r.fields.map(i=>i?rn(i,t,n):void 0)}}default:return e}}function qs({modulePath:e,inputString:t}){return{functionDeclarationFrameLevel:-1,frames:[],modulePath:e,inputString:t}}function it(){let e=qs({modulePath:"",inputString:""});return Oe(e)}function Hs(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=rn(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=rn(o.value[0],!1,t);return{...o,value:[s]}},i=o=>({...o,variables:o.variables.map(r),whereClauseConstraints:Sm(o.whereClauseConstraints)});return{...e,frames:e.frames.map(i)}}function Sm(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 Kn({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 Bn(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 c=u.value?.[0];D(c)&&x(c.value)&&c.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 c of u.requiredTraits)i.has(c.id)||(i.add(c.id),n.push(c));for(let c of u.negativeTraits)o.has(c.id)||(o.add(c.id),r.push(c))}if(a)return{requiredTraits:n,negativeTraits:r}}var Ru=null;function Pu(e){Ru=e}function Uu(){Ru=null}var xm="__yo_self";function fe({env:e,variable:t,deltaFrame:n,variableId:r,addToBeginBlockFrame:i,allowVariableShadowing:o}){let a=e.frames.length-1+(n??0);if(i){let _=Mm(e);_>=0&&(a=_)}if(t.name!==xm){let _=X(e,t.name);if(_.length>0&&!o){let m=_[_.length-1];throw at([{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=st(e.modulePath,t.name)?t.name:r??Jr(e.modulePath,t.name),u={...t,frameLevel:a,id:l},c=Vm({frame:s,variable:u}),f=e.frames.slice();return f[a]=c,{env:{functionDeclarationFrameLevel:e.functionDeclarationFrameLevel,frames:f,modulePath:e.modulePath,inputString:e.inputString},variable:u}}function Vm({frame:e,variable:t}){if(t.name==="_")return e;if(e.variables.some(r=>r.name===t.name))throw at([{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 Dm(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=Dm(o,t,n);r.push(...a)}return n?r.filter(n):r}function un(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 So(e,t){for(let n=e.frames.length-1;n>=0;n--)if(e.frames[n].variables.some(t))return n;return-1}function Oe(e,t={id:Jr(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 lt(e,t=!1){let n=e.frames.length-1,r=e.frames[n];if(!t){let i=Pi(e),o=r.variables.filter(a=>!a.initializedAtToken);if(i.length>0)throw at(i.map(a=>({token:a.token,errorMessage:`Variable "${a.name}" was not consumed. It is supposed to be consumed before going out of scope.
|
|
183
|
+
Typeof "${a.name}": ${A(a.type)}`})));if(o.length>0)throw at(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 zu(e){return{id:e.id,name:e.name,type:A(e.type),typeId:e.type.id,value:De(e.value?.[0]),isCompileTimeOnly:e.isCompileTimeOnly,isUndefined:!e.initializedAtToken,isOwningTheRcValue:!!e.isOwningTheRcValue,isOwningTheSameRcValueAs:e.isOwningTheSameRcValueAs?.name,isReassignable:!!e.isReassignable,isConsumed:!!e.consumedAtToken}}function Bu({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&&z(a.type));if(o&&z(o.type)){let a=o.assignedValue;_e(a)&&(a=Y(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&&ht(a.assignedValue)){let s=a.assignedValue,l=s.type,u=l.fields.findIndex(c=>c.label===n&&z(c.type));if(u>=0){let c=l.fields[u];if(z(c.type)){let f=s.fields[u],p=c.type;ne(f)&&f.specializedType&&(p=f.specializedType),i.push({type:p,value:f})}}}if(i.length===0){let a=cr({concreteType:r,methodName:n,env:e});i.push(...a)}return i}function Ys({env:e,context:t,methodName:n,receiverType:r,isInfixOperatorCall:i}){let o=[],a=r;for(;Ne(a);)a=a.childType;function s(p,_){let m=p.fields.find(g=>g.label===n&&(z(g.type)||Ve(g.type)));if(m){let g;if(z(m.type)){if(_e(_))g=Y(m.type,{variableName:m.label,env:e,context:t});else if(ht(_)){let h=p.fields.findIndex(d=>d.label===m.label);g=_.fields[h]}o.push({type:m.type,value:g})}else if(ve(m.type)){let h=m.assignedValue;ze(h)&&l(h)}}if(!m)for(let g of p.fields)Ve(g.type)&&g.assignedValue&&s(g.type,g.assignedValue)}function l(p){let _=p.type.fields.findIndex(m=>m.label==="Call");if(_>=0){let m=p.type.fields[_];if(m.assignedValue){let g=m.assignedValue;dn(g)?g.fields.forEach(h=>{o.push({type:h.type,value:h})}):o.push({type:g.type,value:g})}}}function u(p){return p.filter(m=>{if(z(m.type)){if(m.type.parameters.length===0)return!1;let h=m.type.parameters[0].type;if(!i&&Ne(h)){let v=h.childType,T=r;if((gt(r)||St(r)||Ft(r))&&(T=dt({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)||x(r)&&r.resolvedConcreteType&&!Ce(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(gt(r)||St(r)||Ft(r)){let v=dt({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(be(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(!ct($)&&!be($)&&!Ne($))return!1}}let v=m.type.return.type;if(nr(v,m.type.SelfType))return!1}return q({type:h,env:m.type.env},{type:r,env:e},!0)}return!0})}function c(p,_,m=new Set){if(m.has(p.id))return;m.add(p.id);let g=p.fields.find(h=>h.label===_&&z(h.type));if(g&&z(g.type)){let h=g.assignedValue;_e(h)&&(h=Y(g.type,{variableName:g.label,env:e,context:t})),o.push({type:g.type,value:h});return}for(let h of p.fields)Ve(h.type)&&h.assignedValue&&s(h.type,h.assignedValue)}if(r!==a&&r.trait){let p=r.trait.fields.find(_=>_.label===n&&z(_.type));if(p&&z(p.type)){let _=p.assignedValue;_e(_)&&(_=Y(p.type,{variableName:p.label,env:e,context:t})),o.push({type:p.type,value:_})}else c(r.trait,n);for(let _ of r.trait.fields)if(_.label===""&&_.assignedValue&&ht(_.assignedValue)){let m=_.assignedValue,g=m.type,h=g.fields.findIndex(d=>d.label===n&&z(d.type));if(h>=0){let d=g.fields[h];if(z(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 p=cr({concreteType:r,methodName:n,env:e});o.push(...p)}let f=x(a)&&a.resolvedConcreteType&&!Ce(a);if(a.trait&&!be(a)&&!f){let p=a.trait.fields.find(_=>_.label===n&&(z(_.type)||ve(_.type)));if(p&&z(p.type)){let _=p.assignedValue;_e(_)&&(_=Y(p.type,{variableName:p.label,env:e,context:t})),o.push({type:p.type,value:_})}else if(p&&ve(p.type)){let _=p.assignedValue;ze(_)&&l(_)}else c(a.trait,n);for(let _ of a.trait.fields)if(_.label===""&&_.assignedValue&&ht(_.assignedValue)){let m=_.assignedValue,g=m.type,h=g.fields.findIndex(d=>d.label===n&&z(d.type));if(h>=0){let d=g.fields[h];if(z(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 _=cr({concreteType:a,methodName:n,env:e});o.push(..._)}}if(gt(a)||St(a)||Ft(a)){let p=dt({type:a,expectedType:void 0,expr:void 0,env:e});if(p.trait){let _=p.trait.fields.find(m=>m.label===n&&z(m.type));if(_&&z(_.type)){let m=_.assignedValue;_e(m)&&(m=Y(_.type,{variableName:_.label,env:e,context:t})),o.push({type:_.type,value:m})}else c(p.trait,n);for(let m of p.trait.fields)if(m.label===""&&m.assignedValue&&ht(m.assignedValue)){let g=m.assignedValue,h=g.type,d=h.fields.findIndex(v=>v.label===n&&z(v.type));if(d>=0){let v=h.fields[d];if(z(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=cr({concreteType:p,methodName:n,env:e});o.push(...m)}}}if(x(a)){if(a.resolvedConcreteType?.trait&&!Ce(a)){let p=a.resolvedConcreteType,_=p.trait,m=_?.fields.find(g=>g.label===n&&z(g.type));if(m&&z(m.type)){let g=m.assignedValue||Y(m.type,{variableName:m.label,env:e,context:t});o.push({type:m.type,value:g})}if(o.length===0){for(let g of _?.fields??[])if(g.label===""&&g.assignedValue&&ht(g.assignedValue)){let h=g.assignedValue,d=h.type,v=d.fields.findIndex(T=>T.label===n&&z(T.type));if(v>=0){let T=d.fields[v];if(z(T.type)){let $=h.fields[v],C=T.type;ne($)&&$.specializedType&&(C=$.specializedType),o.push({type:C,value:$});break}}}}if(o.length===0){let g=cr({concreteType:p,methodName:n,env:e});o.push(...g)}}if(!(o.length>0)){let p=[],_=new Set;for(let g of a.requiredTraits??[])_.has(g.traitType.id)||(_.add(g.traitType.id),p.push(g.traitType));let m=Bn(e,a);if(m)for(let g of m.requiredTraits)_.has(g.id)||(_.add(g.id),p.push(g));if(x(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)_.has(v.id)||(_.add(v.id),p.push(v))}for(let g of p){let h=g.fields.find(d=>d.label===n&&z(d.type));if(h&&z(h.type)){let d={...h.type,SelfType:a},v=!1;if(d.parameters.length>0&&Ne(d.parameters[0].type)){let $=d.parameters[0].type.childType;(x($)&&$.name==="Self"||q({type:$,env:d.env},{type:r,env:e},!0))&&(v=!0)}let T=Y(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&&D(g.assignedValue)&&Ve(g.assignedValue.value)){let d=g.assignedValue.value.fields.find(v=>v.label===n&&z(v.type));if(d&&z(d.type)){let v=Y(d.type,{variableName:d.label,env:e,context:t});o.push({type:d.type,value:v})}}}}}if(be(a)){let p=a.trait.fields.find(m=>m.label===n&&(z(m.type)||Ve(m.type)));if(p&&z(p.type)){let m=p.assignedValue||Y(p.type,{variableName:p.label,env:e,context:t});o.push({type:p.type,value:m})}let _=a.requiredTraits;for(let{traitType:m}of _){let g=m.fields.find(h=>h.label===n&&(z(h.type)||Ve(h.type)));g&&z(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 Gu(e){let t=e.frames.map(n=>({...n,variables:n.variables.filter(r=>!r.isImplicit)}));return{...e,frames:t}}function ka(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 Pi(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!(x(i)&&!i.resolvedConcreteType&&i.requiredTraits.length===0)}).reverse()}function Mm(e){for(let t=e.frames.length-1;t>=0;t--)if(e.frames[t]?.isBeginBlockFrame)return t;return-1}var Pm=process.env.YO_SKIP_PRELUDE==="1"||process.env.YO_SKIP_PRELUDE==="true";function Um(e,t){return e.some(n=>(n.type==="single_line_comment"||n.type==="multi_line_comment")&&n.value.includes(t))}var xo=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??Om(t.replace(/^file:\/\//,""),"utf-8"),this.parser=new gi({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}":
|
|
184
184
|
${a instanceof pn||a instanceof An?a.toString():a instanceof Error?a.message:String(a)}`)}}getProgram(){return this.program}getTokens(){return this.tokens}evaluateProgram(t,n){let r=qs({modulePath:this.modulePath,inputString:this.inputString});if(!Um(this.tokens,"@skip_prelude")&&!Pm){let l="file://"+Rm.join(t,"prelude.yo"),{moduleValue:u,moduleError:c}=n(l);if(c)throw c;if(u&&ve(u.type)){r=Oe(r);for(let f=0;f<u.type.fields.length;f++){let p=u.type.fields[f],_=u.fields[f],{env:m}=fe({env:r,variable:{name:p.label,type:p.type,value:_?[_]:void 0,isCompileTimeOnly:!0,initializedAtToken:p.exprs.labelExpr?.token??p.exprs.expr.token,consumedAtToken:void 0,token:p.exprs.labelExpr?.token??p.exprs.expr.token,isOwningTheRcValue:!1}});r=m}}Pu(r)}let{moduleValue:o,env:a,partialModuleError:s}=va({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 lE(...e){process.env.NODE_ENV!=="production"&&process.env.DEBUG&&console.log(...e)}import{existsSync as Ag}from"fs";import*as Ko from"path";function Wu(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 qu(e){e.emitter.emitHeaderLine("#ifndef _WIN32"),e.emitter.emitHeaderLine("#define _DEFAULT_SOURCE"),e.emitter.emitHeaderLine("#define _GNU_SOURCE // Needed for sched_getcpu() on Linux"),e.emitter.emitHeaderLine("#else"),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("#endif"),e.emitter.emitHeaderLine("");for(let t of e.cIncludes)e.emitter.emitHeaderLine(`#include ${t}`);e.emitter.emitHeaderLine("#ifdef _WIN32"),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("#else"),e.emitter.emitHeaderLine(" #include <unistd.h>"),e.emitter.emitHeaderLine(" #include <sys/stat.h>"),e.emitter.emitHeaderLine(" #include <sys/random.h>"),e.emitter.emitHeaderLine("#endif"),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(" #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"),e.emitter.emitHeaderLine(" #define __yo_aligned_alloc aligned_alloc"),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"),e.emitter.emitHeaderLine(" #define __yo_aligned_alloc aligned_alloc"),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"),e.emitter.emitHeaderLine("#define __yo_aligned_alloc aligned_alloc")),e.emitter.emitHeaderLine("")}function Cr(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 Vn(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 fi=[...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_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],Hu=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 M(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=Gt(e);if(i)return M(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")&&ce(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(Re(i)){let o=M(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(M(n.childType,t))}`;return t.sliceStructTypes.has(i)||t.sliceStructTypes.set(i,{childType:M(n.childType,t)}),i}case"SomeType":{let n=e;if(Ce(n)){if(n.resolvedConcreteType?.isExtern)return`${M(n.resolvedConcreteType,t)}*`;let r=t.types[n.id]?.cName;if(r)return`${r}*`;if(n.resolvedConcreteType&&x(n.resolvedConcreteType)&&Ce(n.resolvedConcreteType)){let o=n.resolvedConcreteType,a=t.types[o.id]?.cName;if(a)return`${a}*`}if(n.resolvedConcreteType&&ce(n.resolvedConcreteType)){let o=n.resolvedConcreteType.id;for(let[a,s]of Object.entries(t.types))if(x(s.type)&&Ce(s.type)&&s.type.resolvedConcreteType&&ce(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
185
|
resolvedConcreteType: ${n.resolvedConcreteType?.id??"none"}
|
|
186
|
-
registered type IDs: ${Object.keys(t.types).filter(o=>o.startsWith("sometype")).join(", ")}`)}return Yt(n)&&n.resolvedConcreteType||n.resolvedConcreteType?M(n.resolvedConcreteType,t):"void*"}case"Ptr":{let r=e.childType;if(Xe(r)){let a=M(r.childType,t),s=`Slice_${te(a)}`;return t.sliceStructTypes.has(s)||t.sliceStructTypes.set(s,{childType:a}),`${s}*`}let i=M(r,t);return ct(r)?`${i}*`:ye(r)&&Gt(r)?`${i}*`:`${i}*`}case"Iso":{let n=e,r=n.childType,i=M(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=M(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 ot(e,t,n){let r=te(t);return`${M(e,n)} ${r}`}function jt(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 Pr(e){return e.type.return.isCompileTimeOnly}function Ui(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],fi)?n=t.args[0].func.token.value:F(t)&&E(t,fi)&&(n=t.func.token.value),n&&k.__yo_as.includes(n)?null:n}function Gt(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(Ne(i)){if(n)return null;n=r}else return null}else return null;return t&&n&&n.fields?n.fields[0].type:null}function bn(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 wa(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 Ln(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 Vo(e){if(e){if(Bt(e))return e;if(F(e)){let t=e;for(let n of t.args){let r=Vo(n);if(r)return r}}}}var js;function Yu(e){js=e}function V(e,t,n){if(!js)throw new Error("Internal Error: generateExpr function is not set.");return js(e,t,n)}function br(e,t,n){let r=x(t)&&t.resolvedConcreteType?t.resolvedConcreteType:t;if(!Le(r))return"";if(ke(r)){let i=r.length;if(!Re(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=br(`(${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=x(a)&&a.resolvedConcreteType?a.resolvedConcreteType:a;if(Le(s)){let l=br(`(${e})._${o}`,a,n);l&&i.emitLine(`${l};`)}}return""}if(be(r))return`__yo_decr_rc((void*)(${e}).data)`;if(ct(r))return`__yo_decr_rc((void*)(${e}))`;if(bt(r))return`__yo_decr_rc_atomic((void*)(${e}))`;if(Tt(r))return`__yo_decr_rc_atomic((void*)(${e}))`;if(ce(r)||ye(r)){let i=
|
|
186
|
+
registered type IDs: ${Object.keys(t.types).filter(o=>o.startsWith("sometype")).join(", ")}`)}return Yt(n)&&n.resolvedConcreteType||n.resolvedConcreteType?M(n.resolvedConcreteType,t):"void*"}case"Ptr":{let r=e.childType;if(Xe(r)){let a=M(r.childType,t),s=`Slice_${te(a)}`;return t.sliceStructTypes.has(s)||t.sliceStructTypes.set(s,{childType:a}),`${s}*`}let i=M(r,t);return ct(r)?`${i}*`:ye(r)&&Gt(r)?`${i}*`:`${i}*`}case"Iso":{let n=e,r=n.childType,i=M(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=M(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 ot(e,t,n){let r=te(t);return`${M(e,n)} ${r}`}function jt(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 Pr(e){return e.type.return.isCompileTimeOnly}function Ui(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],fi)?n=t.args[0].func.token.value:F(t)&&E(t,fi)&&(n=t.func.token.value),n&&k.__yo_as.includes(n)?null:n}function Gt(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(Ne(i)){if(n)return null;n=r}else return null}else return null;return t&&n&&n.fields?n.fields[0].type:null}function bn(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 wa(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 Ln(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 Vo(e){if(e){if(Bt(e))return e;if(F(e)){let t=e;for(let n of t.args){let r=Vo(n);if(r)return r}}}}var js;function Yu(e){js=e}function V(e,t,n){if(!js)throw new Error("Internal Error: generateExpr function is not set.");return js(e,t,n)}function br(e,t,n){let r=x(t)&&t.resolvedConcreteType?t.resolvedConcreteType:t;if(!Le(r))return"";if(ke(r)){let i=r.length;if(!Re(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=br(`(${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=x(a)&&a.resolvedConcreteType?a.resolvedConcreteType:a;if(Le(s)){let l=br(`(${e})._${o}`,a,n);l&&i.emitLine(`${l};`)}}return""}if(be(r))return`__yo_decr_rc((void*)(${e}).data)`;if(ct(r))return`__yo_decr_rc((void*)(${e}))`;if(bt(r))return`__yo_decr_rc_atomic((void*)(${e}))`;if(Tt(r))return`__yo_decr_rc_atomic((void*)(${e}))`;if(ce(r)||ye(r)){let i=fr(r,n);if(i)return`${i}(${e})`}return""}function zi(e,t,n){let r=x(t)&&t.resolvedConcreteType?t.resolvedConcreteType:t;if(ke(r)){let i=r.length;if(!Re(i))return"/* Error: array has non-constant length */";let o=`temp_dup_${Ge("")}`,a=`i_${Ge("")}`,s=M(r,n),l=n.emitter;l.emitLine(`${s} ${o} = ${e};`),l.emitLine(`for (size_t ${a} = 0; ${a} < ${i.value}; ${a}++) {`);let u=zi(`${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_${Ge("")}`,a=M(r,n);i.emitLine(`${a} ${o} = ${e};`);for(let s=0;s<r.fields.length;s++){let l=r.fields[s].type,u=x(l)&&l.resolvedConcreteType?l.resolvedConcreteType:l;if(Le(u)){let c=zi(`${o}._${s}`,l,n);i.emitLine(`${o}._${s} = ${c};`)}}return o}if(be(r))return`((${M(r,n)}){ .data = __yo_incr_rc((void*)(${e}).data), .vtable = (${e}).vtable })`;if(ct(r))return`((${M(r,n)})__yo_incr_rc((void*)(${e})))`;if(bt(r))return`((${M(r,n)})__yo_incr_rc_atomic((void*)(${e})))`;if(Tt(r))return`((${M(r,n)})__yo_incr_rc_atomic((void*)(${e})))`;if(ce(r)||ye(r)){let i=Dn(r,n);if(i)return`${i}(${e})`}return e}function fr(e,t){if(ce(e)||ye(e)||be(e)||x(e)||bt(e)||Tt(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 Dn(e,t){if(ce(e)||ye(e)||be(e)||x(e)||bt(e)||Tt(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 $t(e,t,n){let r=n.emitter;if(e.$?.deferredDropExpressions)for(let i of e.$.deferredDropExpressions){let o=V(i,t,n);o&&r.emitLine(`${t}${o};`)}}function tt(e,t,n){let r=n.emitter;if(e.$?.deferredDupExpressions){for(let i of e.$.deferredDupExpressions)if(F(i)){let o=V(i,t,n);o&&r.emitLine(`${t}${o};`)}}}function Kt(e,t,n){if(Re(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(Ue(e))return e.value?"true":"false";if(He(e)){let r=n?.$?.convertedRuntimeType||n?.$?.type;if(r&&mr(r)&&r.fields.length===1){let i=r.fields[0].type;if(Xe(i)){let o=M(r,t),a=JSON.stringify(e.value),s=Buffer.byteLength(e.value,"utf8");return`(${o}){ .data = (uint8_t*)${a}, .length = ${s} }`}}if(r&&Xe(r)){let i=M(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(Gt(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 Kt(e.fields[0],t)}if(bn(r))return jt(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=jt(r,e.variantName,t);if(!e.fields||e.fields.length===0)return`(${a}){ .tag = ${s} }`;{let l=r.variants.find(c=>c.name===e.variantName);if(!l||!l.fields)return`// Error: Variant ${e.variantName} not found or has no fields`;let u=e.fields.map((c,f)=>{let p=l.fields[f];if(p&&!ue(p.type)){let _=te(p.label),m=Kt(c,t);return`.${_} = ${m}`}return null}).filter(c=>c!==null);return u.length===0?`(${a}){ .tag = ${s} }`:`(${a}){ .tag = ${s}, .data = { .${e.variantName} = { ${u.join(", ")} } } }`}}else if(dn(e)){let r=e.type,i=t.types[r.id]?.cName;if(!i)return`// Error: No C type name found for tuple ${A(r)}
|
|
187
187
|
`;let o=e.fields.map((a,s)=>{let l=Kt(a,t);return`._${s} = ${l}`});return`(${i}){ ${o.join(", ")} }`}else if(vn(e)){let r=e.type;if(r&&ce(r)){let i=t.types[r.id]?.cName;if(!i)return`// Error: No C type name found for struct ${A(r)}
|
|
188
188
|
`;if(r.isNewtype&&r.fields.length===1&&e.fields.length===1){let o=Kt(e.fields[0],t);return`((${i})(${o}))`}if(r.isReferenceSemantics){let o=e.fields.map(s=>Kt(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),c=Kt(l,t);return`.${u} = ${c}`});return`(${i}){ ${o.join(", ")} }`}}}else if(Rn(e)){let r=e.type,i=M(r,t),o=e.elements.map(a=>Kt(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}
|
|
189
189
|
`}else if(D(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(vi(e)){let r=e.targetValue[0];if(r){let i=n?.$?.convertedRuntimeType||n?.$?.type;if(i&&Ne(i)){let o=i.childType,a=Kt(r,t,{$:{type:o,convertedRuntimeType:o}});if(a&&!a.startsWith("/*")&&!a.startsWith("//"))return`(&${a})`}}return`/* Error: Cannot generate pointer value ${De(e)} */`}}return`/* skip generating: ${De(e)} */`}function Bi(e,t,n){if(e===t)return!0;if(e.tag==="FnCall"){if(n&&n(e))return!1;if(Bi(e.func,t,n))return!0;for(let r of e.args)if(Bi(r,t,n))return!0}return!1}function zm(e,t,n){for(let r=0;r<t.length;r++)if(Bi(e,t[r].expr,n))return r;return-1}function ju(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=zm(l,t,i),c=n?.handleReturnStatements&&(Et(l,"return")||E(l,"return"));if(u!==-1){if(s.push(l),a.push(s),s=[],n?.handleSequentialSuspensions)for(let f=u+1;f<t.length&&Bi(l,t[f].expr,i);f++)a.push([])}else if(c){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],c=l<t.length?t[l]:null;r.push({stateNumber:l,expressions:u,suspensionPoint:c})}return r}function Ku(e,t){let r=ju(e,t,{shouldSkipBody:Bt,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 Bm(e,t){return Bi(e,t,Bt)}function Xu(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&&Bm(a,e.awaitPoint.expr),u=e.awaitPoint&&a.tag==="FnCall"&&(E(a,I.while)||E(a,I.cond)||E(a,I.match))&&sn(a);if((l||u)&&e.awaitPoint)Hi(a,e.awaitPoint,e.stateNumber,t,n);else if(s&&r){let c=V(a,t,n);c&&(i.emitLine(`${t}// Store final expression result`),i.emitLine(`${t}sm->result = ${c};`))}else{let c=V(a,t,n);!c||!a.$||st(a.$.env.modulePath,c)||i.emitLine(`${t}${c};`)}}}function Hi(e,t,n,r,i){let o=i.emitter;if(e.tag==="FnCall"&&Tn(e)){let a=e.args[0];if(!a){o.emitLine(`${r}// Error: await without argument`);return}if(t.futureVariableId===void 0){let s=V(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"&&Tn(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 c=V(l,r,i);o.emitLine(`${r}// Store Future for await (variable: ${u})`),o.emitLine(`${r}sm->await_future_${t.index} = ${c};`)}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,c=X(a.$.env,u);c.length>0&&(l=c[c.length-1].id)}Do(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,c=X(a.$.env,u);c.length>0&&(l=c[c.length-1].id)}Mo(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=V(a,r,i);Do(s,t,r,i,void 0,l||void 0);return}if(s.tag==="FnCall"&&E(s,I.match)){let l=V(a,r,i);Mo(s,t,r,i,void 0,l||void 0);return}}}if(e.tag==="FnCall"&&E(e,I.cond)){Do(e,t,r,i);return}if(e.tag==="FnCall"&&E(e,I.match)){Mo(e,t,r,i);return}if(e.tag==="FnCall"&&E(e,I.while)){Xs(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 Do(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&&!(Ue(v.$?.value)&&v.$.value.value===!1)){u=h;break}}}let c=!1;if(u>=0){let h=s[u];if(h.tag==="FnCall"&&E(h,"=>")){let d=h.args[0];d&&Ue(d.$?.value)&&d.$.value.value===!0&&(c=!0)}}if(c&&u>=0){let h=s[u],d=F(h)?h.args[1]:void 0;if(d)if(Ur(d)){let C=qi(d,t,n,r),L=r.asyncWhileLoopInfo?.get(t.index);if(L&&C.length>0){let R=r.asyncCondBranchInfo?.get(t.index)?.branches.some(S=>S.hasAwait&&S.remainingExprs&&S.remainingExprs.length>0)??!1;L.condBranchPostWhileExprs={branchIndex:u,condBranchFieldIndex:t.index,exprs:C,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:C,deferredDropExpressions:d.$?.deferredDropExpressions})}else{if(Gi(e,d,r,i,o))Wi(d,n,r);else if(F(d)&&E(d,I.begin)){let C=d.args;for(let L=0;L<C.length;L++){let b=C[L],R=V(b,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 S=R==="break"||R==="continue"||R?.includes("return");R&&(S||b.$&&!st(b.$.env.modulePath,R))&&a.emitLine(`${n}${R};`)}}if(d.$?.deferredDropExpressions)for(let L of d.$.deferredDropExpressions){let b=V(L,n,r);b&&a.emitLine(`${n}${b};`)}}else{let C=V(d,n,r);if(C==="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=C==="break"||C==="continue"||C?.includes("return");C&&(L||d.$&&!st(d.$.env.modulePath,C))&&a.emitLine(`${n}${C};`)}}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 f=!1,p=0,_=n;for(let h=0;h<s.length;h++){let d=s[h];if(d.tag!=="FnCall"||!E(d,"=>")){a.emitLine(`${_}// Error: Expected => pair in cond`);continue}let v=d.args[0],T=d.args[1];if(!v||!T){a.emitLine(`${_}// Error: Invalid pair in cond`);continue}if(Ue(v.$?.value)&&v.$.value.value===!1)continue;f&&(a.emitLine(`${_}else {`),p++,_+=" ");let $=h===s.length-1&&v.tag==="Atom"&&v.token?.value==="true"?null:V(v,_,r);$?a.emitLine(`${_}if (${$}) {`):a.emitLine(`${_}{`),f=!0;let C=`${_} `;if(Ur(T)){a.emitLine(`${C}sm->cond_branch_${t.index} = ${h};`);let b=qi(T,t,C,r),R=r.asyncWhileLoopInfo?.get(t.index);if(R&&b.length>0){let G=r.asyncCondBranchInfo?.get(t.index)?.branches.some(P=>P.hasAwait&&P.remainingExprs&&P.remainingExprs.length>0)??!1;R.condBranchPostWhileExprs={branchIndex:h,condBranchFieldIndex:t.index,exprs:b,deferredDropExpressions:T.$?.deferredDropExpressions,skipCondBranchCheck:G},l.push({index:h,value:T,hasAwait:!0,remainingExprs:[],deferredDropExpressions:T.$?.deferredDropExpressions})}else l.push({index:h,value:T,hasAwait:!0,remainingExprs:b,deferredDropExpressions:T.$?.deferredDropExpressions})}else{if(Gi(e,T,r,i,o))Wi(T,C,r);else if(F(T)&&E(T,I.begin)){let b=T.args;for(let R=0;R<b.length;R++){let S=b[R],G=V(S,C,r);if(G==="break"&&t.isInsideWhile)a.emitLine(`${C}sm->while_loop_${t.index}_active = false;`),a.emitLine(`${C}goto while_loop_${t.index}_end;`);else{let P=G==="break"||G==="continue"||G?.includes("return");G&&(P||S.$&&!st(S.$.env.modulePath,G))&&a.emitLine(`${C}${G};`)}}if(T.$?.deferredDropExpressions)for(let R of T.$.deferredDropExpressions){let S=V(R,C,r);S&&a.emitLine(`${C}${S};`)}}else{let b=V(T,C,r);if(b==="break"&&t.isInsideWhile)a.emitLine(`${C}sm->while_loop_${t.index}_active = false;`),a.emitLine(`${C}goto while_loop_${t.index}_end;`);else{let R=b==="break"||b==="continue"||b?.includes("return");b&&(R||T.$&&!st(T.$.env.modulePath,b))&&a.emitLine(`${C}${b};`)}}l.push({index:h,value:T,hasAwait:!1})}a.emitLine(`${_}}`)}for(let h=0;h<p;h++)_=_.slice(0,-2),a.emitLine(`${_}}`);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 Gi(e,t,n,r,i){return!r&&!i&&n.asyncBodyReturnExpr!==void 0&&e===n.asyncBodyReturnExpr&&!!n.inAsyncStateMachine&&!Qu(t)}function Wi(e,t,n){let r=n.emitter,i=ue(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=V(l,t,n);u&&l.$&&!st(l.$.env.modulePath,u)&&r.emitLine(`${t}${u};`)}let a=o[o.length-1];if(a&&!i){let s=V(a,t,n);s&&r.emitLine(`${t}sm->result = ${s};`)}if(e.$?.deferredDropExpressions)for(let s of e.$.deferredDropExpressions){let l=V(s,t,n);l&&r.emitLine(`${t}${l};`)}}else if(!i){let o=V(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=V(o,t,n);a&&a.includes("sm->")&&r.emitLine(`${t}${a};`)}Cr({emitter:r,indent:t,resultCode:void 0,debugLabel:n.currentFunctionName}),r.emitLine(`${t}return;`)}function Ur(e){if(e.tag==="FnCall"&&Tn(e))return!0;if(e.tag==="FnCall"){for(let t of e.args)if(Ur(t))return!0}return!1}function Qu(e){if(Et(e,"return")||E(e,"return"))return!0;if(e.tag==="FnCall"){for(let t of e.args)if(Qu(t))return!0}return!1}function Mo(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=V(s,n,r),c=s.$?.type;if(!c){a.emitLine(`${n}// Error: match value has no type`);return}if(e.$?.isPrimitiveMatch){Wm(e,l,u,t,n,r,i,o);return}if(!ye(c)){a.emitLine(`${n}// Error: match requires an enum type or primitive type`);return}let f=c,p=r.types[f.id]?.cName;if(!p){a.emitLine(`${n}// Error: enum type has no C name`);return}let _=Gt(f);if(_){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,C;if(T.stateMachineVariables){for(let[L,b]of T.stateMachineVariables)if(b.name===h){$=!0,C=L;break}}$&&C?a.emitLine(`${n} sm->var_${C} = ${u};`):a.emitLine(`${n} ${M(_,r)} ${h} = ${u};`)}if(a.emitLine(`${n} sm->cond_branch_${t.index} = ${g};`),Ur(v)){let T=qi(v,t,n+" ",r);if(T.length>0){let $=r;$.asyncCondBranchInfo||($.asyncCondBranchInfo=new Map);let C=$.asyncCondBranchInfo.get(t.index)||{branches:[]};C.branches.push({index:g,value:v,hasAwait:!0,remainingExprs:T,deferredDropExpressions:v.$?.deferredDropExpressions}),$.asyncCondBranchInfo.set(t.index,C)}}else if(Gi(e,v,r,i,o))Wi(v,n+" ",r);else{let T=V(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.$&&!st(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};`),Ur(v)){let T=qi(v,t,n+" ",r);if(T.length>0){let $=r;$.asyncCondBranchInfo||($.asyncCondBranchInfo=new Map);let C=$.asyncCondBranchInfo.get(t.index)||{branches:[]};C.branches.push({index:m,value:v,hasAwait:!0,remainingExprs:T,deferredDropExpressions:v.$?.deferredDropExpressions}),$.asyncCondBranchInfo.set(t.index,C)}}else if(Gi(e,v,r,i,o))Wi(v,n+" ",r);else{let T=V(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.$&&!st(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 C=d.func;C&&F(C)&&E(C,".",1)&&($=C.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 C=`${p.toUpperCase()}_${$.toUpperCase()}`;a.emitLine(`${n} case ${C}: {`)}if(a.emitLine(`${n} sm->cond_branch_${t.index} = ${g};`),F(d)&&d.args.length>=1){let C=d.func;if(C&&F(C)&&E(C,".")){let L=f.variants.find(b=>b.name===$);if(L&&L.fields)for(let b=0;b<Math.min(d.args.length,L.fields.length);b++){let R=d.args[b],S=L.fields[b];if(U(R)&&S){let G=R.token.value,P=te(G),O=r,B=!1,ae;if(O.stateMachineVariables){for(let[de,me]of O.stateMachineVariables)if(me.name===G){B=!0,ae=de;break}}let K=te(S.label,S.type.isExtern==="c"),W=`${u}.data.${$}.${K}`;if(B&&ae)a.emitLine(`${n} sm->var_${ae} = ${W};`);else{let de=M(S.type,r);a.emitLine(`${n} ${de} ${P} = ${W};`)}}}}}if(Ur(v)){let C=qi(v,t,n+" ",r);if(C.length>0){let L=r;L.asyncCondBranchInfo||(L.asyncCondBranchInfo=new Map);let b=L.asyncCondBranchInfo.get(t.index)||{branches:[]};b.branches.push({index:g,value:v,hasAwait:!0,remainingExprs:C,deferredDropExpressions:v.$?.deferredDropExpressions}),L.asyncCondBranchInfo.set(t.index,b)}}else if(Gi(e,v,r,i,o))Wi(v,n+" ",r);else{let C=V(v,n+" ",r);if(i){let L=te(`var_${i}`);C&&a.emitLine(`${n} sm->${L} = ${C};`)}else o?C&&a.emitLine(`${n} ${o} = ${C};`):C&&v.$&&!st(v.$.env.modulePath,C)&&a.emitLine(`${n} ${C};`)}a.emitLine(`${n} break;`),a.emitLine(`${n} }`)}m||a.emitLine(`${n} default: break;`),a.emitLine(`${n}}`)}}function Gm(e){return F(e)?E(e,"|",2):!1}function Ks(e){if(!Gm(e))return[e];if(e.tag!=="FnCall")return[e];let t=e.args[0],n=e.args[1];return[...Ks(t),...Ks(n)]}function Wm(e,t,n,r,i,o,a,s){let l=o.emitter,u=[];l.emitLine(`${i}switch (${n}) {`);for(let c=0;c<t.length;c++){let f=t[c];if(!F(f)||!E(f,"=>",2))continue;let p=f.args[0],_=f.args[1];if(Et(p,"_"))l.emitLine(`${i} default:`);else{let m=p.$?.primitivePatternValues;if(m&&m.length>0){for(let g of m)if(g!==void 0){let h=Kt(g,o);l.emitLine(`${i} case ${h}:`)}}else{let g=Ks(p);for(let h of g){let d=h.$?.value;if(d!==void 0){let v=Kt(d,o);l.emitLine(`${i} case ${v}:`)}}}}if(l.emitLine(`${i} sm->cond_branch_${r.index} = ${c};`),Ur(_)){let m=qi(_,r,i+" ",o);u.push({index:c,value:_,hasAwait:!0,remainingExprs:m,deferredDropExpressions:_.$?.deferredDropExpressions})}else{if(Gi(e,_,o,a,s))Wi(_,i+" ",o);else{let m=V(_,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&&_.$&&!st(_.$.env.modulePath,m)&&l.emitLine(`${i} ${m};`)}u.push({index:c,value:_,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 qi(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(Ur(l))if(s=!0,l.tag==="FnCall"&&E(l,":=")){let u=l.args[1];if(u&&u.tag==="FnCall"&&Tn(u)){let c=u.args[0];if(c){let f=V(c,n,r);i.emitLine(`${n}// Store Future for await ${t.index} (cond branch)`),i.emitLine(`${n}sm->await_future_${t.index} = ${f};`)}}}else if(l.tag==="FnCall"&&Tn(l)){let u=l.args[0];if(u)if(t.futureVariableId===void 0){let c=V(u,n,r);i.emitLine(`${n}// Store Future for await ${t.index} (cond branch)`),i.emitLine(`${n}sm->await_future_${t.index} = ${c};`)}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],c=r.asyncBodyReturnExpr;u&&r.asyncBodyReturnExpr!==void 0&&(r.asyncBodyReturnExpr=l),Do(l,t,n,r),r.asyncBodyReturnExpr=c}else if(l.tag==="FnCall"&&E(l,I.match)){let u=l===a[a.length-1],c=r.asyncBodyReturnExpr;u&&r.asyncBodyReturnExpr!==void 0&&(r.asyncBodyReturnExpr=l),Mo(l,t,n,r),r.asyncBodyReturnExpr=c}else l.tag==="FnCall"&&E(l,I.while)&&Xs(l,t,n,r);else{let u=V(l,n,r);u&&l.$&&!st(l.$.env.modulePath,u)&&i.emitLine(`${n}${u};`)}}return o}function Xs(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){i.emitLine(`${n}// Error: while must have exactly 2 arguments (condition, body)`);return}let a=o[0],s=o[1],l=Hm(s),u;l?(u=r.asyncNextWhileLoopIndex??t.index+1,r.asyncNextWhileLoopIndex=u+1):u=t.index,i.emitLine(`${n}sm->while_loop_${u}_active = true;`),i.emitLine(`${n}while_loop_${u}_start:`);let c=V(a,n,r);i.emitLine(`${n}if (!(${c})) {`),i.emitLine(`${n} sm->while_loop_${u}_active = false;`),i.emitLine(`${n} goto while_loop_${u}_end;`),i.emitLine(`${n}}`);let f=qm(s,t,n,r,u);if(i.emitLine(`${n}while_loop_${u}_end:`),r.asyncWhileLoopInfo||(r.asyncWhileLoopInfo=new Map),l){let p=r.asyncWhileLoopInfo.get(t.index);p&&(p.outerWhileLoop={whileLoopIndex:u,conditionExpr:a,bodyExpr:s,bodyExprsAfterAwait:f})}else r.asyncWhileLoopInfo.set(t.index,{conditionExpr:a,bodyExpr:s,bodyExprsAfterAwait:f})}function qm(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 _=0;_<s.length;_++){let m=s[_];if(sn(m)){l=_;break}}if(l===-1)return o.emitLine(`${n}// Error: Expected await in while loop body but none found`),a;let u=r.smWhileBreakInfo,c=r.smWhileContinueInfo,f=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 _=0;_<l;_++){let m=s[_],g=V(m,n,r);g&&m.$&&!st(m.$.env.modulePath,g)&&o.emitLine(`${n}${g};`)}r.smWhileBreakInfo=u,r.smWhileContinueInfo=c,r.smWhileBodyDrops=f;let p=s[l];if(F(p)&&E(p,I.while)&&sn(p)){Xs(p,t,n,r);for(let _=l+1;_<s.length;_++)a.push(s[_]);return a}if(F(p)&&E(p,":=")){let _=p.args[1];if(_&&_.tag==="FnCall"&&Tn(_)){let m=_.args[0];if(m){let g=V(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(p.tag==="FnCall"&&Tn(p)){let _=p.args[0];if(_&&t.futureVariableId===void 0){let m=V(_,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(p)&&E(p,I.cond)){Do(p,t,n,r,void 0);for(let _=l+1;_<s.length;_++)a.push(s[_]);return a}else if(F(p)&&E(p,I.match)){Mo(p,t,n,r);for(let _=l+1;_<s.length;_++)a.push(s[_]);return a}for(let _=l+1;_<s.length;_++)a.push(s[_]);return a}function Hm(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)&&sn(n))return!0;return!1}function Zs(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 Ro(e){return!e||!x(e)?!1:e.resolvedConcreteType&&x(e.resolvedConcreteType)&&e.resolvedConcreteType.isExtern?!0:e.requiredTraits.some(t=>Xo(t.traitType))}function Oo(e,t){return t==="outer"?`__capture.${te(e)}`:te(`var_${e}`)}function Ju(e,t,n,r,i,o,a,s){let l=s.emitter,c=Dt(o).isFuture.outputType,f=ue(c);s.asyncCondBranchInfo=new Map,s.asyncWhileLoopInfo=new Map,s.asyncNextWhileLoopIndex=i.awaitPoints.length;let p=Ku(e,i.awaitPoints),_=e.tag==="FnCall"&&E(e,"begin")?e.args:[e],m=_.length>0?_[_.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<p.length;h++){let d=p[h];if(!d)continue;let v=d.stateNumber,T=h===p.length-1;if(l.emitLine(`
|
|
190
190
|
state_${v}:`),l.emitLine(` case ${v}: { // State ${v}`),l.emitLine(` ASYNC_DEBUG("${t}: Entering state ${v}\\n");`),v>0&&i.awaitPoints[v-1]){let O=i.awaitPoints[v-1],B=Zs(O,i);O.isInsideCond&&l.emitLine(` if (sm->${B} != NULL) {`);let ae=ue(O.resultType)||x(O.resultType)&&!O.resultType.resolvedConcreteType;if(l.emitLine(" // Check if the awaited Future was aborted"),l.emitLine(` if (sm->${B}->state == -2) {`),l.emitLine(` __yo_decr_rc((void*)sm->${B});`),l.emitLine(` sm->${B} = NULL;`),Vn({emitter:l,indent:" ",debugLabel:t}),l.emitLine(" }"),O&&!ae){if(l.emitLine(` // Extract result from await ${v-1}`),l.emitLine(` int state_before_read = sm->${B}->state;`),l.emitLine(` ASYNC_DEBUG("${t}: Reading result from await ${v-1}, state=%d\\n", state_before_read);`),Le(O.resultType)){let W=Dn(O.resultType,s);W?l.emitLine(` sm->await_result_${v-1} = ${W}(sm->${B}->result);`):(l.emitLine(" /* Warning: No ___dup function found for result type, shallow copy may cause use-after-free */"),l.emitLine(` sm->await_result_${v-1} = sm->${B}->result;`))}else l.emitLine(` sm->await_result_${v-1} = sm->${B}->result;`);if(O.targetVariableId){let W=Oo(O.targetVariableId,"local");l.emitLine(` sm->${W} = sm->await_result_${v-1};`)}l.emitLine("")}if(!O.futureVariableId){let W=O.expr;if(W.tag==="FnCall"){let me=W.args[0]?.$?.type;me&&(x(me)||be(me))&&(l.emitLine(` if (sm->${B} != NULL) { __yo_decr_rc((void*)sm->${B}); sm->${B} = NULL; }`),l.emitLine(""))}}let K=s;if(O){let W=K.asyncCondBranchInfo?.get(O.index);if(W&&W.branches.some(me=>me.hasAwait)){let me=W.condBranchFieldIndex??O.index,he=me===-1;l.emitLine(" // Execute remaining code from chosen cond branch"),he||l.emitLine(` switch (sm->cond_branch_${me}) {`);let H=d.awaitPoint?.isInsideCond??!1;for(let Q of W.branches)if(Q.hasAwait){if(he||l.emitLine(` case ${Q.index}: {`),l.emitLine(` ASYNC_DEBUG("${t}: Executing remaining code from branch ${Q.index}\\n");`),Q.remainingExprs&&Q.remainingExprs.length>0){let oe=s.inAsyncStateMachine,Ae=s.stateMachineVariables,pe=s.variableIdRemapping,Se=s.pendingDeferredDrops;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let Je=K.asyncWhileLoopInfo?.get(O.index);s.pendingDeferredDrops=[...Q.deferredDropExpressions??[],...Je?.bodyExpr.$?.deferredDropExpressions??[],...e.$?.deferredDropExpressions??[]];let ee=new Map;for(let Te of i.capturedVariables)ee.set(Te.id,Te);if(a)for(let Te of a.fields)ee.set(Te.label,{id:Te.label,name:Te.label,type:Te.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=ee;let Z=!1,se=[],le=W.targetAssignmentCode;for(let Te=0;Te<Q.remainingExprs.length;Te++){let re=Q.remainingExprs[Te],Ie=Te===Q.remainingExprs.length-1;if(Z){se.push(re);continue}if(H&&sn(re)){Z=!0,Qs(re,d.awaitPoint,i," ",s);continue}let $e=V(re," ",s);!$e||!re.$||st(re.$.env.modulePath,$e)||(Ie&&le?l.emitLine(` ${le} = ${$e};`):l.emitLine(` ${$e};`))}if(Q.remainingExprs.length===0&&le&&l.emitLine(` ${le} = sm->await_result_${O.index};`),Z&&d.awaitPoint){let Te=d.awaitPoint.index;K.asyncCondBranchInfo||(K.asyncCondBranchInfo=new Map);let re=K.asyncCondBranchInfo.get(Te);if(re)re.chainedBranches||(re.chainedBranches=[]),re.chainedBranches.push({branches:[{index:Q.index,value:Q.value,hasAwait:se.length>0||se.some(Ie=>sn(Ie)),remainingExprs:se,deferredDropExpressions:Q.deferredDropExpressions}],condBranchFieldIndex:me});else{let Ie={branches:[{index:Q.index,value:Q.value,hasAwait:se.length>0||se.some($e=>sn($e)),remainingExprs:se,deferredDropExpressions:Q.deferredDropExpressions}],condBranchFieldIndex:me};K.asyncCondBranchInfo.set(Te,Ie)}}else if(Q.deferredDropExpressions)for(let Te of Q.deferredDropExpressions){let re=V(Te," ",s);re&&re.includes("sm->")&&l.emitLine(` ${re};`)}s.inAsyncStateMachine=oe,s.stateMachineVariables=Ae,s.variableIdRemapping=pe,s.pendingDeferredDrops=Se}he||(l.emitLine(" break;"),l.emitLine(" }"))}if(he||l.emitLine(" }"),W.chainedBranches){for(let Q of W.chainedBranches)for(let oe of Q.branches)if(oe.hasAwait&&oe.remainingExprs&&oe.remainingExprs.length>0){let Ae=s.inAsyncStateMachine,pe=s.stateMachineVariables,Se=s.variableIdRemapping,Je=s.pendingDeferredDrops;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let ee=K.asyncWhileLoopInfo?.get(O.index);s.pendingDeferredDrops=[...oe.deferredDropExpressions??[],...ee?.bodyExpr.$?.deferredDropExpressions??[],...e.$?.deferredDropExpressions??[]];let Z=new Map;for(let re of i.capturedVariables)Z.set(re.id,re);if(a)for(let re of a.fields)Z.set(re.label,{id:re.label,name:re.label,type:re.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Z;let se=d.awaitPoint?.isInsideCond??!1,le=!1,Te=[];for(let re of oe.remainingExprs){if(le){Te.push(re);continue}if(se&&sn(re)){le=!0,Qs(re,d.awaitPoint,i," ",s);continue}let Ie=V(re," ",s);!Ie||!re.$||st(re.$.env.modulePath,Ie)||l.emitLine(` ${Ie};`)}if(le&&d.awaitPoint){let re=d.awaitPoint.index;K.asyncCondBranchInfo||(K.asyncCondBranchInfo=new Map);let Ie=K.asyncCondBranchInfo.get(re);Ie?(Ie.chainedBranches||(Ie.chainedBranches=[]),Ie.chainedBranches.push({branches:[{index:oe.index,value:oe.value,hasAwait:Te.length>0||Te.some($e=>sn($e)),remainingExprs:Te,deferredDropExpressions:oe.deferredDropExpressions}],condBranchFieldIndex:Q.condBranchFieldIndex})):K.asyncCondBranchInfo.set(re,{branches:[{index:oe.index,value:oe.value,hasAwait:Te.length>0||Te.some($e=>sn($e)),remainingExprs:Te,deferredDropExpressions:oe.deferredDropExpressions}],condBranchFieldIndex:Q.condBranchFieldIndex})}else if(oe.deferredDropExpressions)for(let re of oe.deferredDropExpressions){let Ie=V(re," ",s);Ie&&Ie.includes("sm->")&&l.emitLine(` ${Ie};`)}s.inAsyncStateMachine=Ae,s.stateMachineVariables=pe,s.variableIdRemapping=Se,s.pendingDeferredDrops=Je}}if(W.targetVariableId){let Q=Oo(W.targetVariableId,"local");l.emitLine(" // Assign cond result to target variable"),l.emitLine(` sm->${Q} = sm->await_result_${O.index};`)}l.emitLine("")}O.isInsideCond&&l.emitLine(" }");let de=K.asyncWhileLoopInfo?.get(O.index);if(de){if(l.emitLine(" // Execute remaining code from while loop body and continue loop"),l.emitLine(` if (sm->while_loop_${O.index}_active) {`),de.bodyExprsAfterAwait&&de.bodyExprsAfterAwait.length>0){let pe=s.inAsyncStateMachine,Se=s.stateMachineVariables,Je=s.variableIdRemapping,ee=s.pendingDeferredDrops;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping,s.pendingDeferredDrops=[...de.bodyExpr.$?.deferredDropExpressions??[],...e.$?.deferredDropExpressions??[]];let Z=new Map;for(let re of i.capturedVariables)Z.set(re.id,re);if(a)for(let re of a.fields)Z.set(re.label,{id:re.label,name:re.label,type:re.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Z;let se=s.smWhileBreakInfo,le=s.smWhileContinueInfo,Te=s.smWhileBodyDrops;s.smWhileBreakInfo={label:`after_while_loop_${O.index}`,activeIndex:O.index},s.smWhileContinueInfo={label:`while_loop_${O.index}_continue`},s.smWhileBodyDrops=[...de.bodyExpr.$?.deferredDropExpressions??[]];for(let re of de.bodyExprsAfterAwait){let Ie=V(re," ",s);!Ie||!re.$||st(re.$.env.modulePath,Ie)||l.emitLine(` ${Ie};`)}s.smWhileBreakInfo=se,s.smWhileContinueInfo=le,s.smWhileBodyDrops=Te,s.inAsyncStateMachine=pe,s.stateMachineVariables=Se,s.variableIdRemapping=Je,s.pendingDeferredDrops=ee}l.emitLine(` while_loop_${O.index}_continue:`);{let pe=de.bodyExpr.$?.deferredDropExpressions??[];if(pe.length>0){let Se=s.inAsyncStateMachine,Je=s.stateMachineVariables,ee=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let Z=new Map;for(let se of i.capturedVariables)Z.set(se.id,se);if(a)for(let se of a.fields)Z.set(se.label,{id:se.label,name:se.label,type:se.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Z;for(let se of pe){let le=V(se," ",s);le&&le.includes("sm->")&&l.emitLine(` ${le};`)}s.inAsyncStateMachine=Se,s.stateMachineVariables=Je,s.variableIdRemapping=ee}}l.emitLine(` ASYNC_DEBUG("${t}: Re-evaluating while loop condition\\n");`);let me=s.inAsyncStateMachine,he=s.stateMachineVariables,H=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let Q=new Map;for(let pe of i.capturedVariables)Q.set(pe.id,pe);if(a)for(let pe of a.fields)Q.set(pe.label,{id:pe.label,name:pe.label,type:pe.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Q;let oe=V(de.conditionExpr," ",s);s.inAsyncStateMachine=me,s.stateMachineVariables=he,s.variableIdRemapping=H,l.emitLine(` if (!(${oe})) {`),l.emitLine(` sm->while_loop_${O.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 Ae=O.index;if(l.emitLine(" // Loop back by transitioning to while loop state"),l.emitLine(` sm->state = ${Ae};`),l.emitLine(` goto while_loop_${Ae}_start;`),l.emitLine(" }"),l.emitLine(" }"),l.emitLine(""),l.emitLine(` after_while_loop_${O.index}:`),de.condBranchPostWhileExprs){let pe=de.condBranchPostWhileExprs,Se=pe.condBranchFieldIndex,Je=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_${Se} == ${Je}) {`));let ee=s.inAsyncStateMachine,Z=s.stateMachineVariables,se=s.variableIdRemapping,le=s.pendingDeferredDrops;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping,s.pendingDeferredDrops=[...e.$?.deferredDropExpressions??[]];let Te=new Map;for(let Ke of i.capturedVariables)Te.set(Ke.id,Ke);if(a)for(let Ke of a.fields)Te.set(Ke.label,{id:Ke.label,name:Ke.label,type:Ke.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=Te;let re=d.awaitPoint!=null,Ie=!1,$e=[];for(let Ke=0;Ke<pe.exprs.length;Ke++){let ut=pe.exprs[Ke];if(Ie){$e.push(ut);continue}if(re&&sn(ut)){Ie=!0,Qs(ut,d.awaitPoint,i," ",s);continue}let We=V(ut," ",s);!We||!ut.$||st(ut.$.env.modulePath,We)||l.emitLine(` ${We};`)}if(Ie&&d.awaitPoint){let Ke=d.awaitPoint.index;K.asyncCondBranchInfo||(K.asyncCondBranchInfo=new Map);let ut=pe.skipCondBranchCheck?-1:pe.condBranchFieldIndex,We=K.asyncCondBranchInfo.get(Ke);We?(We.chainedBranches||(We.chainedBranches=[]),We.chainedBranches.push({branches:[{index:pe.branchIndex,value:pe.exprs[0],hasAwait:$e.length>0||$e.some(Ut=>sn(Ut)),remainingExprs:$e,deferredDropExpressions:pe.deferredDropExpressions}],condBranchFieldIndex:ut})):K.asyncCondBranchInfo.set(Ke,{branches:[{index:pe.branchIndex,value:pe.exprs[0],hasAwait:$e.length>0||$e.some(Ut=>sn(Ut)),remainingExprs:$e,deferredDropExpressions:pe.deferredDropExpressions}],condBranchFieldIndex:ut})}if(!Ie&&pe.deferredDropExpressions)for(let Ke of pe.deferredDropExpressions){let ut=V(Ke," ",s);ut&&ut.includes("sm->")&&l.emitLine(` ${ut};`)}l.emitLine(" }"),s.inAsyncStateMachine=ee,s.stateMachineVariables=Z,s.variableIdRemapping=se,s.pendingDeferredDrops=le}if(de.outerWhileLoop){let pe=de.outerWhileLoop,Se=pe.whileLoopIndex;if(l.emitLine(" // Execute remaining code from outer while loop body"),l.emitLine(` if (sm->while_loop_${Se}_active) {`),pe.bodyExprsAfterAwait.length>0){let Je=s.inAsyncStateMachine,ee=s.stateMachineVariables,Z=s.variableIdRemapping,se=s.pendingDeferredDrops;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping,s.pendingDeferredDrops=[...pe.bodyExpr.$?.deferredDropExpressions??[],...e.$?.deferredDropExpressions??[]];let le=new Map;for(let $e of i.capturedVariables)le.set($e.id,$e);if(a)for(let $e of a.fields)le.set($e.label,{id:$e.label,name:$e.label,type:$e.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=le;let Te=s.smWhileBreakInfo,re=s.smWhileContinueInfo,Ie=s.smWhileBodyDrops;s.smWhileBreakInfo={label:`after_while_loop_${Se}`,activeIndex:Se},s.smWhileContinueInfo={label:`while_loop_${Se}_continue`},s.smWhileBodyDrops=[...pe.bodyExpr.$?.deferredDropExpressions??[]];for(let $e of pe.bodyExprsAfterAwait){let Ke=V($e," ",s);!Ke||!$e.$||st($e.$.env.modulePath,Ke)||l.emitLine(` ${Ke};`)}s.smWhileBreakInfo=Te,s.smWhileContinueInfo=re,s.smWhileBodyDrops=Ie,s.inAsyncStateMachine=Je,s.stateMachineVariables=ee,s.variableIdRemapping=Z,s.pendingDeferredDrops=se}l.emitLine(` while_loop_${Se}_continue:`);{let Je=pe.bodyExpr.$?.deferredDropExpressions??[];if(Je.length>0){let ee=s.inAsyncStateMachine,Z=s.stateMachineVariables,se=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let le=new Map;for(let Te of i.capturedVariables)le.set(Te.id,Te);if(a)for(let Te of a.fields)le.set(Te.label,{id:Te.label,name:Te.label,type:Te.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=le;for(let Te of Je){let re=V(Te," ",s);re&&re.includes("sm->")&&l.emitLine(` ${re};`)}s.inAsyncStateMachine=ee,s.stateMachineVariables=Z,s.variableIdRemapping=se}}{let Je=s.inAsyncStateMachine,ee=s.stateMachineVariables,Z=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let se=new Map;for(let Te of i.capturedVariables)se.set(Te.id,Te);if(a)for(let Te of a.fields)se.set(Te.label,{id:Te.label,name:Te.label,type:Te.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=se;let le=V(pe.conditionExpr," ",s);s.inAsyncStateMachine=Je,s.stateMachineVariables=ee,s.variableIdRemapping=Z,l.emitLine(` if (!(${le})) {`),l.emitLine(` sm->while_loop_${Se}_active = false;`),l.emitLine(" } else {"),l.emitLine(` sm->state = ${O.index};`),l.emitLine(` goto while_loop_${Se}_start;`),l.emitLine(" }")}l.emitLine(" }"),l.emitLine(""),l.emitLine(` after_while_loop_${Se}:`)}}}}let $=s.inAsyncStateMachine,C=s.stateMachineVariables,L=s.variableIdRemapping;s.inAsyncStateMachine={futureType:o},s.variableIdRemapping=i.variableIdRemapping;let b=new Map;for(let O of i.capturedVariables)b.set(O.id,O);if(a)for(let O of a.fields)b.set(O.label,{id:O.label,name:O.label,type:O.type,kind:"outer",isOwningTheSameRcValueAs:void 0});s.stateMachineVariables=b;let R=s.pendingDeferredDrops;s.pendingDeferredDrops=[...e.$?.deferredDropExpressions??[]];let S=T&&!f&&d.expressions.length>0,G=d.expressions.length>0?d.expressions[d.expressions.length-1]:void 0,P=s.asyncBodyReturnExpr;if(!f&&G&&m&&G===m&&d.awaitPoint?s.asyncBodyReturnExpr=G:s.asyncBodyReturnExpr=void 0,Xu(d," ",s,S),s.asyncBodyReturnExpr=P,s.pendingDeferredDrops=R,l.emitLine(""),d.awaitPoint){s.inAsyncStateMachine=$,s.stateMachineVariables=C,s.variableIdRemapping=L;let O=v+1;{let B=Zs(d.awaitPoint,i),K=d.awaitPoint.expr.args?.[0],W=Ro(K?.$?.type),de=d.awaitPoint?.isInsideCond;de&&(l.emitLine(" // Only await if the cond branch with await was taken"),l.emitLine(` if (sm->${B} != NULL) {`));let me=d.awaitPoint?.isInsideWhile,he=me?s.asyncWhileLoopInfo?.get(d.awaitPoint.index):void 0;if(me&&he){let H=d.awaitPoint.index;l.emitLine(" // Only await if while loop is still active (not broken)"),l.emitLine(` if (sm->while_loop_${H}_active) {`)}if(l.emitLine(" // Transition to next state after await"),l.emitLine(` sm->state = ${O};`),l.emitLine(""),l.emitLine(" // Check if future is ready"),l.emitLine(` int future_state = sm->${B}->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->${B}); // event loop reference`)),W||(l.emitLine(" if (future_state == 0) { // 0 = cold (not started)"),jm(d.awaitPoint.expr,`sm->${B}`," ",s),l.emitLine(" // Cold future \u2014 start it via stored resume function pointer"),l.emitLine(` sm->${B}->__yo_resume_fn((void*)sm->${B});`),l.emitLine(""),l.emitLine(" // Re-check: may have completed synchronously"),l.emitLine(` future_state = sm->${B}->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->${B}->continuation_fn = (void (*)(void*))${r};`),l.emitLine(` sm->${B}->continuation_sm = (void*)sm;`),l.emitLine(" return;"),me&&he){let H=d.awaitPoint.index;l.emitLine(" } else {"),l.emitLine(" // While loop was broken, jump to code after loop"),l.emitLine(` goto after_while_loop_${H};`),l.emitLine(" }")}de&&(l.emitLine(" } else {"),l.emitLine(" // Non-await cond branch was taken, skip directly to next state"),l.emitLine(` sm->state = ${O};`),l.emitLine(` goto state_${O};`),l.emitLine(" }"))}}else if(T){if(!d.expressions.some(B=>ec(B))){if(e.$?.deferredDropExpressions){let B=new yi,ae=s.emitter;s.emitter=B;for(let W of e.$.deferredDropExpressions){let de=V(W,"",s);de&&B.emitLine(`${de};`)}s.emitter=ae;let K=B.print().trim();if(K){l.emitLine(" // Drop local variables before completion");for(let W of K.split(`
|
|
191
|
-
`)){let de=W.trim();de&&(l.emitLine(` ${de}`),g.push(de))}l.emitLine("")}}l.emitLine(" // Final state - complete the Future"),Cr({emitter:l,indent:" ",debugLabel:"Future %p completed"})}s.inAsyncStateMachine=$,s.stateMachineVariables=C,s.variableIdRemapping=L}else s.inAsyncStateMachine=$,s.stateMachineVariables=C,s.variableIdRemapping=L;l.emitLine(" }")}return l.emitLine(" }"),l.emitLine("}"),l.emitLine(""),g}function Qs(e,t,n,r,i){let o=i.emitter,a=Zs(t,n);if(e.tag==="FnCall"&&E(e,":=")){let s=e.args[1];if(s&&s.tag==="FnCall"&&Tn(s)){let l=s.args[0];if(l){let u=V(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"&&Tn(e)){let s=e.args[0];if(s){let l=V(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)){Hi(e,t,0,r,i);return}if(e.tag==="FnCall"&&E(e,I.match)){Hi(e,t,0,r,i);return}if(e.tag==="FnCall"&&E(e,I.while)){Hi(e,t,0,r,i);return}if(e.tag==="FnCall"&&E(e,I.begin)){Hi(e,t,0,r,i);return}o.emitLine(`${r}// Warning: unhandled await pattern in remaining expressions`)}function ec(e){if(Et(e,"return")||E(e,"return"))return!0;if(e.tag==="FnCall"){for(let t of e.args)if(ec(t))return!0}return!1}function Ym(e){let t=[];for(let n of e)if(n.isEffectRowSpread){let r=n.type;x(r)&&r.resolvedConcreteType&&(r=r.resolvedConcreteType),rt(r)&&t.push(...r.implicitParameters)}else t.push(n);return t}function jm(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=Ym(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 c=0;c<a.length&&c<u.length;c++){let f=a[c],p=u[c];if(z(f.type)){if(f.type.forallParameters.length>0)continue;let _=V(p,n,r),m=f.label;s.emitLine(`${n}${t}->__capture.${m} = (void*)${_};`)}else ve(f.type)&&Zu(f.type,t,n,p.$?.value,r,e)}}else for(let u of a)if(z(u.type)){if(u.type.forallParameters.length>0)continue;let c=Km(u.label,r,e);c&&s.emitLine(`${n}${t}->__capture.${u.label} = (void*)${c};`)}else ve(u.type)&&Zu(u.type,t,n,void 0,r,e)}function Zu(e,t,n,r,i,o){let a=i.emitter;for(let s of e.fields){if(!z(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&&ze(r)){let u=e.fields.indexOf(s),c=r.fields[u];if(c&&ne(c)){let f=i.functions[c.funcId];f&&(l=f.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 c=un(u,f=>f.isImplicit===!0);for(let f=c.length-1;f>=0;f--){let p=c[f],_=p.value?.[p.value.length-1];if(_&&ze(_)){let m=_.type.fields.findIndex(g=>g.label===s.label);if(m>=0){let g=_.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 Km(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 Xm=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_create","yo_thread_join","yo_thread_self"]);function tc(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(Xm.has(r))continue;Js(i,r,!0,e);continue}i.isExtern==="c"&&i.cInclude||r.startsWith("__atomic_")||r.startsWith("__sync_")||Js(i,r,!0,e)}t.emitDeclarationLine(""),t.emitDeclarationLine("/// Async runtime functions"),t.emitDeclarationLine("void yo_async_spawn_task(void (*resume_fn)(void*), void* state_machine);"),t.emitDeclarationLine("void yo_future_dispose(void* ptr);"),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Object constructors"),Zm(e),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Closure constructors"),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Capture dispose functions"),Jm(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&&wt(i.specializedType??i.type).length===0&&[...i.type.implicitParameters,...i.type.parameters.filter(g=>g.isImplicit)].some(g=>z(g.type)))continue;let u=i.specializedType??i.type,c=wt(u).length>0;if(!o&&i.isIoAsyncStateMachineClosure||!o&&!s&&!c&&!i.isModuleEffectMember&&(Zn(i.type)&&!i.type.isClosure||i.specializedFunctionCaches?.length>0&&!i.type.isClosure||Pr(i)||Ui(i)||i.isIoAsyncStateMachineClosure))continue;let f=i.specializedType??i.type,p=!s&&!i.isModuleEffectMember&&(f.parameters.some(g=>Fe(g.type))||f.forallParameters.length>0),_=Fe(f.return.type),m=x(f.return.type)&&f.return.type.requiredTraits.length>0;p||_&&!m&&!i.isModuleEffectMember||Js(f,r,!1,e,i.isModuleEffectMember?void 0:i.body,i.specializedType&&wt(f).length===0&&wt(i.type).some(g=>g.fieldFunctionType.forallParameters&&g.fieldFunctionType.forallParameters.length>0)?i.type:void 0)}t.emitDeclarationLine("/// Closure vtable instances"),t.emitDeclarationLine("")}function wt(e){let t=[],n=Qm(e.implicitParameters);for(let r of n)ve(r.type)?nc(r.label,r.type,[],t):z(r.type)&&t.push({implicitLabel:r.label,fieldLabel:r.label,fieldPath:[r.label],fieldFunctionType:r.type,cParamName:te(r.label)});return t}function nc(e,t,n,r){for(let i of t.fields)if(z(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 ve(i.type)&&nc(e,i.type,[...n,i.label],r)}function Qm(e){let t=[];for(let n of e)if(n.isEffectRowSpread){let r=n.type;x(r)&&r.resolvedConcreteType&&(r=r.resolvedConcreteType),rt(r)&&t.push(...r.implicitParameters)}else t.push(n);return t}function fr(e,t,n,r,i){let o=r||M(e.return.type,n),a=e.parameters.filter(f=>!f.isCompileTimeOnly),s=[];e.isClosure&&s.push("void* closure_context");let l=a.map((f,p)=>{let _=te(f.label||`param${p}`);if(z(f.type))return fr(f.type,"(*)",n).replace(" (*)(",` (*${_})(`);{let m;return x(f.type)&&Ce(f.type)?f.type.resolvedConcreteType?m=M(f.type.resolvedConcreteType,n)+"*":m=M(f.type,n):m=M(f.type,n),`${m} ${_}`}});s.push(...l);let u=wt(i??e);for(let f of u)if(f.fieldFunctionType.forallParameters&&f.fieldFunctionType.forallParameters.length>0)s.push(`void* ${f.cParamName}`);else{let p=fr(f.fieldFunctionType,"(*)",n).replace(" (*)(",` (*${f.cParamName})(`);s.push(p)}let c=s.join(", ");return`${o} ${t}(${c})`}function Js(e,t,n,r,i,o){let a;if(i&&Ce(e.return.type)){let u=Vo(i);u?.$?.asyncStateMachineStructName?a=`${u.$.asyncStateMachineStructName}*`:i.$?.type&&x(i.$.type)&&Ce(i.$.type)&&(a=M(i.$.type,r))}if(i&&x(e.return.type)&&!Ce(e.return.type)&&i.$?.type&&(a=M(i.$.type,r)),!a&&i&&i.$?.type&&!Ce(e.return.type)){let u=M(e.return.type,r),c=M(i.$.type,r);u!==c&&(a=c)}let s=a?fr(e,t,r,a,o):fr(e,t,r,void 0,o),l=A(e);r.emitter.emitDeclarationLine(`${n?"extern ":""}${s}; // ${l}`)}function Zm(e){let t=e.emitter;t.emitDeclarationLine("void __yo_decr_rc(void* ptr); // Decrement reference count"),t.emitDeclarationLine("void* __yo_incr_rc(void* ptr); // Increment reference count"),t.emitDeclarationLine("void __yo_gc_register(void* ptr); // Register object for cycle detection"),t.emitDeclarationLine("void __yo_gc_unregister(void* ptr); // Unregister object from cycle detection"),t.emitDeclarationLine("void __yo_gc_collect(); // Trigger garbage collection"),t.emitDeclarationLine("void __yo_gc_init_thread(); // Initialize thread-local GC state (for worker threads)"),t.emitDeclarationLine("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(ce(r)&&r.isReferenceSemantics){if(r.fields.some(l=>Fe(l.type)))continue;let a=`__yo_new_${i}`,s=r.fields.map(l=>{let u=M(l.type,e),c=te(l.label);return`${u} ${c}`}).join(", ");t.emitDeclarationLine(`${i}* ${a}(${s}); // Constructor`)}}}function Jm(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(`void ${r}(void* closure_ptr);`)}}function rc(e){let t=new Set;for(let n in e.functions){let{value:r,cName:i}=e.functions[n],o=r.specializedType;if(Pr(r)||!o||!On(r.type)||On(o))continue;let a=o.parameters.some(u=>Fe(u.type)),s=Fe(o.return.type);a||s||wt(r.type).some(u=>u.fieldFunctionType.forallParameters&&u.fieldFunctionType.forallParameters.length>0)||t.has(n)||(t.add(n),e.emitter.emitDeclarationLine(`${fr(o,i,e)}; // specialized function: ${A(r.type)}`))}}function pr(e,t,n){let r=X(t,e);return r.length===0?!1:r[r.length-1].frameLevel<=n}function ic(e){return!!(e.$?.closureFunctionValue&&e.$?.type&&Yt(e.$.type))}function ey(e,t,n,r,i,o=!1){let a=Object.values(i.types).find(_=>_.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 _ of n.$.deferredDupExpressions){let m=wa(_);m&&l.set(m,_)}let u=e.fields.map(_=>{if(_.isEffectParam)return"NULL";let m,g=_.exprs.expr;if(g.$?.deferredDupExpressions?.length&&(m=g.$.deferredDupExpressions[0]),!m){let d=[_.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 V(m,r,i);let h={tag:"Atom",token:g.token,$:g.$};return V(h,r,i)}),c=`(${s}){ ${u.map((_,m)=>{let g=e.fields[m];return g?`.${g.label} = ${_}`:`/* Error: missing field at index ${m} */`}).join(", ")} }`,f=n.token.position.row!==void 0?`${Date.now()}_${n.token.position.row}`:`${Date.now()}_${Math.random().toString(36).substr(2,9)}`,p=`__capture_${t}_${f}`;return o?i.emitter.emitLine(`${r}${s} ${p} = ${c};`):(i.emitter.emitLine(`${r}${s}* ${p} = (${s}*)__yo_malloc(sizeof(${s}));`),i.emitter.emitLine(`${r}*${p} = ${c};`)),{captureTempVar:p,captureCName:s}}function oc(e,t,n){if(!e.$||!e.$.type||!e.$.closureFunctionValue)return"// Error: Missing closure metadata";let r=en(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=be(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 c=a&&ce(a)&&a.fields.length>0,f=M(i.return.type,n),p=i.parameters.map(m=>M(m.type,n)).join(", "),_=`(${f} (*)(void*${p?", "+p:""}))${s}`;if(c&&a&&ce(a)){let m=!l,g=ey(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}, ${_})`}else return n.implClosureCallMap.set(a.id,{functionCName:s,callTypeId:r.isFn.callType.id}),h}else if(l){let m=`__yo_create_${u}`,g=`__yo_dispose_${u}`;return`${m}(NULL, ${g}, ${_})`}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}),`(${M(m.resolvedConcreteType,n)}){}`}return"// Error: Impl(Fn(...)) without captures missing resolvedConcreteType"}}function el(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=V(a,t,n);s&&n.emitter.emitLine(`${t}${s};`)}}}function Yi(e,t,n=""){let r=t;if(e.token.value==="continue"){if(r.currentContinueLabel)return el(r,n,t),`goto ${r.currentContinueLabel}`;if(r.currentLoopLabel)return el(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=V(s,n,t);l&&l.includes("sm->")&&a.emitLine(`${n}${l};`)}}if(r.smWhileContinueInfo.stepExpr){let a=t.emitter,s=V(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 el(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 c=V(u,n,t);c&&c.includes("sm->")&&l.emitLine(`${n}${c};`)}}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,c=ue(u);if(e.$?.deferredDropExpressions)for(let p of e.$.deferredDropExpressions){let _=V(p,n,t);_&&_.includes("sm->")&&a.emitLine(`${n}${_};`)}if(r.pendingDeferredDrops&&r.pendingDeferredDrops.length>0){a.emitLine(`${n}// Drop local variables before early completion`);for(let p of r.pendingDeferredDrops){let _=V(p,n,t);_&&_.includes("sm->")&&a.emitLine(`${n}${_};`)}}a.emitLine(`${n}// Early return - complete the result Future`);let f=c?void 0:`(${M(u,t)}){0}`;return Cr({emitter:a,indent:n,resultCode:f,debugLabel:t.currentFunctionName}),""}return"return"}if(e.$?.type&&ue(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],c=u.isOwningTheSameRcValueAs?u.isOwningTheSameRcValueAs.id:u.id;r.variableIdRemapping?.has(c)&&(c=r.variableIdRemapping.get(c));let f=r.stateMachineVariables.get(c);if(f){let p=f.kind==="outer"?`__capture.${a}`:`var_${f.id}`;return s=!0,`sm->${p}`}}}if(!s){for(let[l,u]of r.stateMachineVariables)if(u.name===a){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 c=u.isOwningTheSameRcValueAs.name,f=u.isOwningTheSameRcValueAs.id;for(let[p,_]of r.stateMachineVariables)if(_.name===c||p===f)return`sm->${_.kind==="outer"?`__capture.${c}`:`var_${p}`}`}}}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&&!_e(e.$.value)){let l=X(e.$.env,e.$.variableName);if(l.length>0&&l[l.length-1].isCompileTimeOnly)return Kt(e.$.value,t,e)}return Ee(e.$.variableName,e.$.env)}}if(e.$?.variableName){if(e.$?.env&&e.$?.value&&!_e(e.$.value)){let a=X(e.$.env,e.$.variableName);if(a.length>0&&a[a.length-1].isCompileTimeOnly)return Kt(e.$.value,t,e)}if(!(r.currentClosureCaptures&&r.currentClosureCaptures.includes(e.token.value)&&e.$?.env&&r.currentClosureCaptureFrameLevel!==void 0&&pr(e.token.value,e.$.env,r.currentClosureCaptureFrameLevel)))return Ee(e.$.variableName,e.$?.env)}if(e.$?.value&&!_e(e.$.value))return Kt(e.$.value,t,e);let i=e.$?.env&&r.currentClosureCaptureFrameLevel!==void 0?pr(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=>z(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(z(s.type)&&(_e(s.value?.[0])||s.value===void 0)){let l=Object.entries(t.functions).find(([u,c])=>c.value.funcName===e.token.value);if(l)return l[1].cName}}}return Ee(e.token.value,e.$?.env)}function ac(e,t,n){let r;if(Bt(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||!Ce(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}`,c=`${a}_state_dispose`;n.types[i.id]={type:i,cName:s};let f=e.$?.awaitAnalysis;if(!f)throw new Error("Missing await analysis for async block. This should have been computed during evaluation.");let p=o.isFuture.outputType,_=M(p,n),m=n.emitter;if(m.emitDeclarationLine(`void ${c}(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:c,futureType:i,futureModuleType:o,resultType:p,resultTypeCName:_,captureType:e.$?.captureType,analysis:f});let g=e.$?.captureType;if(g){let h=Object.values(n.types).find(S=>S.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,C=g.fields.map(S=>{if(S.isEffectParam)return`.${S.label} = NULL`;let G;if(!T&&e.$?.deferredDupExpressions)for(let O of e.$.deferredDupExpressions){let B;if(F(O)&&(O.args.length>0&&U(O.args[0])?B=O.args[0].token.value:O.args.length===0&&F(O.func)&&E(O.func,".")&&O.func.args.length>=2&&U(O.func.args[0])&&(B=O.func.args[0].token.value)),B===S.label){G=O;break}}if(G)return $=!0,G.$?.variableName?(V(G,t,n),`.${S.label} = ${G.$.variableName}`):`.${S.label} = ${V(G,t,n)}`;let P={tag:"Atom",token:S.exprs.expr.token,$:S.exprs.expr.$};return`.${S.label} = ${Yi(P,n)}`}).join(", "),L=`(${d}){${C}}`;if(!$){let S=Dn(g,n);S&&(L=`${S}(${L})`)}let b=e.$?.variableName||"async_result",R=`${u}(${L})`;if(b&&e.$?.type){let S=ot(e.$.type,b,n);return n.emitter.emitLine(`${t}${S} = ${R};`),b}else return R}else{let h=e.$?.variableName||"async_result",d=`${u}()`;if(h&&e.$?.type){let v=ot(e.$.type,h,n);return n.emitter.emitLine(`${t}${v} = ${d};`),h}else return d}}function sc(e,t){let n=t.emitter,{asyncBlockId:r,structName:i,resultType:o,resultTypeCName:a,captureType:s,analysis:l}=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)"),ue(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 p=Object.values(t.types).find(m=>m.type===s),_=p?p.cName:`async_capture_${s.id}`;n.emitDeclarationLine(" // Captured variables from outer scope"),n.emitDeclarationLine(` ${_} __capture;`),n.emitDeclarationLine("")}let u=l.capturedVariables.filter(p=>p.kind!=="outer");if(u.length>0){n.emitDeclarationLine(" // Local variables");for(let p of u){let _=M(p.type,t),m=Oo(p.id,"local");n.emitDeclarationLine(` ${_} ${m}; // ${p.name}`)}n.emitDeclarationLine("")}if(l.awaitPoints.length>0){n.emitDeclarationLine(" // Await result temporaries");for(let p of l.awaitPoints)if(!(ue(p.resultType)||x(p.resultType)&&!p.resultType.resolvedConcreteType)){let m=p.resultType;if(p.futureType){let h=Dt(p.futureType);h&&(m=h.isFuture.outputType)}let g=M(m,t);n.emitDeclarationLine(` ${g} await_result_${p.index};`)}n.emitDeclarationLine("")}if(l.awaitPoints.length>0){let p=l.awaitPoints.filter(_=>_.futureVariableId===void 0);if(p.length>0){n.emitDeclarationLine(" // Future references for awaits");for(let _ of p){let m=_.expr;if(m.tag!=="FnCall")continue;let h=m.args[0]?.$?.type;if(!h)throw new Error(`Internal error: await expression missing type info for future argument in async block ${r}`);let d=M(h,t);n.emitDeclarationLine(` ${d} await_future_${_.index};`)}n.emitDeclarationLine("")}}let c=l.awaitPoints.filter(p=>p.needsOwnCondBranchField);if(c.length>0){n.emitDeclarationLine(" // Branch tracking for cond expressions with await");for(let p of c)n.emitDeclarationLine(` int cond_branch_${p.index}; // Which branch was taken in cond with await ${p.index}`);n.emitDeclarationLine("")}let f=l.awaitPoints.filter(p=>p.isInsideWhile);if(f.length>0){n.emitDeclarationLine(" // Loop state tracking for while loops with await");let p=l.awaitPoints.length;for(let _ of f){n.emitDeclarationLine(` _Bool while_loop_${_.index}_active; // Whether while loop ${_.index} should continue`);let m=(_.whileNestingDepth??1)-1;for(let g=0;g<m;g++)n.emitDeclarationLine(` _Bool while_loop_${p}_active; // Whether outer while loop ${p} should continue`),p++}n.emitDeclarationLine("")}n.emitDeclarationLine("};"),n.emitDeclarationLine("")}function ty(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=c=>{let f=r.get(c);f.has(l.structName)||(f.add(l.structName),i.set(l.structName,(i.get(l.structName)??0)+1))};for(let c of l.analysis.capturedVariables){let f;try{f=M(c.type,e)}catch{continue}let p=n.get(f);p&&p.structName!==l.structName&&u(p.structName)}for(let c of l.analysis.awaitPoints){if(c.futureVariableId!==void 0)continue;let f=c.expr;if(f.tag!=="FnCall")continue;let _=f.args[0]?.$?.type;if(!_)continue;let m;try{m=M(_,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 c of u){let f=(i.get(c)??0)-1;i.set(c,f),f===0&&o.push(c)}}let s=a.length===t.length?a.map(l=>n.get(l)).filter(Boolean):t;for(let l of s)sc({asyncBlockId:l.asyncBlockId,structName:l.structName,resultType:l.resultType,resultTypeCName:l.resultTypeCName,captureType:l.captureType,analysis:l.analysis},e)}function ny(e,t,n,r,i,o,a,s){let l=s.emitter;if(l.emitLine(`// Dispose function for async block ${e} state machine`),l.emitLine("// Called by __yo_decr_rc when refcount hits 0 - do NOT call __yo_free here"),l.emitLine(`void ${n}(void* sm_ptr) {`),l.emitLine(` ${t}* sm = (${t}*)sm_ptr;`),l.emitLine(` ASYNC_DEBUG("${n}: Disposing state machine\\n");`),l.emitLine(""),i&&Le(i)){let u=Object.values(s.types).find(c=>c.type===i);if(!u)l.emitLine(" /* Error: capture struct type not found in context */");else{let c=u.cName,f=i.trait.fields.find(p=>p.label===k.___drop[0]);if(f&&f.assignedValue&&ne(f.assignedValue)){let p=s.functions[f.assignedValue.funcId]?.cName;p&&(l.emitLine(' ASYNC_DEBUG(" Dropping capture struct\\n");'),l.emitLine(` ${p}(sm->__capture);`))}else l.emitLine(` /* Warning: ___drop function not found for capture struct ${c} */`)}}if(l.emitLine(""),!ue(r)&&Le(r)){let u=M(r,s);l.emitLine(" // Drop result field if it was set (state == -1 means completed)"),l.emitLine(" int final_state = sm->state;"),l.emitLine(" if (final_state == -1) {"),l.emitLine(' ASYNC_DEBUG(" Dropping result field\\n");');let c=cr(r,s);c?l.emitLine(` ${c}(sm->result);`):l.emitLine(` /* Warning: No ___drop function found for result type ${u} */`),l.emitLine(" }")}l.emitLine("");{let u=[];for(let c of o.capturedVariables){if(c.kind!=="local"||c.isOwningTheSameRcValueAs!==void 0)continue;let p=`sm->${Oo(c.id,"local")}`;if(be(c.type))u.push(` if ((${p}).data != NULL) { __yo_decr_rc((void*)(${p}).data); }`);else if(bt(c.type)||Tt(c.type))u.push(` if (${p} != NULL) { __yo_decr_rc_atomic((void*)${p}); }`);else if(ct(c.type)||x(c.type)&&on(c.type)){let _=cr(c.type,s);_?u.push(` if (${p} != NULL) { ${_}(${p}); }`):u.push(` if (${p} != NULL) { __yo_decr_rc((void*)${p}); }`)}else if(Le(c.type)){let _=cr(c.type,s);_&&u.push(` ${_}(${p});`)}}if(u.length>0){l.emitLine(" // Drop local variables on escape (state == -2)"),l.emitLine(" if (sm->state == -2) {");for(let c of u)l.emitLine(c);l.emitLine(" }")}}l.emitLine(" // Memory freed by __yo_decr_rc after this function returns"),l.emitLine("}")}function ry(e,t,n,r,i,o,a,s,l,u){let c=u.emitter;if(l){let f=Object.values(u.types).find(_=>_.type===l),p=f?f.cName:`async_capture_${l.id}`;c.emitLine(`${t}* ${r}(${p} __capture) {`)}else c.emitLine(`${t}* ${r}() {`);c.emitLine(" // Allocate async block state machine (heap-backed, ref-counted)"),c.emitLine(` ${t}* sm = (${t}*)__yo_malloc(sizeof(${t}));`),c.emitLine(` memset(sm, 0, sizeof(${t}));`),c.emitLine(""),c.emitLine(" // Initialize reference counting header"),c.emitLine(" sm->header.ref_count = 1; // Caller owns initial reference"),c.emitLine(` GC_DEBUG("AsyncBlock ${t}: Created ptr=%p RC=1\\n", (void*)sm);`),c.emitLine(" sm->header.gc_flags = 0;"),c.emitLine(" sm->header.gc_mark = YO_GC_UNMARKED;"),c.emitLine(" sm->header.gc_next = NULL;"),c.emitLine(" sm->header.gc_prev = NULL;"),c.emitLine(` sm->header.dispose_fn = (void(*)(void*))${i};`),c.emitLine(" sm->header.traverse_fn = NULL; // TODO: Add traverse for cycle detection if needed"),c.emitLine(""),c.emitLine(" sm->state = 0;"),c.emitLine(" sm->continuation_fn = NULL;"),c.emitLine(" sm->continuation_sm = NULL;"),c.emitLine(""),l&&(c.emitLine(" // Initialize captured variables"),c.emitLine(" sm->__capture = __capture;"),c.emitLine("")),c.emitLine(" // Initialize result (will be set when async block completes)"),ue(a)?c.emitLine(" // Result is unit type, no initialization needed"):c.emitLine(` memset(&sm->result, 0, sizeof(${s}));`),c.emitLine(""),c.emitLine(` sm->__yo_resume_fn = (void(*)(void*))${n};`),c.emitLine(""),c.emitLine(" return sm;"),c.emitLine("}"),c.emitLine("")}function lc(e){if(!e.deferredAsyncBlocks||e.deferredAsyncBlocks.length===0)return;let t=e.emitter;ty(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:c,futureType:f,resultType:p,resultTypeCName:_,captureType:m,analysis:g}=r,h=e.stateMachineVariables,d=e.currentEvidenceParams,v=new Map;for(let $ of g.capturedVariables)v.set($.id,$);if(m)for(let $ of m.fields)v.set($.label,{id:$.label,name:$.label,type:$.type,kind:"outer",isOwningTheSameRcValueAs:void 0});e.stateMachineVariables=v;let T=Ju(o,a,s,l,g,f,m,e);if(e.stateMachineVariables=h,e.currentEvidenceParams=d,t.emitLine(""),ny(a,s,c,p,m,g,T,e),t.emitLine(""),ry(a,s,l,u,c,f,p,_,m,e),t.emitLine(""),e.deferredAsyncBlocks.length>i){let $=e.deferredAsyncBlocks.slice(i);for(let C of $)sc({asyncBlockId:C.asyncBlockId,structName:C.structName,resultType:C.resultType,resultTypeCName:C.resultTypeCName,captureType:C.captureType,analysis:C.analysis},e)}n++}}function uc(e){for(let t in e.functions){let{value:n}=e.functions[t];n.body&&cc(n.body,e)}}function cc(e,t){if(e&&F(e)){let n=e;if(Bt(e)){let r=e.$?.type;if(r&&Ce(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(Bt(e)){let r=e.$?.type;if(r&&Ce(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"}`)}}for(let r of n.args)cc(r,t)}}function fc(e,t,n){let r=e.$?.type;if(!r||!Ce(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,a=M(o,n),s=e.$?.asyncStateMachineStructName;if(!s)return"/* Error: Missing sync future struct name */";let l=`${s}_dispose`,u=`${s}_resume`,c=n.emitter,f=e.$?.runtimeArgExprsInOrder?.[0];if(!f?.$)return"/* Error: Missing closure argument for io.async */";let p=V(f,t,n),_=f.$.type,m,g;if(x(_)&&_.resolvedConcreteType){let b=_.resolvedConcreteType,R=n.implClosureCallMap.get(b.id);R&&(m=R.functionCName);let S=n.types[b.id];S&&(g=S.cName)}if(!m||!g)return"/* Error: no closure function or capture type for io.async sync path */";c.emitDeclarationLine(`struct ${s}_struct {`),c.emitDeclarationLine(" yo_ref_header_t header;"),c.emitDeclarationLine(" int state;"),ue(o)?c.emitDeclarationLine(" uint8_t result;"):c.emitDeclarationLine(` ${a} result;`),c.emitDeclarationLine(" void (*continuation_fn)(void*);"),c.emitDeclarationLine(" void* continuation_sm;"),c.emitDeclarationLine(" void (*__yo_resume_fn)(void*);"),c.emitDeclarationLine(` ${g} __capture;`),c.emitDeclarationLine("};"),c.emitDeclarationLine("");let h="";for(let b in n.functions){let R=n.functions[b];if(R.cName===m){let S=wt(R.value.type);S.length>0&&(h=", "+S.map(G=>`(void*)sm->__capture.${G.fieldPath.join(".")}`).join(", "));break}}c.emitDeclarationLine(`void ${u}(void* ptr) {`),c.emitDeclarationLine(` ${s}* sm = (${s}*)ptr;`),ue(o)?c.emitDeclarationLine(` ${m}(&sm->__capture${h});`):c.emitDeclarationLine(` sm->result = ${m}(&sm->__capture${h});`),h&&(c.emitDeclarationLine(" if (__yo_effect_escaped) {"),c.emitDeclarationLine(" __yo_effect_escaped = 0;"),c.emitDeclarationLine(" sm->state = -2;"),c.emitDeclarationLine(" return;"),c.emitDeclarationLine(" }")),c.emitDeclarationLine(" sm->state = -1;"),c.emitDeclarationLine(" void (*continuation)(void*) = sm->continuation_fn;"),c.emitDeclarationLine(" if (continuation) {"),c.emitDeclarationLine(" void* cont_sm = sm->continuation_sm;"),c.emitDeclarationLine(" continuation(cont_sm);"),c.emitDeclarationLine(" }"),c.emitDeclarationLine(" __yo_decr_rc(ptr);"),c.emitDeclarationLine("}"),c.emitDeclarationLine("");let d=f.$.captureType,v=d&&Le(d)?cr(d,n):void 0,T=d&&Le(d)?Dn(d,n):void 0,$=cr(o,n);c.emitDeclarationLine(`void ${l}(void* ptr) {`),(v||$)&&(c.emitDeclarationLine(` ${s}* sm = (${s}*)ptr;`),v&&(c.emitDeclarationLine(" // Drop captured variables (future owns its references)"),c.emitDeclarationLine(` ${v}(sm->__capture);`)),$&&(c.emitDeclarationLine(" if (sm->state == -1) {"),c.emitDeclarationLine(` ${$}(sm->result);`),c.emitDeclarationLine(" }"))),c.emitDeclarationLine("}"),c.emitDeclarationLine("");let C=e.$?.variableName||"__io_async_result",L=ot(r,C,n);return c.emitLine(`${t}${L} = (${s}*)__yo_malloc(sizeof(${s}));`),c.emitLine(`${t}memset(${C}, 0, sizeof(${s}));`),c.emitLine(`${t}${C}->header.ref_count = 1;`),c.emitLine(`${t}${C}->header.gc_flags = 0;`),c.emitLine(`${t}${C}->header.gc_mark = YO_GC_UNMARKED;`),c.emitLine(`${t}${C}->header.gc_next = NULL;`),c.emitLine(`${t}${C}->header.gc_prev = NULL;`),c.emitLine(`${t}${C}->header.dispose_fn = (void(*)(void*))${l};`),c.emitLine(`${t}${C}->header.traverse_fn = NULL;`),c.emitLine(`${t}${C}->__capture = ${p};`),T&&c.emitLine(`${t}${C}->__capture = ${T}(${C}->__capture);`),c.emitLine(`${t}${C}->state = 0;`),c.emitLine(`${t}${C}->__yo_resume_fn = ${u};`),c.emitLine(`${t}${C}->continuation_fn = NULL;`),c.emitLine(`${t}${C}->continuation_sm = NULL;`),C}function pc(e,t){for(let i=0;i<e.fields.length;i++){let o=e.fields[i];ne(o)&&(kr(o.type,t),pi(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(kr(o.value.type,t),o.value.specializedType&&kr(o.value.specializedType,t),pi(o.value.body,t),o.value.calledComptimeFunctionCaches)for(let a of o.value.calledComptimeFunctionCaches)a.value&&a.value.type&&Mt(a.value.type,t),pi(a.body,t)}}}function kr(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 pi(e,t){if(e.$&&e.$.type&&Mt(e.$.type,t),e.$&&e.$.value&&ne(e.$.value)){let n=e.$.value;n.isControlFunction?(kr(n.type,t),Wt(n.body,t)):t.functions[n.funcId]||n.type.parameters.map(o=>o.type).some(o=>x(o)&&Ce(o)&&!o.resolvedConcreteType)||(t.functions[n.funcId]={value:n,cName:te(n.funcId)},kr(n.type,t),Wt(n.body,t))}if(e.$&&e.$.deferredDropExpressions&&e.$.deferredDropExpressions.length>0)for(let n of e.$.deferredDropExpressions)pi(n,t);if(e.$&&e.$.macroExpansion&&pi(e.$.macroExpansion,t),e.$&&e.$.runtimeDestructurings)for(let{type:n}of e.$.runtimeDestructurings)Mt(n,t);if(e.$&&e.$.captureType&&ce(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},kr(i.type,t),Wt(i.body,t))}}}switch(e.tag){case"FnCall":if(E(e,I.test))break;pi(e.func,t);for(let n of e.args)pi(n,t);break;case"Atom":e.$?.value&&D(e.$.value)&&Mt(e.$.value.value,t);break}}function Mt(e,t){if(!t.types[e.id]){if(x(e)&&Yt(e)){if(e.resolvedConcreteType){Mt(e.resolvedConcreteType,t);return}let n=en(e);n&&Mt(n,t);return}if(x(e)&&Ce(e)){let n=Dt(e);n&&Mt(n.isFuture.outputType,t);return}if(x(e)&&e.resolvedConcreteType){Mt(e.resolvedConcreteType,t);return}if(!Fe(e)){if(ce(e)||_t(e)||ye(e)||we(e)||be(e)||ve(e)||Ve(e)||Xe(e)||bt(e)||Tt(e)){let n=Xe(e)?M(e,t):`yo_${e.id}`;if(t.types[e.id]={type:e,cName:n},ce(e))for(let r of e.fields)Mt(r.type,t);if(ye(e)){for(let r of e.variants)if(r.fields)for(let i of r.fields)Mt(i.type,t)}if(_t(e))for(let r of e.fields)Mt(r.type,t);if(be(e)){let r=e;for(let i of r.requiredTraits)Mt(i.traitType,t)}if(bt(e)){let r=e;Mt(r.childType,t),M(r,t)}if(Tt(e)){let r=e;Mt(r.childType,t),M(r,t)}if(Xe(e)&&Mt(e.childType,t),ve(e)||Ve(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)},kr(i.type,t),Wt(i.body,t))}else if(r.assignedValue&&(ze(r.assignedValue)||ht(r.assignedValue))){let i=r.assignedValue;Po(i,t)}}}else if(ke(e)){let n=e,r=n.childType,i=n.length;if(Re(i)){Mt(r,t);let o=M(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(Ne(e)){if(Mt(e.childType,t),Xe(e.childType)){let r=e.childType.childType;Mt(r,t);let i=M(r,t),o=`Slice_${te(i)}`;t.sliceStructTypes.has(o)||t.sliceStructTypes.set(o,{childType:i})}t.types[e.id]={type:e,cName:M(e,t)}}else Hu.has(e.tag)&&(t.types[e.id]={type:e,cName:M(e,t)});e.trait&&Mt(e.trait,t)}}}function _i(e){if(e.$&&e.$.value&&_e(e.$.value)&&!(z(e.$.type)&&e.$.type.isExtern)){if(!ue(e.$.type))return!0}if(F(e)){if(_i(e.func))return!0;for(let t of e.args)if(!(t.$?.type&&ue(t.$.type))&&_i(t))return!0}if(e.$&&e.$.macroExpansion){if(e.$.type&&ue(e.$.type))return!1;if(_i(e.$.macroExpansion))return!0}if(e.$?.deferredDupExpressions){for(let t of e.$.deferredDupExpressions)if(_i(t))return!0}if(e.$?.deferredDropExpressions){for(let t of e.$.deferredDropExpressions)if(_i(t))return!0}return!1}function Po(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)};Wt(r.body,t)}}}function _c(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)},Wt(r.body,t)):r&&ze(r)&&_c(r,t)}}function Wt(e,t){if(e.$?.value&&ze(e.$.value)){let i=e.$.value;_c(i,t)}if(F(e)&&E(e,I.test)||F(e)&&E(e,k.comptime_expect_error))return;if(e.$&&e.$.macroExpansion&&Wt(e.$.macroExpansion,t),e.$?.effectAnalysis){let i=e.$.effectAnalysis.handlerValue;i&&ne(i)&&Wt(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)},Wt(i.body,t))}if(F(e)&&e.$&&e.$.dynCallTraitValues&&e.$.dynCallTraitValues.length>0){let i=e.$.type,o=e.args[0];if(be(i)&&o&&o.$?.type){let a=o.$.type,s=e.$.dynCallTraitValues;if(s.length>0&&(ct(a)||hn(a))){let l=hn(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(z(i)){if(ne(o)&&o.isControlFunction){Wt(o.body,t);for(let a of e.args)Wt(a,t);return}if(ne(o)){if(o.type.return.isCompileTimeOnly||Ya(o)&&!o.specializedType)return;if(o.specializedType&&Zn(o.specializedType)&&wt(o.specializedType).length===0){Wt(e.func,t);for(let s of e.args)Wt(s,t);return}if(!t.functions[o.funcId]){let a=!1;if(_i(o.body)){let s=o.specializedType??o.type;if(a=s.implicitParameters.length>0&&(wt(s).length>0||!Zn(o.type)&&o.type.implicitParameters.length>0),!a)return}if(!a&&!(wt(o.specializedType??o.type).length>0)&&(o.specializedType??o.type).parameters.map(c=>c.type).some(c=>x(c)&&Ce(c)&&!c.resolvedConcreteType))return;t.functions[o.funcId]={value:o,cName:te(o.funcId)},Wt(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}}}}Wt(e.func,t);for(let a of e.args)Wt(a,t)}let n=e.$?.type,r=e.$?.value;if(z(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)},Wt(o.body,t))}Wt(r.body,t);return}if(ne(r)){if(Ya(r)&&!r.specializedFunctionCaches||t.functions[r.funcId])return;if(_i(r.body))return;t.functions[r.funcId]={value:r,cName:te(r.funcId)},Wt(r.body,t)}}if(D(e.$?.value)&&Mt(e.$.value.value,t),e.$?.deferredDupExpressions)for(let i of e.$.deferredDupExpressions)Wt(i,t);if(e.$?.deferredDropExpressions)for(let i of e.$.deferredDropExpressions)Wt(i,t);if(e.$?.dynCallTraitValues)for(let i of e.$.dynCallTraitValues)Po(i,t)}function dc(e){let t=k.dispose[0];for(let n in e.types){let{type:r}=e.types[n];if(!ce(r)||!r.isReferenceSemantics)continue;let i=ur({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)},kr(a.type,e),Wt(a.body,e)}}}function mc(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 yc(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=x(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=M(i,e);t.emitLine(`${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(`void __yo_dispose_${a}(void* ptr) {`),t.emitLine(` ${a}* box = (${a}*)ptr;`);let u=(x(r.concreteType)&&r.concreteType.resolvedConcreteType?r.concreteType.resolvedConcreteType:r.concreteType).trait?.fields.find(c=>c.label===k.___drop[0]);if(u&&u.assignedValue&&ne(u.assignedValue)){let c=e.functions[u.assignedValue.funcId]?.cName;c&&t.emitLine(` ${c}(box->value);`)}t.emitLine("}"),t.emitLine("")}}function gc(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(!Ct(a))continue;let s=a.isFn.callType,l=M(s.return.type,e),u=`yo_wrap_${n}_call`,c=["void* self_ptr"];for(let f=0;f<s.parameters.length;f++){let p=s.parameters[f],_=M(p.type,e);c.push(`${_} arg${f+1}`)}if(t.emitDeclarationLine(`static ${l} ${u}(${c.join(", ")}) {`),hn(i)){let f=e.types[i.id]?.cName||`unknown_${i.id}`,p=te(i.fields[0].label);t.emitDeclarationLine(` ${f}* box = (${f}*)self_ptr;`);let _=i.fields[0].type,m=x(_)&&_.resolvedConcreteType?_.resolvedConcreteType:_,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->${p}`);for(let v=0;v<s.parameters.length;v++)d.push(`arg${v+1}`);mr(s.return.type)?t.emitDeclarationLine(` ${h}(${d.join(", ")});`):t.emitDeclarationLine(` return ${h}(${d.join(", ")});`)}else{d.push(`box->${p}.data`);for(let v=0;v<s.parameters.length;v++)d.push(`arg${v+1}`);mr(s.return.type)?t.emitDeclarationLine(` box->${p}.call(${d.join(", ")});`):t.emitDeclarationLine(` return box->${p}.call(${d.join(", ")});`)}}else{t.emitDeclarationLine(" (void)self_ptr; /* Dyn(Fn): expected Box(...) data */");for(let f=0;f<s.parameters.length;f++)t.emitDeclarationLine(` (void)arg${f+1};`);mr(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(Ct(s))continue;let l=r.traitValues[a];if(!l){t.emitDeclarationLine(`/* Warning: Module value missing for module ${a} */`);continue}let c=l.type.fields;for(let f=0;f<c.length;f++){let p=c[f];if(p.label==="Self"||o.has(p.label))continue;let _=l.fields[f];if(!_||!ne(_)){t.emitDeclarationLine(`/* Warning: Module field ${p.label} is not a function value */`);continue}let m=p.type;if(!z(m)){t.emitDeclarationLine(`/* Warning: Module field ${p.label} is not a function type */`);continue}let g=_.funcId,h=e.functions[g]?.cName;if(!h){t.emitDeclarationLine(`/* Warning: Impl function for ${p.label} not found */`);continue}let d=`yo_wrap_${n}_${p.label}`,v=M(m.return.type,e),T=["void* self_ptr"];for(let b=1;b<m.parameters.length;b++){let R=m.parameters[b],S=M(R.type,e);T.push(`${S} arg${b}`)}t.emitDeclarationLine(`static ${v} ${d}(${T.join(", ")}) {`);let $=m.parameters[0]?.type,C;if(hn(i)){let b=e.types[i.id]?.cName||`unknown_${i.id}`,R=te(i.fields[0].label);t.emitDeclarationLine(` ${b}* box = (${b}*)self_ptr;`),$&&Ne($)?C=`&box->${R}`:C=`box->${R}`}else{let b=M(r.concreteType,e);t.emitDeclarationLine(` ${b} concrete_value = (${b})self_ptr;`),$&&Ne($)?C="&concrete_value":C="concrete_value"}let L=[C];for(let b=1;b<m.parameters.length;b++)L.push(`arg${b}`);mr(m.return.type)?t.emitDeclarationLine(` ${h}(${L.join(", ")});`):t.emitDeclarationLine(` return ${h}(${L.join(", ")});`),t.emitDeclarationLine("}"),t.emitDeclarationLine("")}}}}}function hc(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=x(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=x(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`,c=`yo_typeid_${s}`;t.emitDeclarationLine(`// Vtable for impl(${s}, ${i.dynType.requiredTraits.map(({traitType:_})=>_.typeName||"?").join(" + ")})`),t.emitDeclarationLine(`static const ${u} ${l} = {`),t.emitDeclarationLine(` .__yo_type_id = (uintptr_t)&${c},`);let f=new Set,p=new Set([k.___dup[0],k.___drop[0],k.___dispose[0],k.dispose[0]]);for(let{traitType:_}of i.dynType.requiredTraits){if(Ct(_)){let m=`yo_wrap_${r}_call`;t.emitDeclarationLine(` .call = ${m},`),f.add("call");continue}for(let m of _.fields)if(m.label!=="Self"&&!p.has(m.label)&&!f.has(m.label)&&(f.add(m.label),z(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 vc(e){e.emitLine(`
|
|
191
|
+
`)){let de=W.trim();de&&(l.emitLine(` ${de}`),g.push(de))}l.emitLine("")}}l.emitLine(" // Final state - complete the Future"),Cr({emitter:l,indent:" ",debugLabel:"Future %p completed"})}s.inAsyncStateMachine=$,s.stateMachineVariables=C,s.variableIdRemapping=L}else s.inAsyncStateMachine=$,s.stateMachineVariables=C,s.variableIdRemapping=L;l.emitLine(" }")}return l.emitLine(" }"),l.emitLine("}"),l.emitLine(""),g}function Qs(e,t,n,r,i){let o=i.emitter,a=Zs(t,n);if(e.tag==="FnCall"&&E(e,":=")){let s=e.args[1];if(s&&s.tag==="FnCall"&&Tn(s)){let l=s.args[0];if(l){let u=V(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"&&Tn(e)){let s=e.args[0];if(s){let l=V(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)){Hi(e,t,0,r,i);return}if(e.tag==="FnCall"&&E(e,I.match)){Hi(e,t,0,r,i);return}if(e.tag==="FnCall"&&E(e,I.while)){Hi(e,t,0,r,i);return}if(e.tag==="FnCall"&&E(e,I.begin)){Hi(e,t,0,r,i);return}o.emitLine(`${r}// Warning: unhandled await pattern in remaining expressions`)}function ec(e){if(Et(e,"return")||E(e,"return"))return!0;if(e.tag==="FnCall"){for(let t of e.args)if(ec(t))return!0}return!1}function Ym(e){let t=[];for(let n of e)if(n.isEffectRowSpread){let r=n.type;x(r)&&r.resolvedConcreteType&&(r=r.resolvedConcreteType),rt(r)&&t.push(...r.implicitParameters)}else t.push(n);return t}function jm(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=Ym(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 c=0;c<a.length&&c<u.length;c++){let f=a[c],p=u[c];if(z(f.type)){if(f.type.forallParameters.length>0)continue;let _=V(p,n,r),m=f.label;s.emitLine(`${n}${t}->__capture.${m} = (void*)${_};`)}else ve(f.type)&&Zu(f.type,t,n,p.$?.value,r,e)}}else for(let u of a)if(z(u.type)){if(u.type.forallParameters.length>0)continue;let c=Km(u.label,r,e);c&&s.emitLine(`${n}${t}->__capture.${u.label} = (void*)${c};`)}else ve(u.type)&&Zu(u.type,t,n,void 0,r,e)}function Zu(e,t,n,r,i,o){let a=i.emitter;for(let s of e.fields){if(!z(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&&ze(r)){let u=e.fields.indexOf(s),c=r.fields[u];if(c&&ne(c)){let f=i.functions[c.funcId];f&&(l=f.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 c=un(u,f=>f.isImplicit===!0);for(let f=c.length-1;f>=0;f--){let p=c[f],_=p.value?.[p.value.length-1];if(_&&ze(_)){let m=_.type.fields.findIndex(g=>g.label===s.label);if(m>=0){let g=_.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 Km(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 Xm=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_create","yo_thread_join","yo_thread_self"]);function tc(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(Xm.has(r))continue;Js(i,r,!0,e);continue}i.isExtern==="c"&&i.cInclude||r.startsWith("__atomic_")||r.startsWith("__sync_")||Js(i,r,!0,e)}t.emitDeclarationLine(""),t.emitDeclarationLine("/// Async runtime functions"),t.emitDeclarationLine("void yo_async_spawn_task(void (*resume_fn)(void*), void* state_machine);"),t.emitDeclarationLine("void yo_future_dispose(void* ptr);"),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Object constructors"),Zm(e),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Closure constructors"),t.emitDeclarationLine(""),t.emitDeclarationLine("/// Capture dispose functions"),Jm(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&&wt(i.specializedType??i.type).length===0&&[...i.type.implicitParameters,...i.type.parameters.filter(g=>g.isImplicit)].some(g=>z(g.type)))continue;let u=i.specializedType??i.type,c=wt(u).length>0;if(!o&&i.isIoAsyncStateMachineClosure||!o&&!s&&!c&&!i.isModuleEffectMember&&(Jn(i.type)&&!i.type.isClosure||i.specializedFunctionCaches?.length>0&&!i.type.isClosure||Pr(i)||Ui(i)||i.isIoAsyncStateMachineClosure))continue;let f=i.specializedType??i.type,p=!s&&!i.isModuleEffectMember&&(f.parameters.some(g=>Fe(g.type))||f.forallParameters.length>0),_=Fe(f.return.type),m=x(f.return.type)&&f.return.type.requiredTraits.length>0;p||_&&!m&&!i.isModuleEffectMember||Js(f,r,!1,e,i.isModuleEffectMember?void 0:i.body,i.specializedType&&wt(f).length===0&&wt(i.type).some(g=>g.fieldFunctionType.forallParameters&&g.fieldFunctionType.forallParameters.length>0)?i.type:void 0)}t.emitDeclarationLine("/// Closure vtable instances"),t.emitDeclarationLine("")}function wt(e){let t=[],n=Qm(e.implicitParameters);for(let r of n)ve(r.type)?nc(r.label,r.type,[],t):z(r.type)&&t.push({implicitLabel:r.label,fieldLabel:r.label,fieldPath:[r.label],fieldFunctionType:r.type,cParamName:te(r.label)});return t}function nc(e,t,n,r){for(let i of t.fields)if(z(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 ve(i.type)&&nc(e,i.type,[...n,i.label],r)}function Qm(e){let t=[];for(let n of e)if(n.isEffectRowSpread){let r=n.type;x(r)&&r.resolvedConcreteType&&(r=r.resolvedConcreteType),rt(r)&&t.push(...r.implicitParameters)}else t.push(n);return t}function pr(e,t,n,r,i){let o=r||M(e.return.type,n),a=e.parameters.filter(f=>!f.isCompileTimeOnly),s=[];e.isClosure&&s.push("void* closure_context");let l=a.map((f,p)=>{let _=te(f.label||`param${p}`);if(z(f.type))return pr(f.type,"(*)",n).replace(" (*)(",` (*${_})(`);{let m;return x(f.type)&&Ce(f.type)?f.type.resolvedConcreteType?m=M(f.type.resolvedConcreteType,n)+"*":m=M(f.type,n):m=M(f.type,n),`${m} ${_}`}});s.push(...l);let u=wt(i??e);for(let f of u)if(f.fieldFunctionType.forallParameters&&f.fieldFunctionType.forallParameters.length>0)s.push(`void* ${f.cParamName}`);else{let p=pr(f.fieldFunctionType,"(*)",n).replace(" (*)(",` (*${f.cParamName})(`);s.push(p)}let c=s.join(", ");return`${o} ${t}(${c})`}function Js(e,t,n,r,i,o){let a;if(i&&Ce(e.return.type)){let u=Vo(i);u?.$?.asyncStateMachineStructName?a=`${u.$.asyncStateMachineStructName}*`:i.$?.type&&x(i.$.type)&&Ce(i.$.type)&&(a=M(i.$.type,r))}if(i&&x(e.return.type)&&!Ce(e.return.type)&&i.$?.type&&(a=M(i.$.type,r)),!a&&i&&i.$?.type&&!Ce(e.return.type)){let u=M(e.return.type,r),c=M(i.$.type,r);u!==c&&(a=c)}let s=a?pr(e,t,r,a,o):pr(e,t,r,void 0,o),l=A(e);r.emitter.emitDeclarationLine(`${n?"extern ":""}${s}; // ${l}`)}function Zm(e){let t=e.emitter;t.emitDeclarationLine("void __yo_decr_rc(void* ptr); // Decrement reference count"),t.emitDeclarationLine("void* __yo_incr_rc(void* ptr); // Increment reference count"),t.emitDeclarationLine("void __yo_gc_register(void* ptr); // Register object for cycle detection"),t.emitDeclarationLine("void __yo_gc_unregister(void* ptr); // Unregister object from cycle detection"),t.emitDeclarationLine("void __yo_gc_collect(); // Trigger garbage collection"),t.emitDeclarationLine("void __yo_gc_init_thread(); // Initialize thread-local GC state (for worker threads)"),t.emitDeclarationLine("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(ce(r)&&r.isReferenceSemantics){if(r.fields.some(l=>Fe(l.type)))continue;let a=`__yo_new_${i}`,s=r.fields.map(l=>{let u=M(l.type,e),c=te(l.label);return`${u} ${c}`}).join(", ");t.emitDeclarationLine(`${i}* ${a}(${s}); // Constructor`)}}}function Jm(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(`void ${r}(void* closure_ptr);`)}}function rc(e){let t=new Set;for(let n in e.functions){let{value:r,cName:i}=e.functions[n],o=r.specializedType;if(Pr(r)||!o||!On(r.type)||On(o))continue;let a=o.parameters.some(u=>Fe(u.type)),s=Fe(o.return.type);a||s||wt(r.type).some(u=>u.fieldFunctionType.forallParameters&&u.fieldFunctionType.forallParameters.length>0)||t.has(n)||(t.add(n),e.emitter.emitDeclarationLine(`${pr(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 ic(e){return!!(e.$?.closureFunctionValue&&e.$?.type&&Yt(e.$.type))}function ey(e,t,n,r,i,o=!1){let a=Object.values(i.types).find(_=>_.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 _ of n.$.deferredDupExpressions){let m=wa(_);m&&l.set(m,_)}let u=e.fields.map(_=>{if(_.isEffectParam)return"NULL";let m,g=_.exprs.expr;if(g.$?.deferredDupExpressions?.length&&(m=g.$.deferredDupExpressions[0]),!m){let d=[_.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 V(m,r,i);let h={tag:"Atom",token:g.token,$:g.$};return V(h,r,i)}),c=`(${s}){ ${u.map((_,m)=>{let g=e.fields[m];return g?`.${g.label} = ${_}`:`/* Error: missing field at index ${m} */`}).join(", ")} }`,f=n.token.position.row!==void 0?`${Date.now()}_${n.token.position.row}`:`${Date.now()}_${Math.random().toString(36).substr(2,9)}`,p=`__capture_${t}_${f}`;return o?i.emitter.emitLine(`${r}${s} ${p} = ${c};`):(i.emitter.emitLine(`${r}${s}* ${p} = (${s}*)__yo_malloc(sizeof(${s}));`),i.emitter.emitLine(`${r}*${p} = ${c};`)),{captureTempVar:p,captureCName:s}}function oc(e,t,n){if(!e.$||!e.$.type||!e.$.closureFunctionValue)return"// Error: Missing closure metadata";let r=en(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=be(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 c=a&&ce(a)&&a.fields.length>0,f=M(i.return.type,n),p=i.parameters.map(m=>M(m.type,n)).join(", "),_=`(${f} (*)(void*${p?", "+p:""}))${s}`;if(c&&a&&ce(a)){let m=!l,g=ey(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}, ${_})`}else return n.implClosureCallMap.set(a.id,{functionCName:s,callTypeId:r.isFn.callType.id}),h}else if(l){let m=`__yo_create_${u}`,g=`__yo_dispose_${u}`;return`${m}(NULL, ${g}, ${_})`}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}),`(${M(m.resolvedConcreteType,n)}){}`}return"// Error: Impl(Fn(...)) without captures missing resolvedConcreteType"}}function el(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=V(a,t,n);s&&n.emitter.emitLine(`${t}${s};`)}}}function Yi(e,t,n=""){let r=t;if(e.token.value==="continue"){if(r.currentContinueLabel)return el(r,n,t),`goto ${r.currentContinueLabel}`;if(r.currentLoopLabel)return el(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=V(s,n,t);l&&l.includes("sm->")&&a.emitLine(`${n}${l};`)}}if(r.smWhileContinueInfo.stepExpr){let a=t.emitter,s=V(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 el(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 c=V(u,n,t);c&&c.includes("sm->")&&l.emitLine(`${n}${c};`)}}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,c=ue(u);if(e.$?.deferredDropExpressions)for(let p of e.$.deferredDropExpressions){let _=V(p,n,t);_&&_.includes("sm->")&&a.emitLine(`${n}${_};`)}if(r.pendingDeferredDrops&&r.pendingDeferredDrops.length>0){a.emitLine(`${n}// Drop local variables before early completion`);for(let p of r.pendingDeferredDrops){let _=V(p,n,t);_&&_.includes("sm->")&&a.emitLine(`${n}${_};`)}}a.emitLine(`${n}// Early return - complete the result Future`);let f=c?void 0:`(${M(u,t)}){0}`;return Cr({emitter:a,indent:n,resultCode:f,debugLabel:t.currentFunctionName}),""}return"return"}if(e.$?.type&&ue(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],c=u.isOwningTheSameRcValueAs?u.isOwningTheSameRcValueAs.id:u.id;r.variableIdRemapping?.has(c)&&(c=r.variableIdRemapping.get(c));let f=r.stateMachineVariables.get(c);if(f){let p=f.kind==="outer"?`__capture.${a}`:`var_${f.id}`;return s=!0,`sm->${p}`}}}if(!s){for(let[l,u]of r.stateMachineVariables)if(u.name===a){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 c=u.isOwningTheSameRcValueAs.name,f=u.isOwningTheSameRcValueAs.id;for(let[p,_]of r.stateMachineVariables)if(_.name===c||p===f)return`sm->${_.kind==="outer"?`__capture.${c}`:`var_${p}`}`}}}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&&!_e(e.$.value)){let l=X(e.$.env,e.$.variableName);if(l.length>0&&l[l.length-1].isCompileTimeOnly)return Kt(e.$.value,t,e)}return Ee(e.$.variableName,e.$.env)}}if(e.$?.variableName){if(e.$?.env&&e.$?.value&&!_e(e.$.value)){let a=X(e.$.env,e.$.variableName);if(a.length>0&&a[a.length-1].isCompileTimeOnly)return Kt(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&&!_e(e.$.value))return Kt(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=>z(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(z(s.type)&&(_e(s.value?.[0])||s.value===void 0)){let l=Object.entries(t.functions).find(([u,c])=>c.value.funcName===e.token.value);if(l)return l[1].cName}}}return Ee(e.token.value,e.$?.env)}function ac(e,t,n){let r;if(Bt(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||!Ce(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}`,c=`${a}_state_dispose`;n.types[i.id]={type:i,cName:s};let f=e.$?.awaitAnalysis;if(!f)throw new Error("Missing await analysis for async block. This should have been computed during evaluation.");let p=o.isFuture.outputType,_=M(p,n),m=n.emitter;if(m.emitDeclarationLine(`void ${c}(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:c,futureType:i,futureModuleType:o,resultType:p,resultTypeCName:_,captureType:e.$?.captureType,analysis:f});let g=e.$?.captureType;if(g){let h=Object.values(n.types).find(S=>S.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,C=g.fields.map(S=>{if(S.isEffectParam)return`.${S.label} = NULL`;let G;if(!T&&e.$?.deferredDupExpressions)for(let O of e.$.deferredDupExpressions){let B;if(F(O)&&(O.args.length>0&&U(O.args[0])?B=O.args[0].token.value:O.args.length===0&&F(O.func)&&E(O.func,".")&&O.func.args.length>=2&&U(O.func.args[0])&&(B=O.func.args[0].token.value)),B===S.label){G=O;break}}if(G)return $=!0,G.$?.variableName?(V(G,t,n),`.${S.label} = ${G.$.variableName}`):`.${S.label} = ${V(G,t,n)}`;let P={tag:"Atom",token:S.exprs.expr.token,$:S.exprs.expr.$};return`.${S.label} = ${Yi(P,n)}`}).join(", "),L=`(${d}){${C}}`;if(!$){let S=Dn(g,n);S&&(L=`${S}(${L})`)}let b=e.$?.variableName||"async_result",R=`${u}(${L})`;if(b&&e.$?.type){let S=ot(e.$.type,b,n);return n.emitter.emitLine(`${t}${S} = ${R};`),b}else return R}else{let h=e.$?.variableName||"async_result",d=`${u}()`;if(h&&e.$?.type){let v=ot(e.$.type,h,n);return n.emitter.emitLine(`${t}${v} = ${d};`),h}else return d}}function sc(e,t){let n=t.emitter,{asyncBlockId:r,structName:i,resultType:o,resultTypeCName:a,captureType:s,analysis:l}=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)"),ue(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 p=Object.values(t.types).find(m=>m.type===s),_=p?p.cName:`async_capture_${s.id}`;n.emitDeclarationLine(" // Captured variables from outer scope"),n.emitDeclarationLine(` ${_} __capture;`),n.emitDeclarationLine("")}let u=l.capturedVariables.filter(p=>p.kind!=="outer");if(u.length>0){n.emitDeclarationLine(" // Local variables");for(let p of u){let _=M(p.type,t),m=Oo(p.id,"local");n.emitDeclarationLine(` ${_} ${m}; // ${p.name}`)}n.emitDeclarationLine("")}if(l.awaitPoints.length>0){n.emitDeclarationLine(" // Await result temporaries");for(let p of l.awaitPoints)if(!(ue(p.resultType)||x(p.resultType)&&!p.resultType.resolvedConcreteType)){let m=p.resultType;if(p.futureType){let h=Dt(p.futureType);h&&(m=h.isFuture.outputType)}let g=M(m,t);n.emitDeclarationLine(` ${g} await_result_${p.index};`)}n.emitDeclarationLine("")}if(l.awaitPoints.length>0){let p=l.awaitPoints.filter(_=>_.futureVariableId===void 0);if(p.length>0){n.emitDeclarationLine(" // Future references for awaits");for(let _ of p){let m=_.expr;if(m.tag!=="FnCall")continue;let h=m.args[0]?.$?.type;if(!h)throw new Error(`Internal error: await expression missing type info for future argument in async block ${r}`);let d=M(h,t);n.emitDeclarationLine(` ${d} await_future_${_.index};`)}n.emitDeclarationLine("")}}let c=l.awaitPoints.filter(p=>p.needsOwnCondBranchField);if(c.length>0){n.emitDeclarationLine(" // Branch tracking for cond expressions with await");for(let p of c)n.emitDeclarationLine(` int cond_branch_${p.index}; // Which branch was taken in cond with await ${p.index}`);n.emitDeclarationLine("")}let f=l.awaitPoints.filter(p=>p.isInsideWhile);if(f.length>0){n.emitDeclarationLine(" // Loop state tracking for while loops with await");let p=l.awaitPoints.length;for(let _ of f){n.emitDeclarationLine(` _Bool while_loop_${_.index}_active; // Whether while loop ${_.index} should continue`);let m=(_.whileNestingDepth??1)-1;for(let g=0;g<m;g++)n.emitDeclarationLine(` _Bool while_loop_${p}_active; // Whether outer while loop ${p} should continue`),p++}n.emitDeclarationLine("")}n.emitDeclarationLine("};"),n.emitDeclarationLine("")}function ty(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=c=>{let f=r.get(c);f.has(l.structName)||(f.add(l.structName),i.set(l.structName,(i.get(l.structName)??0)+1))};for(let c of l.analysis.capturedVariables){let f;try{f=M(c.type,e)}catch{continue}let p=n.get(f);p&&p.structName!==l.structName&&u(p.structName)}for(let c of l.analysis.awaitPoints){if(c.futureVariableId!==void 0)continue;let f=c.expr;if(f.tag!=="FnCall")continue;let _=f.args[0]?.$?.type;if(!_)continue;let m;try{m=M(_,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 c of u){let f=(i.get(c)??0)-1;i.set(c,f),f===0&&o.push(c)}}let s=a.length===t.length?a.map(l=>n.get(l)).filter(Boolean):t;for(let l of s)sc({asyncBlockId:l.asyncBlockId,structName:l.structName,resultType:l.resultType,resultTypeCName:l.resultTypeCName,captureType:l.captureType,analysis:l.analysis},e)}function ny(e,t,n,r,i,o,a,s){let l=s.emitter;if(l.emitLine(`// Dispose function for async block ${e} state machine`),l.emitLine("// Called by __yo_decr_rc when refcount hits 0 - do NOT call __yo_free here"),l.emitLine(`void ${n}(void* sm_ptr) {`),l.emitLine(` ${t}* sm = (${t}*)sm_ptr;`),l.emitLine(` ASYNC_DEBUG("${n}: Disposing state machine\\n");`),l.emitLine(""),i&&Le(i)){let u=Object.values(s.types).find(c=>c.type===i);if(!u)l.emitLine(" /* Error: capture struct type not found in context */");else{let c=u.cName,f=i.trait.fields.find(p=>p.label===k.___drop[0]);if(f&&f.assignedValue&&ne(f.assignedValue)){let p=s.functions[f.assignedValue.funcId]?.cName;p&&(l.emitLine(' ASYNC_DEBUG(" Dropping capture struct\\n");'),l.emitLine(` ${p}(sm->__capture);`))}else l.emitLine(` /* Warning: ___drop function not found for capture struct ${c} */`)}}if(l.emitLine(""),!ue(r)&&Le(r)){let u=M(r,s);l.emitLine(" // Drop result field if it was set (state == -1 means completed)"),l.emitLine(" int final_state = sm->state;"),l.emitLine(" if (final_state == -1) {"),l.emitLine(' ASYNC_DEBUG(" Dropping result field\\n");');let c=fr(r,s);c?l.emitLine(` ${c}(sm->result);`):l.emitLine(` /* Warning: No ___drop function found for result type ${u} */`),l.emitLine(" }")}l.emitLine("");{let u=[];for(let c of o.capturedVariables){if(c.kind!=="local"||c.isOwningTheSameRcValueAs!==void 0)continue;let p=`sm->${Oo(c.id,"local")}`;if(be(c.type))u.push(` if ((${p}).data != NULL) { __yo_decr_rc((void*)(${p}).data); }`);else if(bt(c.type)||Tt(c.type))u.push(` if (${p} != NULL) { __yo_decr_rc_atomic((void*)${p}); }`);else if(ct(c.type)||x(c.type)&&on(c.type)){let _=fr(c.type,s);_?u.push(` if (${p} != NULL) { ${_}(${p}); }`):u.push(` if (${p} != NULL) { __yo_decr_rc((void*)${p}); }`)}else if(Le(c.type)){let _=fr(c.type,s);_&&u.push(` ${_}(${p});`)}}if(u.length>0){l.emitLine(" // Drop local variables on escape (state == -2)"),l.emitLine(" if (sm->state == -2) {");for(let c of u)l.emitLine(c);l.emitLine(" }")}}l.emitLine(" // Memory freed by __yo_decr_rc after this function returns"),l.emitLine("}")}function ry(e,t,n,r,i,o,a,s,l,u){let c=u.emitter;if(l){let f=Object.values(u.types).find(_=>_.type===l),p=f?f.cName:`async_capture_${l.id}`;c.emitLine(`${t}* ${r}(${p} __capture) {`)}else c.emitLine(`${t}* ${r}() {`);c.emitLine(" // Allocate async block state machine (heap-backed, ref-counted)"),c.emitLine(` ${t}* sm = (${t}*)__yo_malloc(sizeof(${t}));`),c.emitLine(` memset(sm, 0, sizeof(${t}));`),c.emitLine(""),c.emitLine(" // Initialize reference counting header"),c.emitLine(" sm->header.ref_count = 1; // Caller owns initial reference"),c.emitLine(` GC_DEBUG("AsyncBlock ${t}: Created ptr=%p RC=1\\n", (void*)sm);`),c.emitLine(" sm->header.gc_flags = 0;"),c.emitLine(" sm->header.gc_mark = YO_GC_UNMARKED;"),c.emitLine(" sm->header.gc_next = NULL;"),c.emitLine(" sm->header.gc_prev = NULL;"),c.emitLine(` sm->header.dispose_fn = (void(*)(void*))${i};`),c.emitLine(" sm->header.traverse_fn = NULL; // TODO: Add traverse for cycle detection if needed"),c.emitLine(""),c.emitLine(" sm->state = 0;"),c.emitLine(" sm->continuation_fn = NULL;"),c.emitLine(" sm->continuation_sm = NULL;"),c.emitLine(""),l&&(c.emitLine(" // Initialize captured variables"),c.emitLine(" sm->__capture = __capture;"),c.emitLine("")),c.emitLine(" // Initialize result (will be set when async block completes)"),ue(a)?c.emitLine(" // Result is unit type, no initialization needed"):c.emitLine(` memset(&sm->result, 0, sizeof(${s}));`),c.emitLine(""),c.emitLine(` sm->__yo_resume_fn = (void(*)(void*))${n};`),c.emitLine(""),c.emitLine(" return sm;"),c.emitLine("}"),c.emitLine("")}function lc(e){if(!e.deferredAsyncBlocks||e.deferredAsyncBlocks.length===0)return;let t=e.emitter;ty(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:c,futureType:f,resultType:p,resultTypeCName:_,captureType:m,analysis:g}=r,h=e.stateMachineVariables,d=e.currentEvidenceParams,v=new Map;for(let $ of g.capturedVariables)v.set($.id,$);if(m)for(let $ of m.fields)v.set($.label,{id:$.label,name:$.label,type:$.type,kind:"outer",isOwningTheSameRcValueAs:void 0});e.stateMachineVariables=v;let T=Ju(o,a,s,l,g,f,m,e);if(e.stateMachineVariables=h,e.currentEvidenceParams=d,t.emitLine(""),ny(a,s,c,p,m,g,T,e),t.emitLine(""),ry(a,s,l,u,c,f,p,_,m,e),t.emitLine(""),e.deferredAsyncBlocks.length>i){let $=e.deferredAsyncBlocks.slice(i);for(let C of $)sc({asyncBlockId:C.asyncBlockId,structName:C.structName,resultType:C.resultType,resultTypeCName:C.resultTypeCName,captureType:C.captureType,analysis:C.analysis},e)}n++}}function uc(e){for(let t in e.functions){let{value:n}=e.functions[t];n.body&&cc(n.body,e)}}function cc(e,t){if(e&&F(e)){let n=e;if(Bt(e)){let r=e.$?.type;if(r&&Ce(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(Bt(e)){let r=e.$?.type;if(r&&Ce(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"}`)}}for(let r of n.args)cc(r,t)}}function fc(e,t,n){let r=e.$?.type;if(!r||!Ce(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,a=M(o,n),s=e.$?.asyncStateMachineStructName;if(!s)return"/* Error: Missing sync future struct name */";let l=`${s}_dispose`,u=`${s}_resume`,c=n.emitter,f=e.$?.runtimeArgExprsInOrder?.[0];if(!f?.$)return"/* Error: Missing closure argument for io.async */";let p=V(f,t,n),_=f.$.type,m,g;if(x(_)&&_.resolvedConcreteType){let b=_.resolvedConcreteType,R=n.implClosureCallMap.get(b.id);R&&(m=R.functionCName);let S=n.types[b.id];S&&(g=S.cName)}if(!m||!g)return"/* Error: no closure function or capture type for io.async sync path */";c.emitDeclarationLine(`struct ${s}_struct {`),c.emitDeclarationLine(" yo_ref_header_t header;"),c.emitDeclarationLine(" int state;"),ue(o)?c.emitDeclarationLine(" uint8_t result;"):c.emitDeclarationLine(` ${a} result;`),c.emitDeclarationLine(" void (*continuation_fn)(void*);"),c.emitDeclarationLine(" void* continuation_sm;"),c.emitDeclarationLine(" void (*__yo_resume_fn)(void*);"),c.emitDeclarationLine(` ${g} __capture;`),c.emitDeclarationLine("};"),c.emitDeclarationLine("");let h="";for(let b in n.functions){let R=n.functions[b];if(R.cName===m){let S=wt(R.value.type);S.length>0&&(h=", "+S.map(G=>`(void*)sm->__capture.${G.fieldPath.join(".")}`).join(", "));break}}c.emitDeclarationLine(`void ${u}(void* ptr) {`),c.emitDeclarationLine(` ${s}* sm = (${s}*)ptr;`),ue(o)?c.emitDeclarationLine(` ${m}(&sm->__capture${h});`):c.emitDeclarationLine(` sm->result = ${m}(&sm->__capture${h});`),h&&(c.emitDeclarationLine(" if (__yo_effect_escaped) {"),c.emitDeclarationLine(" __yo_effect_escaped = 0;"),c.emitDeclarationLine(" sm->state = -2;"),c.emitDeclarationLine(" return;"),c.emitDeclarationLine(" }")),c.emitDeclarationLine(" sm->state = -1;"),c.emitDeclarationLine(" void (*continuation)(void*) = sm->continuation_fn;"),c.emitDeclarationLine(" if (continuation) {"),c.emitDeclarationLine(" void* cont_sm = sm->continuation_sm;"),c.emitDeclarationLine(" continuation(cont_sm);"),c.emitDeclarationLine(" }"),c.emitDeclarationLine(" __yo_decr_rc(ptr);"),c.emitDeclarationLine("}"),c.emitDeclarationLine("");let d=f.$.captureType,v=d&&Le(d)?fr(d,n):void 0,T=d&&Le(d)?Dn(d,n):void 0,$=fr(o,n);c.emitDeclarationLine(`void ${l}(void* ptr) {`),(v||$)&&(c.emitDeclarationLine(` ${s}* sm = (${s}*)ptr;`),v&&(c.emitDeclarationLine(" // Drop captured variables (future owns its references)"),c.emitDeclarationLine(` ${v}(sm->__capture);`)),$&&(c.emitDeclarationLine(" if (sm->state == -1) {"),c.emitDeclarationLine(` ${$}(sm->result);`),c.emitDeclarationLine(" }"))),c.emitDeclarationLine("}"),c.emitDeclarationLine("");let C=e.$?.variableName||"__io_async_result",L=ot(r,C,n);return c.emitLine(`${t}${L} = (${s}*)__yo_malloc(sizeof(${s}));`),c.emitLine(`${t}memset(${C}, 0, sizeof(${s}));`),c.emitLine(`${t}${C}->header.ref_count = 1;`),c.emitLine(`${t}${C}->header.gc_flags = 0;`),c.emitLine(`${t}${C}->header.gc_mark = YO_GC_UNMARKED;`),c.emitLine(`${t}${C}->header.gc_next = NULL;`),c.emitLine(`${t}${C}->header.gc_prev = NULL;`),c.emitLine(`${t}${C}->header.dispose_fn = (void(*)(void*))${l};`),c.emitLine(`${t}${C}->header.traverse_fn = NULL;`),c.emitLine(`${t}${C}->__capture = ${p};`),T&&c.emitLine(`${t}${C}->__capture = ${T}(${C}->__capture);`),c.emitLine(`${t}${C}->state = 0;`),c.emitLine(`${t}${C}->__yo_resume_fn = ${u};`),c.emitLine(`${t}${C}->continuation_fn = NULL;`),c.emitLine(`${t}${C}->continuation_sm = NULL;`),C}function pc(e,t){for(let i=0;i<e.fields.length;i++){let o=e.fields[i];ne(o)&&(kr(o.type,t),pi(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(kr(o.value.type,t),o.value.specializedType&&kr(o.value.specializedType,t),pi(o.value.body,t),o.value.calledComptimeFunctionCaches)for(let a of o.value.calledComptimeFunctionCaches)a.value&&a.value.type&&Mt(a.value.type,t),pi(a.body,t)}}}function kr(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 pi(e,t){if(e.$&&e.$.type&&Mt(e.$.type,t),e.$&&e.$.value&&ne(e.$.value)){let n=e.$.value;n.isControlFunction?(kr(n.type,t),Wt(n.body,t)):t.functions[n.funcId]||n.type.parameters.map(o=>o.type).some(o=>x(o)&&Ce(o)&&!o.resolvedConcreteType)||(t.functions[n.funcId]={value:n,cName:te(n.funcId)},kr(n.type,t),Wt(n.body,t))}if(e.$&&e.$.deferredDropExpressions&&e.$.deferredDropExpressions.length>0)for(let n of e.$.deferredDropExpressions)pi(n,t);if(e.$&&e.$.macroExpansion&&pi(e.$.macroExpansion,t),e.$&&e.$.runtimeDestructurings)for(let{type:n}of e.$.runtimeDestructurings)Mt(n,t);if(e.$&&e.$.captureType&&ce(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},kr(i.type,t),Wt(i.body,t))}}}switch(e.tag){case"FnCall":if(E(e,I.test))break;pi(e.func,t);for(let n of e.args)pi(n,t);break;case"Atom":e.$?.value&&D(e.$.value)&&Mt(e.$.value.value,t);break}}function Mt(e,t){if(!t.types[e.id]){if(x(e)&&Yt(e)){if(e.resolvedConcreteType){Mt(e.resolvedConcreteType,t);return}let n=en(e);n&&Mt(n,t);return}if(x(e)&&Ce(e)){let n=Dt(e);n&&Mt(n.isFuture.outputType,t);return}if(x(e)&&e.resolvedConcreteType){Mt(e.resolvedConcreteType,t);return}if(!Fe(e)){if(ce(e)||_t(e)||ye(e)||we(e)||be(e)||ve(e)||Ve(e)||Xe(e)||bt(e)||Tt(e)){let n=Xe(e)?M(e,t):`yo_${e.id}`;if(t.types[e.id]={type:e,cName:n},ce(e))for(let r of e.fields)Mt(r.type,t);if(ye(e)){for(let r of e.variants)if(r.fields)for(let i of r.fields)Mt(i.type,t)}if(_t(e))for(let r of e.fields)Mt(r.type,t);if(be(e)){let r=e;for(let i of r.requiredTraits)Mt(i.traitType,t)}if(bt(e)){let r=e;Mt(r.childType,t),M(r,t)}if(Tt(e)){let r=e;Mt(r.childType,t),M(r,t)}if(Xe(e)&&Mt(e.childType,t),ve(e)||Ve(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)},kr(i.type,t),Wt(i.body,t))}else if(r.assignedValue&&(ze(r.assignedValue)||ht(r.assignedValue))){let i=r.assignedValue;Po(i,t)}}}else if(ke(e)){let n=e,r=n.childType,i=n.length;if(Re(i)){Mt(r,t);let o=M(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(Ne(e)){if(Mt(e.childType,t),Xe(e.childType)){let r=e.childType.childType;Mt(r,t);let i=M(r,t),o=`Slice_${te(i)}`;t.sliceStructTypes.has(o)||t.sliceStructTypes.set(o,{childType:i})}t.types[e.id]={type:e,cName:M(e,t)}}else Hu.has(e.tag)&&(t.types[e.id]={type:e,cName:M(e,t)});e.trait&&Mt(e.trait,t)}}}function _i(e){if(e.$&&e.$.value&&_e(e.$.value)&&!(z(e.$.type)&&e.$.type.isExtern)){if(!ue(e.$.type))return!0}if(F(e)){if(_i(e.func))return!0;for(let t of e.args)if(!(t.$?.type&&ue(t.$.type))&&_i(t))return!0}if(e.$&&e.$.macroExpansion){if(e.$.type&&ue(e.$.type))return!1;if(_i(e.$.macroExpansion))return!0}if(e.$?.deferredDupExpressions){for(let t of e.$.deferredDupExpressions)if(_i(t))return!0}if(e.$?.deferredDropExpressions){for(let t of e.$.deferredDropExpressions)if(_i(t))return!0}return!1}function Po(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)};Wt(r.body,t)}}}function _c(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)},Wt(r.body,t)):r&&ze(r)&&_c(r,t)}}function Wt(e,t){if(e.$?.value&&ze(e.$.value)){let i=e.$.value;_c(i,t)}if(F(e)&&E(e,I.test)||F(e)&&E(e,k.comptime_expect_error))return;if(e.$&&e.$.macroExpansion&&Wt(e.$.macroExpansion,t),e.$?.effectAnalysis){let i=e.$.effectAnalysis.handlerValue;i&&ne(i)&&Wt(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)},Wt(i.body,t))}if(F(e)&&e.$&&e.$.dynCallTraitValues&&e.$.dynCallTraitValues.length>0){let i=e.$.type,o=e.args[0];if(be(i)&&o&&o.$?.type){let a=o.$.type,s=e.$.dynCallTraitValues;if(s.length>0&&(ct(a)||hn(a))){let l=hn(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(z(i)){if(ne(o)&&o.isControlFunction){Wt(o.body,t);for(let a of e.args)Wt(a,t);return}if(ne(o)){if(o.type.return.isCompileTimeOnly||Ya(o)&&!o.specializedType)return;if(o.specializedType&&Jn(o.specializedType)&&wt(o.specializedType).length===0){Wt(e.func,t);for(let s of e.args)Wt(s,t);return}if(!t.functions[o.funcId]){let a=!1;if(_i(o.body)){let s=o.specializedType??o.type;if(a=s.implicitParameters.length>0&&(wt(s).length>0||!Jn(o.type)&&o.type.implicitParameters.length>0),!a)return}if(!a&&!(wt(o.specializedType??o.type).length>0)&&(o.specializedType??o.type).parameters.map(c=>c.type).some(c=>x(c)&&Ce(c)&&!c.resolvedConcreteType))return;t.functions[o.funcId]={value:o,cName:te(o.funcId)},Wt(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}}}}Wt(e.func,t);for(let a of e.args)Wt(a,t)}let n=e.$?.type,r=e.$?.value;if(z(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)},Wt(o.body,t))}Wt(r.body,t);return}if(ne(r)){if(Ya(r)&&!r.specializedFunctionCaches||t.functions[r.funcId])return;if(_i(r.body))return;t.functions[r.funcId]={value:r,cName:te(r.funcId)},Wt(r.body,t)}}if(D(e.$?.value)&&Mt(e.$.value.value,t),e.$?.deferredDupExpressions)for(let i of e.$.deferredDupExpressions)Wt(i,t);if(e.$?.deferredDropExpressions)for(let i of e.$.deferredDropExpressions)Wt(i,t);if(e.$?.dynCallTraitValues)for(let i of e.$.dynCallTraitValues)Po(i,t)}function dc(e){let t=k.dispose[0];for(let n in e.types){let{type:r}=e.types[n];if(!ce(r)||!r.isReferenceSemantics)continue;let i=cr({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)},kr(a.type,e),Wt(a.body,e)}}}function mc(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 yc(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=x(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=M(i,e);t.emitLine(`${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(`void __yo_dispose_${a}(void* ptr) {`),t.emitLine(` ${a}* box = (${a}*)ptr;`);let u=(x(r.concreteType)&&r.concreteType.resolvedConcreteType?r.concreteType.resolvedConcreteType:r.concreteType).trait?.fields.find(c=>c.label===k.___drop[0]);if(u&&u.assignedValue&&ne(u.assignedValue)){let c=e.functions[u.assignedValue.funcId]?.cName;c&&t.emitLine(` ${c}(box->value);`)}t.emitLine("}"),t.emitLine("")}}function gc(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(!Ct(a))continue;let s=a.isFn.callType,l=M(s.return.type,e),u=`yo_wrap_${n}_call`,c=["void* self_ptr"];for(let f=0;f<s.parameters.length;f++){let p=s.parameters[f],_=M(p.type,e);c.push(`${_} arg${f+1}`)}if(t.emitDeclarationLine(`static ${l} ${u}(${c.join(", ")}) {`),hn(i)){let f=e.types[i.id]?.cName||`unknown_${i.id}`,p=te(i.fields[0].label);t.emitDeclarationLine(` ${f}* box = (${f}*)self_ptr;`);let _=i.fields[0].type,m=x(_)&&_.resolvedConcreteType?_.resolvedConcreteType:_,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->${p}`);for(let v=0;v<s.parameters.length;v++)d.push(`arg${v+1}`);yr(s.return.type)?t.emitDeclarationLine(` ${h}(${d.join(", ")});`):t.emitDeclarationLine(` return ${h}(${d.join(", ")});`)}else{d.push(`box->${p}.data`);for(let v=0;v<s.parameters.length;v++)d.push(`arg${v+1}`);yr(s.return.type)?t.emitDeclarationLine(` box->${p}.call(${d.join(", ")});`):t.emitDeclarationLine(` return box->${p}.call(${d.join(", ")});`)}}else{t.emitDeclarationLine(" (void)self_ptr; /* Dyn(Fn): expected Box(...) data */");for(let f=0;f<s.parameters.length;f++)t.emitDeclarationLine(` (void)arg${f+1};`);yr(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(Ct(s))continue;let l=r.traitValues[a];if(!l){t.emitDeclarationLine(`/* Warning: Module value missing for module ${a} */`);continue}let c=l.type.fields;for(let f=0;f<c.length;f++){let p=c[f];if(p.label==="Self"||o.has(p.label))continue;let _=l.fields[f];if(!_||!ne(_)){t.emitDeclarationLine(`/* Warning: Module field ${p.label} is not a function value */`);continue}let m=p.type;if(!z(m)){t.emitDeclarationLine(`/* Warning: Module field ${p.label} is not a function type */`);continue}let g=_.funcId,h=e.functions[g]?.cName;if(!h){t.emitDeclarationLine(`/* Warning: Impl function for ${p.label} not found */`);continue}let d=`yo_wrap_${n}_${p.label}`,v=M(m.return.type,e),T=["void* self_ptr"];for(let b=1;b<m.parameters.length;b++){let R=m.parameters[b],S=M(R.type,e);T.push(`${S} arg${b}`)}t.emitDeclarationLine(`static ${v} ${d}(${T.join(", ")}) {`);let $=m.parameters[0]?.type,C;if(hn(i)){let b=e.types[i.id]?.cName||`unknown_${i.id}`,R=te(i.fields[0].label);t.emitDeclarationLine(` ${b}* box = (${b}*)self_ptr;`),$&&Ne($)?C=`&box->${R}`:C=`box->${R}`}else{let b=M(r.concreteType,e);t.emitDeclarationLine(` ${b} concrete_value = (${b})self_ptr;`),$&&Ne($)?C="&concrete_value":C="concrete_value"}let L=[C];for(let b=1;b<m.parameters.length;b++)L.push(`arg${b}`);yr(m.return.type)?t.emitDeclarationLine(` ${h}(${L.join(", ")});`):t.emitDeclarationLine(` return ${h}(${L.join(", ")});`),t.emitDeclarationLine("}"),t.emitDeclarationLine("")}}}}}function hc(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=x(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=x(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`,c=`yo_typeid_${s}`;t.emitDeclarationLine(`// Vtable for impl(${s}, ${i.dynType.requiredTraits.map(({traitType:_})=>_.typeName||"?").join(" + ")})`),t.emitDeclarationLine(`static const ${u} ${l} = {`),t.emitDeclarationLine(` .__yo_type_id = (uintptr_t)&${c},`);let f=new Set,p=new Set([k.___dup[0],k.___drop[0],k.___dispose[0],k.dispose[0]]);for(let{traitType:_}of i.dynType.requiredTraits){if(Ct(_)){let m=`yo_wrap_${r}_call`;t.emitDeclarationLine(` .call = ${m},`),f.add("call");continue}for(let m of _.fields)if(m.label!=="Self"&&!p.has(m.label)&&!f.has(m.label)&&(f.add(m.label),z(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 vc(e){e.emitLine(`
|
|
192
192
|
// ============================================================================
|
|
193
193
|
// Async/Await Runtime - Single-Threaded Cooperative Scheduler
|
|
194
194
|
// ============================================================================
|
|
@@ -9528,7 +9528,7 @@ static int __yo_poll_and_fs_event_tick(void) {
|
|
|
9528
9528
|
}
|
|
9529
9529
|
|
|
9530
9530
|
#endif // _WIN32
|
|
9531
|
-
`)}function bc(e,t){vc(e),Ec(e),$c(e),Cc(e),Tc(e)}function iy(e,t,n,r){if(e.$?.deferredDupExpressions&&e.$.deferredDupExpressions.length>0){tt(e,n,r);let i=e.$.deferredDupExpressions[0];if(F(i)&&i.$?.variableName)return Ee(i.$.variableName,i.$.env)}return t}function oy(e,t,n){if(e.$?.deferredDupExpressions&&e.$.deferredDupExpressions.length>0){if(e.$?.variableName){let i=e.$.variableName;e.$.variableName=void 0;let o=V(e,t,n);e.$.variableName=i;let a=M(e.$.type,n),s=te(i);s!==o&&n.emitter.emitLine(`${t}${a} ${s} = ${o};`)}else{let i=V(e,t,n);n.emitter.emitLine(`${t}${i};`)}tt(e,t,n);let r=e.$.deferredDupExpressions[0];if(F(r)&&r.$?.variableName)return Ee(r.$.variableName,r.$.env)}return V(e,t,n)}function ay(e){if(F(e)&&E(e,k.___drop)&&e.args.length>=1){let t=e.args[0];if(t&&U(t))return Ee(t.token.value,t.$?.env)}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])){let t=e.func.args[0];return Ee(t.token.value,t.$?.env)}}function cn(e,t,n,r=!1,i=!1,o=!1){if(t.pendingDeferredDrops&&t.pendingDeferredDrops.length>0){let a=new Set;if(!i&&n.$?.deferredDropExpressions)for(let u of n.$.deferredDropExpressions){let c=Ln(u);c&&a.add(c)}let s=t.effectSmConsumedArgCNames,l=n.$?.env&&!o?t.pendingDeferredDrops.filter(u=>{let c=Ln(u);return!c||a.has(c)?!1:X(n.$.env,c).length>0}):t.pendingDeferredDrops.filter(u=>{let c=Ln(u);if(!c||a.has(c))return!1;if(s&&s.size>0){let f=ay(u);if(f&&s.has(f))return!1}return!0});if(l.length>0){let u=r?"Drop local variables before early completion":"Drop local variables before early return";t.emitter.emitLine(`${e}// ${u}`);for(let c of l){let f=V(c,e,t);f&&t.emitter.emitLine(`${e}${f};`)}}}}function
|
|
9531
|
+
`)}function bc(e,t){vc(e),Ec(e),$c(e),Cc(e),Tc(e)}function iy(e,t,n,r){if(e.$?.deferredDupExpressions&&e.$.deferredDupExpressions.length>0){tt(e,n,r);let i=e.$.deferredDupExpressions[0];if(F(i)&&i.$?.variableName)return Ee(i.$.variableName,i.$.env)}return t}function oy(e,t,n){if(e.$?.deferredDupExpressions&&e.$.deferredDupExpressions.length>0){if(e.$?.variableName){let i=e.$.variableName;e.$.variableName=void 0;let o=V(e,t,n);e.$.variableName=i;let a=M(e.$.type,n),s=te(i);s!==o&&n.emitter.emitLine(`${t}${a} ${s} = ${o};`)}else{let i=V(e,t,n);n.emitter.emitLine(`${t}${i};`)}tt(e,t,n);let r=e.$.deferredDupExpressions[0];if(F(r)&&r.$?.variableName)return Ee(r.$.variableName,r.$.env)}return V(e,t,n)}function ay(e){if(F(e)&&E(e,k.___drop)&&e.args.length>=1){let t=e.args[0];if(t&&U(t))return Ee(t.token.value,t.$?.env)}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])){let t=e.func.args[0];return Ee(t.token.value,t.$?.env)}}function cn(e,t,n,r=!1,i=!1,o=!1){if(t.pendingDeferredDrops&&t.pendingDeferredDrops.length>0){let a=new Set;if(!i&&n.$?.deferredDropExpressions)for(let u of n.$.deferredDropExpressions){let c=Ln(u);c&&a.add(c)}let s=t.effectSmConsumedArgCNames,l=n.$?.env&&!o?t.pendingDeferredDrops.filter(u=>{let c=Ln(u);return!c||a.has(c)?!1:X(n.$.env,c).length>0}):t.pendingDeferredDrops.filter(u=>{let c=Ln(u);if(!c||a.has(c))return!1;if(s&&s.size>0){let f=ay(u);if(f&&s.has(f))return!1}return!0});if(l.length>0){let u=r?"Drop local variables before early completion":"Drop local variables before early return";t.emitter.emitLine(`${e}// ${u}`);for(let c of l){let f=V(c,e,t);f&&t.emitter.emitLine(`${e}${f};`)}}}}function Xn(e,t,n,r=!1){if(!t.consumedVarPendingDrops||t.consumedVarPendingDrops.length===0)return;let i=n.$?.env&&!r?t.consumedVarPendingDrops.filter(o=>{let a=Ln(o);return a?X(n.$.env,a).length>0:!1}):[...t.consumedVarPendingDrops];if(i.length>0){t.emitter.emitLine(`${e}// Drop consumed variables (escape propagation)`);for(let o of i){let a=V(o,e,t);a&&t.emitter.emitLine(`${e}${a};`)}}}function kc(e,t,n){let r=n;if(r.continuationVariables){let o=r.continuationVariables.get("resume");if(o&&"directReturnVar"in o){if(!o.isUnitReturn){let a=e.args[0];if(a){let s=V(a,t,n);s&&n.emitter.emitLine(`${t}${o.directReturnVar} = ${s};`)}}return cn(t,r,e,!1,!0),o.directExitLabel&&n.emitter.emitLine(`${t}goto ${o.directExitLabel};`),""}}let i=e.args[0];if(i){if(!e.$)throw new Error("Internal error: return expression missing metadata");if(!e.$.variableName&&!ue(e.$.type))return"// Error: return expression missing temporary variable name";let o,a=!1;if(r.inAsyncStateMachine&&i.$?.variableName){let f=i.$.variableName;i.$.variableName=void 0,o=V(i,t,n),i.$.variableName=f,a=!0}else if(i.$?.variableName&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){let f=i.$.variableName;i.$.variableName=void 0;let p=V(i,t,n);i.$.variableName=f;let _=M(i.$.type,n),m=Ee(f,i.$.env);m!==p&&n.emitter.emitLine(`${t}${_} ${m} = ${p};`),o=m}else o=V(i,t,n);let s=!1;if(i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){tt(i,t,r);let f=i.$.deferredDupExpressions[0];F(f)&&f.$?.variableName&&(o=Ee(f.$.variableName,f.$.env),s=!0)}let l=M(e.$.type,n),u=e.$.variableName?Ee(e.$.variableName,e.$.env):void 0;if(!s&&!ue(e.$.type)&&u&&u!==o&&n.emitter.emitLine(`${t}${l} ${u} = ${o};`),e.$.deferredDropExpressions&&$t(e,t,n),r.inAsyncStateMachine){let f=r.inAsyncStateMachine.futureType,_=Dt(f).isFuture.outputType,m=ue(_);cn(t,r,e,!0),n.emitter.emitLine(`${t}// Final state - complete the result Future`);let g;return m||(g=e.$.variableName&&a?e.$.variableName:e.$.variableName||o),Cr({emitter:n.emitter,indent:t,resultCode:g,debugLabel:n.currentFunctionName}),""}return cn(t,r,e),ue(e.$.type)?"return":`return ${s?o:u??o}`}else{if(e.$?.deferredDropExpressions&&$t(e,t,n),r.inAsyncStateMachine){let o=r.inAsyncStateMachine.futureType,s=Dt(o).isFuture.outputType,l=ue(s);cn(t,r,e,!0),n.emitter.emitLine(`${t}// Final state - complete the result Future (early unit return)`);let u=l?void 0:`(${M(s,n)}){0}`;return Cr({emitter:n.emitter,indent:t,resultCode:u,debugLabel:n.currentFunctionName}),""}return cn(t,r,e),"return"}}function wc(e,t,n){let r=n;switch(e.tag){case"Atom":{let i=Yi(e,n),o=iy(e,i,t,r);n.emitter.emitLine(`${t}return ${o};`);break}case"FnCall":{if(E(e,I.return)){let i=V(e,t,n);n.emitter.emitLine(`${t}${i};`)}else{let i=oy(e,t,r);n.emitter.emitLine(`${t}return ${i};`)}break}}}function Fc(e,t){e.emitLine(`
|
|
9532
9532
|
// ============================================================================
|
|
9533
9533
|
// Parallelism Runtime - Thread and Worker
|
|
9534
9534
|
// ============================================================================
|
|
@@ -10192,7 +10192,7 @@ void __yo_arc_dispose_${n}(${n} arc) {
|
|
|
10192
10192
|
}`),t.emitLine(`
|
|
10193
10193
|
static void __yo_dispose_arc_${n}(void* ptr) {
|
|
10194
10194
|
__yo_arc_dispose_${n}((${n})ptr);
|
|
10195
|
-
}`),r.disposeGenerated=!0}}}function fy(e,t,n){let r=n.emitter;if(e.isNewtype&&e.fields.length===1){let i=e.fields[0].type,o=M(i,n);r.emitDeclarationLine(`typedef ${o} ${t}; // ${e.typeName} : ${A(e)} (newtype - zero-cost abstraction)`),r.emitDeclarationLine("");return}if(e.isReferenceSemantics){r.emitDeclarationLine(`struct ${t}_struct { // ${e.typeName} : ${A(e)} (reference counted)`),r.emitDeclarationLine(" yo_ref_header_t header; // Reference count header");for(let i of e.fields){let o=M(i.type,n),a=te(i.label);r.emitDeclarationLine(` ${o} ${a};`)}r.emitDeclarationLine("};")}else{r.emitDeclarationLine(`struct ${t}_struct { // ${e.typeName} : ${A(e)}`);for(let i of e.fields){let o=M(i.type,n),a=te(i.label);r.emitDeclarationLine(` ${o} ${a};`)}r.emitDeclarationLine("};")}r.emitDeclarationLine("")}function py(e,t,n){let r=n.emitter;if(r.emitDeclarationLine(`typedef struct { // ${e.typeName} : ${A(e)}`),e.fields.length===0)r.emitDeclarationLine(" uint8_t _dummy; // zero-sized type marker");else for(let i=0;i<e.fields.length;i++){let o=e.fields[i],a=M(o.type,n),s=`_${i}`;r.emitDeclarationLine(` ${a} ${s};`)}r.emitDeclarationLine(`} ${t};`),r.emitDeclarationLine("")}function _y(e,t,n){let r=n.emitter;r.emitDeclarationLine(`typedef union { // ${e.typeName} : ${A(e)}`);for(let i of e.fields){let o=M(i.type,n),a=te(i.label);r.emitDeclarationLine(` ${o} ${a};`)}r.emitDeclarationLine(`} ${t};`),r.emitDeclarationLine("")}function il(e,t,n){let r=n.emitter,i=Gt(e);if(i){let l=M(i,n);r.emitDeclarationLine(`typedef ${l} ${t}; // ${e.typeName} : ${A(e)} (optimized as nullable pointer)`),r.emitDeclarationLine("");return}if(bn(e)){r.emitDeclarationLine(`typedef enum { // ${e.typeName} : ${A(e)} (optimized as simple enum)`);for(let l=0;l<e.variants.length;l++){let u=e.variants[l];if(u){let c=jt(e,u.name,n),f=l<e.variants.length-1?",":"",p=u.discriminant??BigInt(l);r.emitDeclarationLine(` ${c} = ${p}${f}`)}}r.emitDeclarationLine(`} ${t};`),r.emitDeclarationLine("");return}let a=`${t}_tag`;r.emitDeclarationLine("typedef enum {");for(let l=0;l<e.variants.length;l++){let u=e.variants[l];if(u){let c=jt(e,u.name,n),f=l<e.variants.length-1?",":"",p=u.discriminant??BigInt(l);r.emitDeclarationLine(` ${c} = ${p}${f}`)}}r.emitDeclarationLine(`} ${a};`),r.emitDeclarationLine("");let s=`${t}_data`;r.emitDeclarationLine("typedef union {");for(let l of e.variants)if(l.fields&&l.fields.length>0){let u=l.fields.filter(c=>!ue(c.type));if(u.length>0){let c=l.name;r.emitDeclarationLine(" struct {");for(let f of u){let p=M(f.type,n),_=te(f.label);r.emitDeclarationLine(` ${p} ${_};`)}r.emitDeclarationLine(` } ${c};`)}}r.emitDeclarationLine(`} ${s};`),r.emitDeclarationLine(""),r.emitDeclarationLine(`struct ${t}_struct { // ${e.typeName} : ${A(e)}`),r.emitDeclarationLine(` ${a} tag;`),r.emitDeclarationLine(` ${s} data;`),r.emitDeclarationLine("};"),r.emitDeclarationLine("")}function dy(e,t){let n=Nn(t,"Dispose");if(!n)return;let r={...n,receiverType:e};if(e.trait)for(let o of e.trait.fields){if(!o.assignedValue||!ht(o.assignedValue))continue;let a=o.assignedValue,s=a.type;if(q({type:r,env:t},{type:s,env:t}))return a}let i=$a({concreteType:e,traitType:n,env:t});if(i)return i.traitValue}function my(e,t,n){let r=dy(e,t);if(!r)return;let i=r.type.fields.findIndex(s=>s.label===k.dispose[0]);if(i<0)return;let o=r.fields[i];if(!ne(o))return;let a=n.functions[o.funcId]?.cName;if(a)return a;for(let s in n.functions){let l=n.functions[s],u=l.value,c=u.specializedType??u.type;if(u.funcName===k.dispose[0]&&c.SelfType&&q({type:c.SelfType,env:t},{type:e,env:t}))return l.cName}}function Ac(e){e.emitter.emitLine("// Function implementations"),bc(e.emitter,e.debugAsyncAwait),Fc(e.emitter,e.debugParallelism),gy(e),vy(e);for(let t in e.functions){let{value:n,cName:r}=e.functions[t],i=r==="__yo_user_main",o=n.body?.$?.effectAnalysis,a=o&&o.hasEffects;if(!i&&!n.type.isClosure&&n.specializedFunctionCaches?.length>0||!i&&!a&&!n.isModuleEffectMember&&!n.type.isClosure&&!n.specializedType&&(n.specializedFunctionCaches?.length??0)===0&&wt(n.specializedType??n.type).length===0&&[...n.type.implicitParameters,...n.type.parameters.filter(d=>d.isImplicit)].some(d=>z(d.type)))continue;let l=n.specializedType&&!On(n.type),u=n.specializedType??n.type,c=wt(u).length>0,f=n.type.parameters.some(d=>d.isCompileTimeOnly);if(!i&&(!n.isModuleEffectMember||f)&&!n.specializedType&&(n.specializedFunctionCaches?.length??0)===0&&(
|
|
10195
|
+
}`),r.disposeGenerated=!0}}}function fy(e,t,n){let r=n.emitter;if(e.isNewtype&&e.fields.length===1){let i=e.fields[0].type,o=M(i,n);r.emitDeclarationLine(`typedef ${o} ${t}; // ${e.typeName} : ${A(e)} (newtype - zero-cost abstraction)`),r.emitDeclarationLine("");return}if(e.isReferenceSemantics){r.emitDeclarationLine(`struct ${t}_struct { // ${e.typeName} : ${A(e)} (reference counted)`),r.emitDeclarationLine(" yo_ref_header_t header; // Reference count header");for(let i of e.fields){let o=M(i.type,n),a=te(i.label);r.emitDeclarationLine(` ${o} ${a};`)}r.emitDeclarationLine("};")}else{r.emitDeclarationLine(`struct ${t}_struct { // ${e.typeName} : ${A(e)}`);for(let i of e.fields){let o=M(i.type,n),a=te(i.label);r.emitDeclarationLine(` ${o} ${a};`)}r.emitDeclarationLine("};")}r.emitDeclarationLine("")}function py(e,t,n){let r=n.emitter;if(r.emitDeclarationLine(`typedef struct { // ${e.typeName} : ${A(e)}`),e.fields.length===0)r.emitDeclarationLine(" uint8_t _dummy; // zero-sized type marker");else for(let i=0;i<e.fields.length;i++){let o=e.fields[i],a=M(o.type,n),s=`_${i}`;r.emitDeclarationLine(` ${a} ${s};`)}r.emitDeclarationLine(`} ${t};`),r.emitDeclarationLine("")}function _y(e,t,n){let r=n.emitter;r.emitDeclarationLine(`typedef union { // ${e.typeName} : ${A(e)}`);for(let i of e.fields){let o=M(i.type,n),a=te(i.label);r.emitDeclarationLine(` ${o} ${a};`)}r.emitDeclarationLine(`} ${t};`),r.emitDeclarationLine("")}function il(e,t,n){let r=n.emitter,i=Gt(e);if(i){let l=M(i,n);r.emitDeclarationLine(`typedef ${l} ${t}; // ${e.typeName} : ${A(e)} (optimized as nullable pointer)`),r.emitDeclarationLine("");return}if(bn(e)){r.emitDeclarationLine(`typedef enum { // ${e.typeName} : ${A(e)} (optimized as simple enum)`);for(let l=0;l<e.variants.length;l++){let u=e.variants[l];if(u){let c=jt(e,u.name,n),f=l<e.variants.length-1?",":"",p=u.discriminant??BigInt(l);r.emitDeclarationLine(` ${c} = ${p}${f}`)}}r.emitDeclarationLine(`} ${t};`),r.emitDeclarationLine("");return}let a=`${t}_tag`;r.emitDeclarationLine("typedef enum {");for(let l=0;l<e.variants.length;l++){let u=e.variants[l];if(u){let c=jt(e,u.name,n),f=l<e.variants.length-1?",":"",p=u.discriminant??BigInt(l);r.emitDeclarationLine(` ${c} = ${p}${f}`)}}r.emitDeclarationLine(`} ${a};`),r.emitDeclarationLine("");let s=`${t}_data`;r.emitDeclarationLine("typedef union {");for(let l of e.variants)if(l.fields&&l.fields.length>0){let u=l.fields.filter(c=>!ue(c.type));if(u.length>0){let c=l.name;r.emitDeclarationLine(" struct {");for(let f of u){let p=M(f.type,n),_=te(f.label);r.emitDeclarationLine(` ${p} ${_};`)}r.emitDeclarationLine(` } ${c};`)}}r.emitDeclarationLine(`} ${s};`),r.emitDeclarationLine(""),r.emitDeclarationLine(`struct ${t}_struct { // ${e.typeName} : ${A(e)}`),r.emitDeclarationLine(` ${a} tag;`),r.emitDeclarationLine(` ${s} data;`),r.emitDeclarationLine("};"),r.emitDeclarationLine("")}function dy(e,t){let n=Nn(t,"Dispose");if(!n)return;let r={...n,receiverType:e};if(e.trait)for(let o of e.trait.fields){if(!o.assignedValue||!ht(o.assignedValue))continue;let a=o.assignedValue,s=a.type;if(q({type:r,env:t},{type:s,env:t}))return a}let i=$a({concreteType:e,traitType:n,env:t});if(i)return i.traitValue}function my(e,t,n){let r=dy(e,t);if(!r)return;let i=r.type.fields.findIndex(s=>s.label===k.dispose[0]);if(i<0)return;let o=r.fields[i];if(!ne(o))return;let a=n.functions[o.funcId]?.cName;if(a)return a;for(let s in n.functions){let l=n.functions[s],u=l.value,c=u.specializedType??u.type;if(u.funcName===k.dispose[0]&&c.SelfType&&q({type:c.SelfType,env:t},{type:e,env:t}))return l.cName}}function Ac(e){e.emitter.emitLine("// Function implementations"),bc(e.emitter,e.debugAsyncAwait),Fc(e.emitter,e.debugParallelism),gy(e),vy(e);for(let t in e.functions){let{value:n,cName:r}=e.functions[t],i=r==="__yo_user_main",o=n.body?.$?.effectAnalysis,a=o&&o.hasEffects;if(!i&&!n.type.isClosure&&n.specializedFunctionCaches?.length>0||!i&&!a&&!n.isModuleEffectMember&&!n.type.isClosure&&!n.specializedType&&(n.specializedFunctionCaches?.length??0)===0&&wt(n.specializedType??n.type).length===0&&[...n.type.implicitParameters,...n.type.parameters.filter(d=>d.isImplicit)].some(d=>z(d.type)))continue;let l=n.specializedType&&!On(n.type),u=n.specializedType??n.type,c=wt(u).length>0,f=n.type.parameters.some(d=>d.isCompileTimeOnly);if(!i&&(!n.isModuleEffectMember||f)&&!n.specializedType&&(n.specializedFunctionCaches?.length??0)===0&&(Jn(n.type)||Pr(n))||!i&&n.isIoAsyncStateMachineClosure||!i&&!a&&!c&&!n.isModuleEffectMember&&(Jn(n.type)&&!n.type.isClosure||n.specializedFunctionCaches?.length>0&&!n.type.isClosure||n.specializedType&&!l||Pr(n)||Ui(n)||n.isIoAsyncStateMachineClosure))continue;let p=n.specializedType??n.type,_=!a&&!n.isModuleEffectMember&&(p.parameters.some(d=>Fe(d.type))||p.forallParameters.length>0),m=Fe(p.return.type),g=x(p.return.type)&&p.return.type.requiredTraits.length>0;if(_||m&&!g&&!n.isModuleEffectMember)continue;let h=n.body?.$?.effectAnalysis;h&&h.hasEffects,Sc(n,r,e)}ol(e)}function Ic(e){let t=e.emitter,n=!1,r=null;for(let a in e.functions){let{cName:s,value:l}=e.functions[a];if(s==="__yo_user_main"){n=!0,r=l;break}}if(!n||!r)return;let i=r.type.return.type;if(!ue(i))throw new Error(`main function must return unit , but it returns ${A(i)}. Use 'main :: (fn() -> unit)' instead. For exit codes, use 'exit(code)' from std/libc/stdlib.yo`);{let s=wt(r.type).map(()=>"NULL").join(", "),l=s?`(${s})`:"()";t.emitLine(`
|
|
10196
10196
|
// Main wrapper - calls __yo_user_main directly
|
|
10197
10197
|
int main(int argc, char** argv) {
|
|
10198
10198
|
// Store command-line arguments
|
|
@@ -10212,7 +10212,7 @@ int main(int argc, char** argv) {
|
|
|
10212
10212
|
|
|
10213
10213
|
return 0;
|
|
10214
10214
|
}
|
|
10215
|
-
`)}}function Nc(e){for(let t in e.functions){let{value:n}=e.functions[t];if(Pr(n))continue;let r=n.body?.$?.effectAnalysis;if(!r||!r.hasEffects)continue;if(n.specializedType){let a=n.specializedType,s=a.forallParameters.length>0||a.parameters.some(f=>f.isCompileTimeOnly),l=a.parameters.some(f=>!f.isCompileTimeOnly&&x(f.type)&&!Ce(f.type));if(s||l)continue;let u=n.specializedType.parameters.some(f=>Fe(f.type)),c=Fe(n.specializedType.return.type);if(u||c)continue}let i=wt(n.specializedType??n.type);if(i.length===0&&n.specializedType){let a=wt(n.type);a.some(s=>s.fieldFunctionType.forallParameters&&s.fieldFunctionType.forallParameters.length>0)&&(i=a)}i.length>0}}function Sc(e,t,n){let r=n.emitter,i=t,o=e.specializedType??e.type,a;if(e.body&&Ce(o.return.type)){let $=Vo(e.body);$?.$?.asyncStateMachineStructName?a=`${$.$.asyncStateMachineStructName}*`:e.body.$?.type&&x(e.body.$.type)&&Ce(e.body.$.type)&&(a=M(e.body.$.type,n))}e.body&&x(o.return.type)&&!Ce(o.return.type)&&!e.specializedType&&!e.isModuleEffectMember&&e.body.$?.type&&(a=M(e.body.$.type,n));let s=e.specializedType&&wt(o).length===0&&wt(e.type).some($=>$.fieldFunctionType.forallParameters&&$.fieldFunctionType.forallParameters.length>0)?e.type:void 0,l=a?
|
|
10215
|
+
`)}}function Nc(e){for(let t in e.functions){let{value:n}=e.functions[t];if(Pr(n))continue;let r=n.body?.$?.effectAnalysis;if(!r||!r.hasEffects)continue;if(n.specializedType){let a=n.specializedType,s=a.forallParameters.length>0||a.parameters.some(f=>f.isCompileTimeOnly),l=a.parameters.some(f=>!f.isCompileTimeOnly&&x(f.type)&&!Ce(f.type));if(s||l)continue;let u=n.specializedType.parameters.some(f=>Fe(f.type)),c=Fe(n.specializedType.return.type);if(u||c)continue}let i=wt(n.specializedType??n.type);if(i.length===0&&n.specializedType){let a=wt(n.type);a.some(s=>s.fieldFunctionType.forallParameters&&s.fieldFunctionType.forallParameters.length>0)&&(i=a)}i.length>0}}function Sc(e,t,n){let r=n.emitter,i=t,o=e.specializedType??e.type,a;if(e.body&&Ce(o.return.type)){let $=Vo(e.body);$?.$?.asyncStateMachineStructName?a=`${$.$.asyncStateMachineStructName}*`:e.body.$?.type&&x(e.body.$.type)&&Ce(e.body.$.type)&&(a=M(e.body.$.type,n))}e.body&&x(o.return.type)&&!Ce(o.return.type)&&!e.specializedType&&!e.isModuleEffectMember&&e.body.$?.type&&(a=M(e.body.$.type,n));let s=e.specializedType&&wt(o).length===0&&wt(e.type).some($=>$.fieldFunctionType.forallParameters&&$.fieldFunctionType.forallParameters.length>0)?e.type:void 0,l=a?pr(o,t,n,a,s):pr(o,t,n,void 0,s);r.emitLine(`${l} {`);let u=n.currentFunctionName,c=n.currentFunctionType;n.currentFunctionName=i,n.currentFunctionType=o;let f=n.isModuleEffectMemberFunction,p=n.overrideReturnTypeStr;e.isModuleEffectMember&&(n.isModuleEffectMemberFunction=!0),n.overrideReturnTypeStr=a;let _=n.currentEvidenceParams,m=wt(o);if(m.length===0&&e.specializedType){let $=wt(e.type);$.some(C=>C.fieldFunctionType.forallParameters&&C.fieldFunctionType.forallParameters.length>0)&&(m=$)}if(m.length>0){let $=new Map;for(let C of m)$.set(`${C.implicitLabel}.${C.fieldLabel}`,C);n.currentEvidenceParams=$}let g=n.currentClosureCaptures,h=n.currentClosureCaptureFrameLevel,d=n.currentClosureType,v=n.currentClosureCaptureTypeCName;if(o.isClosure){let $=e.closureInfo;if($){let C=$.closureType.isFn,L=$.captureType;if(n.currentClosureType=C.callType,L&&ce(L)&&L.fields.length>0){let b=L.fields.map(S=>S.label);n.currentClosureCaptures=b,n.currentClosureCaptureFrameLevel=e.frameLevel;let R=n.types[L.id]?.cName;R&&(n.currentClosureCaptureTypeCName=R)}}}if(e.funcName===k.___dispose[0]&&o.SelfType){let $=my(o.SelfType,e.type.env,n);if($){let C=o.parameters[0]?.label==="__yo_self"?"__yo_self":o.parameters[0]?.label??"__yo_self";r.emitLine(` ${$}(${C}); // Call user's dispose method`)}}yy(e.body,o," ",n),n.currentFunctionName=u,n.currentFunctionType=c,n.isModuleEffectMemberFunction=f,n.overrideReturnTypeStr=p,n.currentEvidenceParams=_,n.currentClosureCaptures=g,n.currentClosureCaptureFrameLevel=h,n.currentClosureType=d,n.currentClosureCaptureTypeCName=v,r.emitLine("}")}function yy(e,t,n,r){let i=r.emitter;if(F(e)&&E(e,I.begin)){let o=e.args;r.pendingDeferredDrops=[...e.$?.deferredDropExpressions??[]],r.consumedVarPendingDrops=[...e.$?.consumedVariableDropExpressions??[]];let a=!1;for(let s=0;s<o.length-1;s++){let l=o[s];E(l,I.return)&&(a=!0);let u=V(l,n,r);if(u&&(!l.$||!st(l.$.env.modulePath,u))&&i.emitLine(`${n}${u};`),a)break}if(!a&&o.length>0){let s=o[o.length-1];if(Ce(t.return.type)&&s){let u=Bt(s),c=s.$?.type,f=c&&Ce(c);if(u||f){let p=V(s,n,r);if(e.$?.deferredDropExpressions&&e.$.deferredDropExpressions.length>0&&c){let _=M(c,r),m=`_yo_async_return_${Math.random().toString(36).substr(2,9)}`;i.emitLine(`${n}${_} ${m} = ${p};`),$t(e,n,r),i.emitLine(`${n}return ${m};`)}else i.emitLine(`${n}return ${p};`);return}}else if(s&&ue(t.return.type)){let u=V(s,n,r);u&&i.emitLine(`${n}${u};`),$t(e,n,r)}else if(s){let u=mt(s.$?.controlFlow),c=ue(s.$?.type)||F(s)&&E(s,I.tuple)&&s.args.length===0,f=o.length>1?o[o.length-2]:null,p=mt(f?.$?.controlFlow);if(!(c&&p))if(u){let _=V(s,n,r);_&&i.emitLine(`${n}${_};`)}else{if(s.$?.deferredDupExpressions&&s.$.deferredDupExpressions.length>0){if(s.$?.variableName){let g=M(t.return.type,r),h=Ee(s.$.variableName,s.$.env),d=V(s,n,r);h!==d&&i.emitLine(`${n}${g} ${h} = ${d};`)}tt(s,n,r);let m=s.$.deferredDupExpressions[0];if(F(m)&&m.$?.variableName){let g=te(m.$.variableName);$t(e,n,r),i.emitLine(`${n}return ${g};`);return}}let _=V(s,n,r);$t(e,n,r),_&&i.emitLine(`${n}return ${_};`)}}}else if(a&&o.length>0){let s=o[o.length-1];s&&ue(s.$?.type)}}else if($t(e,n,r),ue(t.return.type)){let o=V(e,n,r);o&&i.emitLine(`${n}${o};`)}else wc(e,n,r)}function xc(e){for(let t in e.functions){let{value:n,cName:r}=e.functions[t];if(Pr(n)||!n.specializedType||!On(n.type))continue;let i=n.specializedType,o=i.forallParameters.length>0||i.parameters.some(f=>f.isCompileTimeOnly),a=i.parameters.some(f=>!f.isCompileTimeOnly&&x(f.type)&&!Ce(f.type));if(o||a)continue;let s=n.specializedType.parameters.some(f=>Fe(f.type)),l=Fe(n.specializedType.return.type);if(s||l)continue;let u=n.body?.$?.effectAnalysis;u&&u.hasEffects||n.isModuleEffectMember||wt(n.specializedType??n.type).length>0||Sc(n,r,e)}}function gy(e){let t=e.emitter;t.emitLine(`// Non-atomic reference counting functions (thread-local)
|
|
10216
10216
|
void __yo_decr_rc(void* ptr) {
|
|
10217
10217
|
if (ptr == NULL) return;
|
|
10218
10218
|
yo_ref_header_t* header = (yo_ref_header_t*)ptr;
|
|
@@ -10644,16 +10644,16 @@ static uint8_t** __yo_argv;
|
|
|
10644
10644
|
static Slice_uint8_t_u42_ __yo_args;
|
|
10645
10645
|
`),Dc(i),rl(i),uc(i),tc(i),Nc(i),Ac(i),yc(i),gc(i),hc(i),mc(i),lc(i),r.isLibrary||Ic(i),Vc(i),rc(i),xc(i)}print(){return this.emitter.print()}getExportedFunctionNames(){return this.exportedFunctionNames}};var Mc=0;function Oc(e){return e.$?.variableName?!0:(e.$?.value!==void 0,!1)}function La(e,t){if(F(e)){e.$?.variableName&&t.add(e.$.variableName);for(let n of e.args)La(n,t);e.func&&La(e.func,t)}}function Rc(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=Ln(o);if(a&&e.has(a)){let s=V(o,t,n);s&&n.emitter.emitLine(`${t}${s};`),r.shortCircuitHandledDropVarNames.add(a)}}}}function Pc(e,t,n){if(e.args.length===0)return"true";if(e.args.length===1)return V(e.args[0],t,n);let r=[];for(let l of e.args){let u=l.$?.value;if(Ue(u)){if(u.value===!1)return"false";continue}r.push(l)}if(r.length===0)return"true";if(r.length===1)return V(r[0],t,n);if(!r.slice(1).some(l=>Oc(l)))return`(${r.map(u=>V(u,t,n)).join(" && ")})`;let o=`__yo_sc_${Mc++}`;n.emitter.emitLine(`${t}bool ${o} = false;`);let a=t,s=r.length-1;for(let l=0;l<r.length;l++){let u=V(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],c=new Set;La(u,c),Rc(c,a,n),a=a.slice(2),n.emitter.emitLine(`${a}}`)}return o}function Uc(e,t,n){if(e.args.length===0)return"false";if(e.args.length===1)return V(e.args[0],t,n);let r=[];for(let l of e.args){let u=l.$?.value;if(Ue(u)){if(u.value===!0)return"true";continue}r.push(l)}if(r.length===0)return"false";if(r.length===1)return V(r[0],t,n);if(!r.slice(1).some(l=>Oc(l)))return`(${r.map(u=>V(u,t,n)).join(" || ")})`;let o=`__yo_sc_${Mc++}`;n.emitter.emitLine(`${t}bool ${o} = true;`);let a=t,s=r.length-1;for(let l=0;l<r.length;l++){let u=V(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],c=new Set;La(u,c),Rc(c,a,n),a=a.slice(2),n.emitter.emitLine(`${a}}`)}return o}function zc(e,t,n){let r=e.args[0];if(!r)return"// Error: __yo_arc_dispose requires exactly 1 argument";let i=V(r,t,n),o=r.$?.type;return!o||!Tt(o)?"// Error: __yo_arc_dispose requires an Arc type":`__yo_arc_dispose_${M(o,n)}(${i})`}function al(e){let t=e.func.$?.value;return D(t)&&Tt(t.value)&&e.args.length===1}function Bc(e,t,n){if(!al(e))return"/* Error: generateArcTypeCall called on non-Arc type call */";let i=(e.func.$?.value).value,o=i.childType,a=e.args[0],s=V(a,t,n),l=M(i,n),u=M(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 Gc(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 c=V(u,t,n);if(u.$?.deferredDupExpressions&&u.$.deferredDupExpressions.length>0){tt(u,t,a);let f=u.$.deferredDupExpressions[0];if(F(f)&&f.$?.variableName)return Ee(f.$.variableName,f.$.env)}return c}).join(", "),l=M(i,n);if(o&&e.$?.type){let u=`(${l}){ .data = { ${s} } }`,c=ot(e.$.type,o,n);return n.emitter.emitLine(`${t}${c} = ${u};`),o}else return`(${l}){ .data = { ${s} } }`}}function Wc(e,t,n){let r=n.emitter,i=e.args[0],o=e.args[1],a=i.$?.value;if(!a||!D(a)||!ke(a.value))return"/* ERROR: __yo_array_fill first argument must be an ArrayType */";let s=a.value,l=s.length;if(!Re(l))return"/* ERROR: __yo_array_fill requires compile-time known array length */";let u=M(s,n),c=V(o,t,n),f=e.$?.variableName||`temp_array_${Date.now()}`,p=`i_${Ge(e.$?.env.modulePath??"")}`;return r.emitLine(`${t}${u} ${f};`),r.emitLine(`${t}for (int ${p} = 0; ${p} < ${l.value}; ${p}++) {`),r.emitLine(`${t} ${f}.data[${p}] = ${c};`),r.emitLine(`${t}}`),f}function qc(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 c=X(r.$.env,u);if(c.length>0&&c[c.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)}
|
|
10646
10646
|
`;let a=V(r,t,n),s=!1;if(e.$?.variableName){let l=e.$.variableName,u=n;if((u.inAsyncStateMachine||u.inEffectStateMachine)&&a.startsWith("sm->")){let f=u.stateMachineVariables?.get(l);if(!f&&u.stateMachineVariables){for(let[,p]of u.stateMachineVariables)if(p.name===l){f=p;break}}if(f&&f.kind!=="outer"){let p=`var_${f.id}`;ue(r.$.type)||n.emitter.emitLine(`${t}sm->${p} = ${a}; // Save old value for deferred drop`)}else s=!0}else{let f=ot(r.$.type,l,n);ke(r.$.type)?n.emitter.emitLine(`${t}${f} = ${a}; // Save old value for later use`):ue(r.$.type)||n.emitter.emitLine(`${t}${f} = ${a}; // Save old value for later use`)}}if(ke(r.$.type)){let l=V(i,t,n),u=F(i)&&i.$?.closureFunctionValue&&i.$?.type&&Yt(i.$.type),c=n,f=l;if(!u&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){if(i.$?.variableName&&i.$?.type){let _=Ee(i.$.variableName,i.$.env);if(_!==l.trim()){let m=i.$.convertedRuntimeType||i.$.type,g=M(m,n);n.emitter.emitLine(`${t}${g} ${_} = ${l};`)}}tt(i,t,c);let p=i.$.deferredDupExpressions[0];F(p)&&p.$?.variableName&&(f=Ee(p.$.variableName,p.$.env))}if(o){let p=ot(r.$.type,V(r,t,n),n);n.emitter.emitLine(`${t}${p} = ${f};`)}else n.emitter.emitLine(`${t}${a} = ${f};`)}else{let l=V(i,t,n),u=F(i)&&i.$?.closureFunctionValue&&i.$?.type&&Yt(i.$.type),c=n,f=l;if(!u&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){if(i.$?.variableName&&i.$?.type){let _=Ee(i.$.variableName,i.$.env);if(_!==l.trim()){let m=i.$.convertedRuntimeType||i.$.type,g=M(m,n);n.emitter.emitLine(`${t}${g} ${_} = ${l};`)}}tt(i,t,c);let p=i.$.deferredDupExpressions[0];F(p)&&p.$?.variableName&&(f=Ee(p.$.variableName,p.$.env))}if(!ue(r.$.type)){let p=r.$.type,_=i.$?.type,m,g=st(i.$.env.modulePath,f.trim());g&&n.tempVarAsyncStructNames&&(m=n.tempVarAsyncStructNames.get(f.trim()));let h=o&&_&&Ce(p)&&Ce(_),d;g&&h?m?d=`${m}*`:d=M(_,n):h&&m?d=`${m}*`:d=M(h?_:p,n);let v=(c.inAsyncStateMachine||c.inEffectStateMachine)&&a.startsWith("sm->");n.emitter.emitLine(`${t}${o&&!v?d+" ":""}${a} = ${f};`)}}return s?"":e.$?.variableName??""}function Yc(e,t,n){let r=e.args[0];if(!r)return"// Error: await requires exactly 1 argument";let i=r.$?.type;if(!i||!Ce(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(Tn(e)){let s=V(r,t,n),l=M(i,n),u=o.isFuture.outputType,c=a.emitter,f=ue(u)||x(u)&&ue(e.$?.type??u),p=e.$?.variableName?`__sync_future_${e.$.variableName}`:"__sync_future",_=e.$?.variableName?`__pre_await_state_${e.$.variableName}`:"__pre_await_state";c.emitLine(`${t}// Synchronous await (io.await outside state machine)`),c.emitLine(`${t}${l} ${p} = ${s};`),c.emitLine(`${t}int ${_} = ${p}->state;`),Ro(r.$?.type)||(c.emitLine(`${t}if (${_} == 0 && ${p}->__yo_resume_fn) {`),Ey(e,p,t,n),c.emitLine(`${t} __yo_incr_rc((void*)${p}); // event loop reference`),c.emitLine(`${t} ${p}->__yo_resume_fn((void*)${p});`),c.emitLine(`${t}}`)),c.emitLine(`${t}{`),c.emitLine(`${t} int __await_state = ${p}->state;`),c.emitLine(`${t} while (__await_state != -1 && __await_state != -2) {`),c.emitLine(`${t} yo_async_poll_step();`),c.emitLine(`${t} __await_state = ${p}->state;`),c.emitLine(`${t} }`),c.emitLine(`${t} if (__await_state == -2) {`);let g=Dt(i),h=g?.isFuture.effects?.some(d=>z(d.type)||ve(d.type)||d.isEffectRowSpread)??!1;if(h){c.emitLine(`${t} if (${_} == -2) {`),c.emitLine(`${t} fprintf(stderr, "panic: attempted to await an aborted Future\\n");`),c.emitLine(`${t} abort();`),c.emitLine(`${t} }`),c.emitLine(`${t} __yo_decr_rc((void*)${p});`),c.emitLine(`${t} ${s} = NULL;`);let d=a.pendingDeferredDrops;if(d){let $=e.$?.variableName;a.pendingDeferredDrops=d.filter(C=>Ln(C)!==$)}cn(t+" ",a,e),a.pendingDeferredDrops=d;let v=Ty(g,a),T=a.currentFunctionType?.return?.type;if(v)if(c.emitLine(`${t} __yo_effect_escaped = 0;`),T&&!ue(T)){let $=M(T,n);$!=="void"?(c.emitLine(`${t} ${$} _esc_result;`),c.emitLine(`${t} memcpy(&_esc_result, __yo_effect_escape_value, sizeof(${$}));`),c.emitLine(`${t} return _esc_result;`)):c.emitLine(`${t} return;`)}else c.emitLine(`${t} return;`);else if(c.emitLine(`${t} __yo_effect_escaped = 1;`),T&&!ue(T)){let $=M(T,n);c.emitLine(`${t} return (${$}){0};`)}else c.emitLine(`${t} return;`)}else c.emitLine(`${t} fprintf(stderr, "panic: attempted to await an aborted Future\\n");`),c.emitLine(`${t} abort();`);if(c.emitLine(`${t} }`),c.emitLine(`${t}}`),f)return"";{let d=e.$?.variableName||"__sync_await_result",v=M(u,n),T=ot(u,d,n);if(h){if(c.emitLine(`${t}${T};`),c.emitLine(`${t}if (${p}->state == -1) {`),Le(u)){let $=Dn(u,n);$?c.emitLine(`${t} ${d} = ${$}(${p}->result);`):c.emitLine(`${t} ${d} = ${p}->result;`)}else c.emitLine(`${t} ${d} = ${p}->result;`);c.emitLine(`${t}} else {`),c.emitLine(`${t} ${d} = (${v}){0};`),c.emitLine(`${t}}`)}else if(Le(u)){let $=Dn(u,n);$?c.emitLine(`${t}${T} = ${$}(${p}->result);`):c.emitLine(`${t}${T} = ${p}->result;`)}else c.emitLine(`${t}${T} = ${p}->result;`);return d}}return"// Error: await should only be used inside async blocks"}function jc(e,t,n){let r=e.args[0];if(!r)return"// Error: io.state requires exactly 1 argument";let i=r.$?.type;if(!i||!Ce(i))return"// Error: io.state argument must be a Future type";let a=n.emitter,s=V(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 Kc(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=V(o,t,n),s=e.$?.type;if(!s||!ye(s))return"// Error: JoinHandle.await return type must be Option(T)";let l=M(s,n),c=s.variants.find(C=>C.name==="Some")?.fields?.[0]?.type,f=!c||ue(c),p=f?"uint8_t":c?M(c,n):"uint8_t",_=jt(s,"Some",n),m=jt(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 $=ot(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} ${p} 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) {`),f)i.emitLine(`${t} ${v} = (${l}){ .tag = ${_} };`);else if(c&&Le(c)){let C=Dn(c,n);C?i.emitLine(`${t} ${v} = (${l}){ .tag = ${_}, .data = { .Some = { .value = ${C}(${d}->result) } } };`):i.emitLine(`${t} ${v} = (${l}){ .tag = ${_}, .data = { .Some = { .value = ${d}->result } } };`)}else i.emitLine(`${t} ${v} = (${l}){ .tag = ${_}, .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 Ty(e,t){let n=e.isFuture.effects;if(!n?.length)return!1;let r=Xc(n),i=t.currentEvidenceParams;for(let o of r)if(z(o.type)){let a=`${o.label}.${o.label}`;if(!i?.has(a))return!0}else if(ve(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 Xc(e){let t=[];for(let n of e)if(n.isEffectRowSpread){let r=n.type;x(r)&&r.resolvedConcreteType&&(r=r.resolvedConcreteType),rt(r)&&t.push(...r.implicitParameters)}else t.push(n);return t}function Ey(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=Xc(o.isFuture.effects),s=r,l=s.emitter,u=e.args.find(c=>F(c)&&E(c,I.using));if(u){let c=u.args;for(let f=0;f<a.length&&f<c.length;f++){let p=a[f],_=c[f];if(z(p.type)){let m=V(_,n,r),g=p.label;l.emitLine(`${n} ${t}->__capture.${g} = (void*)${m};`)}else ve(p.type)&&Hc(p.type,t,n,_.$?.value,s,e)}}else for(let c of a)if(z(c.type)){let f=Cy(c.label,s,e);f&&l.emitLine(`${n} ${t}->__capture.${c.label} = (void*)${f};`)}else ve(c.type)&&Hc(c.type,t,n,void 0,s,e)}function Hc(e,t,n,r,i,o){let a=i.emitter;for(let s of e.fields){if(!z(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&&ze(r)){let u=e.fields.indexOf(s),c=r.fields[u];if(c&&ne(c)){let f=i.functions[c.funcId];f&&(l=f.cName)}}if(!l&&i.currentEvidenceParams){for(let u of i.currentEvidenceParams.values())if(u.fieldLabel===s.label){l=u.cParamName;break}}l||(l=$y(s.label,e,i,o)),l&&a.emitLine(`${n} ${t}->__capture.${s.label} = (void*)${l};`)}}function $y(e,t,n,r){let i=r.$?.env??r.func.$?.env;if(!i)return;let o=un(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&&ze(l)){let u=l.type.fields.findIndex(c=>c.label===e);if(u>=0){let c=l.fields[u];if(c&&ne(c)){let f=n.functions[c.funcId]?.cName;if(f)return f}}}}}function Cy(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 Qc(e,t,n){let r=e.$?.variableName,i=e.$?.type,o=n;if(r&&i){!ue(i)&&!mt(e.$?.controlFlow)&&n.emitter.emitLine(`${t}${M(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=[],f=!ue(i)&&!mt(e.$?.controlFlow);for(let p=0;p<e.args.length;p++){let _=e.args[p],m=V(_,t+" ",n);c.push(m);let g=p===e.args.length-1;m&&!(g&&f)&&(_.$&&st(_.$.env.modulePath,m)||n.emitter.emitLine(`${t} ${m};`))}if(f){let p=e.args[e.args.length-1],_=c[c.length-1];if(p.$?.deferredDupExpressions&&p.$.deferredDupExpressions.length>0){if(p.$?.variableName){let g=p.$.variableName;p.$.variableName=void 0;let h=V(p,t+" ",n);p.$.variableName=g;let d=M(p.$.type,n),v=Ee(g,p.$.env);v!==h&&n.emitter.emitLine(`${t} ${d} ${v} = ${h};`),_=v}tt(p,t+" ",n);let m=p.$.deferredDupExpressions[0];F(m)&&m.$?.variableName&&(_=Ee(m.$.variableName,m.$.env))}n.emitter.emitLine(`${t} ${r} = ${_};`)}if(e.$?.deferredDropExpressions)for(let p of e.$.deferredDropExpressions){if(o.shortCircuitHandledDropVarNames){let m=Ln(p);if(m&&o.shortCircuitHandledDropVarNames.has(m)){o.shortCircuitHandledDropVarNames.delete(m);continue}}let _=V(p,t+" ",n);_&&n.emitter.emitLine(`${t} ${_};`)}return n.emitter.emitLine(`${t}} // end begin block`),o.pendingDeferredDrops=a,o.consumedVarPendingDrops=l,ue(i)||mt(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(f=>V(f,t+" ",n)).forEach(f=>{f&&n.emitter.emitLine(`${t} ${f};`)}),e.$?.deferredDropExpressions)for(let f of e.$.deferredDropExpressions){if(o.shortCircuitHandledDropVarNames){let _=Ln(f);if(_&&o.shortCircuitHandledDropVarNames.has(_)){o.shortCircuitHandledDropVarNames.delete(_);continue}}let p=V(f,t+" ",n);p&&n.emitter.emitLine(`${t} ${p};`)}return n.emitter.emitLine(`${t}} // end begin block`),o.pendingDeferredDrops=a,o.consumedVarPendingDrops=l,""}}function Zc(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)}
|
|
10647
|
-
`;let i=r.token.value,o=ot(r.$.type,i,n);return n.emitter.emitLine(`${t}${o};`),""}function Jc(e,t,n){if(e.$){let r=e.$.variableName,i=e.$.type,o=i&&ue(i),a=-1;for(let f=0;f<e.args.length;f++){let p=e.args[f];if(F(p)&&E(p,"=>",2)){let _=p.args[0];if(_&&!(Ue(_.$?.value)&&_.$.value.value===!1)){a=f;break}}}let s=!1;if(a>=0){let f=e.args[a];if(f&&F(f)&&E(f,"=>",2)){let p=f.args[0];p&&Ue(p.$?.value)&&p.$.value.value===!0&&(s=!0)}}if(!o&&r&&!s){let f=M(i,n);n.emitter.emitLine(`${t}${f} ${r};`)}if(s&&a>=0){let f=e.args[a];if(f&&F(f)&&E(f,"=>",2)){let p=f.args[1];if(p){let _=V(p,t,n);r&&!o&&(_&&_!==""&&!_.startsWith("goto")&&_!=="continue"&&_!=="break"&&!_.includes("return")?n.emitter.emitLine(`${t}${r} = ${_};`):_&&(_.startsWith("goto")||_==="continue"||_==="break"||_.includes("return"))&&n.emitter.emitLine(`${t}${_};`))}}return o?"":r??""}let l=t,u=0,c=!1;for(let f=0;f<e.args.length;f++){let p=e.args[f];if(F(p)&&E(p,"=>",2)){let _=p.args[0],m=p.args[1];if(_&&m){if(Ue(_.$?.value)&&_.$.value.value===!1)continue;if(c){if(n.emitter.emitLine(`${l}else {`),u++,l+=" ",!(Ue(_.$?.value)&&_.$.value.value===!0)){let T=V(_,l,n);n.emitter.emitLine(`${l}if (${T}) {`)}}else{if(Ue(_.$?.value)&&_.$.value.value===!0)n.emitter.emitLine(`${l}{`);else{let v=V(_,l,n);n.emitter.emitLine(`${l}if (${v}) {`)}c=!0}let g=Ue(_.$?.value)&&_.$.value.value===!0,h=c&&g?l:l+" ";if(F(m)&&E(m,I.begin)){let v=m.args,T=n,$=T.pendingDeferredDrops,C=m.$?.deferredDropExpressions??[];T.pendingDeferredDrops=[...C,...$??[]];let L=T.consumedVarPendingDrops,b=m.$?.consumedVariableDropExpressions??[];T.consumedVarPendingDrops=[...b,...L??[]];for(let R=0;R<v.length-1;R++){let S=v[R],G=V(S,h,n);G&&S.$&&!st(S.$.env.modulePath,G)&&n.emitter.emitLine(`${h}${G};`)}if(v.length>0){let R=v[v.length-1];R.$?.deferredDupExpressions&&tt(R,h,n);let S=V(R,h,n);S&&(S==="continue"||S==="break"||S.startsWith("goto")||F(R)&&E(R,I.return)||S.includes("return")?n.emitter.emitLine(`${h}${S};`):r&&!o&&n.emitter.emitLine(`${h}${r} = ${S};`))}m.$?.deferredDropExpressions&&$t(m,h,n),T.pendingDeferredDrops=$,T.consumedVarPendingDrops=L}else{m.$?.deferredDupExpressions&&tt(m,h,n);let v=V(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};`))}!(c&&g)&&n.emitter.emitLine(`${l}}`)}}}for(let f=0;f<u;f++)l=l.slice(0,-2),n.emitter.emitLine(`${l}}`);return o?"":r??""}return'/* "cond" expression is not evaluated */'}function ef(e,t,n){let r=e.args[0];return V(r,t,n)}function tf(e,t,n){let r=e.args[0],i=r.$?.type;if(!i||!be(i))throw new Error("downcast codegen: expected Dyn type as first argument");let o=V(r,t,n),s=e.args[1].$?.value;if(!s||!D(s))throw new Error("downcast codegen: expected TypeValue as second argument");let l=s.value,u=M(l,n),c=n.types[l.id]?.cName||u,f=`yo_typeid_${te(c)}`;n.typeIdStatics||(n.typeIdStatics=new Map),n.typeIdStatics.has(l.id)||(n.typeIdStatics.set(l.id,f),n.emitter.emitDeclarationLine(`static const char ${f} = 0;`)),n.cIncludes.add("<stdint.h>");let p=`${o}.vtable->__yo_type_id == (uintptr_t)&${f}`,_,m=!1,g="",h="";for(let[,R]of n.dynImpls){if(R.dynType.id!==i.id)continue;if((x(R.concreteType)&&R.concreteType.resolvedConcreteType?R.concreteType.resolvedConcreteType:R.concreteType).id===l.id&&hn(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=ct(l);if(!R){let S=l;for(;
|
|
10648
|
-
`;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 c=u[u.length-1],f=c.isOwningTheSameRcValueAs?c.isOwningTheSameRcValueAs.id:c.id;o.stateMachineVariables.has(f)&&(s=!0,l=f)}}if(ke(r.$.type))if(F(i)&&E(i,I.array)){let u=V(i,t,n);if(s&&l)n.emitter.emitLine(`${t}sm->var_${l} = ${u};`);else if(!ue(r.$.type)){let c=ot(r.$.type,a,n);n.emitter.emitLine(`${t}${c} = ${u};`)}}else{let u;if(i.$?.variableName){let c=Ee(i.$.variableName,i.$.env),f=V(i,t,n);if(!s){let p=ot(i.$.type,c,n);c!==f&&n.emitter.emitLine(`${t}${p} = ${f};`)}u=c}else u=V(i,t,n);if(s&&l)n.emitter.emitLine(`${t}sm->var_${l} = ${u};`);else if(!ue(r.$.type)){let c=ot(r.$.type,a,n);n.emitter.emitLine(`${t}${c} = ${u};`)}}else{let u,c=F(i)&&i.$?.closureFunctionValue&&i.$?.type&&Yt(i.$.type),f=F(i)&&Bt(i);if(i.$?.variableName){let p=Ee(i.$.variableName,i.$.env),_=Ee(a,r.$.env);if(p===_){if(u=V(i,t,n),!c&&!f&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){tt(i,t,o);let m=i.$.deferredDupExpressions[0];F(m)&&m.$?.variableName&&(u=Ee(m.$.variableName,m.$.env))}}else if(U(i)&&p===Ee(i.token.value,i.$.env)){if(u=V(i,t,n),!c&&!f&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){tt(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&&
|
|
10647
|
+
`;let i=r.token.value,o=ot(r.$.type,i,n);return n.emitter.emitLine(`${t}${o};`),""}function Jc(e,t,n){if(e.$){let r=e.$.variableName,i=e.$.type,o=i&&ue(i),a=-1;for(let f=0;f<e.args.length;f++){let p=e.args[f];if(F(p)&&E(p,"=>",2)){let _=p.args[0];if(_&&!(Ue(_.$?.value)&&_.$.value.value===!1)){a=f;break}}}let s=!1;if(a>=0){let f=e.args[a];if(f&&F(f)&&E(f,"=>",2)){let p=f.args[0];p&&Ue(p.$?.value)&&p.$.value.value===!0&&(s=!0)}}if(!o&&r&&!s){let f=M(i,n);n.emitter.emitLine(`${t}${f} ${r};`)}if(s&&a>=0){let f=e.args[a];if(f&&F(f)&&E(f,"=>",2)){let p=f.args[1];if(p){let _=V(p,t,n);r&&!o&&(_&&_!==""&&!_.startsWith("goto")&&_!=="continue"&&_!=="break"&&!_.includes("return")?n.emitter.emitLine(`${t}${r} = ${_};`):_&&(_.startsWith("goto")||_==="continue"||_==="break"||_.includes("return"))&&n.emitter.emitLine(`${t}${_};`))}}return o?"":r??""}let l=t,u=0,c=!1;for(let f=0;f<e.args.length;f++){let p=e.args[f];if(F(p)&&E(p,"=>",2)){let _=p.args[0],m=p.args[1];if(_&&m){if(Ue(_.$?.value)&&_.$.value.value===!1)continue;if(c){if(n.emitter.emitLine(`${l}else {`),u++,l+=" ",!(Ue(_.$?.value)&&_.$.value.value===!0)){let T=V(_,l,n);n.emitter.emitLine(`${l}if (${T}) {`)}}else{if(Ue(_.$?.value)&&_.$.value.value===!0)n.emitter.emitLine(`${l}{`);else{let v=V(_,l,n);n.emitter.emitLine(`${l}if (${v}) {`)}c=!0}let g=Ue(_.$?.value)&&_.$.value.value===!0,h=c&&g?l:l+" ";if(F(m)&&E(m,I.begin)){let v=m.args,T=n,$=T.pendingDeferredDrops,C=m.$?.deferredDropExpressions??[];T.pendingDeferredDrops=[...C,...$??[]];let L=T.consumedVarPendingDrops,b=m.$?.consumedVariableDropExpressions??[];T.consumedVarPendingDrops=[...b,...L??[]];for(let R=0;R<v.length-1;R++){let S=v[R],G=V(S,h,n);G&&S.$&&!st(S.$.env.modulePath,G)&&n.emitter.emitLine(`${h}${G};`)}if(v.length>0){let R=v[v.length-1];R.$?.deferredDupExpressions&&tt(R,h,n);let S=V(R,h,n);S&&(S==="continue"||S==="break"||S.startsWith("goto")||F(R)&&E(R,I.return)||S.includes("return")?n.emitter.emitLine(`${h}${S};`):r&&!o&&n.emitter.emitLine(`${h}${r} = ${S};`))}m.$?.deferredDropExpressions&&$t(m,h,n),T.pendingDeferredDrops=$,T.consumedVarPendingDrops=L}else{m.$?.deferredDupExpressions&&tt(m,h,n);let v=V(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};`))}!(c&&g)&&n.emitter.emitLine(`${l}}`)}}}for(let f=0;f<u;f++)l=l.slice(0,-2),n.emitter.emitLine(`${l}}`);return o?"":r??""}return'/* "cond" expression is not evaluated */'}function ef(e,t,n){let r=e.args[0];return V(r,t,n)}function tf(e,t,n){let r=e.args[0],i=r.$?.type;if(!i||!be(i))throw new Error("downcast codegen: expected Dyn type as first argument");let o=V(r,t,n),s=e.args[1].$?.value;if(!s||!D(s))throw new Error("downcast codegen: expected TypeValue as second argument");let l=s.value,u=M(l,n),c=n.types[l.id]?.cName||u,f=`yo_typeid_${te(c)}`;n.typeIdStatics||(n.typeIdStatics=new Map),n.typeIdStatics.has(l.id)||(n.typeIdStatics.set(l.id,f),n.emitter.emitDeclarationLine(`static const char ${f} = 0;`)),n.cIncludes.add("<stdint.h>");let p=`${o}.vtable->__yo_type_id == (uintptr_t)&${f}`,_,m=!1,g="",h="";for(let[,R]of n.dynImpls){if(R.dynType.id!==i.id)continue;if((x(R.concreteType)&&R.concreteType.resolvedConcreteType?R.concreteType.resolvedConcreteType:R.concreteType).id===l.id&&hn(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=ct(l);if(!R){let S=l;for(;mr(S)&&S.fields.length===1;)S=S.fields[0].type;R=ct(S)}R?_=`((${u})__yo_incr_rc((void*)((${g}*)${o}.data)->${h}))`:_=`((${u})((${g}*)${o}.data)->${h})`}else _=`((${u})__yo_incr_rc((void*)${o}.data))`;let d=e.$?.type;if(!d||!ye(d))throw new Error("downcast codegen: expected Option enum as result type");if(Gt(d))return`((${p}) ? ${_} : NULL)`;let T=M(d,n),$=jt(d,"Some",n),C=jt(d,"None",n),L=`(${T}){ .tag = ${$}, .data = { .Some = { .value = ${_} } } }`,b=`(${T}){ .tag = ${C} }`;return`((${p}) ? ${L} : ${b})`}function nf(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(!be(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(!ct(o)&&!hn(o))return"/* Error: dyn() requires an object type (use box() for value types) */";let s=hn(o)?o.fields[0].type:o,l=x(s)&&s.resolvedConcreteType?s.resolvedConcreteType:s,u=n.types[i.id]?.cName||`yo_dyn_${i.id}`,f=`${(()=>{let d=n.types[l.id]?.cName;if(d)return d;let v=en(l);return(v?n.types[v.id]?.cName:void 0)||`unknown_${l.id}`})()}_${u}`;n.dynImpls.set(f,{dynType:i,concreteType:s,dataType:o,traitValues:a});let p=V(r,t,n);if(r.$?.variableName&&p!==r.$.variableName){let d=ot(r.$.type,r.$.variableName,n);n.emitter.emitLine(`${t}${d} = ${p};`),p=r.$.variableName}if(r.$?.deferredDupExpressions&&r.$.deferredDupExpressions.length>0){tt(r,t,n);let d=r.$.deferredDupExpressions[0];F(d)&&d.$?.variableName&&(p=Ee(d.$.variableName,d.$.env))}let _=e.$?.variableName;if(!_)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===_){g=`sm->var_${d.id}`;break}}let h=`yo_vtable_${f}`;return g?(n.emitter.emitLine(`${t}${g} = (${u}){`),n.emitter.emitLine(`${t} .data = ${p},`),n.emitter.emitLine(`${t} .vtable = &${h}`),n.emitter.emitLine(`${t}};`),g):(n.emitter.emitLine(`${t}${u} ${_} = {`),n.emitter.emitLine(`${t} .data = ${p},`),n.emitter.emitLine(`${t} .vtable = &${h}`),n.emitter.emitLine(`${t}};`),_)}function rf(e,t,n){return e.args.length!==0?"// Error: __yo_gc_collect requires exactly 0 arguments":"__yo_gc_collect()"}function of(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(c=>c.name===a),u=o.stateMachineVariables&&Array.from(o.stateMachineVariables.values()).some(c=>c.name===s);if(a===s&&(l||u))return""}if(e.$?.runtimeDestructurings){let a=e.$.runtimeDestructurings,s=V(i,t,n),l=i.$?.type;return a.forEach(({label:u,type:c,variableName:f})=>{let p=te(f,c.isExtern==="c"),_=ot(c,p,n);if(l&&ce(l)&&l.isNewtype&&l.fields.length===1){let h=l.fields[0];if(h&&h.label===u){n.emitter.emitLine(`${t}${_} = ${s}; // Destructuring ${u} (newtype)`);return}}let m=u.match(/^\d+$/)?`_${u}`:te(u,c.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&&ct(l)?"->":".";n.emitter.emitLine(`${t}${_} = ${s}${g}${m}; // Destructuring ${u}`)}),""}if(U(r)){let a=r.token.value;if(!r.$?.type)return`// Error: No type information for variable ${a}
|
|
10648
|
+
`;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 c=u[u.length-1],f=c.isOwningTheSameRcValueAs?c.isOwningTheSameRcValueAs.id:c.id;o.stateMachineVariables.has(f)&&(s=!0,l=f)}}if(ke(r.$.type))if(F(i)&&E(i,I.array)){let u=V(i,t,n);if(s&&l)n.emitter.emitLine(`${t}sm->var_${l} = ${u};`);else if(!ue(r.$.type)){let c=ot(r.$.type,a,n);n.emitter.emitLine(`${t}${c} = ${u};`)}}else{let u;if(i.$?.variableName){let c=Ee(i.$.variableName,i.$.env),f=V(i,t,n);if(!s){let p=ot(i.$.type,c,n);c!==f&&n.emitter.emitLine(`${t}${p} = ${f};`)}u=c}else u=V(i,t,n);if(s&&l)n.emitter.emitLine(`${t}sm->var_${l} = ${u};`);else if(!ue(r.$.type)){let c=ot(r.$.type,a,n);n.emitter.emitLine(`${t}${c} = ${u};`)}}else{let u,c=F(i)&&i.$?.closureFunctionValue&&i.$?.type&&Yt(i.$.type),f=F(i)&&Bt(i);if(i.$?.variableName){let p=Ee(i.$.variableName,i.$.env),_=Ee(a,r.$.env);if(p===_){if(u=V(i,t,n),!c&&!f&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){tt(i,t,o);let m=i.$.deferredDupExpressions[0];F(m)&&m.$?.variableName&&(u=Ee(m.$.variableName,m.$.env))}}else if(U(i)&&p===Ee(i.token.value,i.$.env)){if(u=V(i,t,n),!c&&!f&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){tt(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=V(i,t,n);if(m.trim()!==p){let g=i.$.convertedRuntimeType||i.$.type,h=ot(g,p,n);n.emitter.emitLine(`${t}${h} = ${m};`)}if(!c&&!f&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){tt(i,t,o);let g=i.$.deferredDupExpressions[0];F(g)&&g.$?.variableName?u=Ee(g.$.variableName,g.$.env):u=p}else u=p}}else if(u=V(i,t,n),!c&&!f&&i.$?.deferredDupExpressions&&i.$.deferredDupExpressions.length>0){tt(i,t,o);let p=i.$.deferredDupExpressions[0];F(p)&&p.$?.variableName&&(u=Ee(p.$.variableName,p.$.env))}if(Xe(r.$.type)){let p=r.$.type;if(s&&l)n.emitter.emitLine(`${t}sm->var_${l} = ${u};`);else if(!ue(p)){let _=ot(p,a,n);n.emitter.emitLine(`${t}${_} = ${u};`)}}else if(s&&l)n.emitter.emitLine(`${t}sm->var_${l} = ${u};`);else{let p=st(i.$.env.modulePath,u.trim()),_;if(p&&n.tempVarAsyncStructNames){let m=n.tempVarAsyncStructNames.get(u.trim());m?_=`${m}*`:_=M(r.$.type,n)}else _=M(r.$.type,n);ue(r.$.type)||n.emitter.emitLine(`${t}${_} ${Ee(a,r.$.env)} = ${u};`)}}return""}}var by=0;function Uo(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`(
|
|
10649
10649
|
#ifdef _WIN32
|
|
10650
10650
|
Sleep(${t[0]})
|
|
10651
10651
|
#else
|
|
10652
10652
|
usleep((${t[0]}) * 1000)
|
|
10653
10653
|
#endif
|
|
10654
|
-
)`;if(k.__yo_decr_rc.includes(e))return`__yo_decr_rc((void*)(${t[0]}))`;if(k.__yo_as.includes(e)&&n.$?.type){let o=M(n.$.type,r),a=n.args[0]?.$?.type;return a&&ye(a)&&!bn(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`(${M(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_maybe_uninit_new.includes(e)&&n.$?.type){let o=M(n.$.type,r),a=`__yo_uninit_${by++}`;return r.emitter.emitLine(`${i}${o} ${a};`),a}else return k.__yo_maybe_uninit_as_ptr.includes(e)&&n.$?.type?`((${M(n.$.type,r)})(${t[0]}))`:k.__yo_maybe_uninit_assume_init.includes(e)?`(${t[0]})`:`/* Unhandled operator ${e} */`}}function af(e,t,n){let r=e.args[0];if(!r)return"// Error: __yo_iso_extract requires exactly 1 argument";let i=V(r,t,n),o=r.$?.type;if(!o||!bt(o))return"// Error: __yo_iso_extract requires an Iso type";let a=M(o,n),s=e.$?.type;if(s&&n.isoTypes?.has(a)){let c=n.isoTypes.get(a);c.optionTypeCName||(c.optionTypeCName=M(s,n))}let l=`__yo_iso_extract_${a}(${i})`,u=e.$?.variableName;return u&&s?(n.emitter.emitLine(`${t}${M(s,n)} ${u} = ${l};`),u):l}function sf(e,t,n){let r=e.args[0];if(!r)return"// Error: __yo_iso_dispose requires exactly 1 argument";let i=V(r,t,n),o=r.$?.type;return!o||!bt(o)?"// Error: __yo_iso_dispose requires an Iso type":`__yo_iso_dispose_${M(o,n)}(${i})`}function sl(e){let t=e.func.$?.value;return D(t)&&bt(t.value)&&e.args.length===1}function lf(e,t,n){if(!sl(e))return"/* Error: generateIsoTypeCall called on non-Iso type call */";let i=(e.func.$?.value).value,o=i.childType,a=e.args[0],s=V(a,t,n),l=M(i,n),u=M(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 wr(e){return e===""||e==="break"||e==="continue"||e.startsWith("goto")||e.includes("return")}function Fr(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 c=0;c<r.length-1;c++){let f=r[c],p=V(f,t,n);p&&n.emitter.emitLine(`${t}${p};`)}let u="";if(r.length>0){let c=r[r.length-1];if(c.$?.deferredDupExpressions&&c.$.deferredDupExpressions.length>0){if(c.$?.variableName){let p=c.$.variableName;c.$.variableName=void 0;let _=V(c,t,n);c.$.variableName=p;let m=M(c.$.type,n),g=Ee(p,c.$.env);g!==_&&n.emitter.emitLine(`${t}${m} ${g} = ${_};`)}tt(c,t,n);let f=c.$.deferredDupExpressions[0];F(f)&&f.$?.variableName?u=Ee(f.$.variableName,f.$.env):u=V(c,t,n)}else u=V(c,t,n)}return e.$?.deferredDropExpressions&&$t(e,t,n),i.pendingDeferredDrops=o,i.consumedVarPendingDrops=s,u}else return e.$?.deferredDupExpressions&&tt(e,t,n),V(e,t,n)}function cf(e,t,n){if(!e.$)return'/* "match" expression is not evaluated */';let r=e.$.variableName,i=e.$.type,o=i&&ue(i);if(!o&&r){let g=M(i,n);n.emitter.emitLine(`${t}${g} ${r};`)}let a=V(e.args[0],t,n),s=e.args[0].$?.type;if(!s)return'// Error: "match" expression requires a valid type';if(e.$.isPrimitiveMatch)return wy(e,t,n,a,s,r,o);let l,u;if(Ne(s)?(u=s.childType,l=s.tag):ct(s)?(u=s,l="ref_semantics"):u=s,!ye(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 f=Gt(u);if(f){let g=e.args.slice(1),h=null,d=null;for(let v of g)if(F(v)&&E(v,"=>",2)){let T=v.args[0],$=v.args[1];if(T&&$&&F(T)&&E(T,"."))h={caseBody:$};else{let C=T.func;if(C&&F(C)&&E(C,".")){let L=C.args[0];if(L&&U(L)){let b=L.token.value;d={caseBody:$,variantName:b,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 b=f;n.emitter.emitLine(`${t} ${M(b,n)} ${v} = ${a};`)}}let T=n;v&&(T.inAsyncStateMachine||T.inEffectStateMachine)&&(T.localShadowedVariables||(T.localShadowedVariables=new Set),T.localShadowedVariables.add(v));let $=Fr(d.caseBody,t+" ",n);v&&T.localShadowedVariables&&T.localShadowedVariables.delete(v);let C=wr($);if(!o&&r&&!C){let L=$||a;n.emitter.emitLine(`${t} ${r} = ${L};`)}else $&&$!==""&&n.emitter.emitLine(`${t} ${$};`)}if(n.emitter.emitLine(`${t}} else {`),h){let v=Fr(h.caseBody,t+" ",n),T=wr(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(bn(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)){let T=v.args[0],$=v.args[1];if(T&&$&&U(T)&&T.token.value==="_"){n.emitter.emitLine(`${t}default: {`);let C=Fr($,t+" ",n);!o&&r&&C&&!wr(C)?n.emitter.emitLine(`${t} ${r} = ${C};`):C&&n.emitter.emitLine(`${t} ${C};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`)}else if(T&&$&&F(T)&&E(T,".",1)){let C=T.args[0].token.value,L=jt(u,C,n);n.emitter.emitLine(`${t}case ${L}: {`);let b=Fr($,t+" ",n);!o&&r&&b&&!wr(b)?n.emitter.emitLine(`${t} ${r} = ${b};`):b&&n.emitter.emitLine(`${t} ${b};`),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 _=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)){let d=h.args[0],v=h.args[1];if(d&&v&&U(d)&&d.token.value==="_"){n.emitter.emitLine(`${t}default: {`);let T=Fr(v,t+" ",n);!o&&r&&T&&!wr(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,$=jt(u,T,n);if(n.emitter.emitLine(`${t}case ${$}: {`),d.args.length>1){let L=u.variants.find(b=>b.name===T);if(L&&L.fields){let b=d.args.slice(1);if(b.some(S=>F(S)&&E(S,":",2))){for(let S of b)if(F(S)&&E(S,":",2)){let G=S.args[0],P=S.args[1];if(!U(G))continue;let O=G.token.value,B=L.fields.find(ae=>ae.label===O);if(!B||ue(B.type))continue;if(U(P)){let ae=P.token.value;if(ae!=="_"){let K=te(ae),W=te(O),de=M(B.type,n),me=l==="ref_semantics"||l?"->":".";n.emitter.emitLine(`${t} ${de} ${K} = ${a}${me}data.${T}.${W};`);let he=n;if((he?.inAsyncStateMachine||he?.inEffectStateMachine)&&he.stateMachineVariables){let H;if(P.$?.env){let Q=X(P.$.env,ae);Q.length>0&&(H=Q[Q.length-1].id)}H&&he.stateMachineVariables.has(H)&&n.emitter.emitLine(`${t} sm->var_${H} = ${K};`)}}}}}else for(let S=0;S<b.length&&S<L.fields.length;S++){let G=b[S],P=L.fields[S];if(U(G)&&P){if(ue(P.type))continue;let O=G.token.value;if(O!=="_"){let B=te(O),ae=te(P.label),K=M(P.type,n),W=l==="ref_semantics"||l?"->":".";n.emitter.emitLine(`${t} ${K} ${B} = ${a}${W}data.${T}.${ae};`);let de=n;if((de?.inAsyncStateMachine||de?.inEffectStateMachine)&&de.stateMachineVariables){let me;if(G.$?.env){let he=X(G.$.env,O);he.length>0&&(me=he[he.length-1].id)}me&&de.stateMachineVariables.has(me)&&n.emitter.emitLine(`${t} sm->var_${me} = ${B};`)}}}}}}if(F(v)&&E(v,"=>",2)){let L=v.args[0];n.emitter.emitLine(`${t} ${M(s,n)} ${te(L.token.value)} = ${a};`),v=v.args[1]}let C=Fr(v,t+" ",n);!o&&r&&C&&!wr(C)?n.emitter.emitLine(`${t} ${r} = ${C};`):C&&n.emitter.emitLine(`${t} ${C};`),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,$=jt(u,T,n),C=d.args;n.emitter.emitLine(`${t}case ${$}: {`);let L=u.variants.find(R=>R.name===T);if(L&&L.fields&&C.length>0)if(C.some(S=>F(S)&&E(S,":",2))){for(let S of C)if(F(S)&&E(S,":",2)){let G=S.args[0],P=S.args[1];if(!U(G))continue;let O=G.token.value,B=L.fields.find(ae=>ae.label===O);if(!B)continue;if(U(P)){let ae=P.token.value;if(ae!=="_"){let K=te(ae);if(ue(B.type))n.emitter.emitLine(`${t} // ${K} is unit type (no value)`);else{let W=te(O),de=M(B.type,n),me=l==="ref_semantics"||l?"->":".";n.emitter.emitLine(`${t} ${de} ${K} = ${a}${me}data.${T}.${W};`);let he=n;if((he?.inAsyncStateMachine||he?.inEffectStateMachine)&&he.stateMachineVariables){let H;if(P.$?.env){let Q=X(P.$.env,K);Q.length>0&&(H=Q[Q.length-1].id)}H&&he.stateMachineVariables.has(H)&&n.emitter.emitLine(`${t} sm->var_${H} = ${K};`)}}}}}}else for(let S=0;S<Math.min(C.length,L.fields.length);S++){let G=C[S],P=L.fields[S];if(G.tag==="Atom"&&P){let O=G.token.value;if(O!=="_"){let B=te(O);if(ue(P.type))n.emitter.emitLine(`${t} // ${B} is unit type (no value)`);else{let ae=te(P.label),K=M(P.type,n),W=l==="ref_semantics"||l?"->":".";n.emitter.emitLine(`${t} ${K} ${B} = ${a}${W}data.${T}.${ae};`);let de=n;if((de?.inAsyncStateMachine||de?.inEffectStateMachine)&&de.stateMachineVariables){let me;if(G.$?.env){let he=X(G.$.env,O);he.length>0&&(me=he[he.length-1].id)}me&&de.stateMachineVariables.has(me)&&n.emitter.emitLine(`${t} sm->var_${me} = ${B};`)}}}}}if(F(v)&&E(v,"=>",2)){let R=v.args[0];n.emitter.emitLine(`${t} ${M(s,n)} ${te(R.token.value)} = ${a};`),v=v.args[1]}let b=Fr(v,t+" ",n);!o&&r&&b&&!wr(b)?n.emitter.emitLine(`${t} ${r} = ${b};`):b&&n.emitter.emitLine(`${t} ${b};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`)}}}return n.insideMatch=_,n.emitter.emitLine(`${t}}`),e.$?.deferredDropExpressions&&$t(e,t,n),o?"":r??""}function ky(e){return F(e)?E(e,"|",2):!1}function ll(e){if(!ky(e))return[e];let t=e,n=t.args[0],r=t.args[1];return[...ll(n),...ll(r)]}function uf(e){if(e!==void 0){if(Re(e))return String(e.value);if(Ue(e))return e.value?"true":"false"}}function wy(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 c=l[u];if(F(c)&&E(c,"=>",2)){let f=c.args[0],p=c.args[1];if(!f||!p)continue;if(U(f)&&f.token.value==="_"){n.emitter.emitLine(`${t}default: {`);let h=Fr(p,t+" ",n);!a&&o&&h&&!wr(h)?n.emitter.emitLine(`${t} ${o} = ${h};`):h&&n.emitter.emitLine(`${t} ${h};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`);continue}let _=ll(f),m=f.$?.primitivePatternValues;if(m&&m.length>0)for(let h of m){let d=uf(h);d!==void 0&&n.emitter.emitLine(`${t}case ${d}:`)}else for(let h of _){let d=h.$?.value,v=uf(d);v!==void 0&&n.emitter.emitLine(`${t}case ${v}:`)}n.emitter.emitLine(`${t}{`);let g=Fr(p,t+" ",n);!a&&o&&g&&!wr(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&&$t(e,t,n),a?"":o??""}function ff(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(ce(i)&&o===void 0){let a=V(r,t,n),s=e.$.runtimeDestructurings;for(let l of s){let u=M(l.type,n),c=te(l.variableName),f=te(l.label);n.emitter.emitLine(`${t}${u} ${c} = ${a}.${f};`)}}}return""}function pf(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(x(o)){let g=o;g.resolvedConcreteType&&(a=g.resolvedConcreteType.id,s=g.resolvedConcreteType)}else ce(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,c=M(s,n),f=V(i,t,n),p=i.$?.variableName?Ee(i.$.variableName,i.$.env):f,_=`_thread_closure_data_${Ge(e.$?.env.modulePath??"")}`;n.emitter.emitLine(`${t}${c}* ${_} = (${c}*)__yo_malloc(sizeof(${c}));`),n.emitter.emitLine(`${t}*${_} = ${p};`);let m=e.$?.variableName;return m?(n.emitter.emitLine(`${t}__yo_thread_t ${m} = __yo_thread_spawn(${u}, ${_});`),m):`__yo_thread_spawn(${u}, ${_})`}function _f(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(x(o)){let m=o;m.resolvedConcreteType&&(a=m.resolvedConcreteType.id,s=m.resolvedConcreteType)}else ce(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,c=M(s,n),f=V(i,t,n),p=i.$?.variableName?Ee(i.$.variableName,i.$.env):f,_=`_worker_closure_data_${Ge(e.$?.env.modulePath??"")}`;return n.emitter.emitLine(`${t}${c}* ${_} = (${c}*)__yo_malloc(sizeof(${c}));`),n.emitter.emitLine(`${t}*${_} = ${p};`),n.emitter.emitLine(`${t}__yo_worker_spawn(${u}, ${_});`),""}function df(e,t,n){let r=e.args[0];return r?`__yo_thread_set_maximum_threads(${V(r,t,n)})`:"// Error: __yo_thread_set_maximum_threads requires exactly 1 argument"}function mf(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 kn(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&&Ce(i.type))return;let o=`var_${i.id}`,a=te(e);n.emitter.emitLine(`${t}sm->${o} = ${a};`)}}function hf(e,t,n){if(e.$?.value!==void 0&&!_e(e.$.value))return e.$?.deferredDropExpressions&&$t(e,t,n),ue(e.$.type)?"":Kt(e.$.value,n,e);let r=e.func.$?.value,i=e.func.$?.type??(ne(r)?r.specializedType??r.type:void 0);if(z(i)){let o=e.$?.runtimeArgExprsInOrder;if(o){let a=!1;if(F(e.func)&&E(e.func,".",2)){let c=e.func.args[0]?.$?.type;c&&be(c)&&(a=!0)}let s=o.map((u,c)=>{if(u.$?.variableName&&u.$?.type){let f=n,p=f.currentClosureCaptures&&f.currentClosureCaptures.includes(u.$.variableName)&&U(u)&&u.$.env&&f.currentClosureCaptureFrameLevel!==void 0&&pr(u.token.value,u.$.env,f.currentClosureCaptureFrameLevel),_=V(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=(f.inAsyncStateMachine||f.inEffectStateMachine)&&_.startsWith("sm->"),h=!1;if(_&&_!==u.$.variableName&&!p&&!g&&!m){let v=Ee(u.$.variableName,u.$.env);if(_!==v){let T=u.$.convertedRuntimeType||u.$.type,$=ot(T,u.$.variableName,n);n.emitter.emitLine(`${t}${$} = ${_};`),h=!0,kn(u.$.variableName,t,n)}}let d=h?u.$.variableName:_;if(u.$?.deferredDupExpressions&&u.$.deferredDupExpressions.length>0){let v=new Set;u.$?.variableName&&v.add(Ee(u.$.variableName,u.$.env)),_&&v.add(_),U(u)&&v.add(Ee(u.token.value,u.$.env));let T=u.$.deferredDupExpressions.find($=>{let C=wa($);return C?v.has(Ee(C,$.$?.env)):!1});T&&(tt(u,t,f),F(T)&&T.$?.variableName&&(d=Ee(T.$.variableName,T.$.env)))}if(a&&c===0){if(F(e.func)&&E(e.func,".",2)){let $=e.func.args[0]?.$?.type,C=e.func.args[1];if(U(C)&&be($)){let L=C.token.value;if($.trait.fields.find(R=>R.label===L))return g?_:te(d,u.$.type.isExtern==="c")}}let v=u.$?.type;return v&&Ne(v)?g?`${_}->data`:`${te(d,u.$.type.isExtern==="c")}->data`:g?`(${_}).data`:`(${te(d,u.$.type.isExtern==="c")}).data`}else return p||g||m?_:te(d,u.$.type.isExtern==="c")}else if(a&&c===0){let f=V(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)&&be(m)){let h=g.token.value;if(m.trait.fields.find(v=>v.label===h))return f}}let p=u.$?.type;return p&&Ne(p)?`(${f})->data`:`(${f}).data`}else return V(u,t,n)}),l=s.join(", ");if(i.isExtern==="yo"&&i.externName){let u=i.externName;return fi.includes(u)?Uo(u,s,e,n,t):u==="__yo_thread_spawn"?pf(e,t,n):u==="__yo_worker_spawn"?_f(e,t,n):ue(i.return.type)?(n.emitter.emitLine(`${t}${u}(${l});`),e.$?.deferredDropExpressions&&$t(e,t,n),""):`${u}(${l})`}{let u=n;if(u.currentEvidenceParams?.size){let c=e.func.token?.value,f;if(c==="."&&F(e.func)&&E(e.func,".",2)){let p=e.func.args[1];p&&U(p)&&(c=p.token.value);let _=e.func.args[0];if(_&&U(_))f=_.token.value;else if(_&&F(_)&&E(_,".",2)){let m=_.args[0];m&&U(m)&&(f=m.token.value)}}if(c&&c!=="."){for(let p of u.currentEvidenceParams.values())if(p.fieldLabel===c||p.implicitLabel===c||p.fieldPath[p.fieldPath.length-1]===c){if(f&&f!==p.implicitLabel)continue;return gf(p.cParamName,i,s,o,e,t,u,p)}}}}if(ne(r)){let u=Ui(r);if(u)return Uo(u,s,e,n,t);let c=r.specializedType??r.type,f=n;if(f.currentEvidenceParams&&r.isModuleEffectMember){let _,m=e.func.$?.env??e.$?.env;if(m)for(let g of f.currentEvidenceParams.values()){let h=X(m,g.implicitLabel),v=h[h.length-1]?.value?.[0];if(v&&ze(v)){let T=v,$=!0;for(let C=0;C<g.fieldPath.length-1;C++){let L=g.fieldPath[C],b=T.type.fields.findIndex(R=>R.label===L);if(b>=0&&T.fields[b]&&ze(T.fields[b]))T=T.fields[b];else{$=!1;break}}if($){let C=g.fieldPath[g.fieldPath.length-1],L=T.type.fields.findIndex(b=>b.label===C);if(L>=0){let b=T.fields[L];if(b&&ne(b)&&b.funcId===r.funcId){_=g;break}}}}}if(_){let g=_.cParamName;return gf(g,c,s,o,e,t,f,_)}}let p=n.functions[r.funcId]?.cName;if(p){let _=r.specializedType??r.type,m=wt(_);if(m.length===0&&r.specializedType){let d=wt(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}=ul(m,r,e,n);if(d.length>0){let T=l?`${l}, ${d.join(", ")}`:d.join(", ");return cl(p,T,c,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=So(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=wt(r.type);if(d.length>0){let v=e.func?.$?.env??e.$?.env;if(v)for(let T of d){let $=So(v,C=>C.isImplicit===!0&&(C.name===T.implicitLabel||C.name===T.fieldLabel));if($>=0&&$>v.functionDeclarationFrameLevel&&v.frames[$]?.isBeginBlockFrame){h=!0;break}}}}}if(ue(c.return.type))return n.emitter.emitLine(`${t}${p}(${l});`),e.$?.deferredDropExpressions&&$t(e,t,n),g&&yf(t,n,h,e),"";{let d=e.$?.variableName;if(d){let v=r.specializedType?.return.type??c.return.type,T=e.$?.type,$=T&&Ce(T),C=v&&Ce(v),L;if($&&C){let b=r.body;if(b&&E(b,"begin")){let R=b.args;if(R.length>0){let S=R[R.length-1];Bt(S)&&(b=S)}}if(b&&Bt(b)&&b.$?.asyncStateMachineStructName){let R=b.$.asyncStateMachineStructName;L=`${R}*`,n.tempVarAsyncStructNames||(n.tempVarAsyncStructNames=new Map),n.tempVarAsyncStructNames.set(d,R)}else T&&x(T)&&T.resolvedConcreteType?L=M(T,n):L=M(v,n)}else L=M(v??T,n);return n.emitter.emitLine(`${t}${L} ${d} = ${p}(${l});`),kn(d,t,n),e.$?.deferredDropExpressions&&$t(e,t,n),g&&yf(t,n,h,e),d}else return`// Error: Regular function call returns ${M(r.specializedType?.return.type??c.return.type,n)} but no temp variable assigned`}}}else{let u=n.externFunctions[i.id];if(u){let c=u.cName;return e.$?.deferredDropExpressions&&$t(e,t,n),`${c}(${l})`}else{let c=V(e.func,t,n);if(r&&z(r.type)){let d=wt(r.type);if(d.length>0){let{args:v,isHandlerInstallation:T}=ul(d,r,e,n);if(v.length>0){let $=l?`${l}, ${v.join(", ")}`:v.join(", ");return cl(c,$,i,e,o,t,n,T)}}}let f=e.$?.type??i.return.type,p=M(f,n),_=i.parameters.filter(d=>!d.isCompileTimeOnly).map(d=>M(d.type,n)),m=`((${p} (*)(${_.join(", ")}))${c})`,g=n,h=c.includes("__capture.")&&!!g.inAsyncStateMachine;if(h&&n.emitter.emitLine(`${t}__yo_effect_escaped = 0;`),ue(i.return.type)||ue(f)){if(n.emitter.emitLine(`${t}${m}(${l});`),e.$?.deferredDropExpressions&&$t(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=mf(te(d.$.variableName),n),T=br(v,d.$.type,n);T&&(n.emitter.emitLine(`${t} ${T};`),n.emitter.emitLine(`${t} memset(&${v}, 0, sizeof(${v}));`))}}Vn({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&&Ce(T)&&Ce(v)?v:T??v;if(n.emitter.emitLine(`${t}${M($,n)} ${d} = ${m}(${l});`),kn(d,t,n),e.$?.deferredDropExpressions&&$t(e,t,n),h){if(n.emitter.emitLine(`${t}if (__yo_effect_escaped) {`),o){for(let C of o)if(C.$?.variableName&&C.$?.type&&Le(C.$.type)){let L=mf(te(C.$.variableName),n),b=br(L,C.$.type,n);b&&(n.emitter.emitLine(`${t} ${b};`),n.emitter.emitLine(`${t} memset(&${L}, 0, sizeof(${L}));`))}}Vn({emitter:n.emitter,indent:t+" ",resultCode:void 0,debugLabel:void 0}),n.emitter.emitLine(`${t}}`)}return d}else return`// Error: Function parameter call returns ${M(i.return.type,n)} but no temp variable assigned`}}}}}else if(i&&Yt(i)){let o=i,a=en(o),s=be(o);{let l=a.isFn.callType,u=e.$?.runtimeArgExprsInOrder;if(u){let c=n;for(let g of u)if(g.$?.variableName&&g.$?.type){let h=c.currentClosureCaptures&&c.currentClosureCaptures.includes(g.$.variableName)&&U(g)&&g.$.env&&c.currentClosureCaptureFrameLevel!==void 0&&pr(g.token.value,g.$.env,c.currentClosureCaptureFrameLevel),d=V(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=(c.inAsyncStateMachine||c.inEffectStateMachine)&&d.startsWith("sm->");if(d&&d!==g.$.variableName&&!h&&!T&&!v){let $=g.$.convertedRuntimeType||g.$.type,C=ot($,g.$.variableName,n);n.emitter.emitLine(`${t}${C} = ${d};`),kn(g.$.variableName,t,n)}}let f=V(e.func,t,n),p=u.map(g=>{if(g.$?.variableName&&g.$?.type){if(c.currentClosureCaptures&&c.currentClosureCaptures.includes(g.$.variableName)&&U(g)&&g.$.env&&c.currentClosureCaptureFrameLevel!==void 0&&pr(g.token.value,g.$.env,c.currentClosureCaptureFrameLevel))return V(g,t,n);{let d=Ee(g.$.variableName,g.$.env),v=(c.inAsyncStateMachine||c.inEffectStateMachine)&&d.startsWith("sm->"),T=d;if(g.$?.deferredDupExpressions&&g.$.deferredDupExpressions.length>0){tt(g,t,c);let $=g.$.deferredDupExpressions[0];F($)&&$.$?.variableName&&(T=Ee($.$.variableName,$.$.env))}return v?d:T}}else return V(g,t,n)}),_;if(s){let g=[`(${f}).data`,...p];_=`(${f}).vtable->call(${g.join(", ")})`}else{let g;if(x(o)){let d=o;d.resolvedConcreteType&&(g=d.resolvedConcreteType.id)}let h=g?n.implClosureCallMap.get(g):void 0;if(h){let d=wt(l);if(d.length>0){let{args:T,isHandlerInstallation:$}=ul(d,{},e,c);if(T.length>0){let C=[`&(${f})`,...p,...T];return cl(h.functionCName,C.join(", "),l,e,u,t,c,$)}}let v=[`&(${f})`,...p];_=`${h.functionCName}(${v.join(", ")})`}else{let d=[`(${f}).data`,...p];_=`(${f}).call(${d.join(", ")})`}}let m=l.return.type;if(ue(m))return n.emitter.emitLine(`${t}${_};`),e.$?.deferredDropExpressions&&$t(e,t,n),"";{let g=e.$?.variableName;return g?(n.emitter.emitLine(`${t}${M(m,n)} ${g} = ${_};`),kn(g,t,n),e.$?.deferredDropExpressions&&$t(e,t,n),g):`// Error: Closure call returns ${M(m,n)} but no temp variable assigned`}}else return"// Error: No runtime args found for closure call"}}else if(D(r))if(ce(r.value)){let o=r.value,a=e.$?.runtimeArgExprsInOrder,s=n.types[o.id]?.cName,l=o.fields.map(c=>c.label),u=e.$?.variableName;if(a&&s&&l.length===a.length){if(o.isNewtype&&o.fields.length===1){let c=a[0],f=V(c,t,n),p=f;if(c.$?.deferredDupExpressions&&c.$.deferredDupExpressions.length>0){let m=n;if(c.$?.variableName&&c.$?.type){let h=Ee(c.$.variableName,c.$.env);if(f!==h){let d=c.$.type,v=M(d,n);n.emitter.emitLine(`${t}${v} ${h} = ${f};`)}}tt(c,t,m);let g=c.$.deferredDupExpressions[0];F(g)&&g.$?.variableName&&(p=Ee(g.$.variableName,g.$.env))}let _=`((${s})(${p}))`;if(u&&e.$?.type){let m=ot(e.$.type,u,n);return n.emitter.emitLine(`${t}${m} = ${_};`),kn(u,t,n),u}else return _}if(o.isReferenceSemantics){let c=n,f=a.map(m=>{let g=V(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=M(v,n);n.emitter.emitLine(`${t}${T} ${d} = ${g};`)}}tt(m,t,c);let h=m.$.deferredDupExpressions[0];if(F(h)&&h.$?.variableName)return Ee(h.$.variableName,h.$.env)}return g}).join(", "),_=`${`__yo_new_${s}`}(${f})`;if(u&&e.$?.type){let m=ot(e.$.type,u,n);return n.emitter.emitLine(`${t}${m} = ${_};`),kn(u,t,n),u}else return _}else{let c=n,f=a.map((_,m)=>{let g=V(_,t,n),h=we(o)?`_${m}`:te(l[m],o.isExtern==="c"),d=g;if(_.$?.deferredDupExpressions&&_.$.deferredDupExpressions.length>0){if(_.$?.variableName&&_.$?.type){let T=Ee(_.$.variableName,_.$.env),$=_.$.type,C=M($,n);g!==T&&n.emitter.emitLine(`${t}${C} ${T} = ${g};`)}tt(_,t,c);let v=_.$.deferredDupExpressions[0];F(v)&&v.$?.variableName&&(d=Ee(v.$.variableName,v.$.env))}return`.${h} = `+d}).join(", "),p=`(${s}){ ${f} }`;if(u&&e.$?.type){let _=ot(e.$.type,u,n);return n.emitter.emitLine(`${t}${_} = ${p};`),kn(u,t,n),u}else return p}}}else{if(Yt(r.value))return"// Error: Closure construction should have been handled by closureFunctionValue check at top of generateFuncCall";if(_t(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 c=n,f=s.token.value,p=Ee(f,s.$?.env),m=V(l,t,n);if(l.$?.deferredDupExpressions&&l.$.deferredDupExpressions.length>0){tt(l,t,c);let h=l.$.deferredDupExpressions[0];F(h)&&h.$?.variableName&&(m=Ee(h.$.variableName,h.$.env))}let g=`(${u}){ .${p} = ${m} }`;if(o&&e.$?.type){let h=ot(e.$.type,o,n);return n.emitter.emitLine(`${t}${h} = ${g};`),kn(o,t,n),o}else return g}}}else if(ye(r.value)){let o=r.value,a=e.$?.runtimeArgExprsInOrder,s=n.types[o.id]?.cName,l=e.$?.variableName;if(o.selectedVariantName&&a&&s){if(Gt(o)){let _=o.selectedVariantName,m=o.variants.find(g=>g.name===_);if(m){if(!m.fields||m.fields.length===0){let g="NULL";if(l&&e.$?.type){let h=ot(e.$.type,l,n);return n.emitter.emitLine(`${t}${h} = ${g};`),kn(l,t,n),l}else return g}else if(m.fields.length===1){let g=V(a[0],t,n);if(l&&e.$?.type){let h=ot(e.$.type,l,n);return n.emitter.emitLine(`${t}${h} = ${g};`),kn(l,t,n),l}else return g}}}if(bn(o)){let _=o.selectedVariantName,m=jt(o,_,n);if(l&&e.$?.type){let g=ot(e.$.type,l,n);return n.emitter.emitLine(`${t}${g} = ${m};`),kn(l,t,n),l}else return m}let f=o.selectedVariantName,p=o.variants.find(_=>_.name===f);if(p){let _=p.fields?.filter(d=>!ue(d.type))||[],m=n,g=a.map((d,v)=>{if(p.fields){let T=p.fields[v];if(T&&!ue(T.type)){let $=V(d,t,n),C=Ee(T.label,d.$?.env),L=$;if(d.$?.variableName&&d.$?.type){let b=m.currentClosureCaptures&&m.currentClosureCaptures.includes(d.$.variableName)&&U(d)&&d.$.env&&m.currentClosureCaptureFrameLevel!==void 0&&pr(d.token.value,d.$.env,m.currentClosureCaptureFrameLevel),R=(m.inAsyncStateMachine||m.inEffectStateMachine)&&$.startsWith("sm->"),S=!1;if(U(d)&&d.$.env&&d.$.variableName){let P=X(d.$.env,d.$.variableName);P.length>0&&P[P.length-1].isCompileTimeOnly&&(S=!0)}let G=!1;if($&&$!==d.$.variableName&&!b&&!R&&!S){let P=Ee(d.$.variableName,d.$.env);if($!==P){let O=ot(d.$.type,d.$.variableName,n);n.emitter.emitLine(`${t}${O} = ${$};`),G=!0,kn(d.$.variableName,t,n)}}G&&(L=Ee(d.$.variableName,d.$.env))}if(d.$?.deferredDupExpressions&&d.$.deferredDupExpressions.length>0){tt(d,t,m);let b=d.$.deferredDupExpressions[0];F(b)&&b.$?.variableName&&(L=Ee(b.$.variableName,b.$.env))}return`.${C} = `+L}return""}else return""}).filter(d=>d).join(", "),h=_.length>0?`(${s}){ .tag = ${jt(o,f,n)}, .data = { .${f} = { ${g} } } }`:`(${s}){ .tag = ${jt(o,f,n)} }`;if(l&&e.$?.type){let d=ot(e.$.type,l,n);return n.emitter.emitLine(`${t}${d} = ${h};`),kn(l,t,n),l}else return h}}}}else if(ke(i)){let o=e.args[0];if(o&&F(o)&&E(o,":")){let l=V(e.func,t,n),u=V(o.args[0],t,n),c=V(o.args[1],t,n),f=`Slice_${te(M(i.childType,n))}`;return n.sliceStructTypes.has(f)||n.sliceStructTypes.set(f,{childType:M(i.childType,n)}),`(${f}){ .data = &${l}.data[${u}], .length = (${c}) - (${u}) }`}else if(o&&U(o)&&o.token.value===":"){let l=V(e.func,t,n),u=i,c=u.childType,f=`Slice_${te(M(c,n))}`;return n.sliceStructTypes.has(f)||n.sliceStructTypes.set(f,{childType:M(c,n)}),Re(u.length)?`(${f}){ .data = &${l}.data[0], .length = ${u.length.value} }`:"/* Error: Cannot slice array with non-compile-time length */"}let a=V(e.func,t,n),s=V(o,t,n);return`${a}.data[${s}]`}else if(Xe(i)){let o=e.args[0];if(o&&F(o)&&E(o,":")){let l=V(e.func,t,n),u=V(o.args[0],t,n),c=V(o.args[1],t,n),f=`Slice_${te(M(i.childType,n))}`;return n.sliceStructTypes.has(f)||n.sliceStructTypes.set(f,{childType:M(i.childType,n)}),`(${f}){ .data = &${l}.data[${u}], .length = (${c}) - (${u}) }`}else if(o&&U(o)&&o.token.value===":"){let l=V(e.func,t,n),u=`Slice_${te(M(i.childType,n))}`;return n.sliceStructTypes.has(u)||n.sliceStructTypes.set(u,{childType:M(i.childType,n)}),`(${u}){ .data = ${l}.data, .length = ${l}.length }`}let a=V(e.func,t,n),s=V(o,t,n);return`${a}.data[${s}]`}else if(i&&Ne(i)&&Xe(i.childType)){let o=V(e.func,t,n),a=V(e.args[0],t,n);return`${o}.data[${a}]`}}function yf(e,t,n,r){let i=t.emitter;if(i.emitLine(`${e}if (__yo_effect_escaped) {`),t.inAsyncStateMachine||(cn(e+" ",t,r,!1,!0,!1),Kn(e+" ",t,r)),t.inAsyncStateMachine)n&&i.emitLine(`${e} __yo_effect_escaped = 0;`),Vn({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&&!ue(o)){let a=M(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&&!ue(o)){let a=M(o,t);a!=="void"?i.emitLine(`${e} return (${a}){0};`):i.emitLine(`${e} return;`)}else i.emitLine(`${e} return;`)}i.emitLine(`${e}}`)}function gf(e,t,n,r,i,o,a,s){let l=n.join(", "),u=t.return.type,c=a.emitter,f;if(s?.fieldFunctionType.forallParameters&&s.fieldFunctionType.forallParameters.length>0){let p=i.$?.type?M(i.$.type,a):M(u,a),_=[],g=s.fieldFunctionType.parameters.filter(d=>!d.isCompileTimeOnly);for(let d=0;d<g.length;d++){let v=g[d].type,T=x(v)&&r?.[d]?.$?.type?r[d].$.type:v,$=z(T)?fr(T,"(*)",a):M(T,a);_.push($)}let h=_.join(", ");f=`((${p} (*)(${h}))${e})`}else f=e;if(ue(u)){if(c.emitLine(`${o}${f}(${l});`),i.$?.deferredDropExpressions&&$t(i,o,a),c.emitLine(`${o}if (__yo_effect_escaped) {`),a.inAsyncStateMachine||(cn(o+" ",a,i,!1,!0,!1),Kn(o+" ",a,i)),a.inAsyncStateMachine)Vn({emitter:c,indent:o+" ",resultCode:void 0,debugLabel:void 0});else{let p=a.currentFunctionType?.return.type;if(p&&!ue(p)){let _=M(p,a);_!=="void"?c.emitLine(`${o} return (${_}){0};`):c.emitLine(`${o} return;`)}else c.emitLine(`${o} return;`)}return c.emitLine(`${o}}`),""}else{let p=i.$?.variableName;if(p){let _=s?.fieldFunctionType.forallParameters?.length&&i.$?.type?i.$.type:u,m=M(_,a);if(m==="void"||ue(_)){if(c.emitLine(`${o}${f}(${l});`),i.$?.deferredDropExpressions&&$t(i,o,a),c.emitLine(`${o}if (__yo_effect_escaped) {`),a.inAsyncStateMachine||(cn(o+" ",a,i,!1,!0,!1),Kn(o+" ",a,i)),a.inAsyncStateMachine)Vn({emitter:c,indent:o+" ",resultCode:void 0,debugLabel:void 0});else{let g=a.currentFunctionType?.return.type;if(g&&!ue(g)){let h=M(g,a);h!=="void"?c.emitLine(`${o} return (${h}){0};`):c.emitLine(`${o} return;`)}else c.emitLine(`${o} return;`)}return c.emitLine(`${o}}`),""}if(c.emitLine(`${o}${m} ${p} = ${f}(${l});`),i.$?.deferredDropExpressions&&$t(i,o,a),c.emitLine(`${o}if (__yo_effect_escaped) {`),a.inAsyncStateMachine||(cn(o+" ",a,i,!1,!0,!1),Kn(o+" ",a,i)),a.inAsyncStateMachine)Vn({emitter:c,indent:o+" ",resultCode:void 0,debugLabel:void 0});else{let g=a.currentFunctionType?.return.type;if(g&&!ue(g)){let h=M(g,a);h!=="void"?c.emitLine(`${o} return (${h}){0};`):c.emitLine(`${o} return;`)}else c.emitLine(`${o} return;`)}return c.emitLine(`${o}}`),p}else return`${f}(${l})`}}function ul(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 c=r.currentEvidenceParams.get(l);c&&(i.push(c.cParamName),u=!0)}if(!u){if(o){if(o.effectHandlerInfos)for(let c of o.effectHandlerInfos){if(c.effectParameterName!==s.fieldLabel&&c.effectParameterName!==s.implicitLabel)continue;let f=c.handlerValue;if(f&&ne(f)){if(f.specializedFunctionCaches?.length){let _=f.specializedFunctionCaches[0].specializedFunction,m=r.functions[_.funcId]?.cName;if(m){i.push(`(void*)${m}`),u=!0,a=!0;break}}let p=r.functions[f.funcId]?.cName;if(p){i.push(p),u=!0,a=!0;break}}}if(!u&&o.handlerValue&&e.length===1){let c=o.handlerValue;if(c&&ne(c)){if(c.specializedFunctionCaches?.length){let f=c.specializedFunctionCaches[0].specializedFunction,p=r.functions[f.funcId]?.cName;p&&(i.push(`(void*)${p}`),u=!0,a=!0)}if(!u){let f=r.functions[c.funcId]?.cName;f&&(i.push(f),u=!0,a=!0)}}}}if(!u){let c=n.func.$?.env??n.$?.env;if(c){let f=X(c,s.implicitLabel),p=un(c,d=>d.isImplicit===!0&&z(d.type)&&z(s.fieldFunctionType)&&d.type===s.fieldFunctionType),_=f[f.length-1],m=p[p.length-1],h=(m&&m!==_?m:_??m)?.value?.[0];if(h&&ze(h)){let d=h,v=!0;for(let T=0;T<s.fieldPath.length-1;T++){let $=s.fieldPath[T],C=d.type.fields.findIndex(L=>L.label===$);if(C>=0&&d.fields[C]&&ze(d.fields[C]))d=d.fields[C];else{v=!1;break}}if(v){let T=s.fieldPath[s.fieldPath.length-1],$=d.type.fields.findIndex(C=>C.label===T);if($>=0){let C=d.fields[$];if(C&&ne(C)){if(C.specializedFunctionCaches?.length>0){let L=C.specializedFunctionCaches[0].specializedFunction,b=r.functions[L.funcId]?.cName;b&&(i.push(`(void*)${b}`),u=!0)}if(!u){let L=r.functions[C.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 c=s.fieldPath[s.fieldPath.length-1];for(let[,f]of r.stateMachineVariables)if(f.name===c&&f.kind==="outer"){i.push(`sm->__capture.${c}`),u=!0;break}}if(!u)break}}return{args:i,isHandlerInstallation:a}}function cl(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;`),ue(u)){if(l.emitLine(`${o}${e}(${t});`),r.$?.deferredDropExpressions&&$t(r,o,a),l.emitLine(`${o}if (__yo_effect_escaped) {`),a.inAsyncStateMachine||(cn(o+" ",a,r,!1,!0,!1),Kn(o+" ",a,r)),a.inAsyncStateMachine)Vn({emitter:l,indent:o+" ",resultCode:void 0,debugLabel:void 0});else{let c=a.currentFunctionType?.return.type;if(s&&l.emitLine(`${o} __yo_effect_escaped = 0;`),c&&!ue(c))if(s){let f=M(c,a);f!=="void"?(l.emitLine(`${o} ${f} _esc_result;`),l.emitLine(`${o} memcpy(&_esc_result, __yo_effect_escape_value, sizeof(${f}));`),l.emitLine(`${o} return _esc_result;`)):l.emitLine(`${o} return;`)}else{let f=M(c,a);f!=="void"?l.emitLine(`${o} return (${f}){0};`):l.emitLine(`${o} return;`)}else l.emitLine(`${o} return;`)}return l.emitLine(`${o}}`),""}else{let c=r.$?.variableName;if(c){let f=M(u,a);if(l.emitLine(`${o}${f} ${c} = ${e}(${t});`),kn(c,o,a),r.$?.deferredDropExpressions&&$t(r,o,a),l.emitLine(`${o}if (__yo_effect_escaped) {`),a.inAsyncStateMachine||(cn(o+" ",a,r,!1,!0,!1),Kn(o+" ",a,r)),a.inAsyncStateMachine)Vn({emitter:l,indent:o+" ",resultCode:void 0,debugLabel:void 0});else{let p=a.currentFunctionType?.return.type;if(s&&p&&!ue(p)){let _=M(p,a);l.emitLine(`${o} ${_} _esc_result;`),l.emitLine(`${o} memcpy(&_esc_result, __yo_effect_escape_value, sizeof(${_}));`),l.emitLine(`${o} __yo_effect_escaped = 0;`),l.emitLine(`${o} return _esc_result;`)}else if(p&&!ue(p)){let _=M(p,a);_!=="void"?l.emitLine(`${o} return (${_}){0};`):l.emitLine(`${o} return;`)}else s&&l.emitLine(`${o} __yo_effect_escaped = 0;`),l.emitLine(`${o} return;`)}return l.emitLine(`${o}}`),c}else return`${e}(${t})`}}function vf(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&&He(a.$.value)){let s=a.$.value.value;r.emitLine(`${t}fprintf(stderr, "%s\\n", ${JSON.stringify(s)});`),r.emitLine(`${t}abort();`)}else{let s=V(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`(*((${M(i,n)}*)NULL))`}function Tf(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=V(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 f=`${r.token.value}.${l}`,p=u.currentEvidenceParams.get(f);if(p)return p.cParamName}if(e.$?.value&&ne(e.$.value)){let c=e.$.value;return n.functions[c.funcId]?.cName||c.funcId}if(!e.$?.value&&(k.___dispose.includes(l)||k.___drop.includes(l)||k.___dup.includes(l))&&a){let c=null;if((ce(a)||ye(a))&&(c=a.trait),c){let f=c.fields.find(p=>p.label===l&&p.assignedValue&&ne(p.assignedValue));if(f&&ne(f.assignedValue)){let p=f.assignedValue;return n.functions[p.funcId]?.cName||p.funcId}else return`/* ERROR: Rc method ${l} not found in type module */`}else return`/* ERROR: No module found for Rc method ${l} */`}if(ve(a)||ze(s)){let c=e.$?.value;if(c){if(_e(c)){if(c.variableName)return Ee(c.variableName,e.$?.env);if((u.inAsyncStateMachine||u.inEffectStateMachine)&&u.stateMachineVariables){for(let[,f]of u.stateMachineVariables)if(f.name===l&&f.kind==="outer")return`sm->__capture.${l}`}}else if(!ze(c))return Kt(c,n,e)}return Ee(l,e.$?.env)}if(dr(a)&&a.fields.length===1){let c=a.fields[0];if(c&&c.label===l)return o}if(ye(a)){let c=a;if(Gt(c))return o;for(let p of c.variants)if(p.fields){for(let _ of p.fields)if(_.label===l){let m=p.name;return`${o}.data.${m}.${te(l)}`}}return`/* ERROR: field ${l} not found in enum ${c.typeName} */`}else if(D(s)&&ye(s.value)){let c=s.value,f=c.variants.find(_=>_.name===l),p=n.types[c.id]?.cName;if(f&&!f.fields&&p){let _=jt(c,f.name,n);return`(${p}){ .tag = ${_}, .data = { } }`}}else{if(Tt(a)&&l==="*")return`${o}->value`;if(Ne(a)){if(l==="*")return`(*${o})`;if(Xe(a.childType))return`${o}->${te(l)}`;{let c=0,f=a;for(;Ne(f);)c++,f=f.childType;if(c>0&&ce(f)&&f.isReferenceSemantics&&c++,dr(f)&&f.fields.length===1){let p=f.fields[0];if(p&&p.label===l)return c===1?`(*${o})`:`${"*".repeat(c)}(${o})`}return c>0?c===1?`${o}->${te(l)}`:`${`(${"*".repeat(c-1)}${o})`}->${te(l)}`:`${o}.${te(l)}`}}else if(we(a)){if(l.match(/^\d+$/))return`${o}._${l}`;{let c=a.fields.findIndex(f=>f.label===l);return`${o}._${c}`}}else return be(a)?`${o}.vtable->${te(l)}`:ct(a)?`${o}->${te(l)}`:`${o}.${te(l)}`}}return"/* ERROR: field name must be an identifier */"}function Ef(e,t,n){if(!e.$?.type)return`// Error: No type information for pointer/reference expression ${w(e)}
|
|
10655
|
-
`;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 c=V(i.func,t,n),f=V(u.args[0],t,n),p=V(u.args[1],t,n),_=`Slice_${te(M(l.childType,n))}`;return n.sliceStructTypes.has(_)||n.sliceStructTypes.set(_,{childType:M(l.childType,n)}),`(${_}){ .data = &${c}.data[${f}], .length = ${p} - ${f} }`}else if(u&&U(u)&&u.token.value===":"){let c=V(i.func,t,n),f=l,p=f.childType,_=`Slice_${te(M(p,n))}`;return n.sliceStructTypes.has(_)||n.sliceStructTypes.set(_,{childType:M(p,n)}),Re(f.length)?`(${_}){ .data = &${c}.data[0], .length = ${f.length.value} }`:"/* Error: Cannot slice array with non-compile-time length */"}}else if(l&&(Xe(l)||Ne(l)&&Xe(l.childType))){let u=Xe(l)?l:l.childType,c=i.args[0];if(c&&F(c)&&E(c,":")){let f=V(i.func,t,n),p=V(c.args[0],t,n),_=V(c.args[1],t,n),m=`Slice_${te(M(u.childType,n))}`;return n.sliceStructTypes.has(m)||n.sliceStructTypes.set(m,{childType:M(u.childType,n)}),`(${m}){ .data = &${f}.data[${p}], .length = ${_} - ${p} }`}else if(c&&U(c)&&c.token.value===":"){let f=V(i.func,t,n),p=`Slice_${te(M(u.childType,n))}`;return n.sliceStructTypes.has(p)||n.sliceStructTypes.set(p,{childType:M(u.childType,n)}),`(${p}){ .data = ${f}.data, .length = ${f}.length }`}}}let o=i.$?.value,a=i.$?.type;if(o!==void 0&&a){if(Re(o)||Ue(o)){let l=V(i,t,n);return`(&(${M(a,n)}){${l}})`}if(He(o)&&i.$?.convertedRuntimeType)return`(&${V(i,t,n)})`}return`(&${V(i,t,n)})`}function $f(e,t,n){let r=e.args[0];return r?`__yo_decr_rc(${V(r,t,n)})`:"// Error: __yo_decr_rc requires exactly 1 argument"}function Cf(e,t,n){let r=e.args[0];return r?`__yo_incr_rc(${V(r,t,n)})`:"// Error: __yo_incr_rc requires exactly 1 argument"}function bf(e,t,n){let r=e.args[0];return r?V(r,t,n):"// Error: __yo_rc_own requires exactly 1 argument"}function kf(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=V(r,t,n),a=V(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=x(l)&&l.resolvedConcreteType?l.resolvedConcreteType:l;if(ke(u)){let f=u.length;if(!Re(f))return"// Error: array element has non-constant length";let p=`i_${Math.floor(Math.random()*1e6)}`,_=n.emitter;_.emitLine(`for (size_t ${p} = 0; ${p} < ${f.value}; ${p}++) {`);let m=`(${o}).data[${a}].data[${p}]`;_.emitLine(" { // drop nested array element");let g=br(m,u.childType,n);return g&&_.emitLine(` ${g};`),_.emitLine(" }"),_.emitLine("}"),""}let c=
|
|
10656
|
-
`}function Pf(e,t,n){let r=e.args[0];return`sizeof(${V(r,t,n)})`}function Uf(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 f=V(l,t,n);if(l.$?.deferredDupExpressions&&l.$.deferredDupExpressions.length>0){tt(l,t,a);let p=l.$.deferredDupExpressions[0];F(p)&&p.$?.variableName&&(f=Ee(p.$.variableName,p.$.env))}return`._${u} = ${f}`}).join(", ");if(o&&e.$?.type){let l=`(${i}){ ${s} }`,u=ot(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 c=V(l,t,n);return`._${u} = ${c}`}).join(", ");if(o&&e.$?.type){let l=`(${i}){ ${s} }`,u=ot(e.$.type,o,n);return n.emitter.emitLine(`${t}${u} = ${l};`),o}else return`(${i}){ ${s} }`}}}function zf(e,t,n){let i=e.args[0].$?.value;if(!i||!D(i))throw new Error("typeid codegen: expected TypeValue argument");let o=i.value,a=o.id,s=n.types[a]?.cName||M(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 Fy(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=V(i,"",t),s=V(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=V(n,"",t),o=V(r,"",t);return`${i} = ${o}`}return V(e,"",t)}function Bf(e,t,n){if(F(e)&&E(e,I.begin)){let r=n,i=r.pendingDeferredDrops,o=e.$?.deferredDropExpressions??[],a=new Map;for(let c of o){let f=Ln(c);f&&a.set(f,c)}r.pendingDeferredDrops=[...i??[]];let s=r.consumedVarPendingDrops,l=e.$?.consumedVariableDropExpressions??[];r.consumedVarPendingDrops=[...l,...s??[]];let u=new Set;for(let c of e.args){let f=V(c,t,n);if(f&&n.emitter.emitLine(`${t}${f};`),c.$?.env&&a.size>u.size)for(let p of c.$.env.frames)for(let _ of p.variables)a.has(_.name)&&!u.has(_.name)&&(u.add(_.name),r.pendingDeferredDrops.unshift(a.get(_.name)))}if(e.$?.deferredDropExpressions)for(let c of e.$.deferredDropExpressions){let f=V(c,t,n);f&&n.emitter.emitLine(`${t}${f};`)}r.pendingDeferredDrops=i,r.consumedVarPendingDrops=s}else{let r=V(e,t,n);r&&n.emitter.emitLine(`${t}${r};`)}}function Gf(e,t,n){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 c=V(i,t+" ",n);return n.emitter.emitLine(`${t} if (!(${c})) {`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t} }`),Bf(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)}`,c=`continue_${Math.random().toString(36).substr(2,9)}`;n.currentLoopLabel=u,n.currentContinueLabel=c;let f=n,p=f.loopBodyDropsBaselineCount;f.loopBodyDropsBaselineCount=f.pendingDeferredDrops?.length??0,n.emitter.emitLine(`${t}while (true) {`);let _=V(i,t+" ",n);n.emitter.emitLine(`${t} if (!(${_})) {`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t} }`),Bf(a,t+" ",n),n.emitter.emitLine(`${t}${c}:;`);let m=Fy(o,n);return n.emitter.emitLine(`${t} ${m};`),n.emitter.emitLine(`${t}}`),n.emitter.emitLine(`${t}${u}:;`),f.loopBodyDropsBaselineCount=p,n.currentLoopLabel=s,n.currentContinueLabel=l,""}else return n.emitter.emitLine(`${t}/* Error: while loop expects 2 or 3 arguments, got ${r.length} */`),""}function Ly(e){let t=[];for(let n of e)if(n.isEffectRowSpread){let r=n.type;x(r)&&r.resolvedConcreteType&&(r=r.resolvedConcreteType),rt(r)&&t.push(...r.implicitParameters)}else t.push(n);return t}function Ay(e,t,n,r){let i=e.args[0];if(!i?.$?.type)return;let o=e.args.find(f=>F(f)&&E(f,I.using));if(!o)return;let a=Dt(i.$.type);if(!a?.isFuture.effects?.length)return;let s=Ly(a.isFuture.effects),l=o.args,u=r,c=u.emitter;for(let f=0;f<s.length&&f<l.length;f++){let p=s[f],_=l[f];if(z(p.type)){let m=p.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=_.$?.value;if(h&&ne(h)){let d=r.functions[h.funcId];d&&(g=d.cName)}}g||(g=V(_,n,r)),g&&c.emitLine(`${n} ${t}->__capture.${m} = (void*)${g};`)}else if(ve(p.type)){let m=p.type;for(let g of m.fields){if(!z(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=_.$?.value;if(d&&ze(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=Iy(g.label,m,u,e)),h&&c.emitLine(`${n} ${t}->__capture.${g.label} = (void*)${h};`)}}}}function Iy(e,t,n,r){let i=r.$?.env??r.func.$?.env;if(!i)return;let o=un(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&&ze(l)){let u=l.type.fields.findIndex(c=>c.label===e);if(u>=0){let c=l.fields[u];if(c&&ne(c)){let f=n.functions[c.funcId]?.cName;if(f)return f}}}}}function Ny(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=V(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=V(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 cn(t,r,e,!1,!0,!0),Kn(t,r,e,!0),Vn({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(cn(t,r,e,!1,!0,!0),Kn(t,r,e,!0),r.currentFunctionType){let l=r.currentFunctionType.return.type;if(!ue(l)){let u=r.overrideReturnTypeStr??M(l,n);if(u!=="void")return`return (${u}){0}`}}return"return"}let s=V(i,t,n);if(r.effectHandlerParamDrops)for(let l of r.effectHandlerParamDrops)r.emitter.emitLine(`${t}${l};`);if(cn(t,r,e,!1,!0,!0),Kn(t,r,e,!0),(r.isModuleEffectMemberFunction||r.currentEvidenceParams&&r.currentEvidenceParams.size>0)&&r.currentFunctionType){let l=i.$?.type;if(l&&!ue(l)){let c=M(l,n);r.emitter.emitLine(`${t}{ ${c} _esc_val = ${s}; memcpy(__yo_effect_escape_value, &_esc_val, sizeof(${c})); }`)}let u=r.currentFunctionType.return.type;if(!ue(u)){let c=r.overrideReturnTypeStr??M(u,n);if(c!=="void")return`return (${c}){0}`}return"return"}return`return ${s}`}function Wf(e,t,n){let r;switch(e.tag){case"FnCall":r=Sy(e,t,n);break;case"Atom":r=Yi(e,n,t);break}return r}function Sy(e,t,n){if(e.$?.macroExpansion)return V(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&&x(o)&&Ce(o)){if(r===k.___drop[0]){let a=V(i,t,n);return`if (${a} != NULL) { __yo_decr_rc((void*)${a}); }`}if(r===k.___dup[0])return`__yo_incr_rc((void*)${V(i,t,n)})`}}if(ic(e))return oc(e,t,n);if(E(e,k.__yo_decr_rc))return $f(e,t,n);if(E(e,k.__yo_incr_rc))return Cf(e,t,n);if(E(e,k.__yo_rc_own))return bf(e,t,n);if(E(e,k.__yo_drop_array_element))return kf(e,t,n);if(E(e,k.__yo_dup_array_element))return wf(e,t,n);if(E(e,k.__yo_drop_tuple_element))return Ff(e,t,n);if(E(e,k.__yo_dup_tuple_element))return Lf(e,t,n);if(E(e,k.___dup))return Af(e,t,n);if(E(e,k.___drop))return If(e,t,n);if(E(e,k.__yo_dyn_drop))return Nf(e,t,n);if(E(e,k.__yo_dyn_dup))return Sf(e,t,n);if(E(e,k.__yo_incr_rc_atomic))return xf(e,t,n);if(E(e,k.__yo_decr_rc_atomic))return Vf(e,t,n);if(E(e,k.__yo_iso_extract))return af(e,t,n);if(E(e,k.__yo_iso_dispose))return sf(e,t,n);if(E(e,k.__yo_arc_dispose))return zc(e,t,n);if(sl(e))return lf(e,t,n);if(al(e))return Bc(e,t,n);if(E(e,k.__yo_sometype_drop))return Df(e,t,n);if(E(e,k.__yo_sometype_dup))return Mf(e,t,n);if(E(e,k.__yo_gc_collect))return rf(e,t,n);if(E(e,k.rc))return Of(e,t,n);if(E(e,k.panic))return vf(e,t,n);if(E(e,I.test))return"/* test declaration skipped */";if(E(e,k.__yo_thread_set_maximum_threads))return df(e,t,n);if(E(e,I.op_and))return Pc(e,t,n);if(E(e,I.op_or))return Uc(e,t,n);if(Bt(e))return e.$?.awaitAnalysis?ac(e,t,n):fc(e,t,n);if(E(e,I.dyn))return nf(e,t,n);if(Tn(e))return Yc(e,t,n);if(bu(e))return jc(e,t,n);if(ku(e)){let r=e.args[0];if(!r)return"// Error: spawn requires a Future argument";let o=n.emitter,a=V(r,t,n),s=r.$?.type,l=s?M(s,n):"void*",u=e.$?.type,c=u?M(u,n):null,f=e.$?.variableName?`__spawn_future_${e.$.variableName}`:"__spawn_future",p=e.$?.variableName?`__spawn_state_${e.$.variableName}`:"__spawn_state";return o.emitLine(`${t}// io.spawn \u2014 start cold Future, return JoinHandle`),o.emitLine(`${t}${l} ${f} = ${a};`),o.emitLine(`${t}int ${p} = ${f}->state;`),o.emitLine(`${t}if (${p} == -2) {`),o.emitLine(`${t} fprintf(stderr, "panic: attempted to spawn an aborted Future\\n");`),o.emitLine(`${t} abort();`),o.emitLine(`${t}}`),Ro(r.$?.type)||(o.emitLine(`${t}if (${p} == 0 && ${f}->__yo_resume_fn) {`),Ay(e,f,t,n),o.emitLine(`${t} __yo_incr_rc((void*)${f});`),o.emitLine(`${t} ${f}->__yo_resume_fn((void*)${f});`),o.emitLine(`${t}}`)),c?`(${c}){ .__future = (void*)${f} }`:`(void*)${f}`}if(wu(e))return Kc(e,t,n);if(E(e,I.return))return kc(e,t,n);if(E(e,I.escape))return Ny(e,t,n);if(E(e,k.__yo_array_fill,2))return Wc(e,t,n);if(E(e,"::",2))return"";if(E(e,":",2))return Zc(e,t,n);if(E(e,":=",2)){let r=of(e,t,n);if(r!==void 0)return r}else{if(E(e,"=",2))return qc(e,t,n);if(e.$?.value&&!_e(e.$?.value)&&!ue(e.$.type)&&!mt(e.$?.controlFlow)){let r=e.$.value;return Kt(r,n,e)}else{if(E(e,".",2))return Tf(e,t,n);if(E(e,I.begin))return Qc(e,t,n);if(E(e,I.cond))return Jc(e,t,n);if(E(e,I.match))return cf(e,t,n);if(E(e,k.__yo_address_of,1))return Ef(e,t,n);if(E(e,I.tuple))return Uf(e,t,n);if(E(e,I.array)){let r=Gc(e,t,n);if(r!==void 0)return r}else{if(E(e,I.recur))return Rf(e,t,n);if(E(e,I.runtime,1))return V(e.args[0],t,n);if(E(e,k.sizeof,1))return Pf(e,t,n);if(E(e,k.typeid,1))return zf(e,t,n);if(E(e,k.downcast,2))return tf(e,t,n);if(E(e,fi)){let r=e.$?.runtimeArgExprsInOrder||e.args;if(r){let i=n,o=r.map(a=>{let s=V(a,t,n);if(a.$?.deferredDupExpressions&&a.$.deferredDupExpressions.length>0){tt(a,t,i);let l=a.$.deferredDupExpressions[0];if(F(l)&&l.$?.variableName)return Ee(l.$.variableName,l.$.env)}return s});return Uo(e.func.token.value,o,e,n,t)}}else{if(E(e,I.while))return Gf(e,t,n);if(E(e,"->",2)&&F(e.args[0])&&E(e.args[0],I.fn)){let r=e.$?.value;return ne(r)?Kt(r,n):"// Error: Anonymous function missing function value"}else{if(E(e,k.consume))return ef(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 ff(e,t,n);{let r=hf(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 qf({expr:e,env:t,context:n}){ge(e,k.alignof,1);let r=e.args[0],i=N({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&&D(i.$.value)?o=i.$.value.value:o=i.$.type;let a=gr(o),s;return a===null?s=Y(yt(),{env:t,context:n}):s=Ht("Usize",a),e.$={env:t,type:yt(),value:s,pathCollection:[]},e}function Hf({expr:e,env:t,context:n}){let r=E(e,I.op_and)?"and":"or",i=e.args;if(i.length===0){let u=ft(r==="and");return e.$={env:t,type:Ze(),value:u,pathCollection:[],isAccessingProperty:!1},e}let o=t,a,s=!1,l=!1;for(let u=0;u<i.length;u++){let c=i[u],f=N({expr:c,env:o,context:{...n}});if(!f.$||!gn(f.$.type))throw y({token:c.token,errorMessage:`Expected bool type for "${r}" argument, got:
|
|
10654
|
+
)`;if(k.__yo_decr_rc.includes(e))return`__yo_decr_rc((void*)(${t[0]}))`;if(k.__yo_as.includes(e)&&n.$?.type){let o=M(n.$.type,r),a=n.args[0]?.$?.type;return a&&ye(a)&&!bn(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`(${M(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_maybe_uninit_new.includes(e)&&n.$?.type){let o=M(n.$.type,r),a=`__yo_uninit_${by++}`;return r.emitter.emitLine(`${i}${o} ${a};`),a}else return k.__yo_maybe_uninit_as_ptr.includes(e)&&n.$?.type?`((${M(n.$.type,r)})(${t[0]}))`:k.__yo_maybe_uninit_assume_init.includes(e)?`(${t[0]})`:`/* Unhandled operator ${e} */`}}function af(e,t,n){let r=e.args[0];if(!r)return"// Error: __yo_iso_extract requires exactly 1 argument";let i=V(r,t,n),o=r.$?.type;if(!o||!bt(o))return"// Error: __yo_iso_extract requires an Iso type";let a=M(o,n),s=e.$?.type;if(s&&n.isoTypes?.has(a)){let c=n.isoTypes.get(a);c.optionTypeCName||(c.optionTypeCName=M(s,n))}let l=`__yo_iso_extract_${a}(${i})`,u=e.$?.variableName;return u&&s?(n.emitter.emitLine(`${t}${M(s,n)} ${u} = ${l};`),u):l}function sf(e,t,n){let r=e.args[0];if(!r)return"// Error: __yo_iso_dispose requires exactly 1 argument";let i=V(r,t,n),o=r.$?.type;return!o||!bt(o)?"// Error: __yo_iso_dispose requires an Iso type":`__yo_iso_dispose_${M(o,n)}(${i})`}function sl(e){let t=e.func.$?.value;return D(t)&&bt(t.value)&&e.args.length===1}function lf(e,t,n){if(!sl(e))return"/* Error: generateIsoTypeCall called on non-Iso type call */";let i=(e.func.$?.value).value,o=i.childType,a=e.args[0],s=V(a,t,n),l=M(i,n),u=M(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 wr(e){return e===""||e==="break"||e==="continue"||e.startsWith("goto")||e.includes("return")}function Fr(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 c=0;c<r.length-1;c++){let f=r[c],p=V(f,t,n);p&&n.emitter.emitLine(`${t}${p};`)}let u="";if(r.length>0){let c=r[r.length-1];if(c.$?.deferredDupExpressions&&c.$.deferredDupExpressions.length>0){if(c.$?.variableName){let p=c.$.variableName;c.$.variableName=void 0;let _=V(c,t,n);c.$.variableName=p;let m=M(c.$.type,n),g=Ee(p,c.$.env);g!==_&&n.emitter.emitLine(`${t}${m} ${g} = ${_};`)}tt(c,t,n);let f=c.$.deferredDupExpressions[0];F(f)&&f.$?.variableName?u=Ee(f.$.variableName,f.$.env):u=V(c,t,n)}else u=V(c,t,n)}return e.$?.deferredDropExpressions&&$t(e,t,n),i.pendingDeferredDrops=o,i.consumedVarPendingDrops=s,u}else return e.$?.deferredDupExpressions&&tt(e,t,n),V(e,t,n)}function cf(e,t,n){if(!e.$)return'/* "match" expression is not evaluated */';let r=e.$.variableName,i=e.$.type,o=i&&ue(i);if(!o&&r){let g=M(i,n);n.emitter.emitLine(`${t}${g} ${r};`)}let a=V(e.args[0],t,n),s=e.args[0].$?.type;if(!s)return'// Error: "match" expression requires a valid type';if(e.$.isPrimitiveMatch)return wy(e,t,n,a,s,r,o);let l,u;if(Ne(s)?(u=s.childType,l=s.tag):ct(s)?(u=s,l="ref_semantics"):u=s,!ye(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 f=Gt(u);if(f){let g=e.args.slice(1),h=null,d=null;for(let v of g)if(F(v)&&E(v,"=>",2)){let T=v.args[0],$=v.args[1];if(T&&$&&F(T)&&E(T,"."))h={caseBody:$};else{let C=T.func;if(C&&F(C)&&E(C,".")){let L=C.args[0];if(L&&U(L)){let b=L.token.value;d={caseBody:$,variantName:b,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 b=f;n.emitter.emitLine(`${t} ${M(b,n)} ${v} = ${a};`)}}let T=n;v&&(T.inAsyncStateMachine||T.inEffectStateMachine)&&(T.localShadowedVariables||(T.localShadowedVariables=new Set),T.localShadowedVariables.add(v));let $=Fr(d.caseBody,t+" ",n);v&&T.localShadowedVariables&&T.localShadowedVariables.delete(v);let C=wr($);if(!o&&r&&!C){let L=$||a;n.emitter.emitLine(`${t} ${r} = ${L};`)}else $&&$!==""&&n.emitter.emitLine(`${t} ${$};`)}if(n.emitter.emitLine(`${t}} else {`),h){let v=Fr(h.caseBody,t+" ",n),T=wr(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(bn(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)){let T=v.args[0],$=v.args[1];if(T&&$&&U(T)&&T.token.value==="_"){n.emitter.emitLine(`${t}default: {`);let C=Fr($,t+" ",n);!o&&r&&C&&!wr(C)?n.emitter.emitLine(`${t} ${r} = ${C};`):C&&n.emitter.emitLine(`${t} ${C};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`)}else if(T&&$&&F(T)&&E(T,".",1)){let C=T.args[0].token.value,L=jt(u,C,n);n.emitter.emitLine(`${t}case ${L}: {`);let b=Fr($,t+" ",n);!o&&r&&b&&!wr(b)?n.emitter.emitLine(`${t} ${r} = ${b};`):b&&n.emitter.emitLine(`${t} ${b};`),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 _=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)){let d=h.args[0],v=h.args[1];if(d&&v&&U(d)&&d.token.value==="_"){n.emitter.emitLine(`${t}default: {`);let T=Fr(v,t+" ",n);!o&&r&&T&&!wr(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,$=jt(u,T,n);if(n.emitter.emitLine(`${t}case ${$}: {`),d.args.length>1){let L=u.variants.find(b=>b.name===T);if(L&&L.fields){let b=d.args.slice(1);if(b.some(S=>F(S)&&E(S,":",2))){for(let S of b)if(F(S)&&E(S,":",2)){let G=S.args[0],P=S.args[1];if(!U(G))continue;let O=G.token.value,B=L.fields.find(ae=>ae.label===O);if(!B||ue(B.type))continue;if(U(P)){let ae=P.token.value;if(ae!=="_"){let K=te(ae),W=te(O),de=M(B.type,n),me=l==="ref_semantics"||l?"->":".";n.emitter.emitLine(`${t} ${de} ${K} = ${a}${me}data.${T}.${W};`);let he=n;if((he?.inAsyncStateMachine||he?.inEffectStateMachine)&&he.stateMachineVariables){let H;if(P.$?.env){let Q=X(P.$.env,ae);Q.length>0&&(H=Q[Q.length-1].id)}H&&he.stateMachineVariables.has(H)&&n.emitter.emitLine(`${t} sm->var_${H} = ${K};`)}}}}}else for(let S=0;S<b.length&&S<L.fields.length;S++){let G=b[S],P=L.fields[S];if(U(G)&&P){if(ue(P.type))continue;let O=G.token.value;if(O!=="_"){let B=te(O),ae=te(P.label),K=M(P.type,n),W=l==="ref_semantics"||l?"->":".";n.emitter.emitLine(`${t} ${K} ${B} = ${a}${W}data.${T}.${ae};`);let de=n;if((de?.inAsyncStateMachine||de?.inEffectStateMachine)&&de.stateMachineVariables){let me;if(G.$?.env){let he=X(G.$.env,O);he.length>0&&(me=he[he.length-1].id)}me&&de.stateMachineVariables.has(me)&&n.emitter.emitLine(`${t} sm->var_${me} = ${B};`)}}}}}}if(F(v)&&E(v,"=>",2)){let L=v.args[0];n.emitter.emitLine(`${t} ${M(s,n)} ${te(L.token.value)} = ${a};`),v=v.args[1]}let C=Fr(v,t+" ",n);!o&&r&&C&&!wr(C)?n.emitter.emitLine(`${t} ${r} = ${C};`):C&&n.emitter.emitLine(`${t} ${C};`),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,$=jt(u,T,n),C=d.args;n.emitter.emitLine(`${t}case ${$}: {`);let L=u.variants.find(R=>R.name===T);if(L&&L.fields&&C.length>0)if(C.some(S=>F(S)&&E(S,":",2))){for(let S of C)if(F(S)&&E(S,":",2)){let G=S.args[0],P=S.args[1];if(!U(G))continue;let O=G.token.value,B=L.fields.find(ae=>ae.label===O);if(!B)continue;if(U(P)){let ae=P.token.value;if(ae!=="_"){let K=te(ae);if(ue(B.type))n.emitter.emitLine(`${t} // ${K} is unit type (no value)`);else{let W=te(O),de=M(B.type,n),me=l==="ref_semantics"||l?"->":".";n.emitter.emitLine(`${t} ${de} ${K} = ${a}${me}data.${T}.${W};`);let he=n;if((he?.inAsyncStateMachine||he?.inEffectStateMachine)&&he.stateMachineVariables){let H;if(P.$?.env){let Q=X(P.$.env,K);Q.length>0&&(H=Q[Q.length-1].id)}H&&he.stateMachineVariables.has(H)&&n.emitter.emitLine(`${t} sm->var_${H} = ${K};`)}}}}}}else for(let S=0;S<Math.min(C.length,L.fields.length);S++){let G=C[S],P=L.fields[S];if(G.tag==="Atom"&&P){let O=G.token.value;if(O!=="_"){let B=te(O);if(ue(P.type))n.emitter.emitLine(`${t} // ${B} is unit type (no value)`);else{let ae=te(P.label),K=M(P.type,n),W=l==="ref_semantics"||l?"->":".";n.emitter.emitLine(`${t} ${K} ${B} = ${a}${W}data.${T}.${ae};`);let de=n;if((de?.inAsyncStateMachine||de?.inEffectStateMachine)&&de.stateMachineVariables){let me;if(G.$?.env){let he=X(G.$.env,O);he.length>0&&(me=he[he.length-1].id)}me&&de.stateMachineVariables.has(me)&&n.emitter.emitLine(`${t} sm->var_${me} = ${B};`)}}}}}if(F(v)&&E(v,"=>",2)){let R=v.args[0];n.emitter.emitLine(`${t} ${M(s,n)} ${te(R.token.value)} = ${a};`),v=v.args[1]}let b=Fr(v,t+" ",n);!o&&r&&b&&!wr(b)?n.emitter.emitLine(`${t} ${r} = ${b};`):b&&n.emitter.emitLine(`${t} ${b};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`)}}}return n.insideMatch=_,n.emitter.emitLine(`${t}}`),e.$?.deferredDropExpressions&&$t(e,t,n),o?"":r??""}function ky(e){return F(e)?E(e,"|",2):!1}function ll(e){if(!ky(e))return[e];let t=e,n=t.args[0],r=t.args[1];return[...ll(n),...ll(r)]}function uf(e){if(e!==void 0){if(Re(e))return String(e.value);if(Ue(e))return e.value?"true":"false"}}function wy(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 c=l[u];if(F(c)&&E(c,"=>",2)){let f=c.args[0],p=c.args[1];if(!f||!p)continue;if(U(f)&&f.token.value==="_"){n.emitter.emitLine(`${t}default: {`);let h=Fr(p,t+" ",n);!a&&o&&h&&!wr(h)?n.emitter.emitLine(`${t} ${o} = ${h};`):h&&n.emitter.emitLine(`${t} ${h};`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t}}`);continue}let _=ll(f),m=f.$?.primitivePatternValues;if(m&&m.length>0)for(let h of m){let d=uf(h);d!==void 0&&n.emitter.emitLine(`${t}case ${d}:`)}else for(let h of _){let d=h.$?.value,v=uf(d);v!==void 0&&n.emitter.emitLine(`${t}case ${v}:`)}n.emitter.emitLine(`${t}{`);let g=Fr(p,t+" ",n);!a&&o&&g&&!wr(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&&$t(e,t,n),a?"":o??""}function ff(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(ce(i)&&o===void 0){let a=V(r,t,n),s=e.$.runtimeDestructurings;for(let l of s){let u=M(l.type,n),c=te(l.variableName),f=te(l.label);n.emitter.emitLine(`${t}${u} ${c} = ${a}.${f};`)}}}return""}function pf(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(x(o)){let g=o;g.resolvedConcreteType&&(a=g.resolvedConcreteType.id,s=g.resolvedConcreteType)}else ce(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,c=M(s,n),f=V(i,t,n),p=i.$?.variableName?Ee(i.$.variableName,i.$.env):f,_=`_thread_closure_data_${Ge(e.$?.env.modulePath??"")}`;n.emitter.emitLine(`${t}${c}* ${_} = (${c}*)__yo_malloc(sizeof(${c}));`),n.emitter.emitLine(`${t}*${_} = ${p};`);let m=e.$?.variableName;return m?(n.emitter.emitLine(`${t}__yo_thread_t ${m} = __yo_thread_spawn(${u}, ${_});`),m):`__yo_thread_spawn(${u}, ${_})`}function _f(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(x(o)){let m=o;m.resolvedConcreteType&&(a=m.resolvedConcreteType.id,s=m.resolvedConcreteType)}else ce(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,c=M(s,n),f=V(i,t,n),p=i.$?.variableName?Ee(i.$.variableName,i.$.env):f,_=`_worker_closure_data_${Ge(e.$?.env.modulePath??"")}`;return n.emitter.emitLine(`${t}${c}* ${_} = (${c}*)__yo_malloc(sizeof(${c}));`),n.emitter.emitLine(`${t}*${_} = ${p};`),n.emitter.emitLine(`${t}__yo_worker_spawn(${u}, ${_});`),""}function df(e,t,n){let r=e.args[0];return r?`__yo_thread_set_maximum_threads(${V(r,t,n)})`:"// Error: __yo_thread_set_maximum_threads requires exactly 1 argument"}function mf(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 kn(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&&Ce(i.type))return;let o=`var_${i.id}`,a=te(e);n.emitter.emitLine(`${t}sm->${o} = ${a};`)}}function hf(e,t,n){if(e.$?.value!==void 0&&!_e(e.$.value))return e.$?.deferredDropExpressions&&$t(e,t,n),ue(e.$.type)?"":Kt(e.$.value,n,e);let r=e.func.$?.value,i=e.func.$?.type??(ne(r)?r.specializedType??r.type:void 0);if(z(i)){let o=e.$?.runtimeArgExprsInOrder;if(o){let a=!1;if(F(e.func)&&E(e.func,".",2)){let c=e.func.args[0]?.$?.type;c&&be(c)&&(a=!0)}let s=o.map((u,c)=>{if(u.$?.variableName&&u.$?.type){let f=n,p=f.currentClosureCaptures&&f.currentClosureCaptures.includes(u.$.variableName)&&U(u)&&u.$.env&&f.currentClosureCaptureFrameLevel!==void 0&&_r(u.token.value,u.$.env,f.currentClosureCaptureFrameLevel),_=V(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=(f.inAsyncStateMachine||f.inEffectStateMachine)&&_.startsWith("sm->"),h=!1;if(_&&_!==u.$.variableName&&!p&&!g&&!m){let v=Ee(u.$.variableName,u.$.env);if(_!==v){let T=u.$.convertedRuntimeType||u.$.type,$=ot(T,u.$.variableName,n);n.emitter.emitLine(`${t}${$} = ${_};`),h=!0,kn(u.$.variableName,t,n)}}let d=h?u.$.variableName:_;if(u.$?.deferredDupExpressions&&u.$.deferredDupExpressions.length>0){let v=new Set;u.$?.variableName&&v.add(Ee(u.$.variableName,u.$.env)),_&&v.add(_),U(u)&&v.add(Ee(u.token.value,u.$.env));let T=u.$.deferredDupExpressions.find($=>{let C=wa($);return C?v.has(Ee(C,$.$?.env)):!1});T&&(tt(u,t,f),F(T)&&T.$?.variableName&&(d=Ee(T.$.variableName,T.$.env)))}if(a&&c===0){if(F(e.func)&&E(e.func,".",2)){let $=e.func.args[0]?.$?.type,C=e.func.args[1];if(U(C)&&be($)){let L=C.token.value;if($.trait.fields.find(R=>R.label===L))return g?_:te(d,u.$.type.isExtern==="c")}}let v=u.$?.type;return v&&Ne(v)?g?`${_}->data`:`${te(d,u.$.type.isExtern==="c")}->data`:g?`(${_}).data`:`(${te(d,u.$.type.isExtern==="c")}).data`}else return p||g||m?_:te(d,u.$.type.isExtern==="c")}else if(a&&c===0){let f=V(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)&&be(m)){let h=g.token.value;if(m.trait.fields.find(v=>v.label===h))return f}}let p=u.$?.type;return p&&Ne(p)?`(${f})->data`:`(${f}).data`}else return V(u,t,n)}),l=s.join(", ");if(i.isExtern==="yo"&&i.externName){let u=i.externName;return fi.includes(u)?Uo(u,s,e,n,t):u==="__yo_thread_spawn"?pf(e,t,n):u==="__yo_worker_spawn"?_f(e,t,n):ue(i.return.type)?(n.emitter.emitLine(`${t}${u}(${l});`),e.$?.deferredDropExpressions&&$t(e,t,n),""):`${u}(${l})`}{let u=n;if(u.currentEvidenceParams?.size){let c=e.func.token?.value,f;if(c==="."&&F(e.func)&&E(e.func,".",2)){let p=e.func.args[1];p&&U(p)&&(c=p.token.value);let _=e.func.args[0];if(_&&U(_))f=_.token.value;else if(_&&F(_)&&E(_,".",2)){let m=_.args[0];m&&U(m)&&(f=m.token.value)}}if(c&&c!=="."){for(let p of u.currentEvidenceParams.values())if(p.fieldLabel===c||p.implicitLabel===c||p.fieldPath[p.fieldPath.length-1]===c){if(f&&f!==p.implicitLabel)continue;return gf(p.cParamName,i,s,o,e,t,u,p)}}}}if(ne(r)){let u=Ui(r);if(u)return Uo(u,s,e,n,t);let c=r.specializedType??r.type,f=n;if(f.currentEvidenceParams&&r.isModuleEffectMember){let _,m=e.func.$?.env??e.$?.env;if(m)for(let g of f.currentEvidenceParams.values()){let h=X(m,g.implicitLabel),v=h[h.length-1]?.value?.[0];if(v&&ze(v)){let T=v,$=!0;for(let C=0;C<g.fieldPath.length-1;C++){let L=g.fieldPath[C],b=T.type.fields.findIndex(R=>R.label===L);if(b>=0&&T.fields[b]&&ze(T.fields[b]))T=T.fields[b];else{$=!1;break}}if($){let C=g.fieldPath[g.fieldPath.length-1],L=T.type.fields.findIndex(b=>b.label===C);if(L>=0){let b=T.fields[L];if(b&&ne(b)&&b.funcId===r.funcId){_=g;break}}}}}if(_){let g=_.cParamName;return gf(g,c,s,o,e,t,f,_)}}let p=n.functions[r.funcId]?.cName;if(p){let _=r.specializedType??r.type,m=wt(_);if(m.length===0&&r.specializedType){let d=wt(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}=ul(m,r,e,n);if(d.length>0){let T=l?`${l}, ${d.join(", ")}`:d.join(", ");return cl(p,T,c,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=So(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=wt(r.type);if(d.length>0){let v=e.func?.$?.env??e.$?.env;if(v)for(let T of d){let $=So(v,C=>C.isImplicit===!0&&(C.name===T.implicitLabel||C.name===T.fieldLabel));if($>=0&&$>v.functionDeclarationFrameLevel&&v.frames[$]?.isBeginBlockFrame){h=!0;break}}}}}if(ue(c.return.type))return n.emitter.emitLine(`${t}${p}(${l});`),e.$?.deferredDropExpressions&&$t(e,t,n),g&&yf(t,n,h,e),"";{let d=e.$?.variableName;if(d){let v=r.specializedType?.return.type??c.return.type,T=e.$?.type,$=T&&Ce(T),C=v&&Ce(v),L;if($&&C){let b=r.body;if(b&&E(b,"begin")){let R=b.args;if(R.length>0){let S=R[R.length-1];Bt(S)&&(b=S)}}if(b&&Bt(b)&&b.$?.asyncStateMachineStructName){let R=b.$.asyncStateMachineStructName;L=`${R}*`,n.tempVarAsyncStructNames||(n.tempVarAsyncStructNames=new Map),n.tempVarAsyncStructNames.set(d,R)}else T&&x(T)&&T.resolvedConcreteType?L=M(T,n):L=M(v,n)}else L=M(v??T,n);return n.emitter.emitLine(`${t}${L} ${d} = ${p}(${l});`),kn(d,t,n),e.$?.deferredDropExpressions&&$t(e,t,n),g&&yf(t,n,h,e),d}else return`// Error: Regular function call returns ${M(r.specializedType?.return.type??c.return.type,n)} but no temp variable assigned`}}}else{let u=n.externFunctions[i.id];if(u){let c=u.cName;return e.$?.deferredDropExpressions&&$t(e,t,n),`${c}(${l})`}else{let c=V(e.func,t,n);if(r&&z(r.type)){let d=wt(r.type);if(d.length>0){let{args:v,isHandlerInstallation:T}=ul(d,r,e,n);if(v.length>0){let $=l?`${l}, ${v.join(", ")}`:v.join(", ");return cl(c,$,i,e,o,t,n,T)}}}let f=e.$?.type??i.return.type,p=M(f,n),_=i.parameters.filter(d=>!d.isCompileTimeOnly).map(d=>M(d.type,n)),m=`((${p} (*)(${_.join(", ")}))${c})`,g=n,h=c.includes("__capture.")&&!!g.inAsyncStateMachine;if(h&&n.emitter.emitLine(`${t}__yo_effect_escaped = 0;`),ue(i.return.type)||ue(f)){if(n.emitter.emitLine(`${t}${m}(${l});`),e.$?.deferredDropExpressions&&$t(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=mf(te(d.$.variableName),n),T=br(v,d.$.type,n);T&&(n.emitter.emitLine(`${t} ${T};`),n.emitter.emitLine(`${t} memset(&${v}, 0, sizeof(${v}));`))}}Vn({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&&Ce(T)&&Ce(v)?v:T??v;if(n.emitter.emitLine(`${t}${M($,n)} ${d} = ${m}(${l});`),kn(d,t,n),e.$?.deferredDropExpressions&&$t(e,t,n),h){if(n.emitter.emitLine(`${t}if (__yo_effect_escaped) {`),o){for(let C of o)if(C.$?.variableName&&C.$?.type&&Le(C.$.type)){let L=mf(te(C.$.variableName),n),b=br(L,C.$.type,n);b&&(n.emitter.emitLine(`${t} ${b};`),n.emitter.emitLine(`${t} memset(&${L}, 0, sizeof(${L}));`))}}Vn({emitter:n.emitter,indent:t+" ",resultCode:void 0,debugLabel:void 0}),n.emitter.emitLine(`${t}}`)}return d}else return`// Error: Function parameter call returns ${M(i.return.type,n)} but no temp variable assigned`}}}}}else if(i&&Yt(i)){let o=i,a=en(o),s=be(o);{let l=a.isFn.callType,u=e.$?.runtimeArgExprsInOrder;if(u){let c=n;for(let g of u)if(g.$?.variableName&&g.$?.type){let h=c.currentClosureCaptures&&c.currentClosureCaptures.includes(g.$.variableName)&&U(g)&&g.$.env&&c.currentClosureCaptureFrameLevel!==void 0&&_r(g.token.value,g.$.env,c.currentClosureCaptureFrameLevel),d=V(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=(c.inAsyncStateMachine||c.inEffectStateMachine)&&d.startsWith("sm->");if(d&&d!==g.$.variableName&&!h&&!T&&!v){let $=g.$.convertedRuntimeType||g.$.type,C=ot($,g.$.variableName,n);n.emitter.emitLine(`${t}${C} = ${d};`),kn(g.$.variableName,t,n)}}let f=V(e.func,t,n),p=u.map(g=>{if(g.$?.variableName&&g.$?.type){if(c.currentClosureCaptures&&c.currentClosureCaptures.includes(g.$.variableName)&&U(g)&&g.$.env&&c.currentClosureCaptureFrameLevel!==void 0&&_r(g.token.value,g.$.env,c.currentClosureCaptureFrameLevel))return V(g,t,n);{let d=Ee(g.$.variableName,g.$.env),v=(c.inAsyncStateMachine||c.inEffectStateMachine)&&d.startsWith("sm->"),T=d;if(g.$?.deferredDupExpressions&&g.$.deferredDupExpressions.length>0){tt(g,t,c);let $=g.$.deferredDupExpressions[0];F($)&&$.$?.variableName&&(T=Ee($.$.variableName,$.$.env))}return v?d:T}}else return V(g,t,n)}),_;if(s){let g=[`(${f}).data`,...p];_=`(${f}).vtable->call(${g.join(", ")})`}else{let g;if(x(o)){let d=o;d.resolvedConcreteType&&(g=d.resolvedConcreteType.id)}let h=g?n.implClosureCallMap.get(g):void 0;if(h){let d=wt(l);if(d.length>0){let{args:T,isHandlerInstallation:$}=ul(d,{},e,c);if(T.length>0){let C=[`&(${f})`,...p,...T];return cl(h.functionCName,C.join(", "),l,e,u,t,c,$)}}let v=[`&(${f})`,...p];_=`${h.functionCName}(${v.join(", ")})`}else{let d=[`(${f}).data`,...p];_=`(${f}).call(${d.join(", ")})`}}let m=l.return.type;if(ue(m))return n.emitter.emitLine(`${t}${_};`),e.$?.deferredDropExpressions&&$t(e,t,n),"";{let g=e.$?.variableName;return g?(n.emitter.emitLine(`${t}${M(m,n)} ${g} = ${_};`),kn(g,t,n),e.$?.deferredDropExpressions&&$t(e,t,n),g):`// Error: Closure call returns ${M(m,n)} but no temp variable assigned`}}else return"// Error: No runtime args found for closure call"}}else if(D(r))if(ce(r.value)){let o=r.value,a=e.$?.runtimeArgExprsInOrder,s=n.types[o.id]?.cName,l=o.fields.map(c=>c.label),u=e.$?.variableName;if(a&&s&&l.length===a.length){if(o.isNewtype&&o.fields.length===1){let c=a[0],f=V(c,t,n),p=f;if(c.$?.deferredDupExpressions&&c.$.deferredDupExpressions.length>0){let m=n;if(c.$?.variableName&&c.$?.type){let h=Ee(c.$.variableName,c.$.env);if(f!==h){let d=c.$.type,v=M(d,n);n.emitter.emitLine(`${t}${v} ${h} = ${f};`)}}tt(c,t,m);let g=c.$.deferredDupExpressions[0];F(g)&&g.$?.variableName&&(p=Ee(g.$.variableName,g.$.env))}let _=`((${s})(${p}))`;if(u&&e.$?.type){let m=ot(e.$.type,u,n);return n.emitter.emitLine(`${t}${m} = ${_};`),kn(u,t,n),u}else return _}if(o.isReferenceSemantics){let c=n,f=a.map(m=>{let g=V(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=M(v,n);n.emitter.emitLine(`${t}${T} ${d} = ${g};`)}}tt(m,t,c);let h=m.$.deferredDupExpressions[0];if(F(h)&&h.$?.variableName)return Ee(h.$.variableName,h.$.env)}return g}).join(", "),_=`${`__yo_new_${s}`}(${f})`;if(u&&e.$?.type){let m=ot(e.$.type,u,n);return n.emitter.emitLine(`${t}${m} = ${_};`),kn(u,t,n),u}else return _}else{let c=n,f=a.map((_,m)=>{let g=V(_,t,n),h=we(o)?`_${m}`:te(l[m],o.isExtern==="c"),d=g;if(_.$?.deferredDupExpressions&&_.$.deferredDupExpressions.length>0){if(_.$?.variableName&&_.$?.type){let T=Ee(_.$.variableName,_.$.env),$=_.$.type,C=M($,n);g!==T&&n.emitter.emitLine(`${t}${C} ${T} = ${g};`)}tt(_,t,c);let v=_.$.deferredDupExpressions[0];F(v)&&v.$?.variableName&&(d=Ee(v.$.variableName,v.$.env))}return`.${h} = `+d}).join(", "),p=`(${s}){ ${f} }`;if(u&&e.$?.type){let _=ot(e.$.type,u,n);return n.emitter.emitLine(`${t}${_} = ${p};`),kn(u,t,n),u}else return p}}}else{if(Yt(r.value))return"// Error: Closure construction should have been handled by closureFunctionValue check at top of generateFuncCall";if(_t(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 c=n,f=s.token.value,p=Ee(f,s.$?.env),m=V(l,t,n);if(l.$?.deferredDupExpressions&&l.$.deferredDupExpressions.length>0){tt(l,t,c);let h=l.$.deferredDupExpressions[0];F(h)&&h.$?.variableName&&(m=Ee(h.$.variableName,h.$.env))}let g=`(${u}){ .${p} = ${m} }`;if(o&&e.$?.type){let h=ot(e.$.type,o,n);return n.emitter.emitLine(`${t}${h} = ${g};`),kn(o,t,n),o}else return g}}}else if(ye(r.value)){let o=r.value,a=e.$?.runtimeArgExprsInOrder,s=n.types[o.id]?.cName,l=e.$?.variableName;if(o.selectedVariantName&&a&&s){if(Gt(o)){let _=o.selectedVariantName,m=o.variants.find(g=>g.name===_);if(m){if(!m.fields||m.fields.length===0){let g="NULL";if(l&&e.$?.type){let h=ot(e.$.type,l,n);return n.emitter.emitLine(`${t}${h} = ${g};`),kn(l,t,n),l}else return g}else if(m.fields.length===1){let g=V(a[0],t,n);if(l&&e.$?.type){let h=ot(e.$.type,l,n);return n.emitter.emitLine(`${t}${h} = ${g};`),kn(l,t,n),l}else return g}}}if(bn(o)){let _=o.selectedVariantName,m=jt(o,_,n);if(l&&e.$?.type){let g=ot(e.$.type,l,n);return n.emitter.emitLine(`${t}${g} = ${m};`),kn(l,t,n),l}else return m}let f=o.selectedVariantName,p=o.variants.find(_=>_.name===f);if(p){let _=p.fields?.filter(d=>!ue(d.type))||[],m=n,g=a.map((d,v)=>{if(p.fields){let T=p.fields[v];if(T&&!ue(T.type)){let $=V(d,t,n),C=Ee(T.label,d.$?.env),L=$;if(d.$?.variableName&&d.$?.type){let b=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->"),S=!1;if(U(d)&&d.$.env&&d.$.variableName){let P=X(d.$.env,d.$.variableName);P.length>0&&P[P.length-1].isCompileTimeOnly&&(S=!0)}let G=!1;if($&&$!==d.$.variableName&&!b&&!R&&!S){let P=Ee(d.$.variableName,d.$.env);if($!==P){let O=ot(d.$.type,d.$.variableName,n);n.emitter.emitLine(`${t}${O} = ${$};`),G=!0,kn(d.$.variableName,t,n)}}G&&(L=Ee(d.$.variableName,d.$.env))}if(d.$?.deferredDupExpressions&&d.$.deferredDupExpressions.length>0){tt(d,t,m);let b=d.$.deferredDupExpressions[0];F(b)&&b.$?.variableName&&(L=Ee(b.$.variableName,b.$.env))}return`.${C} = `+L}return""}else return""}).filter(d=>d).join(", "),h=_.length>0?`(${s}){ .tag = ${jt(o,f,n)}, .data = { .${f} = { ${g} } } }`:`(${s}){ .tag = ${jt(o,f,n)} }`;if(l&&e.$?.type){let d=ot(e.$.type,l,n);return n.emitter.emitLine(`${t}${d} = ${h};`),kn(l,t,n),l}else return h}}}}else if(ke(i)){let o=e.args[0];if(o&&F(o)&&E(o,":")){let l=V(e.func,t,n),u=V(o.args[0],t,n),c=V(o.args[1],t,n),f=`Slice_${te(M(i.childType,n))}`;return n.sliceStructTypes.has(f)||n.sliceStructTypes.set(f,{childType:M(i.childType,n)}),`(${f}){ .data = &${l}.data[${u}], .length = (${c}) - (${u}) }`}else if(o&&U(o)&&o.token.value===":"){let l=V(e.func,t,n),u=i,c=u.childType,f=`Slice_${te(M(c,n))}`;return n.sliceStructTypes.has(f)||n.sliceStructTypes.set(f,{childType:M(c,n)}),Re(u.length)?`(${f}){ .data = &${l}.data[0], .length = ${u.length.value} }`:"/* Error: Cannot slice array with non-compile-time length */"}let a=V(e.func,t,n),s=V(o,t,n);return`${a}.data[${s}]`}else if(Xe(i)){let o=e.args[0];if(o&&F(o)&&E(o,":")){let l=V(e.func,t,n),u=V(o.args[0],t,n),c=V(o.args[1],t,n),f=`Slice_${te(M(i.childType,n))}`;return n.sliceStructTypes.has(f)||n.sliceStructTypes.set(f,{childType:M(i.childType,n)}),`(${f}){ .data = &${l}.data[${u}], .length = (${c}) - (${u}) }`}else if(o&&U(o)&&o.token.value===":"){let l=V(e.func,t,n),u=`Slice_${te(M(i.childType,n))}`;return n.sliceStructTypes.has(u)||n.sliceStructTypes.set(u,{childType:M(i.childType,n)}),`(${u}){ .data = ${l}.data, .length = ${l}.length }`}let a=V(e.func,t,n),s=V(o,t,n);return`${a}.data[${s}]`}else if(i&&Ne(i)&&Xe(i.childType)){let o=V(e.func,t,n),a=V(e.args[0],t,n);return`${o}.data[${a}]`}}function yf(e,t,n,r){let i=t.emitter;if(i.emitLine(`${e}if (__yo_effect_escaped) {`),t.inAsyncStateMachine||(cn(e+" ",t,r,!1,!0,!1),Xn(e+" ",t,r)),t.inAsyncStateMachine)n&&i.emitLine(`${e} __yo_effect_escaped = 0;`),Vn({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&&!ue(o)){let a=M(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&&!ue(o)){let a=M(o,t);a!=="void"?i.emitLine(`${e} return (${a}){0};`):i.emitLine(`${e} return;`)}else i.emitLine(`${e} return;`)}i.emitLine(`${e}}`)}function gf(e,t,n,r,i,o,a,s){let l=n.join(", "),u=t.return.type,c=a.emitter,f;if(s?.fieldFunctionType.forallParameters&&s.fieldFunctionType.forallParameters.length>0){let p=i.$?.type?M(i.$.type,a):M(u,a),_=[],g=s.fieldFunctionType.parameters.filter(d=>!d.isCompileTimeOnly);for(let d=0;d<g.length;d++){let v=g[d].type,T=x(v)&&r?.[d]?.$?.type?r[d].$.type:v,$=z(T)?pr(T,"(*)",a):M(T,a);_.push($)}let h=_.join(", ");f=`((${p} (*)(${h}))${e})`}else f=e;if(ue(u)){if(c.emitLine(`${o}${f}(${l});`),i.$?.deferredDropExpressions&&$t(i,o,a),c.emitLine(`${o}if (__yo_effect_escaped) {`),a.inAsyncStateMachine||(cn(o+" ",a,i,!1,!0,!1),Xn(o+" ",a,i)),a.inAsyncStateMachine)Vn({emitter:c,indent:o+" ",resultCode:void 0,debugLabel:void 0});else{let p=a.currentFunctionType?.return.type;if(p&&!ue(p)){let _=M(p,a);_!=="void"?c.emitLine(`${o} return (${_}){0};`):c.emitLine(`${o} return;`)}else c.emitLine(`${o} return;`)}return c.emitLine(`${o}}`),""}else{let p=i.$?.variableName;if(p){let _=s?.fieldFunctionType.forallParameters?.length&&i.$?.type?i.$.type:u,m=M(_,a);if(m==="void"||ue(_)){if(c.emitLine(`${o}${f}(${l});`),i.$?.deferredDropExpressions&&$t(i,o,a),c.emitLine(`${o}if (__yo_effect_escaped) {`),a.inAsyncStateMachine||(cn(o+" ",a,i,!1,!0,!1),Xn(o+" ",a,i)),a.inAsyncStateMachine)Vn({emitter:c,indent:o+" ",resultCode:void 0,debugLabel:void 0});else{let g=a.currentFunctionType?.return.type;if(g&&!ue(g)){let h=M(g,a);h!=="void"?c.emitLine(`${o} return (${h}){0};`):c.emitLine(`${o} return;`)}else c.emitLine(`${o} return;`)}return c.emitLine(`${o}}`),""}if(c.emitLine(`${o}${m} ${p} = ${f}(${l});`),i.$?.deferredDropExpressions&&$t(i,o,a),c.emitLine(`${o}if (__yo_effect_escaped) {`),a.inAsyncStateMachine||(cn(o+" ",a,i,!1,!0,!1),Xn(o+" ",a,i)),a.inAsyncStateMachine)Vn({emitter:c,indent:o+" ",resultCode:void 0,debugLabel:void 0});else{let g=a.currentFunctionType?.return.type;if(g&&!ue(g)){let h=M(g,a);h!=="void"?c.emitLine(`${o} return (${h}){0};`):c.emitLine(`${o} return;`)}else c.emitLine(`${o} return;`)}return c.emitLine(`${o}}`),p}else return`${f}(${l})`}}function ul(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 c=r.currentEvidenceParams.get(l);c&&(i.push(c.cParamName),u=!0)}if(!u){if(o){if(o.effectHandlerInfos)for(let c of o.effectHandlerInfos){if(c.effectParameterName!==s.fieldLabel&&c.effectParameterName!==s.implicitLabel)continue;let f=c.handlerValue;if(f&&ne(f)){if(f.specializedFunctionCaches?.length){let _=f.specializedFunctionCaches[0].specializedFunction,m=r.functions[_.funcId]?.cName;if(m){i.push(`(void*)${m}`),u=!0,a=!0;break}}let p=r.functions[f.funcId]?.cName;if(p){i.push(p),u=!0,a=!0;break}}}if(!u&&o.handlerValue&&e.length===1){let c=o.handlerValue;if(c&&ne(c)){if(c.specializedFunctionCaches?.length){let f=c.specializedFunctionCaches[0].specializedFunction,p=r.functions[f.funcId]?.cName;p&&(i.push(`(void*)${p}`),u=!0,a=!0)}if(!u){let f=r.functions[c.funcId]?.cName;f&&(i.push(f),u=!0,a=!0)}}}}if(!u){let c=n.func.$?.env??n.$?.env;if(c){let f=X(c,s.implicitLabel),p=un(c,d=>d.isImplicit===!0&&z(d.type)&&z(s.fieldFunctionType)&&d.type===s.fieldFunctionType),_=f[f.length-1],m=p[p.length-1],h=(m&&m!==_?m:_??m)?.value?.[0];if(h&&ze(h)){let d=h,v=!0;for(let T=0;T<s.fieldPath.length-1;T++){let $=s.fieldPath[T],C=d.type.fields.findIndex(L=>L.label===$);if(C>=0&&d.fields[C]&&ze(d.fields[C]))d=d.fields[C];else{v=!1;break}}if(v){let T=s.fieldPath[s.fieldPath.length-1],$=d.type.fields.findIndex(C=>C.label===T);if($>=0){let C=d.fields[$];if(C&&ne(C)){if(C.specializedFunctionCaches?.length>0){let L=C.specializedFunctionCaches[0].specializedFunction,b=r.functions[L.funcId]?.cName;b&&(i.push(`(void*)${b}`),u=!0)}if(!u){let L=r.functions[C.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 c=s.fieldPath[s.fieldPath.length-1];for(let[,f]of r.stateMachineVariables)if(f.name===c&&f.kind==="outer"){i.push(`sm->__capture.${c}`),u=!0;break}}if(!u)break}}return{args:i,isHandlerInstallation:a}}function cl(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;`),ue(u)){if(l.emitLine(`${o}${e}(${t});`),r.$?.deferredDropExpressions&&$t(r,o,a),l.emitLine(`${o}if (__yo_effect_escaped) {`),a.inAsyncStateMachine||(cn(o+" ",a,r,!1,!0,!1),Xn(o+" ",a,r)),a.inAsyncStateMachine)Vn({emitter:l,indent:o+" ",resultCode:void 0,debugLabel:void 0});else{let c=a.currentFunctionType?.return.type;if(s&&l.emitLine(`${o} __yo_effect_escaped = 0;`),c&&!ue(c))if(s){let f=M(c,a);f!=="void"?(l.emitLine(`${o} ${f} _esc_result;`),l.emitLine(`${o} memcpy(&_esc_result, __yo_effect_escape_value, sizeof(${f}));`),l.emitLine(`${o} return _esc_result;`)):l.emitLine(`${o} return;`)}else{let f=M(c,a);f!=="void"?l.emitLine(`${o} return (${f}){0};`):l.emitLine(`${o} return;`)}else l.emitLine(`${o} return;`)}return l.emitLine(`${o}}`),""}else{let c=r.$?.variableName;if(c){let f=M(u,a);if(l.emitLine(`${o}${f} ${c} = ${e}(${t});`),kn(c,o,a),r.$?.deferredDropExpressions&&$t(r,o,a),l.emitLine(`${o}if (__yo_effect_escaped) {`),a.inAsyncStateMachine||(cn(o+" ",a,r,!1,!0,!1),Xn(o+" ",a,r)),a.inAsyncStateMachine)Vn({emitter:l,indent:o+" ",resultCode:void 0,debugLabel:void 0});else{let p=a.currentFunctionType?.return.type;if(s&&p&&!ue(p)){let _=M(p,a);l.emitLine(`${o} ${_} _esc_result;`),l.emitLine(`${o} memcpy(&_esc_result, __yo_effect_escape_value, sizeof(${_}));`),l.emitLine(`${o} __yo_effect_escaped = 0;`),l.emitLine(`${o} return _esc_result;`)}else if(p&&!ue(p)){let _=M(p,a);_!=="void"?l.emitLine(`${o} return (${_}){0};`):l.emitLine(`${o} return;`)}else s&&l.emitLine(`${o} __yo_effect_escaped = 0;`),l.emitLine(`${o} return;`)}return l.emitLine(`${o}}`),c}else return`${e}(${t})`}}function vf(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&&He(a.$.value)){let s=a.$.value.value;r.emitLine(`${t}fprintf(stderr, "%s\\n", ${JSON.stringify(s)});`),r.emitLine(`${t}abort();`)}else{let s=V(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`(*((${M(i,n)}*)NULL))`}function Tf(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=V(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 f=`${r.token.value}.${l}`,p=u.currentEvidenceParams.get(f);if(p)return p.cParamName}if(e.$?.value&&ne(e.$.value)){let c=e.$.value;return n.functions[c.funcId]?.cName||c.funcId}if(!e.$?.value&&(k.___dispose.includes(l)||k.___drop.includes(l)||k.___dup.includes(l))&&a){let c=null;if((ce(a)||ye(a))&&(c=a.trait),c){let f=c.fields.find(p=>p.label===l&&p.assignedValue&&ne(p.assignedValue));if(f&&ne(f.assignedValue)){let p=f.assignedValue;return n.functions[p.funcId]?.cName||p.funcId}else return`/* ERROR: Rc method ${l} not found in type module */`}else return`/* ERROR: No module found for Rc method ${l} */`}if(ve(a)||ze(s)){let c=e.$?.value;if(c){if(_e(c)){if(c.variableName)return Ee(c.variableName,e.$?.env);if((u.inAsyncStateMachine||u.inEffectStateMachine)&&u.stateMachineVariables){for(let[,f]of u.stateMachineVariables)if(f.name===l&&f.kind==="outer")return`sm->__capture.${l}`}}else if(!ze(c))return Kt(c,n,e)}return Ee(l,e.$?.env)}if(mr(a)&&a.fields.length===1){let c=a.fields[0];if(c&&c.label===l)return o}if(ye(a)){let c=a;if(Gt(c))return o;for(let p of c.variants)if(p.fields){for(let _ of p.fields)if(_.label===l){let m=p.name;return`${o}.data.${m}.${te(l)}`}}return`/* ERROR: field ${l} not found in enum ${c.typeName} */`}else if(D(s)&&ye(s.value)){let c=s.value,f=c.variants.find(_=>_.name===l),p=n.types[c.id]?.cName;if(f&&!f.fields&&p){let _=jt(c,f.name,n);return`(${p}){ .tag = ${_}, .data = { } }`}}else{if(Tt(a)&&l==="*")return`${o}->value`;if(Ne(a)){if(l==="*")return`(*${o})`;if(Xe(a.childType))return`${o}->${te(l)}`;{let c=0,f=a;for(;Ne(f);)c++,f=f.childType;if(c>0&&ce(f)&&f.isReferenceSemantics&&c++,mr(f)&&f.fields.length===1){let p=f.fields[0];if(p&&p.label===l)return c===1?`(*${o})`:`${"*".repeat(c)}(${o})`}return c>0?c===1?`${o}->${te(l)}`:`${`(${"*".repeat(c-1)}${o})`}->${te(l)}`:`${o}.${te(l)}`}}else if(we(a)){if(l.match(/^\d+$/))return`${o}._${l}`;{let c=a.fields.findIndex(f=>f.label===l);return`${o}._${c}`}}else return be(a)?`${o}.vtable->${te(l)}`:ct(a)?`${o}->${te(l)}`:`${o}.${te(l)}`}}return"/* ERROR: field name must be an identifier */"}function Ef(e,t,n){if(!e.$?.type)return`// Error: No type information for pointer/reference expression ${w(e)}
|
|
10655
|
+
`;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 c=V(i.func,t,n),f=V(u.args[0],t,n),p=V(u.args[1],t,n),_=`Slice_${te(M(l.childType,n))}`;return n.sliceStructTypes.has(_)||n.sliceStructTypes.set(_,{childType:M(l.childType,n)}),`(${_}){ .data = &${c}.data[${f}], .length = ${p} - ${f} }`}else if(u&&U(u)&&u.token.value===":"){let c=V(i.func,t,n),f=l,p=f.childType,_=`Slice_${te(M(p,n))}`;return n.sliceStructTypes.has(_)||n.sliceStructTypes.set(_,{childType:M(p,n)}),Re(f.length)?`(${_}){ .data = &${c}.data[0], .length = ${f.length.value} }`:"/* Error: Cannot slice array with non-compile-time length */"}}else if(l&&(Xe(l)||Ne(l)&&Xe(l.childType))){let u=Xe(l)?l:l.childType,c=i.args[0];if(c&&F(c)&&E(c,":")){let f=V(i.func,t,n),p=V(c.args[0],t,n),_=V(c.args[1],t,n),m=`Slice_${te(M(u.childType,n))}`;return n.sliceStructTypes.has(m)||n.sliceStructTypes.set(m,{childType:M(u.childType,n)}),`(${m}){ .data = &${f}.data[${p}], .length = ${_} - ${p} }`}else if(c&&U(c)&&c.token.value===":"){let f=V(i.func,t,n),p=`Slice_${te(M(u.childType,n))}`;return n.sliceStructTypes.has(p)||n.sliceStructTypes.set(p,{childType:M(u.childType,n)}),`(${p}){ .data = ${f}.data, .length = ${f}.length }`}}}let o=i.$?.value,a=i.$?.type;if(o!==void 0&&a){if(Re(o)||Ue(o)){let l=V(i,t,n);return`(&(${M(a,n)}){${l}})`}if(He(o)&&i.$?.convertedRuntimeType)return`(&${V(i,t,n)})`}return`(&${V(i,t,n)})`}function $f(e,t,n){let r=e.args[0];return r?`__yo_decr_rc(${V(r,t,n)})`:"// Error: __yo_decr_rc requires exactly 1 argument"}function Cf(e,t,n){let r=e.args[0];return r?`__yo_incr_rc(${V(r,t,n)})`:"// Error: __yo_incr_rc requires exactly 1 argument"}function bf(e,t,n){let r=e.args[0];return r?V(r,t,n):"// Error: __yo_rc_own requires exactly 1 argument"}function kf(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=V(r,t,n),a=V(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=x(l)&&l.resolvedConcreteType?l.resolvedConcreteType:l;if(ke(u)){let f=u.length;if(!Re(f))return"// Error: array element has non-constant length";let p=`i_${Math.floor(Math.random()*1e6)}`,_=n.emitter;_.emitLine(`for (size_t ${p} = 0; ${p} < ${f.value}; ${p}++) {`);let m=`(${o}).data[${a}].data[${p}]`;_.emitLine(" { // drop nested array element");let g=br(m,u.childType,n);return g&&_.emitLine(` ${g};`),_.emitLine(" }"),_.emitLine("}"),""}let c=fr(u,n);return c?`${c}((${o}).data[${a}])`:"// No drop function for array element type"}function wf(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=V(r,t,n),a=V(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=x(l)&&l.resolvedConcreteType?l.resolvedConcreteType:l;if(ke(u)){let f=u.length;if(!Re(f))return"// Error: array element has non-constant length";let p=`temp_array_${Math.floor(Math.random()*1e6)}`,_=`i_${Math.floor(Math.random()*1e6)}`,m=M(u,n),g=n.emitter;g.emitLine(`${m} ${p} = (${o}).data[${a}];`),g.emitLine(`for (size_t ${_} = 0; ${_} < ${f.value}; ${_}++) {`);let h=zi(`${p}.data[${_}]`,u.childType,n);return g.emitLine(` ${p}.data[${_}] = ${h};`),g.emitLine("}"),p}let c=Dn(u,n);return c?`${c}((${o}).data[${a}])`:"// No dup function for array element type"}function Ff(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=V(r,t,n);V(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(!Re(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,c=x(u)&&u.resolvedConcreteType?u.resolvedConcreteType:u;if(we(c)){let p=`(${o})._${l}`;return br(p,c,n)}let f=fr(c,n);return f?`${f}((${o})._${l})`:"// No drop function for tuple element type"}function Lf(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=V(r,t,n);V(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(!Re(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,c=x(u)&&u.resolvedConcreteType?u.resolvedConcreteType:u;if(we(c)){let p=`(${o})._${l}`;return zi(p,c,n)}let f=Dn(c,n);return f?`${f}((${o})._${l})`:"// No dup function for tuple element type"}function Af(e,t,n){let r=e.args[0];if(!r)return"// Error: ___dup requires exactly 1 argument";let i=V(r,t,n),o=r.$?.type??e.$?.type;return o?zi(i,o,n):i}function If(e,t,n){let r=e.args[0];if(!r)return"// Error: ___drop requires exactly 1 argument";let i=V(r,t,n),o=r.$?.type??e.$?.type;return o?br(i,o,n):""}function Nf(e,t,n){let r=e.args[0];return r?`__yo_decr_rc((void*)(${V(r,t,n)}).data)`:"// Error: __yo_dyn_drop requires exactly 1 argument"}function Sf(e,t,n){let r=e.args[0];return r?`__yo_incr_rc((void*)(${V(r,t,n)}).data)`:"// Error: __yo_dyn_dup requires exactly 1 argument"}function xf(e,t,n){let r=e.args[0];return r?`__yo_incr_rc_atomic(${V(r,t,n)})`:"// Error: __yo_incr_rc_atomic requires exactly 1 argument"}function Vf(e,t,n){let r=e.args[0];return r?`__yo_decr_rc_atomic(${V(r,t,n)})`:"// Error: __yo_decr_rc_atomic requires exactly 1 argument"}function Df(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&&x(i)&&Ce(i)){let o=V(r,t,n);return`if (${o} != NULL) { __yo_decr_rc((void*)${o}); }`}if(i&&x(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=V(r,t,n);return`${s}(${l})`}}}return"/* __yo_sometype_drop: no-op */"}function Mf(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&&x(i)&&Ce(i))return`__yo_incr_rc((void*)${V(r,t,n)})`;if(i&&x(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=V(r,t,n);return`${s}(${l})`}}}return"/* __yo_sometype_dup: no-op */"}function Of(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=V(r,t,n);return on(i)?`((yo_ref_header_t*)(${o}))->ref_count`:"1"}function Rf(e,t,n){let r=e.$?.runtimeArgExprsInOrder;if(r){let i=n,o=r.map(a=>{let s=V(a,t,n);if(a.$?.deferredDupExpressions&&a.$.deferredDupExpressions.length>0){tt(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)}
|
|
10656
|
+
`}function Pf(e,t,n){let r=e.args[0];return`sizeof(${V(r,t,n)})`}function Uf(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 f=V(l,t,n);if(l.$?.deferredDupExpressions&&l.$.deferredDupExpressions.length>0){tt(l,t,a);let p=l.$.deferredDupExpressions[0];F(p)&&p.$?.variableName&&(f=Ee(p.$.variableName,p.$.env))}return`._${u} = ${f}`}).join(", ");if(o&&e.$?.type){let l=`(${i}){ ${s} }`,u=ot(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 c=V(l,t,n);return`._${u} = ${c}`}).join(", ");if(o&&e.$?.type){let l=`(${i}){ ${s} }`,u=ot(e.$.type,o,n);return n.emitter.emitLine(`${t}${u} = ${l};`),o}else return`(${i}){ ${s} }`}}}function zf(e,t,n){let i=e.args[0].$?.value;if(!i||!D(i))throw new Error("typeid codegen: expected TypeValue argument");let o=i.value,a=o.id,s=n.types[a]?.cName||M(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 Fy(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=V(i,"",t),s=V(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=V(n,"",t),o=V(r,"",t);return`${i} = ${o}`}return V(e,"",t)}function Bf(e,t,n){if(F(e)&&E(e,I.begin)){let r=n,i=r.pendingDeferredDrops,o=e.$?.deferredDropExpressions??[],a=new Map;for(let c of o){let f=Ln(c);f&&a.set(f,c)}r.pendingDeferredDrops=[...i??[]];let s=r.consumedVarPendingDrops,l=e.$?.consumedVariableDropExpressions??[];r.consumedVarPendingDrops=[...l,...s??[]];let u=new Set;for(let c of e.args){let f=V(c,t,n);if(f&&n.emitter.emitLine(`${t}${f};`),c.$?.env&&a.size>u.size)for(let p of c.$.env.frames)for(let _ of p.variables)a.has(_.name)&&!u.has(_.name)&&(u.add(_.name),r.pendingDeferredDrops.unshift(a.get(_.name)))}if(e.$?.deferredDropExpressions)for(let c of e.$.deferredDropExpressions){let f=V(c,t,n);f&&n.emitter.emitLine(`${t}${f};`)}r.pendingDeferredDrops=i,r.consumedVarPendingDrops=s}else{let r=V(e,t,n);r&&n.emitter.emitLine(`${t}${r};`)}}function Gf(e,t,n){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 c=V(i,t+" ",n);return n.emitter.emitLine(`${t} if (!(${c})) {`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t} }`),Bf(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)}`,c=`continue_${Math.random().toString(36).substr(2,9)}`;n.currentLoopLabel=u,n.currentContinueLabel=c;let f=n,p=f.loopBodyDropsBaselineCount;f.loopBodyDropsBaselineCount=f.pendingDeferredDrops?.length??0,n.emitter.emitLine(`${t}while (true) {`);let _=V(i,t+" ",n);n.emitter.emitLine(`${t} if (!(${_})) {`),n.emitter.emitLine(`${t} break;`),n.emitter.emitLine(`${t} }`),Bf(a,t+" ",n),n.emitter.emitLine(`${t}${c}:;`);let m=Fy(o,n);return n.emitter.emitLine(`${t} ${m};`),n.emitter.emitLine(`${t}}`),n.emitter.emitLine(`${t}${u}:;`),f.loopBodyDropsBaselineCount=p,n.currentLoopLabel=s,n.currentContinueLabel=l,""}else return n.emitter.emitLine(`${t}/* Error: while loop expects 2 or 3 arguments, got ${r.length} */`),""}function Ly(e){let t=[];for(let n of e)if(n.isEffectRowSpread){let r=n.type;x(r)&&r.resolvedConcreteType&&(r=r.resolvedConcreteType),rt(r)&&t.push(...r.implicitParameters)}else t.push(n);return t}function Ay(e,t,n,r){let i=e.args[0];if(!i?.$?.type)return;let o=e.args.find(f=>F(f)&&E(f,I.using));if(!o)return;let a=Dt(i.$.type);if(!a?.isFuture.effects?.length)return;let s=Ly(a.isFuture.effects),l=o.args,u=r,c=u.emitter;for(let f=0;f<s.length&&f<l.length;f++){let p=s[f],_=l[f];if(z(p.type)){let m=p.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=_.$?.value;if(h&&ne(h)){let d=r.functions[h.funcId];d&&(g=d.cName)}}g||(g=V(_,n,r)),g&&c.emitLine(`${n} ${t}->__capture.${m} = (void*)${g};`)}else if(ve(p.type)){let m=p.type;for(let g of m.fields){if(!z(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=_.$?.value;if(d&&ze(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=Iy(g.label,m,u,e)),h&&c.emitLine(`${n} ${t}->__capture.${g.label} = (void*)${h};`)}}}}function Iy(e,t,n,r){let i=r.$?.env??r.func.$?.env;if(!i)return;let o=un(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&&ze(l)){let u=l.type.fields.findIndex(c=>c.label===e);if(u>=0){let c=l.fields[u];if(c&&ne(c)){let f=n.functions[c.funcId]?.cName;if(f)return f}}}}}function Ny(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=V(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=V(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 cn(t,r,e,!1,!0,!0),Xn(t,r,e,!0),Vn({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(cn(t,r,e,!1,!0,!0),Xn(t,r,e,!0),r.currentFunctionType){let l=r.currentFunctionType.return.type;if(!ue(l)){let u=r.overrideReturnTypeStr??M(l,n);if(u!=="void")return`return (${u}){0}`}}return"return"}let s=V(i,t,n);if(r.effectHandlerParamDrops)for(let l of r.effectHandlerParamDrops)r.emitter.emitLine(`${t}${l};`);if(cn(t,r,e,!1,!0,!0),Xn(t,r,e,!0),(r.isModuleEffectMemberFunction||r.currentEvidenceParams&&r.currentEvidenceParams.size>0)&&r.currentFunctionType){let l=i.$?.type;if(l&&!ue(l)){let c=M(l,n);r.emitter.emitLine(`${t}{ ${c} _esc_val = ${s}; memcpy(__yo_effect_escape_value, &_esc_val, sizeof(${c})); }`)}let u=r.currentFunctionType.return.type;if(!ue(u)){let c=r.overrideReturnTypeStr??M(u,n);if(c!=="void")return`return (${c}){0}`}return"return"}return`return ${s}`}function Wf(e,t,n){let r;switch(e.tag){case"FnCall":r=Sy(e,t,n);break;case"Atom":r=Yi(e,n,t);break}return r}function Sy(e,t,n){if(e.$?.macroExpansion)return V(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&&x(o)&&Ce(o)){if(r===k.___drop[0]){let a=V(i,t,n);return`if (${a} != NULL) { __yo_decr_rc((void*)${a}); }`}if(r===k.___dup[0])return`__yo_incr_rc((void*)${V(i,t,n)})`}}if(ic(e))return oc(e,t,n);if(E(e,k.__yo_decr_rc))return $f(e,t,n);if(E(e,k.__yo_incr_rc))return Cf(e,t,n);if(E(e,k.__yo_rc_own))return bf(e,t,n);if(E(e,k.__yo_drop_array_element))return kf(e,t,n);if(E(e,k.__yo_dup_array_element))return wf(e,t,n);if(E(e,k.__yo_drop_tuple_element))return Ff(e,t,n);if(E(e,k.__yo_dup_tuple_element))return Lf(e,t,n);if(E(e,k.___dup))return Af(e,t,n);if(E(e,k.___drop))return If(e,t,n);if(E(e,k.__yo_dyn_drop))return Nf(e,t,n);if(E(e,k.__yo_dyn_dup))return Sf(e,t,n);if(E(e,k.__yo_incr_rc_atomic))return xf(e,t,n);if(E(e,k.__yo_decr_rc_atomic))return Vf(e,t,n);if(E(e,k.__yo_iso_extract))return af(e,t,n);if(E(e,k.__yo_iso_dispose))return sf(e,t,n);if(E(e,k.__yo_arc_dispose))return zc(e,t,n);if(sl(e))return lf(e,t,n);if(al(e))return Bc(e,t,n);if(E(e,k.__yo_sometype_drop))return Df(e,t,n);if(E(e,k.__yo_sometype_dup))return Mf(e,t,n);if(E(e,k.__yo_gc_collect))return rf(e,t,n);if(E(e,k.rc))return Of(e,t,n);if(E(e,k.panic))return vf(e,t,n);if(E(e,I.test))return"/* test declaration skipped */";if(E(e,k.__yo_thread_set_maximum_threads))return df(e,t,n);if(E(e,I.op_and))return Pc(e,t,n);if(E(e,I.op_or))return Uc(e,t,n);if(Bt(e))return e.$?.awaitAnalysis?ac(e,t,n):fc(e,t,n);if(E(e,I.dyn))return nf(e,t,n);if(Tn(e))return Yc(e,t,n);if(bu(e))return jc(e,t,n);if(ku(e)){let r=e.args[0];if(!r)return"// Error: spawn requires a Future argument";let o=n.emitter,a=V(r,t,n),s=r.$?.type,l=s?M(s,n):"void*",u=e.$?.type,c=u?M(u,n):null,f=e.$?.variableName?`__spawn_future_${e.$.variableName}`:"__spawn_future",p=e.$?.variableName?`__spawn_state_${e.$.variableName}`:"__spawn_state";return o.emitLine(`${t}// io.spawn \u2014 start cold Future, return JoinHandle`),o.emitLine(`${t}${l} ${f} = ${a};`),o.emitLine(`${t}int ${p} = ${f}->state;`),o.emitLine(`${t}if (${p} == -2) {`),o.emitLine(`${t} fprintf(stderr, "panic: attempted to spawn an aborted Future\\n");`),o.emitLine(`${t} abort();`),o.emitLine(`${t}}`),Ro(r.$?.type)||(o.emitLine(`${t}if (${p} == 0 && ${f}->__yo_resume_fn) {`),Ay(e,f,t,n),o.emitLine(`${t} __yo_incr_rc((void*)${f});`),o.emitLine(`${t} ${f}->__yo_resume_fn((void*)${f});`),o.emitLine(`${t}}`)),c?`(${c}){ .__future = (void*)${f} }`:`(void*)${f}`}if(wu(e))return Kc(e,t,n);if(E(e,I.return))return kc(e,t,n);if(E(e,I.escape))return Ny(e,t,n);if(E(e,k.__yo_array_fill,2))return Wc(e,t,n);if(E(e,"::",2))return"";if(E(e,":",2))return Zc(e,t,n);if(E(e,":=",2)){let r=of(e,t,n);if(r!==void 0)return r}else{if(E(e,"=",2))return qc(e,t,n);if(e.$?.value&&!_e(e.$?.value)&&!ue(e.$.type)&&!mt(e.$?.controlFlow)){let r=e.$.value;return Kt(r,n,e)}else{if(E(e,".",2))return Tf(e,t,n);if(E(e,I.begin))return Qc(e,t,n);if(E(e,I.cond))return Jc(e,t,n);if(E(e,I.match))return cf(e,t,n);if(E(e,k.__yo_address_of,1))return Ef(e,t,n);if(E(e,I.tuple))return Uf(e,t,n);if(E(e,I.array)){let r=Gc(e,t,n);if(r!==void 0)return r}else{if(E(e,I.recur))return Rf(e,t,n);if(E(e,I.runtime,1))return V(e.args[0],t,n);if(E(e,k.sizeof,1))return Pf(e,t,n);if(E(e,k.typeid,1))return zf(e,t,n);if(E(e,k.downcast,2))return tf(e,t,n);if(E(e,fi)){let r=e.$?.runtimeArgExprsInOrder||e.args;if(r){let i=n,o=r.map(a=>{let s=V(a,t,n);if(a.$?.deferredDupExpressions&&a.$.deferredDupExpressions.length>0){tt(a,t,i);let l=a.$.deferredDupExpressions[0];if(F(l)&&l.$?.variableName)return Ee(l.$.variableName,l.$.env)}return s});return Uo(e.func.token.value,o,e,n,t)}}else{if(E(e,I.while))return Gf(e,t,n);if(E(e,"->",2)&&F(e.args[0])&&E(e.args[0],I.fn)){let r=e.$?.value;return ne(r)?Kt(r,n):"// Error: Anonymous function missing function value"}else{if(E(e,k.consume))return ef(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 ff(e,t,n);{let r=hf(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 qf({expr:e,env:t,context:n}){ge(e,k.alignof,1);let r=e.args[0],i=N({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&&D(i.$.value)?o=i.$.value.value:o=i.$.type;let a=Hn(o),s;return a===null?s=Y(yt(),{env:t,context:n}):s=Ht("Usize",a),e.$={env:t,type:yt(),value:s,pathCollection:[]},e}function Hf({expr:e,env:t,context:n}){let r=E(e,I.op_and)?"and":"or",i=e.args;if(i.length===0){let u=ft(r==="and");return e.$={env:t,type:Ze(),value:u,pathCollection:[],isAccessingProperty:!1},e}let o=t,a,s=!1,l=!1;for(let u=0;u<i.length;u++){let c=i[u],f=N({expr:c,env:o,context:{...n}});if(!f.$||!gn(f.$.type))throw y({token:c.token,errorMessage:`Expected bool type for "${r}" argument, got:
|
|
10657
10657
|
${w(c)}`});o=f.$.env;let p=f.$.value;if(_e(p)){s=!0;continue}if(Ue(p)){let _=p.value;if(r==="and"){if(!_){a=ft(!1);break}!s&&!l&&(a=ft(!0))}else{if(_){a=ft(!0);break}!s&&!l&&(a=ft(!1))}}else l=!0}return Ue(a)||(l||s)&&(l?a=void 0:a=Y(Ze(),{env:o,context:n})),e.$={env:o,type:Ze(),value:a,pathCollection:[],isAccessingProperty:!1},e}function Yf({expr:e,env:t,context:n}){ge(e,k.__yo_array_fill,2);let r=e.args[0],i=e.args[1],o=N({expr:r,env:t,context:{...n}});o.$?.env&&(t=o.$.env);let a=o.$?.value;if(!D(a)||!ke(a.value))throw y({token:r.token,errorMessage:`__yo_array_fill expects first argument to be an ArrayType, got ${a?De(a):"undefined"}`});let s=a.value,l=N({expr:i,env:t,context:{...n,expectedType:{type:s.childType,env:t}}});l.$?.env&&(t=l.$.env);let u=l.$?.type,c=l.$?.value;if(!u)throw y({token:i.token,errorMessage:"Failed to evaluate fill value"});if(!c)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 f=s.length;if(_e(f)){let g=Y(s,{env:t,context:n});return e.$={env:t,type:s,value:g,pathCollection:[]},e}let p;if(Re(f)){let g=f.value;if(p=typeof g=="bigint"?Number(g):g,!Number.isInteger(p)||p<0)throw y({token:i.token,errorMessage:`Array length must be a non-negative integer, got ${p}`})}else throw y({token:i.token,errorMessage:`Array length must be a compile-time known integer, got ${De(f)}`});let _=[];if(_e(c)){let g=Y(s,{env:t,context:n});return e.$={env:t,type:s,value:g,pathCollection:[]},e}for(let g=0;g<p;g++)_.push(c);let m=Sr(s,_);return e.$={env:t,type:s,value:m,pathCollection:[]},e}function jf({expr:e,env:t,context:n}){if(n.isValidatingFunctionDefinition||!n.isExecuting){let s=n.expectedType?.type??j.type;return e.$={env:t,type:s,value:ue(s)?j:Y(s,{env:t,context:n}),pathCollection:[]},e}let r=e.args[0],i=e.args[1],o=N({expr:r,env:t,context:{...n}});if(!o.$||!Ue(o.$.value))throw y({token:r.token,errorMessage:`Expected bool value for "comptime_assert", got:
|
|
10658
10658
|
${w(r)}
|
|
10659
10659
|
|
|
@@ -10663,36 +10663,36 @@ ${w(r)}`,isAssertionError:!0})}function Kf({expr:e,env:t,context:n}){if(E(e,k.__
|
|
|
10663
10663
|
${w(r)}`});t=r.$.env;let i;if(E(e,k.__yo_comptime_bool_not))Ue(r.$.value)?i=ft(!r.$.value.value):i=Y(Ze(),{env:t,context:n});else if(E(e,k.__yo_comptime_bool_to_comptime_string))Ue(r.$.value)?i=nn(r.$.value.value.toString()):i=Y(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=N({expr:e.args[0],env:t,context:{...n}});if(!r.$||!gn(r.$.type)||!r.$.value)throw y({token:r.token,errorMessage:`Expected bool type for "${e.func.token.value}" first argument, got:
|
|
10664
10664
|
${w(r)}`});t=r.$.env;let i=N({expr:e.args[1],env:t,context:{...n}});if(!i.$||!gn(i.$.type)||!i.$.value)throw y({token:i.token,errorMessage:`Expected bool type for "${e.func.token.value}" second argument, got:
|
|
10665
10665
|
${w(i)}`});t=i.$.env;let o=r.$.value,a=i.$.value,s;if(E(e,k.__yo_comptime_bool_and))Ue(o)&&Ue(a)?s=ft(o.value&&a.value):s=Y(Ze(),{env:t,context:n});else if(E(e,k.__yo_comptime_bool_or))Ue(o)&&Ue(a)?s=ft(o.value||a.value):s=Y(Ze(),{env:t,context:n});else if(E(e,k.__yo_comptime_bool_eq))Ue(o)&&Ue(a)?s=ft(o.value===a.value):s=Y(Ze(),{env:t,context:n});else if(E(e,k.__yo_comptime_bool_neq))Ue(o)&&Ue(a)?s=ft(o.value!==a.value):s=Y(Ze(),{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 Xf({expr:e,env:t,context:n}){let r=xe(e.args[0]),i=e.args[1]?xe(e.args[1]):void 0;try{N({expr:r,env:t,context:{...n}})}catch{return e.$={env:t,type:j.type,value:j,pathCollection:[]},e}if(i){let o=N({expr:i,env:t,context:{...n}});if(o.$?.value)throw y({token:e.token,errorMessage:He(o.$.value)?o.$.value.value:De(o.$.value)})}throw y({token:e.token,errorMessage:`Expected compile error, but the expression was evaluated successfully:
|
|
10666
|
-
${w(r)}`})}function xy(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 ji(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(
|
|
10666
|
+
${w(r)}`})}function xy(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 ji(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(ir(i.type,t))return;if(ir(e.type.return.type,t))return;let r=xy(e.type);try{let i=xe(e.body),o=Oe(r.env);for(let l of r.parameters){let{env:u}=fe({env:o,variable:{name:l.label,type:l.type,isCompileTimeOnly:!0,value:[Y(l.type,{variableName:l.label,env:o,context:n})],token:ie,initializedAtToken:ie,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=vt({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,lt(o,!0),a;lt(o,!0);return}catch{return}}function Qf({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=N({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: ${De(o)}`});if(o.type.return.isCompileTimeOnly)return e.$={env:t,type:o.type,value:o,pathCollection:[]},e;let a=ji(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 Zf({expr:e,env:t,context:n}){ge(e,k.__yo_comptime_list_car,1);let r=e.args[0],i=N({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}":
|
|
10667
10667
|
${w(r)}`});if(!xt(i.$.type))throw y({token:r.token,errorMessage:`Expected ComptimeList type for "${e.func.token.value}" argument, got:
|
|
10668
10668
|
${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:
|
|
10669
|
-
${w(r)}`});if(e.$={env:i.$.env,type:o.childType,value:Y(o.childType,{env:i.$.env,context:n}),pathCollection:[],isAccessingProperty:!1},
|
|
10669
|
+
${w(r)}`});if(e.$={env:i.$.env,type:o.childType,value:Y(o.childType,{env:i.$.env,context:n}),pathCollection:[],isAccessingProperty:!1},er(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 Jf({expr:e,env:t,context:n}){ge(e,k.__yo_comptime_list_cdr,1);let r=e.args[0],i=N({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}":
|
|
10670
10670
|
${w(r)}`});if(!xt(i.$.type))throw y({token:r.token,errorMessage:`Expected ComptimeList type for "${e.func.token.value}" argument, got:
|
|
10671
10671
|
${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:
|
|
10672
|
-
${w(r)}`});if(e.$={env:i.$.env,type:o,value:Y(o,{env:i.$.env,context:n}),pathCollection:[],isAccessingProperty:!1},
|
|
10672
|
+
${w(r)}`});if(e.$={env:i.$.env,type:o,value:Y(o,{env:i.$.env,context:n}),pathCollection:[],isAccessingProperty:!1},er(a)){let s=a.elements;if(s.length>0)e.$.value=Pn(o.childType,[...s.slice(1)]);else throw y({token:r.token,errorMessage:`Unexpected empty ComptimeList for "${e.func.token.value}" argument`})}return e}function ep({expr:e,env:t,context:n}){ge(e,k.__yo_comptime_list_cons,2);let r=N({expr:e.args[0],env:t,context:{...n}});if(!r.$)throw y({token:r.token,errorMessage:`Failed to evaluate the first argument expression for "${e.func.token.value}":
|
|
10673
10673
|
${w(r)}`});t=r.$.env;let i=r.$.value;if(!i)throw y({token:r.token,errorMessage:`Expected Expr value for "${e.func.token.value}" first argument, got:
|
|
10674
10674
|
${w(r)}`});let o=N({expr:e.args[1],env:t,context:{...n}});if(!o.$)throw y({token:o.token,errorMessage:`Failed to evaluate the second argument expression for "${e.func.token.value}":
|
|
10675
10675
|
${w(o)}`});if(t=o.$.env,!xt(o.$.type))throw y({token:o.token,errorMessage:`Expected ComptimeList type for "${e.func.token.value}" second argument, got:
|
|
10676
10676
|
${w(o)}`});let a=o.$.value;if(!a)throw y({token:o.token,errorMessage:`Expected ComptimeList value for "${e.func.token.value}" second argument, got:
|
|
10677
|
-
${w(o)}`});let s=o.$.type,l=r.$.type;if(!q({type:l,env:t},{type:s.childType,env:t}))throw y({token:r.token,errorMessage:`Type mismatch: cannot cons value of type "${A(l)}" to ComptimeList of base type "${A(s.childType)}" in "${e.func.token.value}"`});if(e.$={env:t,type:s,value:Y(s,{env:t,context:n}),pathCollection:[],isAccessingProperty:!1},
|
|
10677
|
+
${w(o)}`});let s=o.$.type,l=r.$.type;if(!q({type:l,env:t},{type:s.childType,env:t}))throw y({token:r.token,errorMessage:`Type mismatch: cannot cons value of type "${A(l)}" to ComptimeList of base type "${A(s.childType)}" in "${e.func.token.value}"`});if(e.$={env:t,type:s,value:Y(s,{env:t,context:n}),pathCollection:[],isAccessingProperty:!1},er(a)){let u=[i,...a.elements];e.$.value=Pn(s.childType,u)}return e}function tp({expr:e,env:t,context:n}){ge(e,k.__yo_comptime_list_append,2);let r=N({expr:e.args[0],env:t,context:{...n}});if(!r.$)throw y({token:r.token,errorMessage:`Failed to evaluate the first argument expression for "${e.func.token.value}":
|
|
10678
10678
|
${w(r)}`});if(t=r.$.env,!xt(r.$.type))throw y({token:r.token,errorMessage:`Expected ComptimeList type for "${e.func.token.value}" first argument, got:
|
|
10679
10679
|
${w(r)}`});let i=r.$.value;if(!i)throw y({token:r.token,errorMessage:`Expected Expr value for "${e.func.token.value}" first argument, got:
|
|
10680
10680
|
${w(r)}`});let o=N({expr:e.args[1],env:t,context:{...n}});if(!o.$)throw y({token:o.token,errorMessage:`Failed to evaluate the second argument expression for "${e.func.token.value}":
|
|
10681
10681
|
${w(o)}`});if(t=o.$.env,!xt(o.$.type))throw y({token:o.token,errorMessage:`Expected ComptimeList type for "${e.func.token.value}" second argument, got:
|
|
10682
10682
|
${w(o)}`});let a=o.$.value;if(!a)throw y({token:o.token,errorMessage:`Expected ComptimeList value for "${e.func.token.value}" second argument, got:
|
|
10683
|
-
${w(o)}`});let s=r.$.type,l=o.$.type;if(!q({type:s,env:t},{type:l,env:t}))throw y({token:e.token,errorMessage:`Type mismatch: cannot append ComptimeList of base type "${A(l.childType)}" to ComptimeList of base type "${A(s.childType)}" in "${e.func.token.value}"`});if(e.$={env:t,type:s,value:Y(s,{env:t,context:n}),pathCollection:[],isAccessingProperty:!1},
|
|
10683
|
+
${w(o)}`});let s=r.$.type,l=o.$.type;if(!q({type:s,env:t},{type:l,env:t}))throw y({token:e.token,errorMessage:`Type mismatch: cannot append ComptimeList of base type "${A(l.childType)}" to ComptimeList of base type "${A(s.childType)}" in "${e.func.token.value}"`});if(e.$={env:t,type:s,value:Y(s,{env:t,context:n}),pathCollection:[],isAccessingProperty:!1},er(i)&&er(a)){let u=[...i.elements,...a.elements];e.$.value=Pn(s.childType,u)}return e}function np({expr:e,env:t,context:n}){ge(e,k.__yo_comptime_list_length,1);let r=e.args[0],i=N({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}":
|
|
10684
10684
|
${w(r)}`});if(!xt(i.$.type))throw y({token:r.token,errorMessage:`Expected ComptimeList type for "${e.func.token.value}" argument, got:
|
|
10685
10685
|
${w(r)}`});let o=i.$.value;if(!o)throw y({token:r.token,errorMessage:`Expected ComptimeList value for "${e.func.token.value}" argument, got:
|
|
10686
|
-
${w(r)}`});if(e.$={env:i.$.env,type:yt(),value:Y(yt(),{env:i.$.env,context:n}),pathCollection:[],isAccessingProperty:!1},
|
|
10686
|
+
${w(r)}`});if(e.$={env:i.$.env,type:yt(),value:Y(yt(),{env:i.$.env,context:n}),pathCollection:[],isAccessingProperty:!1},er(o)){let a=o.elements.length,s=Ht("Usize",a);e.$.value=s}return e}function rp({expr:e,env:t,context:n}){ge(e,k.__yo_comptime_list_element_type,1);let r=e.args[0],i=N({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}":
|
|
10687
10687
|
${w(r)}`});if(!D(i.$?.value))throw y({token:r.token,errorMessage:`Expected ComptimeList type for "${e.func.token.value}" argument, got:
|
|
10688
10688
|
${w(r)}`});let o=i.$.value.value;if(!xt(o))throw y({token:r.token,errorMessage:`Expected ComptimeList type for "${e.func.token.value}" argument, got:
|
|
10689
|
-
${A(o)}`});let a=J(o.childType);return e.$={env:i.$.env,type:a.type,value:a,pathCollection:[],isAccessingProperty:!1},e}function Ia(e){switch(e.tag){case"u8":return{min:0,max:255};case"i8":return{min:-128,max:127};case"u16":return{min:0,max:65535};case"i16":return{min:-32768,max:32767};case"u32":return{min:0,max:4294967295};case"i32":return{min:-2147483648,max:2147483647};case"u64":return{min:0n,max:18446744073709551615n};case"i64":return{min:-9223372036854775808n,max:9223372036854775807n};case"usize":{let t=hr();return{min:0n,max:(1n<<BigInt(t))-1n}}case"isize":{let t=hr();return{min:-(1n<<BigInt(t-1)),max:(1n<<BigInt(t-1))-1n}}case"comptime_int":return{min:-1/0,max:1/0};case"f32":case"f64":return;default:return}}function ip(e){switch(e.tag){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"usize":return"Usize";case"isize":return"Isize";case"f32":return"F32";case"f64":return"F64";default:return}}function zo(e){return Ir(e)||Nr(e)||gt(e)||St(e)||qn(e)||e.isExtern==="c"&&x(e)}function Vy(e){return e.type.variants.find(r=>r.name===e.variantName)?.discriminant}function Dy(e){if(e&&Re(e))return e.value}function My(e){return Fn(e)||Jo(e)||Re(e)}function Aa(e,t,n){let r=Ia(t);if(r){let i=e,o=(s,l)=>{if(typeof s=="bigint"||typeof l=="bigint"){let u=typeof s=="bigint"?s:BigInt(Math.floor(s)),c=typeof l=="bigint"?l:BigInt(Math.floor(l));return u<c}return s<l},a=(s,l)=>{if(typeof s=="bigint"||typeof l=="bigint"){let u=typeof s=="bigint"?s:BigInt(Math.floor(s)),c=typeof l=="bigint"?l:BigInt(Math.floor(l));return u>c}return s>l};if(o(i,r.min)||a(i,r.max))throw y({token:n,errorMessage:`Value ${e} is out of range for type ${A(t)} (${r.min} to ${r.max})`})}if(gt(t)){let i=typeof e=="bigint"?e:BigInt(Math.floor(e));return
|
|
10689
|
+
${A(o)}`});let a=J(o.childType);return e.$={env:i.$.env,type:a.type,value:a,pathCollection:[],isAccessingProperty:!1},e}function Ia(e){switch(e.tag){case"u8":return{min:0,max:255};case"i8":return{min:-128,max:127};case"u16":return{min:0,max:65535};case"i16":return{min:-32768,max:32767};case"u32":return{min:0,max:4294967295};case"i32":return{min:-2147483648,max:2147483647};case"u64":return{min:0n,max:18446744073709551615n};case"i64":return{min:-9223372036854775808n,max:9223372036854775807n};case"usize":{let t=hr();return{min:0n,max:(1n<<BigInt(t))-1n}}case"isize":{let t=hr();return{min:-(1n<<BigInt(t-1)),max:(1n<<BigInt(t-1))-1n}}case"comptime_int":return{min:-1/0,max:1/0};case"f32":case"f64":return;default:return}}function ip(e){switch(e.tag){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"usize":return"Usize";case"isize":return"Isize";case"f32":return"F32";case"f64":return"F64";default:return}}function zo(e){return Ir(e)||Nr(e)||gt(e)||St(e)||qn(e)||e.isExtern==="c"&&x(e)}function Vy(e){return e.type.variants.find(r=>r.name===e.variantName)?.discriminant}function Dy(e){if(e&&Re(e))return e.value}function My(e){return Fn(e)||Jo(e)||Re(e)}function Aa(e,t,n){let r=Ia(t);if(r){let i=e,o=(s,l)=>{if(typeof s=="bigint"||typeof l=="bigint"){let u=typeof s=="bigint"?s:BigInt(Math.floor(s)),c=typeof l=="bigint"?l:BigInt(Math.floor(l));return u<c}return s<l},a=(s,l)=>{if(typeof s=="bigint"||typeof l=="bigint"){let u=typeof s=="bigint"?s:BigInt(Math.floor(s)),c=typeof l=="bigint"?l:BigInt(Math.floor(l));return u>c}return s>l};if(o(i,r.min)||a(i,r.max))throw y({token:n,errorMessage:`Value ${e} is out of range for type ${A(t)} (${r.min} to ${r.max})`})}if(gt(t)){let i=typeof e=="bigint"?e:BigInt(Math.floor(e));return tr(i)}if(St(t)){let i=typeof e=="bigint"?Number(e):e;return ea(i)}if(Nr(t)){let i=ip(t);if(i){let o=typeof e=="bigint"?Number(e):e;return Ht(i,o)}}if(Ir(t)){let i=ip(t);if(i)if(i==="U64"||i==="I64"||i==="Usize"||i==="Isize"){let a=typeof e=="bigint"?e:BigInt(Math.floor(e));return Ht(i,a)}else{let a=typeof e=="bigint"?Number(e):Math.floor(e);return Ht(i,a)}}throw y({token:n,errorMessage:`Cannot create compile-time value for type ${A(t)}`})}function op({targetType:e,argExpr:t,expr:n,callerEnv:r,context:i}){if(!zo(e))return;let o=N({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.$.value,l=o.$.type;if(ye(l)&&It(s)){let c=Vy(s);if(c===void 0)throw y({token:t.token,errorMessage:`Failed to get discriminant for enum variant "${s.variantName}"`});if(Yn(e,a)){let f=Aa(c,e,n.token);return n.$={env:a,type:e,value:f,pathCollection:[]},{expr:n,env:a}}}if(!zo(l)&&!gt(l)&&!St(l)&&!ye(l))throw y({token:t.token,errorMessage:`Cannot convert ${A(l)} to ${A(e)}. Expected a numeric type.`});let u=Dy(s);if(u!==void 0&&Yn(e,a)){let c=Aa(u,e,n.token);return n.$={env:a,type:e,value:c,pathCollection:[]},{expr:n,env:a}}if((gt(e)||St(e))&&u===void 0)throw y({token:t.token,errorMessage:`Cannot convert runtime value to ${A(e)}. Only compile-time values can be converted to ${A(e)}.`});if((gt(l)||St(l))&&Yn(e,a))if(u!==void 0){let c=Aa(u,e,n.token);return n.$={env:a,type:e,value:c,pathCollection:[]},{expr:n,env:a}}else return n.$={env:a,type:e,value:Y(e,{variableName:"comptime_conversion_placeholder",env:a,context:i}),pathCollection:[]},{expr:n,env:a};if(qn(e)||!My(s)){let c={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}};return la(n,c),{expr:n,env:a}}if(u!==void 0){let c=Aa(u,e,n.token);return n.$={env:a,type:e,value:c,pathCollection:[]},{expr:n,env:a}}throw y({token:n.token,errorMessage:"Unexpected case in numeric type conversion"})}function Rt(e){return e&&(Fn(e)||Jo(e)||Re(e))?e.value:null}function zr(e,t,n,r){if(t.tag==="comptime_int"){let a=typeof e=="bigint"?e:BigInt(Math.floor(e));return tr(a)}if(t.tag==="comptime_float"){let a=typeof e=="bigint"?Number(e):e;return ea(a)}if(qn(t))return Y(t,{env:n,context:r});let i=Oy(t),o=Py(e,t);return Ht(i,o)}function Oy(e){switch(e.tag){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"usize":return"Usize";case"isize":return"Isize";case"f32":return"F32";case"f64":return"F64";case"comptime_int":return"ComptimeFloat";case"comptime_float":return"ComptimeFloat";default:throw new Error(`Unsupported numeric type: ${e.tag}`)}}function fl(e,t,n,r,i,o){let a=Ia(t);if(a===void 0||a.min===-1/0&&a.max===1/0)return;let s=(u,c)=>{if(typeof u=="bigint"||typeof c=="bigint"){let f=typeof u=="bigint"?u:BigInt(Math.floor(u)),p=typeof c=="bigint"?c:BigInt(Math.floor(c));return f<p}return u<c},l=(u,c)=>{if(typeof u=="bigint"||typeof c=="bigint"){let f=typeof u=="bigint"?u:BigInt(Math.floor(u)),p=typeof c=="bigint"?c:BigInt(Math.floor(c));return f>p}return u>c};if(s(e,a.min)||l(e,a.max))throw y({token:o,errorMessage:`Integer overflow in compile-time evaluation
|
|
10690
10690
|
${r} ${n==="multiply"?"*":n==="add"?"+":"-"} ${i} = ${e}
|
|
10691
10691
|
Result ${e} exceeds ${t.tag} range [${a.min}, ${a.max}]`,kind:"overflow"})}function Ry(e){switch(e.tag){case"u8":case"i8":return 8;case"u16":case"i16":return 16;case"u32":case"i32":return 32;case"u64":case"i64":return 64;case"usize":case"isize":return hr();default:return null}}function Py(e,t){if(t.tag==="u64"||t.tag==="i64"||t.tag==="usize"||t.tag==="isize"){let r=typeof e=="bigint"?e:BigInt(Math.floor(e)),i=Ia(t),o=typeof i.min=="bigint"?i.min:BigInt(i.min),a=typeof i.max=="bigint"?i.max:BigInt(i.max);return r<o?o:r>a?a:r}let n=typeof e=="bigint"?Number(e):e;switch(t.tag){case"u8":return Math.floor(Math.abs(n))%256;case"i8":return Math.max(-128,Math.min(127,Math.floor(n)));case"u16":return Math.floor(Math.abs(n))%65536;case"i16":return Math.max(-32768,Math.min(32767,Math.floor(n)));case"u32":return Math.floor(Math.abs(n))%4294967296;case"i32":return Math.max(-2147483648,Math.min(2147483647,Math.floor(n)));case"f32":case"f64":return n;default:return n}}function Bo(e,t,n,r,i,o){let a=Rt(e),s=Rt(t);return a===null||s===null?Y(n,{env:i,context:o}):zr(r(a,s),n,i,o)??Y(n,{env:i,context:o})}function Ki(e,t,n,r,i){let o=Rt(e),a=Rt(t);if(o===null||a===null)return Y(Ze(),{env:r,context:i});if(typeof o=="bigint"||typeof a=="bigint"){let s=typeof o=="bigint"?o:BigInt(Math.floor(o)),l=typeof a=="bigint"?a:BigInt(Math.floor(a));return ft(n(s,l))}return ft(n(o,a))}function Uy(e,t,n,r,i){let o=Rt(e);return o===null?Y(t,{env:r,context:i}):zr(n(o),t,r,i)??Y(t,{env:r,context:i})}function ap({expr:e,env:t,context:n}){let r=e.func.token.value,i=/^__yo_comptime_(u8|i8|u16|i16|u32|i32|u64|i64|usize|isize|f32|f64|int|float)_(add|sub|mul|div|mod|eq|neq|lt|lte|gt|gte|neg|to_comptime_string|bit_and|bit_or|bit_xor|bit_not|shl|shr)$/,o=r.match(i);if(!o)throw y({token:e.token,errorMessage:`Expected numeric function, got: ${r}`});let[,a,s]=o,u=(()=>{switch(a){case"u8":return Ci();case"i8":return bi();case"u16":return ki();case"i16":return wi();case"u32":return Fi();case"i32":return Vr();case"u64":return Li();case"i64":return Ai();case"usize":return yt();case"isize":return $i();case"f32":return Ii();case"f64":return Dr();case"int":case"comptime_int":return xr();case"float":case"comptime_float":return Ei();default:throw new Error(`Unknown numeric type: ${a}`)}})();if(s==="neg"||s==="to_comptime_string"||s==="bit_not"){let h=N({expr:e.args[0],env:t,context:{...n}});if(!h.$||!h.$.value)throw y({token:h.token,errorMessage:`Expected ${a} type for "${r}" argument, got:
|
|
10692
10692
|
${w(h)}`});t=h.$.env;let d;if(s==="neg")if(Re(h.$.value)){if(u.tag==="u8"||u.tag==="u16"||u.tag==="u32"||u.tag==="u64"||u.tag==="usize")throw y({token:e.token,errorMessage:`Cannot apply negation to unsigned type: ${a}`});d=Uy(h.$.value,u,v=>-v,t,n)}else d=Y(u,{env:t,context:n});else if(s==="bit_not")if(Re(h.$.value)||Fn(h.$.value)){let v=Rt(h.$.value);if(v!==null){let T=typeof v=="bigint"?v:BigInt(Math.floor(v)),$=Ry(u),C;if($!==null){let b=(1n<<BigInt($))-1n;if(C=T^b,Vl(u)){let R=1n<<BigInt($-1);C>=R&&(C=C-(1n<<BigInt($)))}}else C=~T;d=zr(C,u,t,n)??Y(u,{env:t,context:n})}else d=Y(u,{env:t,context:n})}else d=Y(u,{env:t,context:n});else if(s==="to_comptime_string")if(Re(h.$.value)){let v=Rt(h.$.value);v!==null?d=nn(v.toString()):d=Y(Vt(),{env:t,context:n})}else d=Y(Vt(),{env:t,context:n});else throw y({token:e.token,errorMessage:`Unexpected unary operation: ${s}`});return e.$={env:t,type:s==="to_comptime_string"?Vt():u,value:d,pathCollection:[]},e}let c=N({expr:e.args[0],env:t,context:{...n}});if(!c.$||!c.$.value)throw y({token:c.token,errorMessage:`Expected ${a} type for "${r}" left argument, got:
|
|
10693
10693
|
${w(c)}`});t=c.$.env;let f=N({expr:e.args[1],env:t,context:{...n}});if(!f.$||!f.$.value)throw y({token:f.token,errorMessage:`Expected ${a} type for "${r}" right argument, got:
|
|
10694
10694
|
${w(f)}`});t=f.$.env;let p=c.$.value,_=f.$.value,m,g;switch(s){case"add":{let h=Rt(p),d=Rt(_);if(h!==null&&d!==null){let v=typeof h=="bigint"||typeof d=="bigint"?(typeof h=="bigint"?h:BigInt(h))+(typeof d=="bigint"?d:BigInt(d)):h+d;fl(v,u,"add",h,d,e.token)}m=Bo(p,_,u,(v,T)=>{if(typeof v=="bigint"||typeof T=="bigint"){let $=typeof v=="bigint"?v:BigInt(v),C=typeof T=="bigint"?T:BigInt(T);return $+C}return v+T},t,n),g=u;break}case"sub":{let h=Rt(p),d=Rt(_);if(h!==null&&d!==null){let v=typeof h=="bigint"||typeof d=="bigint"?(typeof h=="bigint"?h:BigInt(h))-(typeof d=="bigint"?d:BigInt(d)):h-d;fl(v,u,"subtract",h,d,e.token)}m=Bo(p,_,u,(v,T)=>{if(typeof v=="bigint"||typeof T=="bigint"){let $=typeof v=="bigint"?v:BigInt(v),C=typeof T=="bigint"?T:BigInt(T);return $-C}return v-T},t,n),g=u;break}case"mul":{let h=Rt(p),d=Rt(_);if(h!==null&&d!==null){let v=typeof h=="bigint"||typeof d=="bigint"?(typeof h=="bigint"?h:BigInt(h))*(typeof d=="bigint"?d:BigInt(d)):h*d;fl(v,u,"multiply",h,d,e.token)}m=Bo(p,_,u,(v,T)=>{if(typeof v=="bigint"||typeof T=="bigint"){let $=typeof v=="bigint"?v:BigInt(v),C=typeof T=="bigint"?T:BigInt(T);return $*C}return v*T},t,n),g=u;break}case"div":{let h=Rt(_);if(h===0||h===0n)throw y({token:f.token,errorMessage:`Division by zero in "${r}" operation`});m=Bo(p,_,u,(d,v)=>{if(typeof d=="bigint"||typeof v=="bigint"){let T=typeof d=="bigint"?d:BigInt(d),$=typeof v=="bigint"?v:BigInt(v);return T/$}return Ir(u)||u.tag==="comptime_int"?Math.trunc(d/v):d/v},t,n),g=u;break}case"mod":{if(Nr(u))throw y({token:e.token,errorMessage:`Modulo operation not supported for floating point types: ${a}`});let h=Rt(_);if(h===0||h===0n)throw y({token:f.token,errorMessage:`Modulo by zero in "${r}" operation`});m=Bo(p,_,u,(d,v)=>{if(typeof d=="bigint"||typeof v=="bigint"){let T=typeof d=="bigint"?d:BigInt(d),$=typeof v=="bigint"?v:BigInt(v);return T%$}return d%v},t,n),g=u;break}case"eq":m=Ki(p,_,(h,d)=>h===d,t,n),g=Ze();break;case"neq":m=Ki(p,_,(h,d)=>h!==d,t,n),g=Ze();break;case"lt":m=Ki(p,_,(h,d)=>h<d,t,n),g=Ze();break;case"lte":m=Ki(p,_,(h,d)=>h<=d,t,n),g=Ze();break;case"gt":m=Ki(p,_,(h,d)=>h>d,t,n),g=Ze();break;case"gte":m=Ki(p,_,(h,d)=>h>=d,t,n),g=Ze();break;case"bit_and":{let h=Rt(p),d=Rt(_);if(h!==null&&d!==null){let v=typeof h=="bigint"?h:BigInt(Math.floor(h)),T=typeof d=="bigint"?d:BigInt(Math.floor(d));m=zr(v&T,u,t,n)??Y(u,{env:t,context:n})}else m=Y(u,{env:t,context:n});g=u;break}case"bit_or":{let h=Rt(p),d=Rt(_);if(h!==null&&d!==null){let v=typeof h=="bigint"?h:BigInt(Math.floor(h)),T=typeof d=="bigint"?d:BigInt(Math.floor(d));m=zr(v|T,u,t,n)??Y(u,{env:t,context:n})}else m=Y(u,{env:t,context:n});g=u;break}case"bit_xor":{let h=Rt(p),d=Rt(_);if(h!==null&&d!==null){let v=typeof h=="bigint"?h:BigInt(Math.floor(h)),T=typeof d=="bigint"?d:BigInt(Math.floor(d));m=zr(v^T,u,t,n)??Y(u,{env:t,context:n})}else m=Y(u,{env:t,context:n});g=u;break}case"shl":{let h=Rt(p),d=Rt(_);if(h!==null&&d!==null){let v=typeof h=="bigint"?h:BigInt(Math.floor(h)),T=typeof d=="bigint"?Number(d):Math.floor(d);m=zr(v<<BigInt(T),u,t,n)??Y(u,{env:t,context:n})}else m=Y(u,{env:t,context:n});g=u;break}case"shr":{let h=Rt(p),d=Rt(_);if(h!==null&&d!==null){let v=typeof h=="bigint"?h:BigInt(Math.floor(h)),T=typeof d=="bigint"?Number(d):Math.floor(d);m=zr(v>>BigInt(T),u,t,n)??Y(u,{env:t,context:n})}else m=Y(u,{env:t,context:n});g=u;break}default:throw y({token:e.token,errorMessage:`Unexpected binary operation: ${s}`})}return e.$={env:t,type:g,value:m,pathCollection:[]},e}function sp({expr:e,env:t,context:n}){if(e.args.length===0)throw y({token:e.token,errorMessage:'Expected at least 1 argument for "comptime_print", got 0'});let r=[];for(let i of e.args){let o=N({expr:i,env:t,context:{...n}});if(!o.$)throw y({token:i.token,errorMessage:`Failed to evaluate argument for "comptime_print": ${w(i)}`});t=o.$.env,He(o.$.value)?r.push(o.$.value.value):r.push(De(o.$.value))}return!n.isValidatingFunctionDefinition&&n.isExecuting&&console.log(...r),e.$={env:t,type:j.type,value:j,pathCollection:[]},e}function lp({expr:e,env:t,context:n}){if(E(e,k.__yo_comptime_string_length)||E(e,k.__yo_comptime_string_to_upper)||E(e,k.__yo_comptime_string_to_lower)){let r=N({expr:e.args[0],env:t,context:{...n}});if(!r.$||!Ft(r.$.type)||!r.$.value)throw y({token:r.token,errorMessage:`Expected comptime_string type for "${e.func.token.value}" argument, got:
|
|
10695
|
-
${w(r)}`});t=r.$.env;let i;if(E(e,k.__yo_comptime_string_length))He(r.$.value)?i=
|
|
10695
|
+
${w(r)}`});t=r.$.env;let i;if(E(e,k.__yo_comptime_string_length))He(r.$.value)?i=tr(BigInt(r.$.value.value.length)):i=Y(xr(),{env:t,context:n});else if(E(e,k.__yo_comptime_string_to_upper))He(r.$.value)?i=nn(r.$.value.value.toUpperCase()):i=Y(Vt(),{env:t,context:n});else if(E(e,k.__yo_comptime_string_to_lower))He(r.$.value)?i=nn(r.$.value.value.toLowerCase()):i=Y(Vt(),{env:t,context:n});else throw y({token:e.token,errorMessage:`Unexpected function call for "${e.func.token.value}", expected string unary function`});e.$={env:t,type:i.type,value:i,pathCollection:[]}}else if(E(e,k.__yo_comptime_string_slice)){if(e.args.length<2||e.args.length>3)throw y({token:e.token,errorMessage:`"${e.func.token.value}" expects 2 or 3 arguments (string, start, end?), got ${e.args.length}`});let r=N({expr:e.args[0],env:t,context:{...n}});if(!r.$||!Ft(r.$.type)||!r.$.value)throw y({token:r.token,errorMessage:`Expected comptime_string type for "${e.func.token.value}" string argument, got:
|
|
10696
10696
|
${w(r)}`});t=r.$.env;let i=N({expr:e.args[1],env:t,context:{...n}});if(!i.$||!gt(i.$.type)||!i.$.value)throw y({token:i.token,errorMessage:`Expected comptime_int type for "${e.func.token.value}" start argument, got:
|
|
10697
10697
|
${w(i)}`});t=i.$.env;let o;if(e.args.length===3){if(o=N({expr:e.args[2],env:t,context:{...n}}),!o.$||!gt(o.$.type)||!o.$.value)throw y({token:o.token,errorMessage:`Expected comptime_int type for "${e.func.token.value}" end argument, got:
|
|
10698
10698
|
${w(o)}`});t=o.$.env}let a;if(He(r.$.value)&&Fn(i.$.value)){let s=r.$.value.value,l=i.$.value.value,u=typeof l=="bigint"?Number(l):l,c=s.length;if(o&&o.$&&o.$.value&&Fn(o.$.value)){let f=o.$.value.value;c=typeof f=="bigint"?Number(f):f}a=nn(s.slice(u,c))}else a=Y(Vt(),{env:t,context:n});e.$={env:t,type:a.type,value:a,pathCollection:[]}}else{let r=N({expr:e.args[0],env:t,context:{...n}});if(!r.$||!Ft(r.$.type)||!r.$.value)throw y({token:r.token,errorMessage:`Expected comptime_string type for "${e.func.token.value}" first argument, got:
|
|
@@ -10719,8 +10719,8 @@ ${w(i)}`});return t=a.$.env,e.$={env:t,type:j.type,value:j,pathCollection:[]},e}
|
|
|
10719
10719
|
${w(r)}`});t=o.$.env;let a=N({expr:i,env:t,context:{...n}});if(!a.$)throw y({token:i.token,errorMessage:`Failed to evaluate the index argument for "${k.__yo_dup_tuple_element[0]}":
|
|
10720
10720
|
${w(i)}`});t=a.$.env;let s=o.$.type;if(!s||!we(s))throw y({token:r.token,errorMessage:`Expected tuple type for "${k.__yo_dup_tuple_element[0]}"`});let l=a.$.value;if(!Re(l))throw y({token:i.token,errorMessage:`Expected number value for index in "${k.__yo_dup_tuple_element[0]}"`});let u=Number(l.value);if(u<0||u>=s.fields.length)throw y({token:i.token,errorMessage:`Index out of bounds for tuple in "${k.__yo_dup_tuple_element[0]}"`});let c=s.fields[u].type;return e.$={env:t,type:c,value:void 0,pathCollection:[]},e}function wp({expr:e,env:t,context:n}){ge(e,k.downcast,2);let r=e.args[0],i=N({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:"Failed to evaluate dyn value argument for downcast."});t=i.$.env;let o=i.$.type;if(!o||!be(o))throw y({token:r.token,errorMessage:`downcast expects a Dyn type as first argument, got ${o?A(o):"unknown"}.`});let a=e.args[1],s=N({expr:a,env:t,context:{...n}});if(!s.$)throw y({token:a.token,errorMessage:"Failed to evaluate type argument for downcast."});if(t=s.$.env,!s.$.value||!D(s.$.value))throw y({token:a.token,errorMessage:`downcast expects a type as second argument, got ${s.$.type?A(s.$.type):"unknown"}.`});let l=s.$.value.value,{optionType:u,env:c}=pl(l,t,n);t=c;let f=Y(u,{env:t,context:n});return e.$={env:t,type:u,value:f,pathCollection:[]},Pe(e,!0),e}function Go(e){if(e.result.kind!=="type")throw new Error("Expected type call result");return e.result.result}function Fp(e){if(e.result.kind!=="module-type")throw new Error("Expected module type call result");return e.result.result}function Lp(e){if(e.result.kind!=="trait-type")throw new Error("Expected trait type call result");return e.result.result}function Ap(e){if(e.result.kind!=="array")throw new Error("Expected array call result");return e.result.result}function Qi(e,t,n,r,i){if(!i.isEvaluatingFunctionBodyOrAsyncBlock)return;let o;if(i.isEvaluatingFunctionBodyOrAsyncBlock&&(o=i.isEvaluatingFunctionBodyOrAsyncBlock.evaluationEnv),!o||t>=o.frames.length)return;let a,s=-1;for(let c=0;c<o.frames.length;c++){let f=o.frames[c]?.variables.find(p=>p.name===e);if(f){a=f,s=c;break}}if(!a||s<0||a.isCompileTimeOnly)return;i.capturedVariables||(i.capturedVariables=new Map);let l=i.capturedVariables.get(e),u=l&&(l.usageType==="own"||l.usageType==="write"&&n==="read")?l.usageType:n;i.capturedVariables.set(e,{frameLevel:s,usageType:u,token:r})}function zy(e){let t=e;if(F(t)&&E(t,"?=",2)&&(t=t.args[0]),F(t)&&E(t,"=",2)&&(t=t.args[0]),!F(t)||!E(t,":",2))return;let n=t.args[0],r=t.args[1];if(!F(n)||!E(n,I.comptime)||n.args.length!==1)return;let i=n.args[0];if(!(!U(i)||!Ye(i)))return{name:i.token.value,typeExpr:r,token:i.token}}function _l({expr:e,env:t,context:n,isParameterComptimeByDefault:r,allowVariableShadowing:i}){let o,a=r,s=!1,l=!1,u,c,f,p,_,m=e,g,h,d,v;if(F(m)&&E(m,"=")){let S=m.args[0];if(S&&F(S)&&E(S,":",2))u=S,c=m.args[1],v=c,m=u;else throw y({token:m.func.token,errorMessage:'Use "?=" for default parameter values. Assigned values require an explicit type: (name : Type) = value.'})}if(F(m)&&E(m,":=",2))throw y({token:m.func.token,errorMessage:'":=" is not allowed in parameter lists. Use (name : Type) = value instead.'});if(F(m)&&E(m,"?=",2)&&(c=m.args[1],u=m.args[0],d=c,m=u),F(m)&&E(m,":",2)?(c=m.args[1],u=m.args[0],g=c):v?u=m:d?(g=void 0,u=m):g=m,!g)throw y({token:e.token,errorMessage:d?"Default parameters must specify a type: (name : Type) ?= value.":'Expected an explicit type annotation for function parameter. Use "(name : Type)".'});if(u){if(F(u)&&E(u,I.comptime)){if(r)throw y({token:u.token,errorMessage:'"forall"/"using" parameters are "comptime" by default. Not needed to use "comptime" modifier.'});if(a=!0,u.args.length!==1)throw y({token:u.token,errorMessage:`Expected one argument for "comptime" , got ${u.args.length}`});u=u.args[0]}if(F(u)&&E(u,"own")){if(l=!0,u.args.length!==1)throw y({token:u.token,errorMessage:`Expected one argument for "own", got ${u.args.length}`});u=u.args[0]}if(F(u)&&E(u,I.quote)){if(s=!0,u.args.length!==1)throw y({token:u.token,errorMessage:`Expected one argument for "quote" (or ":"), got ${u.args.length}`});if(a)throw y({token:u.token,errorMessage:'Cannot use "comptime" with "quote" (or ":"). "quote" parameters means compile-time only, so "comptime" is redundant.'});a=!0,u=u.args[0]}if(!U(u)||!Ye(u))throw y({token:u.token,errorMessage:`Expected identifier for parameter label, got ${w(u)}`});o=u.token.value,h=u}if(!o)throw y({token:e.token,errorMessage:`Expected a label for function parameter, got ${w(e)}`});if(o==="Self")throw y({token:h?.token??e.token,errorMessage:"Not allowed to use 'Self' as the label."});{if(v){let S=N({expr:v,env:t,context:{...n}});if(!S.$)throw y({token:v.token,errorMessage:`Failed to evaluate assigned value expression: ${w(v)}`});t=S.$.env;let G=S.$.value;if(!D(G))throw y({token:v.token,errorMessage:`Expected type value for = assignment, got ${De(G)}`});if(f=et(),_=G,!a)throw y({token:v.token,errorMessage:`Assigned value (=) is only allowed for compile-time parameters. Use "comptime(${o})" or put this in "forall(...)".`})}if(g){let S=N({expr:g,env:t,context:{...n}});if(!S.$)throw y({token:g.token,errorMessage:`(3) Failed to evaluate type expression: ${w(g)}`});t=S.$.env;let G=S.$.value;if(D(G))f=G.value;else throw y({token:g.token,errorMessage:`Expected type for function parameter, got ${De(G)}`})}if(d){let S=N({expr:d,env:t,context:{...n}});if(S.$?.env&&(t=S.$?.env),p=S.$?.value,!p)throw y({token:d.token,errorMessage:`Expected a compile-time known value for default parameter, got ${w(d)}`});if(!f)f=p.type;else if(!q({type:f,env:t},{type:p.type,env:t}))throw y({token:d.token,errorMessage:`Incompatible default value type:
|
|
10721
10721
|
- Expected: ${A(f)}
|
|
10722
|
-
- Got : ${A(p.type)}`})}if(!f)throw y({token:e.token,errorMessage:"Expected type for function parameter}"});if(a&&
|
|
10723
|
-
${A(f)}`});if(!a&&
|
|
10722
|
+
- Got : ${A(p.type)}`})}if(!f)throw y({token:e.token,errorMessage:"Expected type for function parameter}"});if(a&&ir(f,t))throw y({token:u?.token??e.token,errorMessage:`Parameter marked as "comptime" but type is not available at compile-time:
|
|
10723
|
+
${A(f)}`});if(!a&&rr(f,t))throw y({token:u?.token??e.token,errorMessage:`Parameter marked as runtime but type is not available at runtime:
|
|
10724
10724
|
${A(f)}`});if(!a&&z(f)&&(f.forallParameters.length>0||f.parameters.some(S=>S.isCompileTimeOnly)))throw y({token:u?.token??e.token,errorMessage:`Runtime function parameters with generic function types are not allowed:
|
|
10725
10725
|
${A(f)}
|
|
10726
10726
|
|
|
@@ -10739,17 +10739,17 @@ use_id :: (fn(forall(T : Type),
|
|
|
10739
10739
|
) -> T) {
|
|
10740
10740
|
return val.id();
|
|
10741
10741
|
}
|
|
10742
|
-
`});let $=X(t,o),C=$.length>0?$[$.length-1]:void 0,L=$.find(S=>{if(S.value&&D(S.value[0])){let G=S.value[0];if(x(G.value))return!0}return!1}),b=T,R=f;if(L){let S=L.value[0],G=S.value;if(_&&D(_)&&x(_.value)){let P=_.value,O=[...G.requiredTraits];for(let ae of P.requiredTraits)O.some(K=>K.traitType.id===ae.traitType.id)||O.push(ae);let B=[...G.negativeTraits??[]];if(P.negativeTraits)for(let ae of P.negativeTraits)B.some(K=>K.traitType.id===ae.traitType.id)||B.push(ae);G.requiredTraits=O,G.negativeTraits=B}b=S,R=kt(G)}else if(C&&C.isCompileTimeOnly&&C.value&&C.frameLevel===t.frames.length-1)b=C.value[0],R=C.type;else{let{env:S}=fe({env:t,variable:{name:o,type:f,isCompileTimeOnly:a,value:_?[_]:a?[Y(f,{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=S}return u&&(u.$={env:t,type:R,value:b,pathCollection:[]}),u!==e&&g!==e&&(e.$={env:t,type:j.type,value:j,pathCollection:[]}),Ct(f),{parameter:{label:o,type:f,exprs:ui({expr:e,labelExpr:h,typeExpr:g,defaultValueExpr:d,assignedValueExpr:v}),isCompileTimeOnly:a,isQuote:s,isOwningTheRcValue:l,isImplicit:!1,assignedValue:_},env:t}}function By({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=En(et(),s,{env:t,context:n}),c=J(u),{env:f}=fe({env:t,variable:{name:s,type:kt(u),isCompileTimeOnly:!0,value:[c],token:o.token,initializedAtToken:o.token,consumedAtToken:void 0,isOwningTheRcValue:!1,isOwningTheSameRcValueAs:void 0,isReassignable:!1}});t=f,o.$={env:t,type:kt(u),value:c,pathCollection:[]}}}let a=dl({constraintExprs:[i],env:t,context:n,collectPendingTraits:!0});t=a.env,r.push(...a.pendingTraits)}return{env:t,pendingConstraints:r}}function Ip({pendingConstraints:e,env:t,context:n}){let r=[];for(let i of e){let o=Gy({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 Np({concreteType:e,traitExpr:t,isNegated:n,constraintExpr:r,env:i,context:o}){let a;try{a=N({expr:t,env:i,context:{...o}})}catch{return{env:i,success:!1}}if(!a.$||!a.$.value||!D(a.$.value))return{env:i,success:!1};i=a.$.env;let s=a.$.value;if(!Ve(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=Nt({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 Gy({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 f=e.token.value,p=X(r,f);if(p.length===0)return{env:r,success:!1};let _=p[p.length-1];if(_.value&&D(_.value[0])&&x(_.value[0].value))s=_.value[0].value;else if(_.value&&D(_.value[0]))try{return Np({concreteType:_.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 f;try{f=N({expr:e,env:r,context:{...i}})}catch{return{env:r,success:!1}}if(!f.$||!f.$.value||!D(f.$.value))return{env:r,success:!1};r=f.$.env;let p=f.$.value;if(!x(p.value))try{return Np({concreteType:p.value,traitExpr:a,isNegated:o,constraintExpr:n,env:r,context:i})}catch{return{env:r,success:!1}}s=p.value}let l;try{l=N({expr:a,env:r,context:{...i}})}catch{return{env:r,success:!1}}if(!l.$||!l.$.value||!D(l.$.value))return{env:r,success:!1};r=l.$.env;let u=l.$.value;if(!Ve(u.value))throw y({token:a.token,errorMessage:`Expected trait type for right-hand side of where clause constraint, got: ${A(u.value)}`});let c=u.value;if(c.receiverType)throw y({token:a.token,errorMessage:"Trait type in where clause already has a receiver type assigned."});return r=jn({env:r,someType:s,traitType:c,isNegated:o}),{env:r,success:!0}}function dl({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 c=a.token.value,f=X(t,c);if(f.length>0){let p=f[f.length-1];if(p.value&&D(p.value[0])&&x(p.value[0].value))l=p.value[0].value;else if(p.value&&D(p.value[0])){let _=p.value[0].value;t=Sp({concreteType:_,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 "${c}".`})}else{l=En(et(),c,{env:t,context:n});let p=J(l),{env:_}=fe({env:t,variable:{name:c,type:kt(l),isCompileTimeOnly:!0,value:[p],token:a.token,initializedAtToken:a.token,consumedAtToken:void 0,isOwningTheRcValue:!1,isOwningTheSameRcValueAs:void 0,isReassignable:!1}});t=_,a.$={env:t,type:kt(l),value:p,pathCollection:[]}}}else{let c=N({expr:a,env:t,context:{...n}});if(!c.$||!c.$.value||!D(c.$.value))throw y({token:a.token,errorMessage:"Expected type for left-hand side of where clause constraint."});t=c.$.env;let f=c.$.value;if(!x(f.value)){t=Sp({concreteType:f.value,rhsExpr:s,constraintExpr:o,env:t,context:n});continue}l=f.value}let u=[];F(s)&&E(s,I.tuple)?u.push(...s.args):u.push(s);for(let c=0;c<u.length;c++){let f=u[c],p=!1,_=f;F(f)&&E(f,"!")&&f.args.length===1&&(p=!0,_=f.args[0]);let m;try{m=N({expr:_,env:t,context:{...n}})}catch(d){if(r){i.push({lhsExpr:a,traitExpr:f,originalConstraintExpr:o});continue}throw d}if(!m.$||!m.$.value||!D(m.$.value)){if(r){i.push({lhsExpr:a,traitExpr:f,originalConstraintExpr:o});continue}throw y({token:_.token,errorMessage:"Expected trait type for right-hand side of where clause constraint."})}t=m.$.env;let g=m.$.value;if(!Ve(g.value))throw y({token:_.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:_.token,errorMessage:"Trait type in where clause already has a receiver type assigned."});t=jn({env:t,someType:l,traitType:h,isNegated:p})}}return{env:t,pendingTraits:i}}function Br({constraintExprs:e,env:t,context:n}){return e.length===0?{env:t}:{env:dl({constraintExprs:e,env:t,context:n,collectPendingTraits:!1}).env}}function Sp({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=N({expr:a,env:r,context:{...i}});if(!l.$||!l.$.value||!D(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(!Ve(u.value))throw y({token:a.token,errorMessage:`Expected trait type for right-hand side of where clause constraint, got: ${A(u.value)}`});let c=u.value,f=Nt({targetType:e,traitType:c,env:r});if(s){if(f)throw y({token:n.token,errorMessage:`Type ${A(e)} must NOT implement ${A(c)}, but it does.`})}else if(!f)throw y({token:n.token,errorMessage:`Type ${A(e)} does not implement required trait ${A(c)}.`})}return r}function ml({parameterExprs:e,env:t,context:n}){t=Oe(t);let r=[],i=[],o=[],a,s,l=!1;if(e.length>0){let p=e[0];if(F(p)&&E(p,I.forall)){let _=p.args;for(let m=0;m<_.length;m++){let g=_[m];if(F(g)&&E(g,"...")&&g.args.length===1&&U(g.args[0])){let T=g.args[0].token.value;if(i.find(S=>S.label===T))throw y({token:g.token,errorMessage:`Duplicate label "${T}" in type parameter`});let C=li(T,t),L=_n(1),{env:b}=fe({env:t,variable:{name:T,type:L,isCompileTimeOnly:!0,value:[J(C)],token:g.args[0].token,initializedAtToken:g.args[0].token,consumedAtToken:void 0,isOwningTheRcValue:!1}});t=b,g.$={env:t,type:L,value:J(C),pathCollection:[]};let R={label:T,type:L,isCompileTimeOnly:!0,isQuote:!1,isOwningTheRcValue:!1,isImplicit:!1,isEffectRowSpread:!1,exprs:ui({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}=_l({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 p=0;p<e.length;p++){let _=e[p];if(F(_)&&E(_,I.using)){if(u++,u>1)throw y({token:_.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=_.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 S=h.args[0].token.value,P=X(t,S).at(-1);if(!P)throw y({token:h.token,errorMessage:`Effect row variable "${S}" not found in scope. Declare it with forall(..., ...(${S}))`});let O,B=P.value?.[0];if(B&&D(B)&&rt(B.value)){let K=B.value;for(let W of K.implicitParameters)o.push({...W,isEffectRowSpread:!1});continue}else if(B&&D(B)){if(!(x(B.value)&&B.value.isEffectsRow||rt(B.value)))throw y({token:h.token,errorMessage:`"...(${S})" requires "${S}" 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 : ${S}) instead of using(...(${S}))`});O=B.value}else if(B&&_e(B)&&rt(B.type)){let K=B.type;for(let W of K.implicitParameters)o.push({...W,isEffectRowSpread:!1});continue}else if(B&&_e(B))O=li(S,t);else throw y({token:h.token,errorMessage:`Effect row variable "${S}" has invalid value. Expected a type.`});let ae={label:S,type:O,isCompileTimeOnly:!0,isImplicit:!0,isEffectRowSpread:!0,isQuote:!1,isOwningTheRcValue:!1,exprs:ui({expr:h,labelExpr:h.args[0],typeExpr:h.args[0],defaultValueExpr:void 0,assignedValueExpr:void 0})};o.push(ae);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}=_l({expr:h,env:t,context:{...n},isParameterComptimeByDefault:!0,allowVariableShadowing:!0});if(i.find(S=>S.label===v.label))throw y({token:h.token,errorMessage:`Duplicate label "${v.label}" in implicit parameter (already in forall)`});if(o.find(S=>S.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(S=>S.name===v.label);R&&(R.isImplicit=!0),t=T}}}let c=new Set;for(let p=0;p<e.length;p++){let _=e[p];if(F(_)&&(E(_,I.forall)||E(_,I.using)||E(_,I.where)||E(_,"...")))continue;let m=zy(_);if(m){let g=N({expr:m.typeExpr,env:t,context:{...n}});if(g.$?.env&&(t=g.$.env),!g.$||!g.$.value||!D(g.$.value))continue;let h=g.$.value.value,d=Y(h,{variableName:m.name,env:t,context:n}),{env:v}=fe({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,c.add(p)}}let f=[];if(e.length>0){let p=e[e.length-1];if(F(p)&&E(p,I.where)){if(s=p.args,s.length===0)throw y({token:p.token,errorMessage:"The where clause must have at least one constraint."});let _=By({constraintExprs:s,env:t,context:n});t=_.env,f=_.pendingConstraints}}for(let p=0;p<e.length;p++){let _=e[p];if(F(_)&&E(_,I.forall)){if(p!==0)throw y({token:_.token,errorMessage:`Expected type parameters to be the first argument, got ${p+1}`});continue}else{if(F(_)&&E(_,I.using))continue;if(F(_)&&E(_,I.where)){if(p!==e.length-1)throw y({token:_.token,errorMessage:"The where clause must be the last parameter in the function signature."});continue}else if(U(_)&&Et(_,"...")||F(_)&&E(_,"...")){l=!0;let m=!1,g=!1,h="...",d=_,v=j.type;if(F(_)){let C=_.args[0];if(C){if(F(C)&&E(C,I.comptime))throw m=!0,C.args.length!==1?y({token:C.token,errorMessage:`Expected one argument for "comptime" , got ${C.args.length}`}):(d=C.args[0],h=C.args[0].token.value,v=j.type,y({token:C.token,errorMessage:"...(comptime(param_name)) is not supported yet."}));if(F(C)&&E(C,I.quote)){if(m=!0,g=!0,C.args.length!==1)throw y({token:C.token,errorMessage:`Expected one argument for "quote" (or ":"), got ${C.args.length}`});d=C.args[0],h=C.args[0].token.value,v=bo()}else throw Ye(C)?(d=C,h=C.token.value,v=j.type,y({token:C.token,errorMessage:"...(param_name) is not supported yet."})):y({token:C.token,errorMessage:`Expected a valid variable name for variadic parameter, got ${w(C)}`})}else throw y({token:_.token,errorMessage:`Expected a name for variadic parameter, got ${w(_)}`})}else v=j.type;let T=Qt(A(v)),$={exprs:{expr:_,labelExpr:d,typeExpr:T},isCompileTimeOnly:m,isQuote:g,label:h,type:v,isOwningTheRcValue:!1,isImplicit:!1};if(a=$,h!=="..."){let{env:C}=fe({env:t,variable:{name:h,type:v,isCompileTimeOnly:$.isCompileTimeOnly,value:m?[Y(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=C,d.$={env:t,type:v,value:m?Y(v,{variableName:h,env:t,context:n}):void 0,pathCollection:[]}}}else{if(l)throw y({token:_.token,errorMessage:"Expected variadic parameter to be the last parameter before the normal parameters."});let{parameter:m,env:g}=_l({expr:_,env:t,context:{...n},isParameterComptimeByDefault:!1,allowVariableShadowing:!0});if(r.find(d=>d.label===m.label))throw y({token:F(_)?_.args[0]?.token??_.token:_.token,errorMessage:`Duplicate label "${m.label}" in function parameter`});if(r.push(m),t=g,f.length>0){let d=Ip({pendingConstraints:f,env:t,context:n});t=d.env,f=d.pendingConstraints}}}}if(r.forEach((p,_)=>{if(p.isQuote&&jr(p.type)&&_!==r.length-1)throw y({token:p.exprs.expr.token,errorMessage:"Expected ExprList type to be the last parameter."})}),f.length>0){let p=Ip({pendingConstraints:f,env:t,context:n});if(t=p.env,p.pendingConstraints.length>0){let _=p.pendingConstraints[0];dl({constraintExprs:[_.originalConstraintExpr],env:t,context:n,collectPendingTraits:!1})}}return{parameters:r,forallParameters:i,implicitParameters:o,variadicParameter:a,whereClauseExprs:s,env:t}}function Na({expr:e,env:t,context:n}){if(!E(e,"->",2))throw y({token:e.token,errorMessage:`Expected -> for function type, got:
|
|
10742
|
+
`});let $=X(t,o),C=$.length>0?$[$.length-1]:void 0,L=$.find(S=>{if(S.value&&D(S.value[0])){let G=S.value[0];if(x(G.value))return!0}return!1}),b=T,R=f;if(L){let S=L.value[0],G=S.value;if(_&&D(_)&&x(_.value)){let P=_.value,O=[...G.requiredTraits];for(let ae of P.requiredTraits)O.some(K=>K.traitType.id===ae.traitType.id)||O.push(ae);let B=[...G.negativeTraits??[]];if(P.negativeTraits)for(let ae of P.negativeTraits)B.some(K=>K.traitType.id===ae.traitType.id)||B.push(ae);G.requiredTraits=O,G.negativeTraits=B}b=S,R=kt(G)}else if(C&&C.isCompileTimeOnly&&C.value&&C.frameLevel===t.frames.length-1)b=C.value[0],R=C.type;else{let{env:S}=fe({env:t,variable:{name:o,type:f,isCompileTimeOnly:a,value:_?[_]:a?[Y(f,{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=S}return u&&(u.$={env:t,type:R,value:b,pathCollection:[]}),u!==e&&g!==e&&(e.$={env:t,type:j.type,value:j,pathCollection:[]}),Ct(f),{parameter:{label:o,type:f,exprs:ui({expr:e,labelExpr:h,typeExpr:g,defaultValueExpr:d,assignedValueExpr:v}),isCompileTimeOnly:a,isQuote:s,isOwningTheRcValue:l,isImplicit:!1,assignedValue:_},env:t}}function By({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=En(et(),s,{env:t,context:n}),c=J(u),{env:f}=fe({env:t,variable:{name:s,type:kt(u),isCompileTimeOnly:!0,value:[c],token:o.token,initializedAtToken:o.token,consumedAtToken:void 0,isOwningTheRcValue:!1,isOwningTheSameRcValueAs:void 0,isReassignable:!1}});t=f,o.$={env:t,type:kt(u),value:c,pathCollection:[]}}}let a=dl({constraintExprs:[i],env:t,context:n,collectPendingTraits:!0});t=a.env,r.push(...a.pendingTraits)}return{env:t,pendingConstraints:r}}function Ip({pendingConstraints:e,env:t,context:n}){let r=[];for(let i of e){let o=Gy({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 Np({concreteType:e,traitExpr:t,isNegated:n,constraintExpr:r,env:i,context:o}){let a;try{a=N({expr:t,env:i,context:{...o}})}catch{return{env:i,success:!1}}if(!a.$||!a.$.value||!D(a.$.value))return{env:i,success:!1};i=a.$.env;let s=a.$.value;if(!Ve(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=Nt({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 Gy({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 f=e.token.value,p=X(r,f);if(p.length===0)return{env:r,success:!1};let _=p[p.length-1];if(_.value&&D(_.value[0])&&x(_.value[0].value))s=_.value[0].value;else if(_.value&&D(_.value[0]))try{return Np({concreteType:_.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 f;try{f=N({expr:e,env:r,context:{...i}})}catch{return{env:r,success:!1}}if(!f.$||!f.$.value||!D(f.$.value))return{env:r,success:!1};r=f.$.env;let p=f.$.value;if(!x(p.value))try{return Np({concreteType:p.value,traitExpr:a,isNegated:o,constraintExpr:n,env:r,context:i})}catch{return{env:r,success:!1}}s=p.value}let l;try{l=N({expr:a,env:r,context:{...i}})}catch{return{env:r,success:!1}}if(!l.$||!l.$.value||!D(l.$.value))return{env:r,success:!1};r=l.$.env;let u=l.$.value;if(!Ve(u.value))throw y({token:a.token,errorMessage:`Expected trait type for right-hand side of where clause constraint, got: ${A(u.value)}`});let c=u.value;if(c.receiverType)throw y({token:a.token,errorMessage:"Trait type in where clause already has a receiver type assigned."});return r=Kn({env:r,someType:s,traitType:c,isNegated:o}),{env:r,success:!0}}function dl({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 c=a.token.value,f=X(t,c);if(f.length>0){let p=f[f.length-1];if(p.value&&D(p.value[0])&&x(p.value[0].value))l=p.value[0].value;else if(p.value&&D(p.value[0])){let _=p.value[0].value;t=Sp({concreteType:_,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 "${c}".`})}else{l=En(et(),c,{env:t,context:n});let p=J(l),{env:_}=fe({env:t,variable:{name:c,type:kt(l),isCompileTimeOnly:!0,value:[p],token:a.token,initializedAtToken:a.token,consumedAtToken:void 0,isOwningTheRcValue:!1,isOwningTheSameRcValueAs:void 0,isReassignable:!1}});t=_,a.$={env:t,type:kt(l),value:p,pathCollection:[]}}}else{let c=N({expr:a,env:t,context:{...n}});if(!c.$||!c.$.value||!D(c.$.value))throw y({token:a.token,errorMessage:"Expected type for left-hand side of where clause constraint."});t=c.$.env;let f=c.$.value;if(!x(f.value)){t=Sp({concreteType:f.value,rhsExpr:s,constraintExpr:o,env:t,context:n});continue}l=f.value}let u=[];F(s)&&E(s,I.tuple)?u.push(...s.args):u.push(s);for(let c=0;c<u.length;c++){let f=u[c],p=!1,_=f;F(f)&&E(f,"!")&&f.args.length===1&&(p=!0,_=f.args[0]);let m;try{m=N({expr:_,env:t,context:{...n}})}catch(d){if(r){i.push({lhsExpr:a,traitExpr:f,originalConstraintExpr:o});continue}throw d}if(!m.$||!m.$.value||!D(m.$.value)){if(r){i.push({lhsExpr:a,traitExpr:f,originalConstraintExpr:o});continue}throw y({token:_.token,errorMessage:"Expected trait type for right-hand side of where clause constraint."})}t=m.$.env;let g=m.$.value;if(!Ve(g.value))throw y({token:_.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:_.token,errorMessage:"Trait type in where clause already has a receiver type assigned."});t=Kn({env:t,someType:l,traitType:h,isNegated:p})}}return{env:t,pendingTraits:i}}function Br({constraintExprs:e,env:t,context:n}){return e.length===0?{env:t}:{env:dl({constraintExprs:e,env:t,context:n,collectPendingTraits:!1}).env}}function Sp({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=N({expr:a,env:r,context:{...i}});if(!l.$||!l.$.value||!D(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(!Ve(u.value))throw y({token:a.token,errorMessage:`Expected trait type for right-hand side of where clause constraint, got: ${A(u.value)}`});let c=u.value,f=Nt({targetType:e,traitType:c,env:r});if(s){if(f)throw y({token:n.token,errorMessage:`Type ${A(e)} must NOT implement ${A(c)}, but it does.`})}else if(!f)throw y({token:n.token,errorMessage:`Type ${A(e)} does not implement required trait ${A(c)}.`})}return r}function ml({parameterExprs:e,env:t,context:n}){t=Oe(t);let r=[],i=[],o=[],a,s,l=!1;if(e.length>0){let p=e[0];if(F(p)&&E(p,I.forall)){let _=p.args;for(let m=0;m<_.length;m++){let g=_[m];if(F(g)&&E(g,"...")&&g.args.length===1&&U(g.args[0])){let T=g.args[0].token.value;if(i.find(S=>S.label===T))throw y({token:g.token,errorMessage:`Duplicate label "${T}" in type parameter`});let C=li(T,t),L=_n(1),{env:b}=fe({env:t,variable:{name:T,type:L,isCompileTimeOnly:!0,value:[J(C)],token:g.args[0].token,initializedAtToken:g.args[0].token,consumedAtToken:void 0,isOwningTheRcValue:!1}});t=b,g.$={env:t,type:L,value:J(C),pathCollection:[]};let R={label:T,type:L,isCompileTimeOnly:!0,isQuote:!1,isOwningTheRcValue:!1,isImplicit:!1,isEffectRowSpread:!1,exprs:ui({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}=_l({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 p=0;p<e.length;p++){let _=e[p];if(F(_)&&E(_,I.using)){if(u++,u>1)throw y({token:_.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=_.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 S=h.args[0].token.value,P=X(t,S).at(-1);if(!P)throw y({token:h.token,errorMessage:`Effect row variable "${S}" not found in scope. Declare it with forall(..., ...(${S}))`});let O,B=P.value?.[0];if(B&&D(B)&&rt(B.value)){let K=B.value;for(let W of K.implicitParameters)o.push({...W,isEffectRowSpread:!1});continue}else if(B&&D(B)){if(!(x(B.value)&&B.value.isEffectsRow||rt(B.value)))throw y({token:h.token,errorMessage:`"...(${S})" requires "${S}" 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 : ${S}) instead of using(...(${S}))`});O=B.value}else if(B&&_e(B)&&rt(B.type)){let K=B.type;for(let W of K.implicitParameters)o.push({...W,isEffectRowSpread:!1});continue}else if(B&&_e(B))O=li(S,t);else throw y({token:h.token,errorMessage:`Effect row variable "${S}" has invalid value. Expected a type.`});let ae={label:S,type:O,isCompileTimeOnly:!0,isImplicit:!0,isEffectRowSpread:!0,isQuote:!1,isOwningTheRcValue:!1,exprs:ui({expr:h,labelExpr:h.args[0],typeExpr:h.args[0],defaultValueExpr:void 0,assignedValueExpr:void 0})};o.push(ae);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}=_l({expr:h,env:t,context:{...n},isParameterComptimeByDefault:!0,allowVariableShadowing:!0});if(i.find(S=>S.label===v.label))throw y({token:h.token,errorMessage:`Duplicate label "${v.label}" in implicit parameter (already in forall)`});if(o.find(S=>S.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(S=>S.name===v.label);R&&(R.isImplicit=!0),t=T}}}let c=new Set;for(let p=0;p<e.length;p++){let _=e[p];if(F(_)&&(E(_,I.forall)||E(_,I.using)||E(_,I.where)||E(_,"...")))continue;let m=zy(_);if(m){let g=N({expr:m.typeExpr,env:t,context:{...n}});if(g.$?.env&&(t=g.$.env),!g.$||!g.$.value||!D(g.$.value))continue;let h=g.$.value.value,d=Y(h,{variableName:m.name,env:t,context:n}),{env:v}=fe({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,c.add(p)}}let f=[];if(e.length>0){let p=e[e.length-1];if(F(p)&&E(p,I.where)){if(s=p.args,s.length===0)throw y({token:p.token,errorMessage:"The where clause must have at least one constraint."});let _=By({constraintExprs:s,env:t,context:n});t=_.env,f=_.pendingConstraints}}for(let p=0;p<e.length;p++){let _=e[p];if(F(_)&&E(_,I.forall)){if(p!==0)throw y({token:_.token,errorMessage:`Expected type parameters to be the first argument, got ${p+1}`});continue}else{if(F(_)&&E(_,I.using))continue;if(F(_)&&E(_,I.where)){if(p!==e.length-1)throw y({token:_.token,errorMessage:"The where clause must be the last parameter in the function signature."});continue}else if(U(_)&&Et(_,"...")||F(_)&&E(_,"...")){l=!0;let m=!1,g=!1,h="...",d=_,v=j.type;if(F(_)){let C=_.args[0];if(C){if(F(C)&&E(C,I.comptime))throw m=!0,C.args.length!==1?y({token:C.token,errorMessage:`Expected one argument for "comptime" , got ${C.args.length}`}):(d=C.args[0],h=C.args[0].token.value,v=j.type,y({token:C.token,errorMessage:"...(comptime(param_name)) is not supported yet."}));if(F(C)&&E(C,I.quote)){if(m=!0,g=!0,C.args.length!==1)throw y({token:C.token,errorMessage:`Expected one argument for "quote" (or ":"), got ${C.args.length}`});d=C.args[0],h=C.args[0].token.value,v=bo()}else throw Ye(C)?(d=C,h=C.token.value,v=j.type,y({token:C.token,errorMessage:"...(param_name) is not supported yet."})):y({token:C.token,errorMessage:`Expected a valid variable name for variadic parameter, got ${w(C)}`})}else throw y({token:_.token,errorMessage:`Expected a name for variadic parameter, got ${w(_)}`})}else v=j.type;let T=Qt(A(v)),$={exprs:{expr:_,labelExpr:d,typeExpr:T},isCompileTimeOnly:m,isQuote:g,label:h,type:v,isOwningTheRcValue:!1,isImplicit:!1};if(a=$,h!=="..."){let{env:C}=fe({env:t,variable:{name:h,type:v,isCompileTimeOnly:$.isCompileTimeOnly,value:m?[Y(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=C,d.$={env:t,type:v,value:m?Y(v,{variableName:h,env:t,context:n}):void 0,pathCollection:[]}}}else{if(l)throw y({token:_.token,errorMessage:"Expected variadic parameter to be the last parameter before the normal parameters."});let{parameter:m,env:g}=_l({expr:_,env:t,context:{...n},isParameterComptimeByDefault:!1,allowVariableShadowing:!0});if(r.find(d=>d.label===m.label))throw y({token:F(_)?_.args[0]?.token??_.token:_.token,errorMessage:`Duplicate label "${m.label}" in function parameter`});if(r.push(m),t=g,f.length>0){let d=Ip({pendingConstraints:f,env:t,context:n});t=d.env,f=d.pendingConstraints}}}}if(r.forEach((p,_)=>{if(p.isQuote&&jr(p.type)&&_!==r.length-1)throw y({token:p.exprs.expr.token,errorMessage:"Expected ExprList type to be the last parameter."})}),f.length>0){let p=Ip({pendingConstraints:f,env:t,context:n});if(t=p.env,p.pendingConstraints.length>0){let _=p.pendingConstraints[0];dl({constraintExprs:[_.originalConstraintExpr],env:t,context:n,collectPendingTraits:!1})}}return{parameters:r,forallParameters:i,implicitParameters:o,variadicParameter:a,whereClauseExprs:s,env:t}}function Na({expr:e,env:t,context:n}){if(!E(e,"->",2))throw y({token:e.token,errorMessage:`Expected -> for function type, got:
|
|
10743
10743
|
${w(e)}
|
|
10744
10744
|
|
|
10745
10745
|
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:
|
|
10746
10746
|
${w(r)}`});let{parameters:a,forallParameters:s,implicitParameters:l,variadicParameter:u,whereClauseExprs:c,env:f}=ml({parameterExprs:o,env:t,context:{...n,isEvaluatingFunctionType:!0}});t=f;let p,_=!1,m=!1,g=i;if(F(i)&&E(i,":",2)){let $=i.args[0];if(g=i.args[1],F($)&&E($,I.comptime)){if(_=!0,$.args.length!==1)throw y({token:$.token,errorMessage:`Expected one argument for "comptime" , got ${$.args.length}`});$=$.args[0]}if(F($)&&E($,I.unquote)){if(m=!0,$.args.length!==1)throw y({token:$.token,errorMessage:`Expected one argument for "unquote", got ${$.args.length}`});if(_)throw y({token:$.token,errorMessage:'Cannot use "comptime" with "unquote". "unquote" return type means compile-time only, so "comptime" is redundant.'});_=!0,$=$.args[0]}if(F($)&&E($,I.quote))throw y({token:$.token,errorMessage:'To define a macro function, please use "unquote" for the return type, not "quote".'});if(!Ye($))throw y({token:$.token,errorMessage:`Expected a valid variable name for return label, got ${w($)}`});p=$.token.value}else{if(F(g)&&E(g,I.comptime)){if(_=!0,g.args.length!==1)throw y({token:g.token,errorMessage:`Expected one argument for "comptime" , got ${g.args.length}`});g=g.args[0]}if(F(g)&&E(g,I.unquote)){if(m=!0,g.args.length!==1)throw y({token:g.token,errorMessage:`Expected one argument for "unquote", got ${g.args.length}`});if(_)throw y({token:g.token,errorMessage:'Cannot use "comptime" with "unquote". "unquote" return type means compile-time only, so "comptime" is redundant.'});_=!0,g=g.args[0]}if(F(g)&&E(g,I.quote))throw y({token:g.token,errorMessage:'To define a macro function, please use "unquote" for the return type, not "quote".'})}let h=N({expr:g,env:t,context:{...n,isEvaluatingFunctionType:!0}}),d,v=h.$?.value;if(D(v))d=v.value;else throw y({token:g.token,errorMessage:`Expected a type for function return type, got:
|
|
10747
|
-
${w(g)}`});if(
|
|
10747
|
+
${w(g)}`});if(rr(d,t)&&!_&&(d=dt({type:d,expectedType:void 0,expr:void 0,env:t}),rr(d,t)))throw y({token:g.token,errorMessage:`Expected a "comptime" for return type, like:
|
|
10748
10748
|
|
|
10749
10749
|
comptime(${w(g)})
|
|
10750
10750
|
|
|
10751
10751
|
Given type:
|
|
10752
|
-
${A(d)}`});if(n.isUnsafeFunctionType||vr(d,g.token),_&&
|
|
10752
|
+
${A(d)}`});if(n.isUnsafeFunctionType||vr(d,g.token),_&&ir(d,t))throw y({token:g.token,errorMessage:`Unexpected "comptime" for return type of ${A(d)} which can only be used at runtime.`});if(_){for(let $ of a)if(!$.isCompileTimeOnly)throw y({token:Dl($),errorMessage:"Expected all parameters to be compile time only given the return type is compile time only."})}if(m&&!Lt(d))throw y({token:g.token,errorMessage:`Expected Expr type for "unquote" return type, got ${A(d)}`});let T=ai({parameters:a,forallParameters:s,implicitParameters:l,variadicParameter:u,whereClauseExprs:c,return_:{type:d,typeExpr:g,isCompileTimeOnly:_,isUnquote:m,label:p??`fn_return_${Ge(t.modulePath)}`},env:lt(t,!0),parametersFrame:t.frames[t.frames.length-1],SelfType:n.SelfType,SelfTraitType:n.SelfTraitType,SelfModuleType:n.SelfModuleType});return t=lt(t,!0),e.$={env:t,value:J(T),type:kt(T),pathCollection:[]},e}function Wo({parameter:e,calleeEnv:t,context:n,definitionSiteEnclosingFunctionType:r,functionType:i}){let o=e.exprs.typeExpr,a=e.exprs.defaultValueExpr;if(o){let s=r??(n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"?n.isEvaluatingFunctionBodyOrAsyncBlock.type:void 0),l=N({expr:xe(o),env:t,context:{...n,expectedType:void 0,SelfType:i.SelfType,SelfTraitType:i.SelfTraitType??n.SelfTraitType,SelfModuleType:i.SelfModuleType??n.SelfModuleType,isEvaluatingFunctionBodyOrAsyncBlock:s?{kind:"function-body",type:s,evaluationEnv:t}:void 0}});if(!D(l.$?.value))throw y({token:o.token,errorMessage:`Expected type for parameter, got:
|
|
10753
10753
|
${w(l)}`});return l.$?.env&&(t=l.$?.env),{parameterType:l.$?.value.value,calleeEnv:t}}else if(a){let s=N({expr:xe(a),env:t,context:{...n,expectedType:void 0,SelfType:i.SelfType,SelfTraitType:i.SelfTraitType??n.SelfTraitType,SelfModuleType:i.SelfModuleType??n.SelfModuleType}});if(!s.$)throw y({token:a.token,errorMessage:`Failed to evaluate default value expression:
|
|
10754
10754
|
${w(a)}`});return t=s.$?.env,{parameterType:s.$.type,calleeEnv:t}}else return{parameterType:e.type,calleeEnv:t}}function di({functionType:e,calleeEnv:t,context:n,functionCalleeExpr:r}){let i=e.return,o=N({expr:xe(i.typeExpr),env:t,context:{...n,SelfType:e.SelfType,SelfTraitType:e.SelfTraitType??n.SelfTraitType,SelfModuleType:e.SelfModuleType??n.SelfModuleType}}),a,s=o.$?.value;if(D(s))a=s.value;else throw y({token:r?.token??ie,errorMessage:"Function body is not evaluated correctly. Expected to return a type."});return x(a)&&(a=Ot(t,a)),{returnType:a,calleeEnv:o.$?.env??t}}function xp({expr:e,env:t,context:n}){let r=e.func,i=e.args;if(!U(r)||r.token.value!=="_")throw y({token:r.token,errorMessage:`Expected "_" for anonymous struct, got:
|
|
10755
10755
|
${w(r)}`});let o=oi(t),a=o.fields,s=[],l=[];for(let p=0;p<i.length;p++){let _=i[p],m,g=_,h;if(F(_)&&E(_,":",2)){if(m=_.args[0],g=_.args[1],!Ye(m))throw y({token:m.token,errorMessage:`Expected identifier for anonymous struct field label, got:
|
|
@@ -10762,12 +10762,12 @@ ${A(f)}`});let p=N({expr:u,env:o,context:{...a,expectedType:{type:yt(),env:o}}})
|
|
|
10762
10762
|
${w(u)}`});o=p.$.env;let _=p.$.type;if(!q({type:yt(),env:o},{type:_,env:o}))throw y({token:u.token,errorMessage:`Expected usize for array end index, got:
|
|
10763
10763
|
${A(_)}`});if(n&&Re(c.$.value)&&Re(p.$.value)){let m=c.$.value.value,g=p.$.value.value,h=typeof m=="bigint"?Number(m):m,d=typeof g=="bigint"?Number(g):g;if(h<0||h>n.elements.length)throw y({token:l.token,errorMessage:`Slice start index out of bounds: ${h}. Expected index in range [0, ${n.elements.length}].`});if(d<h||d>n.elements.length)throw y({token:u.token,errorMessage:`Slice end index out of bounds: ${d}. Expected index in range [${h}, ${n.elements.length}].`});return{value:ra(s,[n],h,d),type:s,callerEnv:o}}if(r&&Re(c.$.value)&&Re(p.$.value)){let m=c.$.value.value,g=p.$.value.value,h=typeof m=="bigint"?Number(m):m,d=typeof g=="bigint"?Number(g):g,v=r.endIndex-r.startIndex;if(h<0||h>v)throw y({token:l.token,errorMessage:`Slice start index out of bounds: ${h}. Expected index in range [0, ${v}].`});if(d<h||d>v)throw y({token:u.token,errorMessage:`Slice end index out of bounds: ${d}. Expected index in range [${h}, ${v}].`});let T=r.startIndex+h,$=r.startIndex+d;return{value:ra(s,r.sourceArray,T,$),type:s,callerEnv:o}}return{value:void 0,type:s,callerEnv:o}}}else{let s=i[0],l=N({expr:s,env:o,context:{...a,expectedType:{type:yt(),env:o}}});if(!l.$)throw y({token:s.token,errorMessage:`Failed to evaluate argument expression:
|
|
10764
10764
|
${w(s)}`});o=l.$.env;let u=l.$.type;if(!q({type:yt(),env:o},{type:u,env:o}))throw y({token:s.token,errorMessage:`Expected usize for array index, got:
|
|
10765
|
-
${A(u)}`});let c=t.childType;if(r)if(l.$.value)if(Re(l.$.value)){let f=l.$.value.value,p=typeof f=="bigint"?Number(f):f,_=r.endIndex-r.startIndex;if(p<0||p>=_)throw y({token:s.token,errorMessage:`Slice index out of bounds: ${p}. Expected index in range [0, ${_-1}].`});let m=r.startIndex+p,g=r.sourceArray[0];return{value:g.elements[m],index:p,arrayElementRef:{arrayValue:g,index:m},type:c,callerEnv:o}}else return{value:Y(c,{env:o,context:a}),type:c,callerEnv:o};else return{value:void 0,type:dt({type:c,env:o}),callerEnv:o};if(n)if(l.$.value)if(Re(l.$.value)){let f=l.$.value.value,p=typeof f=="bigint"?Number(f):f;if(p<0||p>=n.elements.length)throw y({token:s.token,errorMessage:`Array index out of bounds: ${p}. Expected index in range [0, ${n.elements.length-1}].`});return{value:n.elements[p],index:p,arrayElementRef:{arrayValue:n,index:p},type:c,callerEnv:o}}else return{value:Y(c,{env:o,context:a}),type:c,callerEnv:o};else return{value:void 0,type:dt({type:c,env:o}),callerEnv:o};else return{value:void 0,type:c,callerEnv:o}}}function Op({expr:e,arrayType:t,argExprs:n,callerEnv:r,context:i}){let o=t.length,a=t,s;if(Re(o)){if(s=Number(o.value),n.length!==s)throw y({token:e.func.token,errorMessage:`Array constructor expects ${s} elements, got ${n.length}.`})}else if(_e(o)){s=n.length;let p=
|
|
10765
|
+
${A(u)}`});let c=t.childType;if(r)if(l.$.value)if(Re(l.$.value)){let f=l.$.value.value,p=typeof f=="bigint"?Number(f):f,_=r.endIndex-r.startIndex;if(p<0||p>=_)throw y({token:s.token,errorMessage:`Slice index out of bounds: ${p}. Expected index in range [0, ${_-1}].`});let m=r.startIndex+p,g=r.sourceArray[0];return{value:g.elements[m],index:p,arrayElementRef:{arrayValue:g,index:m},type:c,callerEnv:o}}else return{value:Y(c,{env:o,context:a}),type:c,callerEnv:o};else return{value:void 0,type:dt({type:c,env:o}),callerEnv:o};if(n)if(l.$.value)if(Re(l.$.value)){let f=l.$.value.value,p=typeof f=="bigint"?Number(f):f;if(p<0||p>=n.elements.length)throw y({token:s.token,errorMessage:`Array index out of bounds: ${p}. Expected index in range [0, ${n.elements.length-1}].`});return{value:n.elements[p],index:p,arrayElementRef:{arrayValue:n,index:p},type:c,callerEnv:o}}else return{value:Y(c,{env:o,context:a}),type:c,callerEnv:o};else return{value:void 0,type:dt({type:c,env:o}),callerEnv:o};else return{value:void 0,type:c,callerEnv:o}}}function Op({expr:e,arrayType:t,argExprs:n,callerEnv:r,context:i}){let o=t.length,a=t,s;if(Re(o)){if(s=Number(o.value),n.length!==s)throw y({token:e.func.token,errorMessage:`Array constructor expects ${s} elements, got ${n.length}.`})}else if(_e(o)){s=n.length;let p=tr(BigInt(s));a=sr(t.childType,p)}else throw y({token:e.func.token,errorMessage:`Array length must be a known number value or unknown (_), got ${o}.`});let l=[],u=r,c=a.childType;for(let p=0;p<n.length;p++){let _=n[p],m=N({expr:_,env:u,context:{...i,expectedType:{type:c,env:u}}});if(!m.$)throw y({token:_.token,errorMessage:`Failed to evaluate array element at index ${p}.`});if(zt(m,i),u=m.$.env,p===0&&ke(c)&&_e(c.length)&&ke(m.$.type)&&(c=m.$.type,a=sr(c,a.length)),!q({type:c,env:u},{type:m.$.type,env:u}))throw y({token:_.token,errorMessage:`Array element at index ${p} has incompatible type:
|
|
10766
10766
|
- Expected: ${A(c)}
|
|
10767
10767
|
- Given : ${A(m.$.type)}`});m.$.value!==void 0?l.push(m.$.value):l.push(Y(c,{env:u,context:i}))}let f=Sr(a,l);return e.$={env:u,value:f,type:a,pathCollection:[]},e}function Rp({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 Zi(e){let t=[];for(let[n]of e.entries())t.push([n]);return t}function Sa({wrapperType:e,captureType:t,env:n,errorToken:r}){for(let{traitType:i}of e.requiredTraits)if(!Ct(i)&&!Nt({targetType:t,traitType:i,env:n})){let o=t.fields.filter(l=>!Nt({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(`
|
|
10768
10768
|
`);throw y({token:r,errorMessage:`Closure does not implement \`${a}\` because captured variable ${s}`})}}function xa({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=oi(n),l=Array.from(t.entries()).map(([c,f])=>({label:c,type:f.type,isCompileTimeOnly:!1,assignedValue:void 0,isEffectParam:f.isEffectParam||void 0,exprs:{expr:{tag:"Atom",token:f.token},labelExpr:void 0,typeExpr:void 0,defaultValueExpr:void 0}}));s.fields=l,o=s,n=ri({structType:s,env:n,context:{...i},errorToken:r});let u=Array.from(t.values()).map(c=>c.value);u.every(c=>c!==void 0)?a=Un(s,u):a=void 0}else{let s=oi(n);s.fields=[],n=ri({structType:s,env:n,context:{...i},errorToken:r}),o=s,a=Un(s,[])}else if(t&&t.size>0){let s=o,l=Array.from(t.keys()),u=s.fields.map(f=>f.label);for(let f of l)if(!u.includes(f))throw y({token:r,errorMessage:`Captured variable "${f}" does not exist in expected capture struct "${A(s)}"`});for(let f of s.fields)if(!l.includes(f.label))throw y({token:r,errorMessage:`Expected capture struct field "${f.label}" is not captured by this closure`});for(let[f,p]of t.entries()){let _=s.fields.find(m=>m.label===f);if(_&&!q({type:_.type,env:n},{type:p.type,env:n}))throw y({token:p.token,errorMessage:`Captured variable "${f}" has type "${A(p.type)}" but expected struct field has type "${A(_.type)}"`})}let c=Array.from(t.values()).map(f=>f.value);c.every(f=>f!==void 0)?a=Un(o,c):a=void 0}else a=Un(o,[]);return{captureType:o,captureValue:a}}function Va({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 Da({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=Qt(`${k.___dup[0]}(${o})`),l=N({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 yl({functionBodyExpr:e,functionType:t,functionValue:n,env:r,context:i}){if(!Fe(t.return.type))return;let o;try{let a=xe(e),s=Ji({...i,capturedVariables:void 0},t,{...n},r),l=vt({expr:a,env:r,context:s.evaluationContext,variablesToAdd:[],isEvaluatingFunctionBodyBeginBlock:!0});if(o=l.$?.type,nt(l.$?.controlFlow,"escape")&&!nt(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:
|
|
10769
10769
|
- Expected: ${A(t.return.type)}
|
|
10770
|
-
- Given : ${A(o)}`})}function Ji(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=Sn()}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 Pp({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&&z(l)&&l.parameters.length===t.parameters.length&&l.parameters.some((L,b)=>L.label!==t.parameters[b].label),c=Oe(s?n:ka(n));if(u&&l&&z(l)){for(let L of t.forallParameters){let{env:b}=fe({env:c,variable:{name:L.label,type:L.type,isCompileTimeOnly:!0,value:[Y(L.type,{variableName:L.label,env:c,context:r})],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});c=b}for(let L=0;L<t.parameters.length;L++){let b=t.parameters[L],R=l.parameters[L],S=b.label,G=R.label,{env:P}=fe({env:c,variable:{name:S,type:b.type,isCompileTimeOnly:b.isCompileTimeOnly,value:b.isCompileTimeOnly?[Y(b.type,{variableName:G,env:c,context:r})]:void 0,token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:b.isOwningTheRcValue,parameterAlias:S!==G?G:void 0}});c=P}}else c=Oe(c,t.parametersFrame);let f=c.frames[c.frames.length-1],p={...t,parametersFrame:f,env:t.env},_={tag:"Function",type:p,body:a,frameLevel:c.frames.length-1,funcName:void 0,funcId:`fn_${Ge(c.modulePath)}`,definitionSiteEnclosingFunctionType:r.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"?r.isEvaluatingFunctionBodyOrAsyncBlock.type:void 0,calledComptimeFunctionCaches:[],specializedFunctionCaches:[]};if(p.whereClauseExprs?.length){let L=p.whereClauseExprs.map(R=>xe(R));c=Br({constraintExprs:L,env:c,context:{...r,isEvaluatingFunctionType:!0}}).env}let m=p.forallParameters.length>0||p.parameters.some(L=>Fe(L.type))||p.SelfType&&Fe(p.SelfType),g,h;if(m)yl({functionBodyExpr:a,functionType:p,functionValue:_,env:c,context:r}),a.$={env:c,type:t.return.type,value:t.return.isCompileTimeOnly?Y(t.return.type,{variableName:"function_body",env:c,context:r}):void 0,pathCollection:[]},h={...r,capturedVariables:void 0},g=a;else{if(h=Ji({...r,capturedVariables:void 0},p,_,c).evaluationContext,g=vt({expr:a,env:c,context:h,variablesToAdd:[],isEvaluatingFunctionBodyBeginBlock:!0}),!g.$)throw y({token:a.token,errorMessage:"Failed to evaluate the function body."});c=g.$.env}let d=h.capturedVariables,v=g.$?.type;if(
|
|
10770
|
+
- Given : ${A(o)}`})}function Ji(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=Sn()}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 Pp({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&&z(l)&&l.parameters.length===t.parameters.length&&l.parameters.some((L,b)=>L.label!==t.parameters[b].label),c=Oe(s?n:ka(n));if(u&&l&&z(l)){for(let L of t.forallParameters){let{env:b}=fe({env:c,variable:{name:L.label,type:L.type,isCompileTimeOnly:!0,value:[Y(L.type,{variableName:L.label,env:c,context:r})],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1}});c=b}for(let L=0;L<t.parameters.length;L++){let b=t.parameters[L],R=l.parameters[L],S=b.label,G=R.label,{env:P}=fe({env:c,variable:{name:S,type:b.type,isCompileTimeOnly:b.isCompileTimeOnly,value:b.isCompileTimeOnly?[Y(b.type,{variableName:G,env:c,context:r})]:void 0,token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:b.isOwningTheRcValue,parameterAlias:S!==G?G:void 0}});c=P}}else c=Oe(c,t.parametersFrame);let f=c.frames[c.frames.length-1],p={...t,parametersFrame:f,env:t.env},_={tag:"Function",type:p,body:a,frameLevel:c.frames.length-1,funcName:void 0,funcId:`fn_${Ge(c.modulePath)}`,definitionSiteEnclosingFunctionType:r.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"?r.isEvaluatingFunctionBodyOrAsyncBlock.type:void 0,calledComptimeFunctionCaches:[],specializedFunctionCaches:[]};if(p.whereClauseExprs?.length){let L=p.whereClauseExprs.map(R=>xe(R));c=Br({constraintExprs:L,env:c,context:{...r,isEvaluatingFunctionType:!0}}).env}let m=p.forallParameters.length>0||p.parameters.some(L=>Fe(L.type))||p.SelfType&&Fe(p.SelfType),g,h;if(m)yl({functionBodyExpr:a,functionType:p,functionValue:_,env:c,context:r}),a.$={env:c,type:t.return.type,value:t.return.isCompileTimeOnly?Y(t.return.type,{variableName:"function_body",env:c,context:r}):void 0,pathCollection:[]},h={...r,capturedVariables:void 0},g=a;else{if(h=Ji({...r,capturedVariables:void 0},p,_,c).evaluationContext,g=vt({expr:a,env:c,context:h,variablesToAdd:[],isEvaluatingFunctionBodyBeginBlock:!0}),!g.$)throw y({token:a.token,errorMessage:"Failed to evaluate the function body."});c=g.$.env}let d=h.capturedVariables,v=g.$?.type;if(jn(g)&&(_.isControlFunction=!0),!_.isControlFunction&&v&&!q({type:p.return.type,env:c},{type:v,env:c}))throw y({token:p.return.typeExpr.token,errorMessage:`Incompatible function return type for:
|
|
10771
10771
|
- Expected: ${A(p.return.type)}
|
|
10772
10772
|
- Given : ${A(v)}`});if(x(p.return.type)&&!p.return.type.resolvedConcreteType&&(x(v)?x(v)&&v.resolvedConcreteType&&(p.return.type.resolvedConcreteType=v.resolvedConcreteType):p.return.type.resolvedConcreteType=v),p.return.isCompileTimeOnly&&g.$&&!g.$.value)throw y({token:p.return.typeExpr.token,errorMessage:"Expected to return a compile-time value, but got runtime value."});c=lt(c,!0);let T=n;s&&d&&d.size>0&&(T=Rp({capturedVariables:d,env:n,closureToken:e.token}));let $=_,C=p;if(r.isAnalyzingCtfeCapability||r.forceCompileTimeBindings){let L=ji(_,T,r);L&&($=L,C=L.type)}return e.$={env:T,value:$,type:C,pathCollection:d&&d.size>0?Zi(d):[]},e}function Up({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=Oe(r,t.isFn.callType.parametersFrame);if(t.isFn.callType.whereClauseExprs?.length){let $=t.isFn.callType.whereClauseExprs.map(L=>xe(L));l=Br({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_${Ge(l.modulePath)}`,definitionSiteEnclosingFunctionType:i.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"?i.isEvaluatingFunctionBodyOrAsyncBlock.type:void 0,calledComptimeFunctionCaches:[],specializedFunctionCaches:[]},{evaluationContext:c}=Ji(i,t.isFn.callType,u,l),f=vt({expr:s,env:l,context:c,variablesToAdd:[],isEvaluatingFunctionBodyBeginBlock:!0});if(!f.$)throw y({token:s.token,errorMessage:"Failed to evaluate the closure body."});l=f.$.env;let p=c.capturedVariables,_=f.$.type;if(!q({type:t.isFn.callType.return.type,env:l},{type:_,env:l}))throw y({token:t.isFn.callType.return.typeExpr.token,errorMessage:`Incompatible closure return type:
|
|
10773
10773
|
- Expected: ${A(t.isFn.callType.return.type)}
|
|
@@ -10780,11 +10780,11 @@ ${w(f)}`});let C=f.token.value;if(n.label==="")throw y({token:f.token,errorMessa
|
|
|
10780
10780
|
${A(p)}`});else{let C=e.ioBuiltin==="io_await"||e.ioBuiltin==="io_state"||e.ioBuiltin==="io_spawn"||e.ioBuiltin==="join_handle_await"?void 0:{type:p,env:o};if(m=N({expr:c,env:a,context:{...s,expectedType:C}}),m.$?.env&&(a=m.$?.env),n.isCompileTimeOnly||u.push(m),ei(m,a),n.isOwningTheRcValue&&!n.isCompileTimeOnly){let L=m.$?.variableName,b=L?X(a,L):[];(b.length?b[b.length-1]:void 0)?.isOwningTheRcValue?a=yn(m,a,!0):(zt(m,s),m.$?.env&&(a=m.$.env),a=yn(m,a,!0))}}if(!m.$)throw y({token:c?.token??ie,errorMessage:"Failed to evaluate argument expression."});let g=m.$.type;if(!m.$?.value&&n.isCompileTimeOnly)throw y({token:c?.token??ie,errorMessage:`Cannot assign runtime argument to compile-time parameter:
|
|
10781
10781
|
${c?w(c):""}`});if(n.assignedValue&&m.$?.value&&!At({value:n.assignedValue,env:o},{value:m.$.value,env:a}))throw y({token:c?.token??ie,errorMessage:`Value mismatch for parameter "${n.label}":
|
|
10782
10782
|
Expected: ${De(n.assignedValue)}
|
|
10783
|
-
Got: ${De(m.$.value)}`});let h=m.$.value;if(!n.isCompileTimeOnly&&Qr(g,m.$.env)&&(s.forceCompileTimeBindings||(h=void 0),g=dt({type:g,expectedType:p,expr:m,env:m.$.env}),
|
|
10784
|
-
${w(m)}`});let d=n.isCompileTimeOnly||s.forceCompileTimeBindings===!0,{env:v}=fe({env:o,variable:{name:n.label,type:g,isCompileTimeOnly:d,value:h?[h]:void 0,token:c?.token??ie,initializedAtToken:c?.token??ie,consumedAtToken:void 0,isOwningTheRcValue:n.isOwningTheRcValue}});if(o=v,h&&D(h)&&x(h.value)){let C=h.value,L=Bn(a,C);if(L){for(let b of L.requiredTraits){let R={...b,receiverType:C};o=
|
|
10783
|
+
Got: ${De(m.$.value)}`});let h=m.$.value;if(!n.isCompileTimeOnly&&Qr(g,m.$.env)&&(s.forceCompileTimeBindings||(h=void 0),g=dt({type:g,expectedType:p,expr:m,env:m.$.env}),rr(g,m.$.env)))throw y({token:c?.token??ie,errorMessage:`Cannot convert compile-time type to runtime type for argument:
|
|
10784
|
+
${w(m)}`});let d=n.isCompileTimeOnly||s.forceCompileTimeBindings===!0,{env:v}=fe({env:o,variable:{name:n.label,type:g,isCompileTimeOnly:d,value:h?[h]:void 0,token:c?.token??ie,initializedAtToken:c?.token??ie,consumedAtToken:void 0,isOwningTheRcValue:n.isOwningTheRcValue}});if(o=v,h&&D(h)&&x(h.value)){let C=h.value,L=Bn(a,C);if(L){for(let b of L.requiredTraits){let R={...b,receiverType:C};o=Kn({env:o,someType:C,traitType:R,isNegated:!1})}for(let b of L.negativeTraits){let R={...b,receiverType:C};o=Kn({env:o,someType:C,traitType:R,isNegated:!0})}}}try{let{expectedEnv:C}=Qe({type:p,env:o},{type:g,env:a});o=C}catch(C){throw y({token:c?.token??ie,errorMessage:`Failed to synthesize types for parameter "${n.label}":
|
|
10785
10785
|
${C.message}`})}let{parameterType:T,calleeEnv:$}=Wo({functionType:e,definitionSiteEnclosingFunctionType:t,parameter:n,calleeEnv:o,context:{...s,isEvaluatingFunctionType:!0}});if(o=$,!q({type:T,env:o},{type:g,env:a},i===0&&l))throw y({token:c?.token??ie,errorMessage:`Type mismatch for parameter "${n.label}":
|
|
10786
10786
|
Expected: ${A(T)}
|
|
10787
|
-
Got: ${A(g)}`});return{calleeEnv:o,callerEnv:a,context:{...s},argValue:h,argType:g,parameterType:T}}function eo(e){if(e&&ne(e))return e}function Ma(e){let t=process.env[e];return t==="1"||t?.toLowerCase()==="true"}var Oa=Ma("YO_DEBUG_CALL")||Ma("YO_DEBUG_CALL_PROFILE")||Ma("YO_DEBUG_EVAL")||Ma("YO_DEBUG_EVAL_PROFILE"),qp=globalThis,
|
|
10787
|
+
Got: ${A(g)}`});return{calleeEnv:o,callerEnv:a,context:{...s},argValue:h,argType:g,parameterType:T}}function eo(e){if(e&&ne(e))return e}function Ma(e){let t=process.env[e];return t==="1"||t?.toLowerCase()==="true"}var Oa=Ma("YO_DEBUG_CALL")||Ma("YO_DEBUG_CALL_PROFILE")||Ma("YO_DEBUG_EVAL")||Ma("YO_DEBUG_EVAL_PROFILE"),qp=globalThis,dr=qp.__yoCallProfilerState??(qp.__yoCallProfilerState={tryCallCount:0,specializeCount:0,cacheHitCount:0,cacheMissCount:0,specializeNames:new Map,tryCallNames:new Map});function Gr({expr:e,functionValue:t,functionType:n,functionCalleeExpr:r,argExprs:i,callerEnv:o,context:a,isMethodCall:s,skipSpecialization:l,skipCtfeExecution:u}){if(Oa){dr.tryCallCount++;let ee="(unknown)";t&&"funcName"in t&&t.funcName?ee=t.funcName:t&&"funcId"in t?ee=String(t.funcId):r&&(ee=w(r).slice(0,60)),dr.tryCallNames.set(ee,(dr.tryCallNames.get(ee)??0)+1),dr.tryCallCount<=5&&console.log(`[DEBUG tryCall] #${dr.tryCallCount}: name=${ee}, hasFuncValue=${!!t}, hasFuncCalleeExpr=${!!r}`)}t&&(t.specializedType?n=t.specializedType:n=t.type);let c,f=[],p=[],_=[],m=t?.definitionSiteEnclosingFunctionType,g=0;i.length>0&&F(i[0])&&E(i[0],I.forall)&&(c=i[0],g=1);let h,d=i.slice(g),v=d.findIndex(ee=>F(ee)&&E(ee,I.using));if(v!==-1){let ee=d.findIndex((Z,se)=>se>v&&F(Z)&&E(Z,I.using));if(ee!==-1)throw y({token:d[ee].token,errorMessage:'Only one "using(...)" is allowed per function call. Combine all implicit arguments into a single using(), e.g.: func(..., using(a, b))'});h=d[v],d=[...d.slice(0,v),...d.slice(v+1)]}let T=n.parameters.length,$=d;if(!n.variadicParameter){if($.length>T){let ee=n.parameters.at(-1);if(!(ee&&ee.isQuote&&jr(ee.type)))throw y({token:r?.token??ie,errorMessage:`Too many arguments for function call:
|
|
10788
10788
|
Expected: ${T} arguments
|
|
10789
10789
|
Got: ${$.length} arguments`})}else if($.length<T&&!n.parameters.slice($.length).every(Z=>Z.exprs.defaultValueExpr!==void 0))throw y({token:r?.token??ie,errorMessage:`Too few arguments for function call:
|
|
10790
10790
|
Expected: ${T} arguments
|
|
@@ -10794,8 +10794,8 @@ ${w(le)}`:"Expected type for default value."});re=We.$?.value}else throw y({toke
|
|
|
10794
10794
|
${w(le)}`});re=We.$?.value}Te&&(Te.$={env:b,type:re.type,value:re,pathCollection:[]});let{parameterType:Ie,calleeEnv:$e}=Wo({parameter:Z,calleeEnv:b,definitionSiteEnclosingFunctionType:m,context:{...a,isEvaluatingFunctionType:!0},functionType:n});b=$e;let{expectedEnv:Ke,givenEnv:ut}=Qe({type:Ie,env:b},{type:re.type,env:o});if(b=Ke,o=ut,!q({type:Ie,env:b},{type:re.type,env:o}))throw y({token:le?.token??r?.token??ie,errorMessage:`Type mismatch for type parameter "${Z.label}":
|
|
10795
10795
|
Expected: ${A(Ie)}
|
|
10796
10796
|
Got: ${A(re.type)}`});if(Z.label)if(se)b=Be(b,se,{...se,value:[re]});else{let We=le?.token??r?.token??ie,{env:Ut}=fe({env:b,variable:{name:Z.label,type:re.type,isCompileTimeOnly:!0,value:[re],token:We,initializedAtToken:We,consumedAtToken:void 0,isOwningTheRcValue:!1}});b=Ut}f.push({value:re,argType:re.type,parameterType:Ie})}}if(a.expectedType&&!c&&n.forallParameters.length>0&&!n.return.isUnquote)try{let{returnType:ee,calleeEnv:Z}=di({functionType:n,calleeEnv:b,context:{...a,isEvaluatingFunctionType:!0},functionCalleeExpr:r}),{expectedEnv:se}=Qe({type:ee,env:Z},{type:a.expectedType.type,env:a.expectedType.env});b=se}catch{}if(h&&n.implicitParameters.length>0&&n.implicitParameters.some(Z=>Z.isEffectRowSpread)){let se=n.implicitParameters.filter(Te=>!Te.isEffectRowSpread).length,le=h.args.slice(se);if(le.length>0){let Te=[];for(let $e of le){if(!U($e))throw y({token:$e.token,errorMessage:`Expected identifier for using() argument in effect row spread, got ${w($e)}`});let Ke=$e.token.value,We=X(o,Ke).at(-1);if(!We)throw y({token:$e.token,errorMessage:`Variable "${Ke}" not found for using() argument in effect row spread.`});$e.$={env:o,type:We.type,value:We.value?.[0],variableName:Ke,pathCollection:[]},Te.push({label:Ke,type:We.type,isCompileTimeOnly:!0,isImplicit:!0,isOwningTheRcValue:!1,isQuote:!1,exprs:{expr:$e,labelExpr:$e,typeExpr:void 0,defaultValueExpr:void 0}})}let re=$r(Te),Ie=J(re);for(let $e of n.implicitParameters){if(!$e.isEffectRowSpread)continue;let Ke=$e.label,We=X(b,Ke).at(-1);We&&(b=Be(b,We,{...We,value:[Ie]})),x($e.type)&&$e.type.isEffectsRow&&($e.type.resolvedConcreteType=re)}}}n.ioBuiltin==="io_async"&&(a={...a,isInsideIoAsyncCall:!0});let R=n.parameters.length;for(let ee=0;ee<R;ee++){let Z=n.parameters[ee],{calleeEnv:se,callerEnv:le,context:Te,argValue:re,argType:Ie,parameterType:$e}=Hy({functionType:n,definitionSiteEnclosingFunctionType:m,parameter:Z,argExprs:i,argIndex:ee,callerEnv:o,calleeEnv:b,context:a,isMethodCall:s,runtimeArgExprsInOrder:_});b=se,o=le,a=Te,p.push({value:re,parameterType:$e,argType:Ie})}if(!c&&n.forallParameters.length>0){for(let ee of n.forallParameters)if(ee.label){let se=X(b,ee.label).at(-1);if(se?.value?.[0]&&D(se.value[0])){let le=se.value[0];if(x(le.value)&&le.value.resolvedConcreteType&&(!le.value.requiredTraits||le.value.requiredTraits.length===0)){let Te=J(le.value.resolvedConcreteType);b=Be(b,se,{...se,value:[Te]})}}}}if(!c&&n.forallParameters.length>0){for(let ee of n.forallParameters)if(ee.label){let se=X(b,ee.label).at(-1);se?.value?.[0]&&D(se.value[0])&&f.push({value:se.value[0],argType:se.value[0].type,parameterType:ee.type})}}if(n.whereClauseExprs?.length){let ee=n.whereClauseExprs.map(se=>xe(se));b=Br({constraintExprs:ee,env:b,context:{...a,isEvaluatingFunctionType:!0}}).env}let{returnType:S,calleeEnv:G}=di({functionType:n,calleeEnv:b,context:{...a,isEvaluatingFunctionType:!0},functionCalleeExpr:r});if(b=G,a.expectedType&&!n.return.isUnquote){let{expectedEnv:ee}=Qe({type:S,env:b},{type:a.expectedType.type,env:a.expectedType.env});b=ee;let Z=di({functionType:n,calleeEnv:b,context:{...a,isEvaluatingFunctionType:!0},functionCalleeExpr:r});S=Z.returnType,b=Z.calleeEnv,q({type:a.expectedType.type,env:a.expectedType.env},{type:S,env:b})&&(S=a.expectedType.type)}let P=[];if(n.variadicParameter){for(let ee=0;ee<L.length;ee++){let Z=L[ee],se;if(n.variadicParameter.isQuote)se=xe(Z),se.$={type:ln(),value:zn(Z),env:o,pathCollection:[]},P.push({value:se.$.value,argType:se.$.type});else{if(se=N({expr:Z,env:o,context:{...a}}),!se.$?.env)throw y({token:Z.token,errorMessage:`Failed to evaluate the expression:
|
|
10797
|
-
${w(Z)}`});o=se.$.env,P.push({value:se.$.value,argType:se.$.type}),n.variadicParameter.isCompileTimeOnly||_.push(Z)}}if(n.variadicParameter.label!=="..."){if(n.variadicParameter.isQuote){let ee=Pn(ln(),P.map(se=>se.value)),{env:Z}=fe({env:b,variable:{name:n.variadicParameter.label,type:ee.type,isCompileTimeOnly:n.variadicParameter.isCompileTimeOnly,value:[ee],token:n.variadicParameter.exprs.expr.token,initializedAtToken:n.variadicParameter.exprs.expr.token,consumedAtToken:void 0,isOwningTheRcValue:!1}});b=Z}}}let O=[],B=[];if(n.implicitParameters.length>0)for(let ee=0;ee<n.implicitParameters.length;ee++){let Z=n.implicitParameters[ee],se=!1;if(Z.isEffectRowSpread){let re=[],$e=X(b,Z.label).at(-1)?.value?.[0],Ke;if($e&&D($e)&&rt($e.value))Ke=$e.value;else if(x(Z.type)&&Z.type.isEffectsRow){let ut=Ot(b,Z.type);rt(ut)&&(Ke=ut)}else rt(Z.type)&&(Ke=Z.type);if(!Ke&&x(Z.type)&&Z.type.isEffectsRow){let ut=un(o,Pt=>Pt.isImplicit===!0&&Pt.isCompileTimeOnly===!0&&(z(Pt.type)||ve(Pt.type))),We=new Set(n.implicitParameters.filter(Pt=>!Pt.isEffectRowSpread).map(Pt=>Pt.label)),Ut=ut.filter(Pt=>!We.has(Pt.name));if(Ut.length>0){for(let
|
|
10798
|
-
Please ensure a given variable of matching type is in scope.`});let Ar=Gn.value[0];B.push({value:Ar,parameterType:We,argType:Gn.type});let{env:
|
|
10797
|
+
${w(Z)}`});o=se.$.env,P.push({value:se.$.value,argType:se.$.type}),n.variadicParameter.isCompileTimeOnly||_.push(Z)}}if(n.variadicParameter.label!=="..."){if(n.variadicParameter.isQuote){let ee=Pn(ln(),P.map(se=>se.value)),{env:Z}=fe({env:b,variable:{name:n.variadicParameter.label,type:ee.type,isCompileTimeOnly:n.variadicParameter.isCompileTimeOnly,value:[ee],token:n.variadicParameter.exprs.expr.token,initializedAtToken:n.variadicParameter.exprs.expr.token,consumedAtToken:void 0,isOwningTheRcValue:!1}});b=Z}}}let O=[],B=[];if(n.implicitParameters.length>0)for(let ee=0;ee<n.implicitParameters.length;ee++){let Z=n.implicitParameters[ee],se=!1;if(Z.isEffectRowSpread){let re=[],$e=X(b,Z.label).at(-1)?.value?.[0],Ke;if($e&&D($e)&&rt($e.value))Ke=$e.value;else if(x(Z.type)&&Z.type.isEffectsRow){let ut=Ot(b,Z.type);rt(ut)&&(Ke=ut)}else rt(Z.type)&&(Ke=Z.type);if(!Ke&&x(Z.type)&&Z.type.isEffectsRow){let ut=un(o,Pt=>Pt.isImplicit===!0&&Pt.isCompileTimeOnly===!0&&(z(Pt.type)||ve(Pt.type))),We=new Set(n.implicitParameters.filter(Pt=>!Pt.isEffectRowSpread).map(Pt=>Pt.label)),Ut=ut.filter(Pt=>!We.has(Pt.name));if(Ut.length>0){for(let Qn of Ut){let Yr=Qn.value?.[0];if(Yr){B.push({value:Yr,parameterType:Qn.type,argType:Qn.type});let{env:Od}=fe({env:b,variable:{name:Qn.name,type:Qn.type,isCompileTimeOnly:!0,isImplicit:!0,isFromEffectSpread:!0,value:[Yr],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});b=Od}}let Pt=$r(Ut.map(Qn=>({label:Qn.name,type:Qn.type,isCompileTimeOnly:!0,isQuote:!1,isOwningTheRcValue:!1,isImplicit:!0,exprs:{expr:void 0,labelExpr:void 0,typeExpr:void 0}}))),fn=J(Pt),Ar=X(b,Z.label).at(-1);Ar&&(b=Be(b,Ar,{...Ar,value:[fn],type:Pt})),se=!0;continue}}re=Ke?.implicitParameters??[];for(let ut of re){let We=ut.type,Pt=un(o,fn=>fn.isImplicit===!0&&fn.isCompileTimeOnly===!0&&fn.name===ut.label&&q({type:We,env:b},{type:fn.type,env:o})).at(-1);if(Pt?.value?.[0]){let fn=Pt.value[0];B.push({value:fn,parameterType:We,argType:Pt.type});let{env:Gn}=fe({env:b,variable:{name:ut.label,type:We,isCompileTimeOnly:!0,isImplicit:!0,isFromEffectSpread:!0,value:[fn],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});b=Gn}else{let Gn=un(o,Yr=>Yr.isImplicit===!0&&Yr.isCompileTimeOnly===!0&&q({type:We,env:b},{type:Yr.type,env:o})).at(-1);if(!Gn?.value?.[0])throw y({token:r?.token??e?.token??ie,errorMessage:`No "given" variable found for effect row parameter "${ut.label}" of type ${A(We)} (expanded from effect row ...(${Z.label})).
|
|
10798
|
+
Please ensure a given variable of matching type is in scope.`});let Ar=Gn.value[0];B.push({value:Ar,parameterType:We,argType:Gn.type});let{env:Qn}=fe({env:b,variable:{name:ut.label,type:We,isCompileTimeOnly:!0,isImplicit:!0,isFromEffectSpread:!0,value:[Ar],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});b=Qn}}continue}let{parameterType:le,calleeEnv:Te}=Wo({parameter:Z,calleeEnv:b,definitionSiteEnclosingFunctionType:m,context:{...a,isEvaluatingFunctionType:!0},functionType:n});if(b=Te,h){let re=h.args[ee],Ie=re&&U(re)&&Et(re,I.undefined);if(re&&!Ie){let $e=N({expr:re,env:o,context:{...a}});if(!$e.$)throw y({token:re.token,errorMessage:`Failed to evaluate using() argument: ${w(re)}`});o=$e.$.env;let Ke=$e.$.value,ut=$e.$.type;if(!Ke)throw y({token:re.token,errorMessage:`Expected compile-time value for using() argument, got runtime value: ${w(re)}`});if(!q({type:le,env:b},{type:ut,env:o}))throw y({token:re.token,errorMessage:`Incompatible type for implicit parameter "${Z.label}":
|
|
10799
10799
|
Expected: ${A(le)}
|
|
10800
10800
|
Got: ${A(ut)}`});B.push({value:Ke,parameterType:le,argType:ut});let We=X(b,Z.label);if(We.length>0){let Ut=We[We.length-1];b=Be(b,Ut,{...Ut,type:le,isImplicit:!0,value:[Ke]})}else{let{env:Ut}=fe({env:b,variable:{name:Z.label,type:le,isCompileTimeOnly:!0,isImplicit:!0,value:[Ke],token:Z.exprs.labelExpr?.token??ie,initializedAtToken:Z.exprs.labelExpr?.token??ie,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});b=Ut}se=!0}}if(!se){let re=un(o,Ut=>Ut.isImplicit===!0&&Ut.isCompileTimeOnly===!0&&q({type:le,env:b},{type:Ut.type,env:o}));if(re.length===0)throw y({token:r?.token??e?.token??ie,errorMessage:`No "given" variable found for implicit parameter "${Z.label}" of type ${A(le)}.
|
|
10801
10801
|
Please declare a given variable with a compatible type, e.g.:
|
|
@@ -10804,7 +10804,7 @@ Or pass it explicitly:
|
|
|
10804
10804
|
${t?.funcName??"func"}(..., using(<value>))`});if(re[re.length-1].isFromEffectSpread&&!(()=>{if(!r||!U(r))return!1;let Pt=r.token.value,fn=a.isEvaluatingFunctionBodyOrAsyncBlock;return!fn||fn.kind!=="function-body"?!1:fn.type.parameters.some(Ar=>Ar.label===Pt)})())throw y({token:r?.token??e?.token??ie,errorMessage:`Effect "${Z.label}" of type ${A(le)} is available through an effect row spread but not explicitly declared in the function's using clause.
|
|
10805
10805
|
Add it explicitly:
|
|
10806
10806
|
using(${Z.label} : ${A(le)}, ...(E))`});let $e=re;if($e.length>1){let Ut=So(o,Pt=>Pt.isImplicit===!0&&Pt.isCompileTimeOnly===!0&&q({type:le,env:b},{type:Pt.type,env:o}));if(Ut>=0){let fn=o.frames[Ut].variables.filter(Gn=>Gn.isImplicit===!0&&Gn.isCompileTimeOnly===!0&&q({type:le,env:b},{type:Gn.type,env:o}));fn.length>0&&($e=fn)}}if($e.length>1)throw y({token:r?.token??e?.token??ie,errorMessage:`Ambiguous implicit parameter "${Z.label}": found ${$e.length} "given" variables with compatible type ${A(le)} in the same scope.
|
|
10807
|
-
Please use explicit using() to disambiguate.`});let Ke=$e[$e.length-1],ut=Ke.value?.[0];if(!ut)throw y({token:r?.token??e?.token??ie,errorMessage:`The "given" variable "${Ke.name}" has no compile-time value.`});B.push({value:ut,parameterType:le,argType:Ke.type});let{env:We}=fe({env:b,variable:{name:Z.label,type:le,isCompileTimeOnly:!0,isImplicit:!0,value:[ut],token:Z.exprs.labelExpr?.token??ie,initializedAtToken:Z.exprs.labelExpr?.token??ie,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});b=We}}let ae={args:p,forallArgs:f,implicitArgs:B,variadicArgs:P},K;if(n.return.isCompileTimeOnly)if(u)K=Y(S,{variableName:n.return.label,env:n.env,context:a});else if(ne(t)){let{value:ee,callerEnv:Z,calleeEnv:se}=Xi({functionCalleeExpr:r,functionType:n,functionValue:t,argValues:ae,callerEnv:o,calleeEnv:b,context:{...a}});K=ee,S=ee.type,o=Z,b=se}else{let ee=qe(S)&&S.level===0,Z=`${n.id}_return_sometype`;if(ee)if(a.expectedType?.type)K=J(a.expectedType.type);else if(a.isEvaluatingFunctionType){let se=En(S,n.return.label,{id:Z,env:b,context:a});se.functionApplication=e;let le=Ot(b,se);K=J(le)}else throw y({token:e?.token??r?.token??ie,errorMessage:"Cannot infer comptime return type. Please provide the expected type."});else K=Y(S,{variableName:n.return.label,env:n.env,context:a})}Ky({returnType:S,env:b,expr:e,context:a});let W,de=a.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"&&a.isEvaluatingFunctionBodyOrAsyncBlock.value&&ne(a.isEvaluatingFunctionBodyOrAsyncBlock.value)&&t&&ne(t)&&a.isEvaluatingFunctionBodyOrAsyncBlock.value.funcId===t.funcId,me=ae.implicitArgs?.some(ee=>_e(ee.value)),he=me&&!ae.implicitArgs?.some(ee=>_e(ee.value)&&!ve(ee.parameterType)),H=ae.args.some(ee=>ee.argType&&x(ee.argType)),Q=he&&H,oe=(()=>{if(!me||!n.implicitParameters.some(le=>le.isEffectRowSpread))return!1;let Z=0;for(let le of n.implicitParameters)le.isEffectRowSpread||Z++;let se=ae.implicitArgs??[];for(let le=0;le<Z&&le<se.length;le++)if(_e(se[le].value))return!1;return!0})(),pe=On(n)&&!Zn(n)&&n.implicitParameters.some(ee=>ve(ee.type)?ee.type.fields.some(Z=>z(Z.type)&&Z.type.forallParameters.length===0):!!ee.isEffectRowSpread);if(!l&&!pe&&t&&ne(t)&&!t.isControlFunction&&On(n)&&!de&&(!me||Q||oe)){if(W=Yy({originalFunction:t,argValues:ae,calleeEnv:b,callerEnv:o,context:a}),W&&x(S)){let ee=W.body?.$?.type;ee&&!x(ee)&&(S=ee,W.specializedType&&(W.specializedType={...W.specializedType,return:{...W.specializedType.return,type:ee}}))}if(W){let ee=new Set,Z=0;for(let se=0;se<n.parameters.length;se++)if(!n.parameters[se].isCompileTimeOnly){let re=ae.args[se]?.value;re&&ne(re)&&re.type.implicitParameters.some(Ie=>z(Ie.type)||ve(Ie.type))&&ee.add(Z),Z++}if(ee.size>0)for(let se=_.length-1;se>=0;se--)ee.has(se)&&_.splice(se,1)}}if(!l&&t&&ne(t)&&t.isControlFunction&&n.forallParameters.length>0&&!W&&(W=jy({originalFunction:t,argValues:ae,calleeEnv:b,callerEnv:o,context:a}),W&&x(S))){let ee=W.body?.$?.type;ee&&!x(ee)&&(S=ee,W.specializedType&&(W.specializedType={...W.specializedType,return:{...W.specializedType.return,type:ee}}))}let Se=Pi(o),Je;if(Se.length>0){let ee=qy({variablesToDrop:Se,env:o,context:a});Je=ee.deferredDropExpressions,o=ee.env}return{returnType:S,calleeEnv:b,callerEnv:o,pathCollection:O,argValues:ae,returnValue:K,specializedFunctionValue:W,runtimeArgExprsInOrder:_,deferredDropExpressions:Je}}function Yy({originalFunction:e,argValues:t,calleeEnv:n,callerEnv:r,context:i}){if(Oa){_r.specializeCount++;let P=e.funcName??e.funcId;_r.specializeNames.set(P,(_r.specializeNames.get(P)??0)+1)}let o=e.type,a=[],s=[];t.forallArgs&&a.push(...t.forallArgs.map(P=>P.value)),t.implicitArgs&&a.push(...t.implicitArgs.map(P=>P.value)),o.parameters.forEach((P,O)=>{let B=t.args[O];if(P.isCompileTimeOnly)B.value&&a.push(B.value);else if(B.value&&ne(B.value)&&B.value.type.implicitParameters.some(K=>z(K.type)||ve(K.type)))B.value&&a.push(B.value);else{let W=x(B.argType)&&B.argType.resolvedConcreteType&&!Ce(B.argType)?B.argType.resolvedConcreteType:B.argType;s.push({...P,type:W})}});let l=s.map(P=>P.type),u=e.specializedFunctionCaches.find(P=>P.compileTimeArgValues.length===a.length&&P.compileTimeArgValues.every((ae,K)=>{let W=a[K];return At({value:ae,env:P.env},{value:W,env:r})})?P.runtimeParameterTypes.length===l.length&&P.runtimeParameterTypes.every((ae,K)=>{let W=l[K];return q({type:ae,env:P.env},{type:W,env:r},!0)}):!1);if(u)return Oa&&_r.cacheHitCount++,u.specializedFunction;Oa&&_r.cacheMissCount++;let c=n;for(let P of r.frames)for(let O of P.variables){if(!O.isCompileTimeOnly||X(c,O.name).length>0)continue;let{env:ae}=fe({env:c,variable:{...O},allowVariableShadowing:!0});c=ae}for(let P of s){let O=X(c,P.label);if(O.length>0){let B=O[O.length-1],ae={...B,value:void 0};c=Be(c,B,ae)}}let f=xe(e.body),{returnType:p,calleeEnv:_}=di({functionType:o,calleeEnv:c,context:{...i,isEvaluatingFunctionType:!0},functionCalleeExpr:void 0});c=_;let m=i.enclosingFunctionReturnType,g=t.implicitArgs?.some(P=>ne(P.value)&&P.value.isControlFunction||ze(P.value)&&Hp(P.value.type,P.value))??!1,h=vt({expr:f,env:c,context:{...i,expectedType:{type:p,env:c},isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:o,value:e,evaluationEnv:c},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 P=0;P<o.implicitParameters.length;P++){let O=o.implicitParameters[P];if(z(O.type)){let B=t.implicitArgs?.[v];(B&&ne(B.value)?B.value:void 0)?.isControlFunction&&d.push({handlerArgIndex:v,label:O.label,type:O.type,fromSpread:!1}),v+=1}else if(O.isEffectRowSpread){let B=O.type;if(x(B)){let K=X(c,O.label).at(-1)?.value?.[0];if(K&&D(K)&&rt(K.value))B=K.value;else{let W=Ot(c,B);W&&(B=W)}}if(rt(B)){for(let ae=0;ae<B.implicitParameters.length;ae++){let K=B.implicitParameters[ae];if(z(K.type)){let W=t.implicitArgs?.[v+ae];(W&&ne(W.value)?W.value:void 0)?.isControlFunction&&d.push({handlerArgIndex:v+ae,label:K.label,type:K.type,fromSpread:!0})}else if(ve(K.type)){let W=t.implicitArgs?.[v+ae],de=W&&ze(W.value)?W.value:void 0,me=[],he=(H,Q,oe)=>{for(let Ae=0;Ae<H.fields.length;Ae++){let pe=H.fields[Ae];if(z(pe.type)){let Se=oe?.fields[Ae];if(Se&&ne(Se)&&Se.isControlFunction){let Je=Se.specializedType??pe.type;me.push({path:[...Q,pe.label],type:Je})}}else if(ve(pe.type)){let Se=oe?.fields[Ae];he(pe.type,[...Q,pe.label],Se&&ze(Se)?Se:void 0)}}};he(K.type,[],de);for(let H of me)d.push({handlerArgIndex:v+ae,label:K.label,type:H.type,fromSpread:!0,effectFieldPath:H.path})}}v+=B.implicitParameters.length}else v+=1}else if(ve(O.type)){let B=[],ae=t.implicitArgs?.[v],K=(W,de,me)=>{for(let he=0;he<W.fields.length;he++){let H=W.fields[he];if(z(H.type)){let Q=me?.fields[he];if(Q&&ne(Q)&&Q.isControlFunction){let oe=Q.specializedType??H.type;B.push({path:[...de,H.label],type:oe})}}else if(ve(H.type)){let Q=me?.fields[he];K(H.type,[...de,H.label],Q&&ze(Q)?Q:void 0)}}};K(O.type,[],ae&&ze(ae.value)?ae.value:void 0);for(let W of B)d.push({handlerArgIndex:v,label:O.label,type:W.type,fromSpread:!1,effectFieldPath:W.path});v+=1}else v+=1}let T=[];for(let P of d){let O=Wp(h,P.label,P.type,!0,P.effectFieldPath);if(O.hasEffects){let B=t.implicitArgs?.[P.handlerArgIndex],ae,K=P.effectFieldPath;if(B&&ne(B.value))ae=B.value;else if(B&&ze(B.value)&&K&&K.length>0){let W=B.value;for(let de of K){if(!ze(W)){W=void 0;break}let me=W.type.fields.findIndex(he=>he.label===de);if(me<0||!W.fields[me]){W=void 0;break}W=W.fields[me]}W&&ne(W)&&(ae=W)}if(ae){let W=ae,de=P.type,me=!W.body.$;if(!me&&W.isControlFunction&&F(W.body)&&W.body.args.length>0&&!W.body.args[0]?.$&&(me=!0),me&&z(de)&&de.forallParameters.length>0&&O.effectCallPoints.length>0){let he=new Map,H=de.return.type,Q=O.effectCallPoints[0].operationResultType;if(x(H)&&he.set(H.name,Q),he.size===0&&de.forallParameters.length===1){let ee=de.forallParameters[0];he.set(ee.label,Q)}let oe=xe(W.body),Ae=W.body.$?.env??c;Ae=Oe(Ae);for(let ee of de.forallParameters){let Z=he.get(ee.label);Z&&(Ae=fe({env:Ae,variable:{name:ee.label,type:ee.type,isCompileTimeOnly:!0,value:[J(Z)],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0}).env)}let pe=W.specializedType??W.type,Se=W.definitionSiteEnclosingFunctionType?.return.type??Sn(),Je={...i,expectedType:void 0,enclosingFunctionReturnType:Se,isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:pe,value:W,evaluationEnv:Ae}};try{let ee=Wr({expr:oe,env:Ae,context:Je}),Z=pe.parameters.map(re=>{if(re.isCompileTimeOnly)return re;if(x(re.type)){let Ie=he.get(re.type.name);if(Ie)return{...re,type:Ie}}return re}),se=pe.return.type;if(x(se)){let re=he.get(se.name);re&&(se=re)}let le={...pe,parameters:Z,return:{...pe.return,type:se}},Te={...W,body:ee,specializedType:le};O.handlerValue=Te,O.effectParameterType=le;for(let re of O.effectCallPoints)re.isTransitiveEffectCall&&(re.operationArgTypes=re.operationArgTypes.map(Ie=>x(Ie)?he.get(Ie.name)??Ie:Ie))}catch(ee){if(F(W.body)&&W.body.args.length>0&&!W.body.args[0]?.$)throw ee;O.handlerValue=W}}else O.handlerValue=W}else B&&(O.handlerValue=B.value);T.push({analysis:O,ctlParam:P})}}if(T.length===1)h.$.effectAnalysis=T[0].analysis;else if(T.length>1){let P=[],O=new Map,B=new Map,ae=[];for(let de=0;de<T.length;de++){let{analysis:me}=T[de];ae.push({effectParameterName:me.effectParameterName,effectParameterType:me.effectParameterType,effectFieldPath:me.effectFieldPath,handlerValue:me.handlerValue,operationArgTypes:me.effectCallPoints.length>0?me.effectCallPoints[0].operationArgTypes:[],operationResultType:me.effectCallPoints.length>0?me.effectCallPoints[0].operationResultType:{tag:"unit"}});for(let he of me.effectCallPoints)P.push({...he,effectIndex:de});for(let he of me.capturedVariables)O.has(he.id)||O.set(he.id,he);for(let[he,H]of me.variableIdRemapping)B.set(he,H)}if(F(h)&&E(h,I.begin)){let de=h.args,me=new Map;for(let H=0;H<de.length;H++)me.set(de[H],H);let he=H=>{for(let Q=0;Q<de.length;Q++)if(gl(de[Q],H.expr))return Q;return 999};P.sort((H,Q)=>he(H)-he(Q))}for(let de=0;de<P.length;de++)P[de].index=de;let K=T[0].analysis,W={effectCallPoints:P,capturedVariables:Array.from(O.values()),hasEffects:!0,variableIdRemapping:B,effectParameterName:K.effectParameterName,effectParameterType:K.effectParameterType,effectFieldPath:K.effectFieldPath,handlerValue:K.handlerValue,effectHandlerInfos:ae};h.$.effectAnalysis=W}let $=[],C=P=>{if(D(P)){let O=P.value;if(!O.typeName&&O.id)return`${De(P)}_id${O.id}`}return ne(P)?`fn_${P.funcId}`:De(P)};o.forallParameters.forEach((P,O)=>{if(O<t.forallArgs.length){let B=t.forallArgs[O];$.push(te(C(B.value)))}else{let B=P.label,ae=X(n,B);ae.length>0&&ae[ae.length-1]?.value?.[0]?$.push(te(C(ae[ae.length-1].value[0]))):$.push("unknown")}}),o.parameters.forEach((P,O)=>{if(P.isCompileTimeOnly&&O<t.args.length){let B=t.args[O];B?$.push(te(C(B.value))):$.push("unknown")}}),t.implicitArgs&&t.implicitArgs.forEach(P=>{$.push(te(C(P.value)))}),s.forEach((P,O)=>{let B=P.type;(!B.typeName&&B.id||Fe(B))&&$.push(`rtparam${O}_${te(A(B))}_id${B.id}`)});let L=$.join("_"),b=[];for(let P of o.implicitParameters)if(P.isEffectRowSpread){let O=P.type;if(x(O)){if(t.forallArgs){for(let B=0;B<o.forallParameters.length;B++)if(o.forallParameters[B].label===O.name&&B<t.forallArgs.length){let K=t.forallArgs[B].value;D(K)&&rt(K.value)&&(O=K.value);break}}if(x(O)&&O.resolvedConcreteType&&rt(O.resolvedConcreteType)&&(O=O.resolvedConcreteType),x(O)){let B=X(c,O.name);if(B.length>0){let K=B[B.length-1].value?.[0];K&&D(K)&&rt(K.value)&&(O=K.value)}}}rt(O)&&b.push(...O.implicitParameters)}else ve(P.type)&&b.push(P);let R=ai({forallParameters:[],parameters:s,implicitParameters:b.length>0?b:void 0,variadicParameter:void 0,return_:{...o.return,type:p},parametersFrame:c.frames[c.frames.length-1],env:o.env,SelfType:o.SelfType}),S={...e,specializedType:R,body:h,isControlFunction:e.isControlFunction||Yn(h),funcId:`${e.funcId}_${L}`,funcName:`${e.funcName}_${L}`,calledComptimeFunctionCaches:[],specializedFunctionCaches:[]},G={funcId:e.funcId,compileTimeArgValues:a,runtimeParameterTypes:l,specializedFunction:S,env:h.$.env};return e.specializedFunctionCaches=[...e.specializedFunctionCaches,G],S}function jy({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??Sn(),s=te(A(o)),l=e.specializedFunctionCaches.find(d=>d.specializedFunction.funcId===`${e.funcId}_ctl_${s}`);if(l)return l.specializedFunction;let u=Oe(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:$}=fe({env:u,variable:{...v},allowVariableShadowing:!0});u=$}for(let d of i.forallParameters){let v=o,{env:T}=fe({env:u,variable:{name:d.label,type:d.type,isCompileTimeOnly:!0,value:[J(v)],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});u=T}let c=xe(e.body),f={...r,expectedType:void 0,enclosingFunctionReturnType:a,isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:i,value:e,evaluationEnv:u},functionReturnImplConcreteType:[]},p=Wr({expr:c,env:u,context:f}),_={...e,body:p,isControlFunction:e.isControlFunction||Yn(p),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=>x(d)&&m.has(d)?o:d,h=ai({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 _.specializedType=h,e.specializedFunctionCaches=[...e.specializedFunctionCaches,{funcId:e.funcId,compileTimeArgValues:[],runtimeParameterTypes:[],specializedFunction:_,env:p.$?.env??u}],_}function Ky({returnType:e,expr:t,env:n,context:r}){if(r.isEvaluatingFunctionType||r.expectedType)return;let i=Xa(e);for(let o of i){if(Ce(o)||Yt(o)||o.resolvedConcreteType||o.requiredTraits&&o.requiredTraits.length>0)continue;if(!X(n,o.name).length){let s=un(n,()=>!0),l=!1;for(let u of s)if(D(u.value?.[0])){let c=u.value[0].value,f=Xa(c);for(let p of f)if(p.name===o.name){l=!0;break}if(l)break}if(l)continue;throw y({token:t?.token??ie,errorMessage:`Failed to infer the function call return type.
|
|
10807
|
+
Please use explicit using() to disambiguate.`});let Ke=$e[$e.length-1],ut=Ke.value?.[0];if(!ut)throw y({token:r?.token??e?.token??ie,errorMessage:`The "given" variable "${Ke.name}" has no compile-time value.`});B.push({value:ut,parameterType:le,argType:Ke.type});let{env:We}=fe({env:b,variable:{name:Z.label,type:le,isCompileTimeOnly:!0,isImplicit:!0,value:[ut],token:Z.exprs.labelExpr?.token??ie,initializedAtToken:Z.exprs.labelExpr?.token??ie,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});b=We}}let ae={args:p,forallArgs:f,implicitArgs:B,variadicArgs:P},K;if(n.return.isCompileTimeOnly)if(u)K=Y(S,{variableName:n.return.label,env:n.env,context:a});else if(ne(t)){let{value:ee,callerEnv:Z,calleeEnv:se}=Xi({functionCalleeExpr:r,functionType:n,functionValue:t,argValues:ae,callerEnv:o,calleeEnv:b,context:{...a}});K=ee,S=ee.type,o=Z,b=se}else{let ee=qe(S)&&S.level===0,Z=`${n.id}_return_sometype`;if(ee)if(a.expectedType?.type)K=J(a.expectedType.type);else if(a.isEvaluatingFunctionType){let se=En(S,n.return.label,{id:Z,env:b,context:a});se.functionApplication=e;let le=Ot(b,se);K=J(le)}else throw y({token:e?.token??r?.token??ie,errorMessage:"Cannot infer comptime return type. Please provide the expected type."});else K=Y(S,{variableName:n.return.label,env:n.env,context:a})}Ky({returnType:S,env:b,expr:e,context:a});let W,de=a.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"&&a.isEvaluatingFunctionBodyOrAsyncBlock.value&&ne(a.isEvaluatingFunctionBodyOrAsyncBlock.value)&&t&&ne(t)&&a.isEvaluatingFunctionBodyOrAsyncBlock.value.funcId===t.funcId,me=ae.implicitArgs?.some(ee=>_e(ee.value)),he=me&&!ae.implicitArgs?.some(ee=>_e(ee.value)&&!ve(ee.parameterType)),H=ae.args.some(ee=>ee.argType&&x(ee.argType)),Q=he&&H,oe=(()=>{if(!me||!n.implicitParameters.some(le=>le.isEffectRowSpread))return!1;let Z=0;for(let le of n.implicitParameters)le.isEffectRowSpread||Z++;let se=ae.implicitArgs??[];for(let le=0;le<Z&&le<se.length;le++)if(_e(se[le].value))return!1;return!0})(),pe=On(n)&&!Jn(n)&&n.implicitParameters.some(ee=>ve(ee.type)?ee.type.fields.some(Z=>z(Z.type)&&Z.type.forallParameters.length===0):!!ee.isEffectRowSpread);if(!l&&!pe&&t&&ne(t)&&!t.isControlFunction&&On(n)&&!de&&(!me||Q||oe)){if(W=Yy({originalFunction:t,argValues:ae,calleeEnv:b,callerEnv:o,context:a}),W&&x(S)){let ee=W.body?.$?.type;ee&&!x(ee)&&(S=ee,W.specializedType&&(W.specializedType={...W.specializedType,return:{...W.specializedType.return,type:ee}}))}if(W){let ee=new Set,Z=0;for(let se=0;se<n.parameters.length;se++)if(!n.parameters[se].isCompileTimeOnly){let re=ae.args[se]?.value;re&&ne(re)&&re.type.implicitParameters.some(Ie=>z(Ie.type)||ve(Ie.type))&&ee.add(Z),Z++}if(ee.size>0)for(let se=_.length-1;se>=0;se--)ee.has(se)&&_.splice(se,1)}}if(!l&&t&&ne(t)&&t.isControlFunction&&n.forallParameters.length>0&&!W&&(W=jy({originalFunction:t,argValues:ae,calleeEnv:b,callerEnv:o,context:a}),W&&x(S))){let ee=W.body?.$?.type;ee&&!x(ee)&&(S=ee,W.specializedType&&(W.specializedType={...W.specializedType,return:{...W.specializedType.return,type:ee}}))}let Se=Pi(o),Je;if(Se.length>0){let ee=qy({variablesToDrop:Se,env:o,context:a});Je=ee.deferredDropExpressions,o=ee.env}return{returnType:S,calleeEnv:b,callerEnv:o,pathCollection:O,argValues:ae,returnValue:K,specializedFunctionValue:W,runtimeArgExprsInOrder:_,deferredDropExpressions:Je}}function Yy({originalFunction:e,argValues:t,calleeEnv:n,callerEnv:r,context:i}){if(Oa){dr.specializeCount++;let P=e.funcName??e.funcId;dr.specializeNames.set(P,(dr.specializeNames.get(P)??0)+1)}let o=e.type,a=[],s=[];t.forallArgs&&a.push(...t.forallArgs.map(P=>P.value)),t.implicitArgs&&a.push(...t.implicitArgs.map(P=>P.value)),o.parameters.forEach((P,O)=>{let B=t.args[O];if(P.isCompileTimeOnly)B.value&&a.push(B.value);else if(B.value&&ne(B.value)&&B.value.type.implicitParameters.some(K=>z(K.type)||ve(K.type)))B.value&&a.push(B.value);else{let W=x(B.argType)&&B.argType.resolvedConcreteType&&!Ce(B.argType)?B.argType.resolvedConcreteType:B.argType;s.push({...P,type:W})}});let l=s.map(P=>P.type),u=e.specializedFunctionCaches.find(P=>P.compileTimeArgValues.length===a.length&&P.compileTimeArgValues.every((ae,K)=>{let W=a[K];return At({value:ae,env:P.env},{value:W,env:r})})?P.runtimeParameterTypes.length===l.length&&P.runtimeParameterTypes.every((ae,K)=>{let W=l[K];return q({type:ae,env:P.env},{type:W,env:r},!0)}):!1);if(u)return Oa&&dr.cacheHitCount++,u.specializedFunction;Oa&&dr.cacheMissCount++;let c=n;for(let P of r.frames)for(let O of P.variables){if(!O.isCompileTimeOnly||X(c,O.name).length>0)continue;let{env:ae}=fe({env:c,variable:{...O},allowVariableShadowing:!0});c=ae}for(let P of s){let O=X(c,P.label);if(O.length>0){let B=O[O.length-1],ae={...B,value:void 0};c=Be(c,B,ae)}}let f=xe(e.body),{returnType:p,calleeEnv:_}=di({functionType:o,calleeEnv:c,context:{...i,isEvaluatingFunctionType:!0},functionCalleeExpr:void 0});c=_;let m=i.enclosingFunctionReturnType,g=t.implicitArgs?.some(P=>ne(P.value)&&P.value.isControlFunction||ze(P.value)&&Hp(P.value.type,P.value))??!1,h=vt({expr:f,env:c,context:{...i,expectedType:{type:p,env:c},isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:o,value:e,evaluationEnv:c},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 P=0;P<o.implicitParameters.length;P++){let O=o.implicitParameters[P];if(z(O.type)){let B=t.implicitArgs?.[v];(B&&ne(B.value)?B.value:void 0)?.isControlFunction&&d.push({handlerArgIndex:v,label:O.label,type:O.type,fromSpread:!1}),v+=1}else if(O.isEffectRowSpread){let B=O.type;if(x(B)){let K=X(c,O.label).at(-1)?.value?.[0];if(K&&D(K)&&rt(K.value))B=K.value;else{let W=Ot(c,B);W&&(B=W)}}if(rt(B)){for(let ae=0;ae<B.implicitParameters.length;ae++){let K=B.implicitParameters[ae];if(z(K.type)){let W=t.implicitArgs?.[v+ae];(W&&ne(W.value)?W.value:void 0)?.isControlFunction&&d.push({handlerArgIndex:v+ae,label:K.label,type:K.type,fromSpread:!0})}else if(ve(K.type)){let W=t.implicitArgs?.[v+ae],de=W&&ze(W.value)?W.value:void 0,me=[],he=(H,Q,oe)=>{for(let Ae=0;Ae<H.fields.length;Ae++){let pe=H.fields[Ae];if(z(pe.type)){let Se=oe?.fields[Ae];if(Se&&ne(Se)&&Se.isControlFunction){let Je=Se.specializedType??pe.type;me.push({path:[...Q,pe.label],type:Je})}}else if(ve(pe.type)){let Se=oe?.fields[Ae];he(pe.type,[...Q,pe.label],Se&&ze(Se)?Se:void 0)}}};he(K.type,[],de);for(let H of me)d.push({handlerArgIndex:v+ae,label:K.label,type:H.type,fromSpread:!0,effectFieldPath:H.path})}}v+=B.implicitParameters.length}else v+=1}else if(ve(O.type)){let B=[],ae=t.implicitArgs?.[v],K=(W,de,me)=>{for(let he=0;he<W.fields.length;he++){let H=W.fields[he];if(z(H.type)){let Q=me?.fields[he];if(Q&&ne(Q)&&Q.isControlFunction){let oe=Q.specializedType??H.type;B.push({path:[...de,H.label],type:oe})}}else if(ve(H.type)){let Q=me?.fields[he];K(H.type,[...de,H.label],Q&&ze(Q)?Q:void 0)}}};K(O.type,[],ae&&ze(ae.value)?ae.value:void 0);for(let W of B)d.push({handlerArgIndex:v,label:O.label,type:W.type,fromSpread:!1,effectFieldPath:W.path});v+=1}else v+=1}let T=[];for(let P of d){let O=Wp(h,P.label,P.type,!0,P.effectFieldPath);if(O.hasEffects){let B=t.implicitArgs?.[P.handlerArgIndex],ae,K=P.effectFieldPath;if(B&&ne(B.value))ae=B.value;else if(B&&ze(B.value)&&K&&K.length>0){let W=B.value;for(let de of K){if(!ze(W)){W=void 0;break}let me=W.type.fields.findIndex(he=>he.label===de);if(me<0||!W.fields[me]){W=void 0;break}W=W.fields[me]}W&&ne(W)&&(ae=W)}if(ae){let W=ae,de=P.type,me=!W.body.$;if(!me&&W.isControlFunction&&F(W.body)&&W.body.args.length>0&&!W.body.args[0]?.$&&(me=!0),me&&z(de)&&de.forallParameters.length>0&&O.effectCallPoints.length>0){let he=new Map,H=de.return.type,Q=O.effectCallPoints[0].operationResultType;if(x(H)&&he.set(H.name,Q),he.size===0&&de.forallParameters.length===1){let ee=de.forallParameters[0];he.set(ee.label,Q)}let oe=xe(W.body),Ae=W.body.$?.env??c;Ae=Oe(Ae);for(let ee of de.forallParameters){let Z=he.get(ee.label);Z&&(Ae=fe({env:Ae,variable:{name:ee.label,type:ee.type,isCompileTimeOnly:!0,value:[J(Z)],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0}).env)}let pe=W.specializedType??W.type,Se=W.definitionSiteEnclosingFunctionType?.return.type??Sn(),Je={...i,expectedType:void 0,enclosingFunctionReturnType:Se,isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:pe,value:W,evaluationEnv:Ae}};try{let ee=Wr({expr:oe,env:Ae,context:Je}),Z=pe.parameters.map(re=>{if(re.isCompileTimeOnly)return re;if(x(re.type)){let Ie=he.get(re.type.name);if(Ie)return{...re,type:Ie}}return re}),se=pe.return.type;if(x(se)){let re=he.get(se.name);re&&(se=re)}let le={...pe,parameters:Z,return:{...pe.return,type:se}},Te={...W,body:ee,specializedType:le};O.handlerValue=Te,O.effectParameterType=le;for(let re of O.effectCallPoints)re.isTransitiveEffectCall&&(re.operationArgTypes=re.operationArgTypes.map(Ie=>x(Ie)?he.get(Ie.name)??Ie:Ie))}catch(ee){if(F(W.body)&&W.body.args.length>0&&!W.body.args[0]?.$)throw ee;O.handlerValue=W}}else O.handlerValue=W}else B&&(O.handlerValue=B.value);T.push({analysis:O,ctlParam:P})}}if(T.length===1)h.$.effectAnalysis=T[0].analysis;else if(T.length>1){let P=[],O=new Map,B=new Map,ae=[];for(let de=0;de<T.length;de++){let{analysis:me}=T[de];ae.push({effectParameterName:me.effectParameterName,effectParameterType:me.effectParameterType,effectFieldPath:me.effectFieldPath,handlerValue:me.handlerValue,operationArgTypes:me.effectCallPoints.length>0?me.effectCallPoints[0].operationArgTypes:[],operationResultType:me.effectCallPoints.length>0?me.effectCallPoints[0].operationResultType:{tag:"unit"}});for(let he of me.effectCallPoints)P.push({...he,effectIndex:de});for(let he of me.capturedVariables)O.has(he.id)||O.set(he.id,he);for(let[he,H]of me.variableIdRemapping)B.set(he,H)}if(F(h)&&E(h,I.begin)){let de=h.args,me=new Map;for(let H=0;H<de.length;H++)me.set(de[H],H);let he=H=>{for(let Q=0;Q<de.length;Q++)if(gl(de[Q],H.expr))return Q;return 999};P.sort((H,Q)=>he(H)-he(Q))}for(let de=0;de<P.length;de++)P[de].index=de;let K=T[0].analysis,W={effectCallPoints:P,capturedVariables:Array.from(O.values()),hasEffects:!0,variableIdRemapping:B,effectParameterName:K.effectParameterName,effectParameterType:K.effectParameterType,effectFieldPath:K.effectFieldPath,handlerValue:K.handlerValue,effectHandlerInfos:ae};h.$.effectAnalysis=W}let $=[],C=P=>{if(D(P)){let O=P.value;if(!O.typeName&&O.id)return`${De(P)}_id${O.id}`}return ne(P)?`fn_${P.funcId}`:De(P)};o.forallParameters.forEach((P,O)=>{if(O<t.forallArgs.length){let B=t.forallArgs[O];$.push(te(C(B.value)))}else{let B=P.label,ae=X(n,B);ae.length>0&&ae[ae.length-1]?.value?.[0]?$.push(te(C(ae[ae.length-1].value[0]))):$.push("unknown")}}),o.parameters.forEach((P,O)=>{if(P.isCompileTimeOnly&&O<t.args.length){let B=t.args[O];B?$.push(te(C(B.value))):$.push("unknown")}}),t.implicitArgs&&t.implicitArgs.forEach(P=>{$.push(te(C(P.value)))}),s.forEach((P,O)=>{let B=P.type;(!B.typeName&&B.id||Fe(B))&&$.push(`rtparam${O}_${te(A(B))}_id${B.id}`)});let L=$.join("_"),b=[];for(let P of o.implicitParameters)if(P.isEffectRowSpread){let O=P.type;if(x(O)){if(t.forallArgs){for(let B=0;B<o.forallParameters.length;B++)if(o.forallParameters[B].label===O.name&&B<t.forallArgs.length){let K=t.forallArgs[B].value;D(K)&&rt(K.value)&&(O=K.value);break}}if(x(O)&&O.resolvedConcreteType&&rt(O.resolvedConcreteType)&&(O=O.resolvedConcreteType),x(O)){let B=X(c,O.name);if(B.length>0){let K=B[B.length-1].value?.[0];K&&D(K)&&rt(K.value)&&(O=K.value)}}}rt(O)&&b.push(...O.implicitParameters)}else ve(P.type)&&b.push(P);let R=ai({forallParameters:[],parameters:s,implicitParameters:b.length>0?b:void 0,variadicParameter:void 0,return_:{...o.return,type:p},parametersFrame:c.frames[c.frames.length-1],env:o.env,SelfType:o.SelfType}),S={...e,specializedType:R,body:h,isControlFunction:e.isControlFunction||jn(h),funcId:`${e.funcId}_${L}`,funcName:`${e.funcName}_${L}`,calledComptimeFunctionCaches:[],specializedFunctionCaches:[]},G={funcId:e.funcId,compileTimeArgValues:a,runtimeParameterTypes:l,specializedFunction:S,env:h.$.env};return e.specializedFunctionCaches=[...e.specializedFunctionCaches,G],S}function jy({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??Sn(),s=te(A(o)),l=e.specializedFunctionCaches.find(d=>d.specializedFunction.funcId===`${e.funcId}_ctl_${s}`);if(l)return l.specializedFunction;let u=Oe(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:$}=fe({env:u,variable:{...v},allowVariableShadowing:!0});u=$}for(let d of i.forallParameters){let v=o,{env:T}=fe({env:u,variable:{name:d.label,type:d.type,isCompileTimeOnly:!0,value:[J(v)],token:ie,initializedAtToken:ie,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});u=T}let c=xe(e.body),f={...r,expectedType:void 0,enclosingFunctionReturnType:a,isEvaluatingFunctionBodyOrAsyncBlock:{kind:"function-body",type:i,value:e,evaluationEnv:u},functionReturnImplConcreteType:[]},p=Wr({expr:c,env:u,context:f}),_={...e,body:p,isControlFunction:e.isControlFunction||jn(p),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=>x(d)&&m.has(d)?o:d,h=ai({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 _.specializedType=h,e.specializedFunctionCaches=[...e.specializedFunctionCaches,{funcId:e.funcId,compileTimeArgValues:[],runtimeParameterTypes:[],specializedFunction:_,env:p.$?.env??u}],_}function Ky({returnType:e,expr:t,env:n,context:r}){if(r.isEvaluatingFunctionType||r.expectedType)return;let i=Xa(e);for(let o of i){if(Ce(o)||Yt(o)||o.resolvedConcreteType||o.requiredTraits&&o.requiredTraits.length>0)continue;if(!X(n,o.name).length){let s=un(n,()=>!0),l=!1;for(let u of s)if(D(u.value?.[0])){let c=u.value[0].value,f=Xa(c);for(let p of f)if(p.name===o.name){l=!0;break}if(l)break}if(l)continue;throw y({token:t?.token??ie,errorMessage:`Failed to infer the function call return type.
|
|
10808
10808
|
Please consider providing the expected type.`})}}}function gl(e,t){if(e===t)return!0;if(e.tag==="FnCall"){if(gl(e.func,t))return!0;for(let n of e.args)if(gl(n,t))return!0}return!1}function Yp({expr:e,env:t,context:n}){let r=e.args[0],i=N({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:`Failed to evaluate the argument expression for Iso:
|
|
10809
10809
|
${w(r)}`});if(t=i.$.env,!D(i.$.value))throw y({token:r.token,errorMessage:`Iso expects a type as argument, but got:
|
|
10810
10810
|
${w(r)}`});let a=i.$.value.value,s=yu(a,t);t=Kl({isoType:s,env:t,context:n});let l=J(s);return e.$={env:t,type:l.type,value:l,pathCollection:[]},e}function jp({expr:e,env:t,context:n,isoType:r}){let i=e.args[0],o=N({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:
|
|
@@ -10835,7 +10835,7 @@ ${w(_)}`});if(_){let d=_.token.value,v=e.find(T=>T.label===d);if(v){if(v.assigne
|
|
|
10835
10835
|
${Ni(v)}`});f=v}else throw y({token:p.token,errorMessage:`Failed to find "${d}" in the type.`})}if(a.has(f))throw y({token:p.token,errorMessage:`Type member "${f.label}" is already implemented.`});let m=e.indexOf(f),g=N({expr:p,env:r,context:{...i,expectedType:{type:f.type,env:r}}});if(!g.$)throw y({token:p.token,errorMessage:`Failed to evaluate argument expression:
|
|
10836
10836
|
${w(p)}`});zt(g,i),r=g.$.env;let h=g.$.type;if(Qr(f.type,r)||(h=dt({type:h,expectedType:f.type,expr:g,env:r})),_&&(_.$=g.$),!q({type:f.type,env:r},{type:h,env:r}))throw y({token:p.token,errorMessage:`Type mismatch for type member "${f.label}":
|
|
10837
10837
|
Expected: ${A(f.type)}
|
|
10838
|
-
Got: ${A(h)}`});s[m]=g.$?.value,l[m]=g,a.add(f)}if(!o)for(let c=0;c<e.length;c++){let f=e[c];if(!a.has(f)){if(!f.defaultValue&&!f.assignedValue)throw y({token:t.token,errorMessage:`Type member "${f.label}" is not provided and has no default value or assigned value.`});s[c]=f.defaultValue??f.assignedValue,l[c]=f.exprs.defaultValueExpr??f.exprs.assignedValueExpr}}return{values:s,pathCollection:[],callerEnv:r,runtimeArgExprsInOrder:l}}function Xy(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 c=i[u];return D(l)&&D(c)?q({type:l.value,env:s.env},{type:c.value,env:t},!0):At({value:l,env:s.env},{value:c,env:t})}));if(o&&D(o.value)&&!(x(o.value.value)&&o.value.value.recursiveTypeRef))return o.value.value;if(n?.SelfType&&ct(n.SelfType)||n?.SelfType&&ce(n.SelfType))return n.SelfType;let a=r.calledComptimeFunctionCaches.find(s=>!(!D(s.value)||x(s.value.value)&&s.value.value.recursiveTypeRef));if(a&&D(a.value))return a.value.value}function Mn({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=N({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,C=D($);if(U(s)){let L=s.token.value;if(C){let b=$.value;l=Bu({env:t,context:n,methodName:L,type:b}).map(S=>({type:S.type,value:S.value,args:a}))}else l=Ys({env:t,context:n,methodName:L,receiverType:T,isInfixOperatorCall:!1}).map(R=>{let S;if(R.needsPointerConversion){let G={tag:"Atom",token:v.token,$:void 0};G.token={...v.token,value:"&",type:"identifier"},S=[{tag:"FnCall",func:G,args:[v],token:v.token,$:void 0},...a]}else S=[v,...a];return{type:R.type,value:R.value,needsPointerConversion:R.needsPointerConversion,args:S}})}else{let L=N({expr:s,env:t,context:{...n}});L.$?.env&&(t=L.$?.env),s=L;let b=s.$?.type,R=s.$?.value;if(!b)throw y({token:s.token,errorMessage:"Expected to be a function."});l=[{type:b,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||x(v.type))return xp({expr:e,env:t,context:n});l=[{type:kt(v.type),value:J(v.type)}],o.$={env:t,type:l[0].type,value:l[0].value,pathCollection:[]}}else if(
|
|
10838
|
+
Got: ${A(h)}`});s[m]=g.$?.value,l[m]=g,a.add(f)}if(!o)for(let c=0;c<e.length;c++){let f=e[c];if(!a.has(f)){if(!f.defaultValue&&!f.assignedValue)throw y({token:t.token,errorMessage:`Type member "${f.label}" is not provided and has no default value or assigned value.`});s[c]=f.defaultValue??f.assignedValue,l[c]=f.exprs.defaultValueExpr??f.exprs.assignedValueExpr}}return{values:s,pathCollection:[],callerEnv:r,runtimeArgExprsInOrder:l}}function Xy(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 c=i[u];return D(l)&&D(c)?q({type:l.value,env:s.env},{type:c.value,env:t},!0):At({value:l,env:s.env},{value:c,env:t})}));if(o&&D(o.value)&&!(x(o.value.value)&&o.value.value.recursiveTypeRef))return o.value.value;if(n?.SelfType&&ct(n.SelfType)||n?.SelfType&&ce(n.SelfType))return n.SelfType;let a=r.calledComptimeFunctionCaches.find(s=>!(!D(s.value)||x(s.value.value)&&s.value.value.recursiveTypeRef));if(a&&D(a.value))return a.value.value}function Mn({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=N({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,C=D($);if(U(s)){let L=s.token.value;if(C){let b=$.value;l=Bu({env:t,context:n,methodName:L,type:b}).map(S=>({type:S.type,value:S.value,args:a}))}else l=Ys({env:t,context:n,methodName:L,receiverType:T,isInfixOperatorCall:!1}).map(R=>{let S;if(R.needsPointerConversion){let G={tag:"Atom",token:v.token,$:void 0};G.token={...v.token,value:"&",type:"identifier"},S=[{tag:"FnCall",func:G,args:[v],token:v.token,$:void 0},...a]}else S=[v,...a];return{type:R.type,value:R.value,needsPointerConversion:R.needsPointerConversion,args:S}})}else{let L=N({expr:s,env:t,context:{...n}});L.$?.env&&(t=L.$?.env),s=L;let b=s.$?.type,R=s.$?.value;if(!b)throw y({token:s.token,errorMessage:"Expected to be a function."});l=[{type:b,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||x(v.type))return xp({expr:e,env:t,context:n});l=[{type:kt(v.type),value:J(v.type)}],o.$={env:t,type:l[0].type,value:l[0].value,pathCollection:[]}}else if(Zn(d)&&e.isInfix){let v=a[0];if(!v)throw y({token:o.token,errorMessage:`Expected first argument for operator, got:
|
|
10839
10839
|
${w(o)}`});let $=N({expr:v,env:t,context:{...n,expectedType:void 0}}).$?.type;if(!$)throw y({token:v.token,errorMessage:"Expected to be evaluated."});let C=d;s=o,l=Ys({env:t,context:n,methodName:C,receiverType:$,isInfixOperatorCall:!0}).map(b=>({type:b.type,value:b.value,needsPointerConversion:b.needsPointerConversion}))}else if(d==="Call"&&n.SelfType){let v=J(n.SelfType);l=[{type:v.type,value:v}]}else{let v=N({expr:o,env:t,context:{...n}});if(o=v,!v.$)throw y({token:o.token,errorMessage:"Failed to evaluate the callee:"});if(ve(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 C=T.fields[$];if(C.assignedValue){let L=C.assignedValue;dn(L)?l=L.fields.map(b=>({type:b.type,value:b})):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&&z(l[0].type)&&l[0].type.return.isCompileTimeOnly&&!l[0].type.return.isUnquote&&!qe(l[0].type.return.type)&&l[0].type.forallParameters.length===0,p=l.length===1&&(z(l[0].type)||(x(l[0].type)||be(l[0].type))&&!!en(l[0].type))?l.map(d=>({...d,result:{kind:"function",result:void 0}})):l.map(d=>{let v=d.args??a;if(z(d.type))try{let T=Gr({functionValue:eo(d.value),functionType:d.type,expr:xe(e),functionCalleeExpr:o,argExprs:v.map($=>xe($)),callerEnv:Hs(t),context:{...n,isInFunctionCallCheckingPhase:!0},isMethodCall:!!s,skipSpecialization:!0,skipCtfeExecution:!0});return{...d,result:{kind:"function",result:T}}}catch(T){if(T instanceof pn&&T.kind==="overflow")throw at([{token:e.token,errorMessage:`Failed to call the function:
|
|
10840
10840
|
`},...T.tokenAndErrorList],T.isAssertionError);return{...d,result:{kind:"error",error:T}}}else if((x(d.type)||be(d.type))&&en(d.type)){let T=en(d.type);try{let $=Gr({functionValue:eo(d.value),functionType:T.isFn.callType,expr:xe(e),functionCalleeExpr:o,argExprs:v.map(C=>xe(C)),callerEnv:Hs(t),context:{...n,isInFunctionCallCheckingPhase:!0},isMethodCall:!!s,skipSpecialization:!0,skipCtfeExecution:!0});return{...d,result:{kind:"function",result:$}}}catch($){if($ instanceof pn&&$.kind==="overflow")throw at([{token:e.token,errorMessage:`Failed to call the function:
|
|
10841
10841
|
`},...$.tokenAndErrorList],$.isAssertionError);return{...d,result:{kind:"error",error:$}}}}else{let T=d.value;if(D(T)&&x(T.value)&&T.value.recursiveTypeRef){let $=Xy(T.value,t,n);$&&(T=J($),d.value=T,d.type=T.type)}if(D(T)&&ce(T.value))try{let $=Ra({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(D(T)&&ye(T.value)){let $=T.value,C=$.variants.find(L=>L.name===$.selectedVariantName);if(C)try{let L=Ra({typeFields:C.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(D(T)&&_t(T.value))try{let $=Ra({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(D(T)&&ve(T.value)){let $=T.value;try{let C=Kp({moduleExpr:o,moduleType:$,argExprs:v,callerEnv:t,context:{...n}});return{...d,result:{kind:"module-type",result:C}}}catch(C){return{...d,result:{kind:"error",error:C}}}}else if(D(T)&&Ve(T.value)){let $=T.value;if(v.some(L=>F(L)&&E(L,":=",2)))try{let L=Qp({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=Zp({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(D(T)&&z(T.value)){let $=T.value;try{return Pp({expr:e,functionType:$,callerEnv:t,context:{...n}}),{...d,result:{kind:"function-type"}}}catch(C){return{...d,result:{kind:"error",error:C}}}}else if(D(T)&&ke(T.value)){let $=T.value;try{return Op({expr:e,arrayType:$,argExprs:v,callerEnv:t,context:{...n}}),{...d,result:{kind:"array-type"}}}catch(C){return{...d,result:{kind:"error",error:C}}}}else if(D(T)&&xt(T.value)){let $=T.value;try{return zp({expr:e,comptimeListType:$,argExprs:v,callerEnv:t,context:{...n}}),{...d,result:{kind:"array-type"}}}catch(C){return{...d,result:{kind:"error",error:C}}}}else if(D(T)&&(x(T.value)||be(T.value))){let $=T.value,C=en($);if(C)try{return Up({expr:e,fnModuleType:C,wrapperType:$,callerEnv:t,context:{...n}}),{...d,result:{kind:"closure-type"}}}catch(L){return{...d,result:{kind:"error",error:L}}}else if(x($)&&$.recursiveTypeRef)try{let L=[];for(let b of v){let R=N({expr:b,env:t,context:{...n}});if(!R.$)throw y({token:b.token,errorMessage:"Failed to evaluate argument"});t=R.$.env,L.push(R)}return{...d,result:{kind:"type",result:{values:L.map(b=>b.$.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:
|
|
@@ -10874,7 +10874,7 @@ ${w(r)}`});t=i.$.env;let o=i.$?.variableName;if(!o)throw y({token:r.token,errorM
|
|
|
10874
10874
|
${w(i)}
|
|
10875
10875
|
|
|
10876
10876
|
Original expression:
|
|
10877
|
-
${w(r)}`});let a=i.$.type,l=x(a)&&a.resolvedConcreteType&&!Ce(a)?a.resolvedConcreteType:a;if(Le(l))if(we(l)){let u=Qy(i);if(u){let c=Qt(u);t=yn(i,t,!0);let f=N({expr:c,env:t,context:{...n}});return F(f)?(
|
|
10877
|
+
${w(r)}`});let a=i.$.type,l=x(a)&&a.resolvedConcreteType&&!Ce(a)?a.resolvedConcreteType:a;if(Le(l))if(we(l)){let u=Qy(i);if(u){let c=Qt(u);t=yn(i,t,!0);let f=N({expr:c,env:t,context:{...n}});return F(f)?(ar(e,f),e):f}else return t=yn(i,t,!0),e.$={env:t,type:j.type,value:j,pathCollection:[]},e}else if(ke(l)){let u=Zy(i);if(u){let c=Qt(u);t=yn(i,t,!0);let f=N({expr:c,env:t,context:{...n}});return F(f)?(ar(e,f),e):f}else return t=yn(i,t,!0),e.$={env:t,type:j.type,value:j,pathCollection:[]},e}else{if(x(l)&&!Ce(l))return t=yn(i,t,!0),e.$={env:t,type:j.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=yn(i,t,!0),e.$={env:t,type:j.type,value:void 0,pathCollection:[]},e}let c=Qt(`(${w(i)}).___drop()`),f=Mn({env:t,context:{...n},expr:c});if(!f.$?.env)throw y({token:e.token,errorMessage:`Failed to get updated environment after evaluating "${k.___drop[0]}" method call:
|
|
10878
10878
|
${w(c)}`});let _=X(f.$.env,o).at(-1);if(!_)throw y({token:e.token,errorMessage:`Variable "${o}" not found in environment after evaluating "${k.___drop[0]}" method call:
|
|
10879
10879
|
${w(c)}`});let m=Be(f.$.env,_,{..._,consumedAtToken:e.token});return f.$.env=m,f}}else return t=yn(i,t,!0),e.$={env:t,type:j.type,value:void 0,pathCollection:[]},e}function Jy(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:
|
|
10880
10880
|
${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(
|
|
@@ -10884,7 +10884,7 @@ ${w(e)}`});let n=e.$.type.fields.map((i,o)=>({index:o,element:i,needsDup:Le(i.ty
|
|
|
10884
10884
|
${w(e)}`});let t=e.$.type,n=t.childType;if(!Le(n))return"";if(Re(t.length)){let r=t.length.value;return`begin(
|
|
10885
10885
|
${Array.from({length:Number(r)},(i,o)=>`${k.__yo_dup_array_element[0]}(${e.$?.variableName}, ${o})`).join(", ")}
|
|
10886
10886
|
)`}else return""}function e_({expr:e,env:t,context:n}){ge(e,k.___dup,1);let r=e.args[0],i=N({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:`Failed to evaluate the argument expression for "${k.___dup[0]}":
|
|
10887
|
-
${w(r)}`});t=i.$.env;let o=i.$.type,a=x(o)&&o.resolvedConcreteType?o.resolvedConcreteType:o;if(Le(a))if(we(a)){let s=Jy(i);if(s){let l=Qt(s),u=N({expr:l,env:t,context:{...n}});return F(u)?(
|
|
10887
|
+
${w(r)}`});t=i.$.env;let o=i.$.type,a=x(o)&&o.resolvedConcreteType?o.resolvedConcreteType:o;if(Le(a))if(we(a)){let s=Jy(i);if(s){let l=Qt(s),u=N({expr:l,env:t,context:{...n}});return F(u)?(ar(e,u),e):u}else return e.$={env:t,type:i.$.type,value:void 0,pathCollection:[]},e}else if(ke(a)){let s=eg(i);if(s){let l=Qt(s),u=N({expr:l,env:t,context:{...n}});return F(u)?(ar(e,u),e):u}else return e.$={env:t,type:i.$.type,value:void 0,pathCollection:[]},e}else{if(x(a)&&!Ce(a))return e.$={env:t,type:i.$.type,value:void 0,pathCollection:[]},e;{let s=Qt(`(${w(i)}).___dup()`),l=Mn({env:t,context:{...n},expr:s}),u=l.$?.variableName;if(!u||!l.$)throw y({token:e.token,errorMessage:`Failed to evaluate the "${k.___dup[0]}" method call:
|
|
10888
10888
|
${w(s)}`});let c=X(l.$.env,u);if(c.length){let f=c[c.length-1];if(f.isOwningTheRcValue){let p=Be(l.$.env,f,{...f,isOwningTheRcValue:!1});l.$.env=p}}return l}}return e.$={env:t,type:i.$.type,value:void 0,pathCollection:[]},e}function t_({expr:e,env:t,context:n}){ge(e,k.__yo_expr_is_atom,1);let r=e.args[0],i=N({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}":
|
|
10889
10889
|
${w(r)}`});if(!Lt(i.$.type))throw y({token:r.token,errorMessage:`Expected expression type for "${e.func.token.value}" argument, got:
|
|
10890
10890
|
${w(r)}`});let o=i.$.value;if(!o)throw y({token:r.token,errorMessage:`Expected expression value for "${e.func.token.value}" argument, got:
|
|
@@ -10945,10 +10945,10 @@ ${w(e)}`});let r=e.args[0],i=e.args[1],o=U(i)&&i.token.value==="_",a=N({expr:r,e
|
|
|
10945
10945
|
${w(r)}`});if(!D(a.$.value))throw y({token:r.token,errorMessage:`Expected type for element type, got:
|
|
10946
10946
|
${w(r)}
|
|
10947
10947
|
|
|
10948
|
-
If you are creating an array value with 1 element, please consider adding a "," in the end, like [1,]`});let s=a.$.value.value;if(o){let p=`_array_length_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,_=Y(yt(),{variableName:p,env:a.$.env,context:n}),{env:m}=fe({env:a.$.env,variable:{name:p,value:[_],type:yt(),isCompileTimeOnly:!0,token:i.token,initializedAtToken:i.token,consumedAtToken:void 0,isOwningTheRcValue:!1}}),g=
|
|
10948
|
+
If you are creating an array value with 1 element, please consider adding a "," in the end, like [1,]`});let s=a.$.value.value;if(o){let p=`_array_length_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,_=Y(yt(),{variableName:p,env:a.$.env,context:n}),{env:m}=fe({env:a.$.env,variable:{name:p,value:[_],type:yt(),isCompileTimeOnly:!0,token:i.token,initializedAtToken:i.token,consumedAtToken:void 0,isOwningTheRcValue:!1}}),g=sr(s,_),h=J(g);return e.$={env:m,type:h.type,value:h,pathCollection:[]},e}let l=N({expr:i,env:t,context:{...n,expectedType:{type:yt(),env:t}}});if(!l.$)throw y({token:i.token,errorMessage:`Failed to evaluate the length expression:
|
|
10949
10949
|
${w(i)}`});if(!q({type:yt(),env:t},{type:l.$.type,env:t}))throw y({token:i.token,errorMessage:`Expected usize for length, got:
|
|
10950
10950
|
${w(i)}`});let u=l.$.value;if(!u)throw y({token:i.token,errorMessage:`Expected compile-time known value for length, got:
|
|
10951
|
-
${w(i)}`});_e(u)&&(u.type=yt());let c=
|
|
10951
|
+
${w(i)}`});_e(u)&&(u.type=yt());let c=sr(s,u),f=J(c);return e.$={env:l.$.env,type:f.type,value:f,pathCollection:[]},e}function z_({expr:e,env:t,context:n}){return Na({expr:e,env:t,context:n})}function B_({expr:e,env:t,context:n}){ge(e,I.ComptimeList,1);let r=e.args[0],i=N({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:`Failed to evaluate the element type expression:
|
|
10952
10952
|
${w(r)}`});if(!D(i.$.value))throw y({token:r.token,errorMessage:`Expected type for element type, got:
|
|
10953
10953
|
${w(r)}`});let o=i.$.value.value,a=To(o),s=J(a);return e.$={env:i.$.env,type:s.type,value:s,pathCollection:[]},e}function G_({expr:e,env:t,context:n}){if(e.args.length!==1)throw y({token:e.token,errorMessage:`Concrete type constructor expects exactly 1 argument, got ${e.args.length}. Usage: Concrete(T)`});let r=e.args[0],i=N({expr:r,env:t,context:{...n}});if(!i.$)throw y({token:r.token,errorMessage:`Failed to evaluate the concrete type expression for Concrete:
|
|
10954
10954
|
${w(r)}`});if(t=i.$.env,!D(i.$.value))throw y({token:r.token,errorMessage:`Concrete type constructor expects a type as its argument, but got:
|
|
@@ -10987,7 +10987,7 @@ ${w(e)}`});return to({expr:e,env:t,context:n})}function Q_({expr:e,env:t,context
|
|
|
10987
10987
|
${w(r)}`});if(!D(i.$.value))throw y({token:r.token,errorMessage:`Expected type for element type, got:
|
|
10988
10988
|
${w(r)}
|
|
10989
10989
|
|
|
10990
|
-
If you are creating an array value with 1 element, please consider adding a "," in the end, like [1,]`});let o=i.$.value.value,a=_a(o),s=J(a);return e.$={env:i.$.env,type:s.type,value:s,pathCollection:[]},e}function J_({lhsExpr:e,env:t,context:n,selfType:r}){if(U(e)&&e.token.value==="Self")return{env:t,someType:r,isSelf:!0};if(U(e)){let a=e.token.value,s=X(t,a);if(s.length>0){let f=s[s.length-1];if(f.value&&D(f.value[0])&&x(f.value[0].value))return{env:t,someType:f.value[0].value,isSelf:!1}}let l=En(et(),a,{env:t,context:n}),u=J(l),{env:c}=fe({env:t,variable:{name:a,type:kt(l),isCompileTimeOnly:!0,value:[u],token:e.token,initializedAtToken:e.token,consumedAtToken:void 0,isOwningTheRcValue:!1,isOwningTheSameRcValueAs:void 0,isReassignable:!1},allowVariableShadowing:!0});return{env:c,someType:l,isSelf:!1}}let i=N({expr:e,env:t,context:{...n,SelfType:r}});if(!i.$||!i.$.value||!D(i.$.value))throw y({token:e.token,errorMessage:"Expected type for left-hand side of where clause constraint."});let o=i.$.value;if(!x(o.value))throw y({token:e.token,errorMessage:`Expected SomeType for left-hand side of where clause constraint, got ${A(o.value)}`});return{env:i.$.env,someType:o.value,isSelf:!1}}function cg({lhsExpr:e,traitExpr:t,env:n,context:r,selfType:i,traitType:o}){let a=!1,s=t;F(t)&&E(t,"!")&&t.args.length===1&&(a=!0,s=t.args[0]);let l;try{l=J_({lhsExpr:e,env:n,context:r,selfType:i})}catch{return{env:n,success:!1}}n=l.env;let u;try{u=N({expr:s,env:n,context:{...r,SelfType:i}})}catch{return{env:n,success:!1}}if(!u.$||!u.$.value||!D(u.$.value))return{env:n,success:!1};n=u.$.env;let c=u.$.value;if(!Ve(c.value))throw y({token:s.token,errorMessage:`Expected trait type for right-hand side of where clause constraint, got: ${A(c.value)}`});let f=c.value;if(f.receiverType)throw y({token:s.token,errorMessage:"Trait type in where clause already has a receiver type assigned."});if(l.isSelf&&(o.selfConstraints||(o.selfConstraints=[]),o.negativeSelfConstraints||(o.negativeSelfConstraints=[]),a?o.negativeSelfConstraints.push(f):o.selfConstraints.push(f)),!l.isSelf){let p=n.frames.length-1;a?l.someType.negativeTraits.some(_=>_.traitType.id===f.id)||l.someType.negativeTraits.push({traitType:f,frameLevel:p}):l.someType.requiredTraits.some(_=>_.traitType.id===f.id)||l.someType.requiredTraits.push({traitType:f,frameLevel:p})}return n=
|
|
10990
|
+
If you are creating an array value with 1 element, please consider adding a "," in the end, like [1,]`});let o=i.$.value.value,a=_a(o),s=J(a);return e.$={env:i.$.env,type:s.type,value:s,pathCollection:[]},e}function J_({lhsExpr:e,env:t,context:n,selfType:r}){if(U(e)&&e.token.value==="Self")return{env:t,someType:r,isSelf:!0};if(U(e)){let a=e.token.value,s=X(t,a);if(s.length>0){let f=s[s.length-1];if(f.value&&D(f.value[0])&&x(f.value[0].value))return{env:t,someType:f.value[0].value,isSelf:!1}}let l=En(et(),a,{env:t,context:n}),u=J(l),{env:c}=fe({env:t,variable:{name:a,type:kt(l),isCompileTimeOnly:!0,value:[u],token:e.token,initializedAtToken:e.token,consumedAtToken:void 0,isOwningTheRcValue:!1,isOwningTheSameRcValueAs:void 0,isReassignable:!1},allowVariableShadowing:!0});return{env:c,someType:l,isSelf:!1}}let i=N({expr:e,env:t,context:{...n,SelfType:r}});if(!i.$||!i.$.value||!D(i.$.value))throw y({token:e.token,errorMessage:"Expected type for left-hand side of where clause constraint."});let o=i.$.value;if(!x(o.value))throw y({token:e.token,errorMessage:`Expected SomeType for left-hand side of where clause constraint, got ${A(o.value)}`});return{env:i.$.env,someType:o.value,isSelf:!1}}function cg({lhsExpr:e,traitExpr:t,env:n,context:r,selfType:i,traitType:o}){let a=!1,s=t;F(t)&&E(t,"!")&&t.args.length===1&&(a=!0,s=t.args[0]);let l;try{l=J_({lhsExpr:e,env:n,context:r,selfType:i})}catch{return{env:n,success:!1}}n=l.env;let u;try{u=N({expr:s,env:n,context:{...r,SelfType:i}})}catch{return{env:n,success:!1}}if(!u.$||!u.$.value||!D(u.$.value))return{env:n,success:!1};n=u.$.env;let c=u.$.value;if(!Ve(c.value))throw y({token:s.token,errorMessage:`Expected trait type for right-hand side of where clause constraint, got: ${A(c.value)}`});let f=c.value;if(f.receiverType)throw y({token:s.token,errorMessage:"Trait type in where clause already has a receiver type assigned."});if(l.isSelf&&(o.selfConstraints||(o.selfConstraints=[]),o.negativeSelfConstraints||(o.negativeSelfConstraints=[]),a?o.negativeSelfConstraints.push(f):o.selfConstraints.push(f)),!l.isSelf){let p=n.frames.length-1;a?l.someType.negativeTraits.some(_=>_.traitType.id===f.id)||l.someType.negativeTraits.push({traitType:f,frameLevel:p}):l.someType.requiredTraits.some(_=>_.traitType.id===f.id)||l.someType.requiredTraits.push({traitType:f,frameLevel:p})}return n=Kn({env:n,someType:l.someType,traitType:f,isNegated:a}),{env:n,success:!0}}function Z_({constraintExprs:e,env:t,context:n,selfType:r,traitType:i,collectPendingTraits:o=!1}){let a=[];for(let s of e){if(!F(s)||!E(s,"<:",2))throw y({token:s.token,errorMessage:`Expected constraint in the form "T <: Trait" or "T <: (Trait1, Trait2)", got: ${w(s)}`});let l=s.args[0],u=s.args[1],c;try{c=J_({lhsExpr:l,env:t,context:n,selfType:r})}catch{if(o){a.push({lhsExpr:l,traitExpr:u,originalConstraintExpr:s});continue}throw y({token:l.token,errorMessage:"Expected type for left-hand side of where clause constraint."})}t=c.env;let f=[];F(u)&&E(u,I.tuple)?f.push(...u.args):f.push(u);for(let p of f){let _=!1,m=p;F(p)&&E(p,"!")&&p.args.length===1&&(_=!0,m=p.args[0]);let g;try{g=N({expr:m,env:t,context:{...n,SelfType:r,SelfTraitType:i}})}catch(v){if(o){a.push({lhsExpr:l,traitExpr:p,originalConstraintExpr:s});continue}throw v}if(!g.$||!g.$.value||!D(g.$.value)){if(o){a.push({lhsExpr:l,traitExpr:p,originalConstraintExpr:s});continue}throw y({token:m.token,errorMessage:"Expected trait type for right-hand side of where clause constraint."})}t=g.$.env;let h=g.$.value;if(!Ve(h.value))throw y({token:m.token,errorMessage:`Expected trait type for right-hand side of where clause constraint, got: ${A(h.value)}`});let d=h.value;if(d.receiverType)throw y({token:m.token,errorMessage:"Trait type in where clause already has a receiver type assigned."});c.isSelf&&(i.selfConstraints||(i.selfConstraints=[]),i.negativeSelfConstraints||(i.negativeSelfConstraints=[]),_?i.negativeSelfConstraints.push(d):i.selfConstraints.push(d)),t=Kn({env:t,someType:c.someType,traitType:d,isNegated:_})}}return{env:t,pendingTraits:a}}function fg({expr:e,traitFieldIndex:t,env:n,context:r,isForEvaluatingTraitType:i}){let o,a=e,s,l,u,c,f,p,_;if(F(e)&&E(e,"?=",2)&&(u=e.args[1],a=e.args[0]),F(a)&&(E(a,"=",2)||E(a,"::",2)||E(a,":=",2))){if(E(a,"::",2))throw y({token:a.token,errorMessage:`Cannot use "::" for trait field. Use ":=" instead.
|
|
10991
10991
|
All trait fields are compile-time only by default.`});f=a.args[1],a=a.args[0]}if(u&&f)throw y({token:e.token,errorMessage:"Cannot have both default value and required value for trait field."});if(F(a)&&E(a,":",2)){if(s=a.args[0],l=a.args[1],F(s)&&E(s,I.comptime,1))throw y({token:s.token,errorMessage:'No need to use "comptime" modifier. All trait fields are compile-time only by default.'});if(!U(s)&&!Ye(s))throw y({token:s.token,errorMessage:`Expected identifier for tuple field label, got ${w(s)}`});o=s.token.value}else{if(F(a)&&E(a,I.comptime,1))throw y({token:a.token,errorMessage:'No need to use "comptime" modifier. All trait fields are compile-time only by default.'});if(!u&&!f)throw y({token:e.token,errorMessage:`Expected label for trait field, got ${w(a)}`});if(s=a,!Ye(s))throw y({token:s.token,errorMessage:`Expected identifier for trait field label, got ${w(s)}`});if(!U(s)&&!Ye(s))throw y({token:s.token,errorMessage:`Expected identifier for trait field label, got ${w(s)}`});o=s.token.value}let m=r.expectedType?.type,g;if(m&&Ve(m)){let d=m.fields[t];if(!d)throw y({token:e.token,errorMessage:`Failed to get the field at index ${t}`});g=d.type}if(l){let d=N({expr:l,env:n,context:{...r,expectedType:g?{type:g,env:n}:void 0}});d.$?.env&&(n=d.$?.env);let v=d.$?.value;if(!D(v))throw y({token:l.token,errorMessage:`Expected type for trait field, got ${w(l)}`});_=v.value}if(f){let d=_?{type:_,env:n}:g?{type:g,env:n}:void 0,v=N({expr:f,env:n,context:{...r,expectedType:d}});if(!v.$)throw y({token:f.token,errorMessage:`Failed to evaluate required value expression: ${w(f)}`});if(n=v.$?.env,p=v.$.value,!p)throw y({token:f.token,errorMessage:`Expected compile-time known value for required value, got ${w(f)}`});let T=v.$.type;if(d){if(!q({type:d.type,env:n},{type:T,env:n}))throw y({token:f.token,errorMessage:`Assigned value type mismatch:
|
|
10992
10992
|
Expected type: ${A(d.type)}
|
|
10993
10993
|
Given type: ${A(T)}`});_=d.type}else _=T}if(u){let d=_?{type:_,env:n}:g?{type:g,env:n}:void 0,v=N({expr:u,env:n,context:{...r,expectedType:d}});if(!v.$)throw y({token:u.token,errorMessage:`Failed to evaluate default value expression: ${w(u)}`});if(n=v.$.env,c=v.$?.value,!c)throw y({token:u.token,errorMessage:`Expected compile-time known value for default value, got ${w(u)}`});let T=v.$.type;if(d){if(!q({type:d.type,env:n},{type:T,env:n}))throw y({token:u.token,errorMessage:`Default value type mismatch:
|
|
@@ -11010,23 +11010,23 @@ ${w(e)}`});let c=e.args[0],f=e.args[1],p=[];F(c)&&E(c,I.tuple)?p=c.args:p=[c];le
|
|
|
11010
11010
|
Expected: "${oe.label}"
|
|
11011
11011
|
Got: "${Ae}"`})}for(let H=0;H<i.forallParameters.length;H++){let Q=_[H],oe=i.forallParameters[H],{env:Ae}=fe({env:t,variable:{name:oe.label,type:oe.type,isCompileTimeOnly:oe.isCompileTimeOnly,value:[Y(oe.type,{variableName:oe.label,env:t,context:n})],token:Q?.token??ie,initializedAtToken:Q?.token??ie,consumedAtToken:void 0,isOwningTheRcValue:!1},allowVariableShadowing:!0});t=Ae,Q&&(Q.$={env:t,type:oe.type,value:Y(oe.type,{variableName:oe.label,env:t,context:n}),pathCollection:[]})}let d=i.implicitParameters.some(H=>H.isEffectRowSpread),v,T;if(d&&m.length>0){v=[];for(let H of m)if(F(H)&&E(H,":",2)){let Q=H.args[0],oe=H.args[1];if(!U(Q))throw y({token:Q.token,errorMessage:`Expected identifier for effect name, got ${w(Q)}`});let Ae=Q.token.value,pe=N({expr:xe(oe),env:h,context:{...n,isEvaluatingFunctionType:!0}});if(!pe.$?.value||!D(pe.$.value))throw y({token:oe.token,errorMessage:`Expected a type for effect parameter "${Ae}", got ${w(oe)}`});let Se=pe.$.value.value;v.push({label:Ae,type:Se,isCompileTimeOnly:!0,isImplicit:!0,isOwningTheRcValue:!1,isQuote:!1,exprs:{expr:H,labelExpr:Q,typeExpr:oe,defaultValueExpr:void 0}})}else if(U(H)){let Q=H.token.value,Ae=X(h,Q).at(-1);if(!Ae)throw y({token:H.token,errorMessage:`Variable "${Q}" not found. Cannot infer type for using() parameter.`});v.push({label:Q,type:Ae.type,isCompileTimeOnly:!0,isImplicit:!0,isOwningTheRcValue:!1,isQuote:!1,exprs:{expr:H,labelExpr:H,typeExpr:H,defaultValueExpr:void 0}})}else throw y({token:H.token,errorMessage:`Expected "name : Type" or identifier in using(), got ${w(H)}`});T=$r(v);for(let H of i.implicitParameters)H.isEffectRowSpread&&x(H.type)&&H.type.isEffectsRow&&(H.type.resolvedConcreteType=T)}else if(m.length>0){let H=[];for(let oe of m)if(F(oe)&&E(oe,":",2)){let Ae=oe.args[0],pe=oe.args[1];if(!U(Ae))throw y({token:Ae.token,errorMessage:`Expected identifier for effect name, got ${w(Ae)}`});let Se=N({expr:xe(pe),env:h,context:{...n,isEvaluatingFunctionType:!0}});if(!Se.$?.value||!D(Se.$.value))throw y({token:pe.token,errorMessage:`Expected a type for effect parameter "${Ae.token.value}", got ${w(pe)}`});H.push({name:Ae.token.value,type:Se.$.value.value,nameExpr:Ae})}else if(U(oe))H.push({name:oe.token.value,type:void 0,nameExpr:oe});else throw y({token:oe.token,errorMessage:`Expected "name : Type" or identifier in using(), got ${w(oe)}`});if(H.some(oe=>oe.type!==void 0)){if(H.length!==i.implicitParameters.length)throw y({token:e.token,errorMessage:`Effect row mismatch: closure declares ${H.length} effects, but call site resolved ${i.implicitParameters.length} effects.`});let oe=new Set,Ae=[];for(let pe=0;pe<H.length;pe++){let Se=H[pe];if(!Se.type){Ae.push({...i.implicitParameters[pe],label:Se.name,exprs:{...i.implicitParameters[pe].exprs,expr:Se.nameExpr,labelExpr:Se.nameExpr}}),oe.add(pe);continue}let Je=!1;for(let ee=0;ee<i.implicitParameters.length;ee++){if(oe.has(ee))continue;let Z=i.implicitParameters[ee];if(q({type:Se.type,env:h},{type:Z.type,env:h})){Ae.push({...Z,label:Se.name,exprs:{...Z.exprs,expr:Se.nameExpr,labelExpr:Se.nameExpr}}),oe.add(ee),Je=!0;break}}if(!Je)throw y({token:Se.nameExpr.token,errorMessage:`Effect row type mismatch for "${Se.name}": closure declares ${A(Se.type)}, but no matching resolved effect found.`})}v=Ae,T=$r(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 H=0;H<v.length;H++){let Q=v[H],oe=T?Q.exprs?.labelExpr:m[H],Ae=Q.label;oe&&U(oe)&&(Ae=oe.token.value);let pe;if(z(Q.type)){let se=i.implicitParameters[H]?.label,le=[Q.label];se&&se!==Q.label&&le.push(se);for(let Te of le){let re=X(h,Te),Ie=re[re.length-1];if(Ie?.value&&Ie.value.length>0){let $e=Ie.value[0];if($e&&ne($e)){pe=$e;break}}}if(!pe){let re=un(h,Ie=>Ie.isImplicit===!0&&Ie.isCompileTimeOnly===!0&&ne(Ie.value?.[0])&&q({type:Q.type,env:h},{type:Ie.type,env:h})).at(-1);re?.value?.[0]&&ne(re.value[0])&&(pe=re.value[0])}}let Se=pe||Y(Q.type,{variableName:Ae,env:t,context:n}),Je=n.isInsideIoAsyncCall&&o&&z(Q.type)&&!pe;if(Je&&$.push({name:Ae,type:Q.type,token:oe?.token??ie}),!Je&&n.isInsideIoAsyncCall&&o&&ve(Q.type)&&!pe){let se=Q.type;for(let le of se.fields)z(le.type)&&$.push({name:le.label,type:le.type,token:oe?.token??ie})}let{env:Z}=fe({env:t,variable:{name:Ae,type:Q.type,isCompileTimeOnly:!Je,isImplicit:!0,value:Je?void 0:[Se],token:oe?.token??ie,initializedAtToken:oe?.token??ie,consumedAtToken:void 0,isOwningTheRcValue:!1,isEffectParam:Je||void 0},allowVariableShadowing:!0});t=Z,oe&&(oe.$={env:t,type:Q.type,value:Je?void 0:Se,pathCollection:[]})}for(let H=0;H<g.length;H++){let Q=g[H],oe=i.parameters[H];if(oe.isCompileTimeOnly){if(!U(Q))throw y({token:Q.token,errorMessage:`Expected parameter name for compile-time parameter, got ${w(Q)}`});let Je=Q.token.value;if(Je!=="_"&&Je!==oe.label)throw y({token:Q.token,errorMessage:`Compile-time parameter name must match expected name.
|
|
11012
11012
|
Expected: "${oe.label}"
|
|
11013
|
-
Got: "${Je}"`})}let Ae=Q.token.value,pe=oe.label,{env:Se}=fe({env:t,variable:{name:Ae,type:oe.type,isCompileTimeOnly:oe.isCompileTimeOnly,value:oe.isCompileTimeOnly?[Y(oe.type,{variableName:oe.label,env:t,context:n})]:void 0,token:Q.token,initializedAtToken:Q.token,consumedAtToken:void 0,isOwningTheRcValue:oe.isOwningTheRcValue,parameterAlias:Ae!==pe?pe:void 0}});t=Se,Q.$={env:t,type:oe.type,value:oe.isCompileTimeOnly?Y(oe.type,{variableName:oe.label,env:t,context:n}):void 0,pathCollection:[]}}let C=t.frames[t.frames.length-1],L={...i,forallParameters:i.forallParameters,implicitParameters:T?v:v.map((H,Q)=>{let oe=m[Q];if(oe&&U(oe)){let Ae=oe.token.value;if(Ae!==H.label)return{...H,label:Ae}}return H}),parameters:i.parameters.map((H,Q)=>{if(H.isCompileTimeOnly)return H;{let oe=g[Q];return{...H,label:U(oe)?oe.token.value:H.label,exprs:{...H.exprs,expr:oe,labelExpr:oe,typeExpr:H.exprs.typeExpr,defaultValueExpr:void 0}}}}),return:{...i.return,typeExpr:i.return.typeExpr},parametersFrame:C,env:ka(i.env)};if(L.whereClauseExprs?.length){let H=L.whereClauseExprs.map(oe=>xe(oe));t=Br({constraintExprs:H,env:t,context:{...n,isEvaluatingFunctionType:!0}}).env}let b={tag:"Function",type:L,body:f,frameLevel:t.frames.length-1,funcId:`fn_${Ge(t.modulePath)}`,definitionSiteEnclosingFunctionType:n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"?n.isEvaluatingFunctionBodyOrAsyncBlock.type:void 0,calledComptimeFunctionCaches:[],specializedFunctionCaches:[]},R=!!a,S=_.length>0||i.parameters.some(H=>Fe(H.type))||i.SelfType&&Fe(i.SelfType),G,P;if(S)yl({functionBodyExpr:f,functionType:i,functionValue:b,env:t,context:n}),f.$={env:t,type:i.return.type,value:i.return.isCompileTimeOnly?Y(i.return.type,{variableName:"function_body",env:t,context:n}):void 0,pathCollection:[]},G={...n,isExecuting:!1,capturedVariables:new Map},P=f;else{let{evaluationContext:H}=Ji({...n,isExecuting:!1,isValidatingFunctionDefinition:!1},i,b,t);if(G=H,n.isInsideIoAsyncCall&&o&&(G={...G,isEvaluatingFunctionBodyOrAsyncBlock:{kind:"async-block",evaluationEnv:t}}),P=vt({expr:f,env:t,context:G,variablesToAdd:[],isEvaluatingFunctionBodyBeginBlock:!0}),!P.$)throw y({token:f.token,errorMessage:"Failed to evaluate the function body."});t=P.$.env}let O=G.capturedVariables;if(
|
|
11013
|
+
Got: "${Je}"`})}let Ae=Q.token.value,pe=oe.label,{env:Se}=fe({env:t,variable:{name:Ae,type:oe.type,isCompileTimeOnly:oe.isCompileTimeOnly,value:oe.isCompileTimeOnly?[Y(oe.type,{variableName:oe.label,env:t,context:n})]:void 0,token:Q.token,initializedAtToken:Q.token,consumedAtToken:void 0,isOwningTheRcValue:oe.isOwningTheRcValue,parameterAlias:Ae!==pe?pe:void 0}});t=Se,Q.$={env:t,type:oe.type,value:oe.isCompileTimeOnly?Y(oe.type,{variableName:oe.label,env:t,context:n}):void 0,pathCollection:[]}}let C=t.frames[t.frames.length-1],L={...i,forallParameters:i.forallParameters,implicitParameters:T?v:v.map((H,Q)=>{let oe=m[Q];if(oe&&U(oe)){let Ae=oe.token.value;if(Ae!==H.label)return{...H,label:Ae}}return H}),parameters:i.parameters.map((H,Q)=>{if(H.isCompileTimeOnly)return H;{let oe=g[Q];return{...H,label:U(oe)?oe.token.value:H.label,exprs:{...H.exprs,expr:oe,labelExpr:oe,typeExpr:H.exprs.typeExpr,defaultValueExpr:void 0}}}}),return:{...i.return,typeExpr:i.return.typeExpr},parametersFrame:C,env:ka(i.env)};if(L.whereClauseExprs?.length){let H=L.whereClauseExprs.map(oe=>xe(oe));t=Br({constraintExprs:H,env:t,context:{...n,isEvaluatingFunctionType:!0}}).env}let b={tag:"Function",type:L,body:f,frameLevel:t.frames.length-1,funcId:`fn_${Ge(t.modulePath)}`,definitionSiteEnclosingFunctionType:n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"?n.isEvaluatingFunctionBodyOrAsyncBlock.type:void 0,calledComptimeFunctionCaches:[],specializedFunctionCaches:[]},R=!!a,S=_.length>0||i.parameters.some(H=>Fe(H.type))||i.SelfType&&Fe(i.SelfType),G,P;if(S)yl({functionBodyExpr:f,functionType:i,functionValue:b,env:t,context:n}),f.$={env:t,type:i.return.type,value:i.return.isCompileTimeOnly?Y(i.return.type,{variableName:"function_body",env:t,context:n}):void 0,pathCollection:[]},G={...n,isExecuting:!1,capturedVariables:new Map},P=f;else{let{evaluationContext:H}=Ji({...n,isExecuting:!1,isValidatingFunctionDefinition:!1},i,b,t);if(G=H,n.isInsideIoAsyncCall&&o&&(G={...G,isEvaluatingFunctionBodyOrAsyncBlock:{kind:"async-block",evaluationEnv:t}}),P=vt({expr:f,env:t,context:G,variablesToAdd:[],isEvaluatingFunctionBodyBeginBlock:!0}),!P.$)throw y({token:f.token,errorMessage:"Failed to evaluate the function body."});t=P.$.env}let O=G.capturedVariables;if(jn(P)&&(b.isControlFunction=!0),P.$&&(i.implicitParameters.some(H=>ve(H.type))||n.isInsideIoAsyncCall)){let H=Cu(P);H.hasAwaits&&(P.$.awaitAnalysis=H)}let B=P.$?.type;if(x(i.return.type)&&!i.return.type.resolvedConcreteType&&B&&!x(B)){let H=dt({type:B,expectedType:void 0,expr:P,env:t});i.return.type.resolvedConcreteType=H}if(!b.isControlFunction&&B&&!q({type:i.return.type,env:t},{type:B,env:t}))throw y({token:f.token,errorMessage:`Incompatible return type:
|
|
11014
11014
|
- Expected: ${A(i.return.type)}
|
|
11015
11015
|
- Got : ${A(B)}`});P.$?.env&&(t=P.$?.env),t=lt(t,!0),t=h;let ae;if(R&&O&&O.size>0&&(ae=Va({capturedVariables:O,env:t})),R&&$.length>0){ae||(ae=new Map);for(let H of $)ae.set(H.name,{frameLevel:0,usageType:"read",token:H.token,value:void 0,type:H.type,isEffectParam:!0})}let K,W,de,me,he=b;if((n.isAnalyzingCtfeCapability||n.forceCompileTimeBindings)&&!o){let H=ji(b,t,n);H&&(he=H)}if(o&&a&&s){me=xa({expectedCaptureType:void 0,capturedVariablesWithValues:ae,env:t,closureToken:e.token,context:{...n}}).captureType;let Q=hu(L,t),{capturedVariableDupExpressions:oe,env:Ae}=Da({capturedVariablesWithValues:ae,env:t,context:n});de=oe,t=Ae,b.funcId=`closure_${Ge(t.modulePath)}`,b.closureInfo={closureType:Q,captureType:me,effectParamNames:$.length>0?$.map(pe=>pe.name):void 0},x(s)&&me&&Sa({wrapperType:s,captureType:me,env:t,errorToken:e.token}),s.resolvedConcreteType=me,K={...s,resolvedConcreteType:me},W=void 0}else K=he.type,W=he;return e.$={env:t,type:K,value:W,pathCollection:R&&O?Zi(O):[],deferredDupExpressions:o&&de?de:void 0,captureType:o?me:void 0,closureFunctionValue:o?he:void 0,isAnonymousFunctionDefinition:!0},R&&Pe(e,!0),e}function rd({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 f=0;f<r.length;f++){let p=r[f],_=N({expr:p,env:t,context:{...n,expectedType:a?{type:a,env:t}:void 0}});if(zt(_,n),!_.$)throw y({token:p.token,errorMessage:`Failed to evaluate array element: ${w(p)}`});if(t=_.$.env,s.push(_.$.value),!o)o=a||_.$.type;else if(!q({type:o,env:t},{type:_.$.type,env:t}))if(q({type:dt({type:o,expectedType:void 0,expr:void 0,env:t}),env:t},{type:_.$.type,env:t}))o=_.$.type;else throw y({token:p.token,errorMessage:`Array element type mismatch:
|
|
11016
11016
|
Expected type: ${A(o)}
|
|
11017
|
-
Given type: ${A(_.$.type)}`});l.push(_)}let u=
|
|
11017
|
+
Given type: ${A(_.$.type)}`});l.push(_)}let u=sr(o,Ht("Usize",i)),c=s.every(f=>!!f)?Sr(u,s):void 0;return e.$={env:t,type:u,value:c,pathCollection:[],runtimeArgExprsInOrder:l},Pe(e,!0),e}function id(e,t){if(e.token.type==="bool"){let n=e.token.value==="true",r=ft(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 od(e,t){if(e.token.type==="char"){let n=_g(e.token.value),r=tr(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 _g(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 ad({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=N({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:
|
|
11018
11018
|
${w(l)}`});t=u.$.env;let c=u.$.value;if(r.push(c),!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=Pn(o,r);return e.$={env:t,type:a.type,value:a,pathCollection:[]},e}function sd(e,t,n){let i=X(t,"Box").find(_=>_.value&&ne(_.value[0])&&z(_.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=J(e),u=Oe(a.env),{env:c}=fe({env:u,variable:{name:s.label,token:ie,type:l.type,isCompileTimeOnly:!0,initializedAtToken:ie,consumedAtToken:void 0,value:[l],isOwningTheRcValue:!1}}),{value:f,callerEnv:p}=Xi({functionCalleeExpr:void 0,functionType:a,functionValue:o,argValues:{forallArgs:[],args:[{value:l,parameterType:s.type,argType:et()}],variadicArgs:[]},callerEnv:t,calleeEnv:c,context:n});if(!D(f)||!ct(f.value))throw new Error("Box type constructor did not return a type value");return{boxType:f.value,env:p}}function dg(e,t,n){try{let r=N({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):D(i)?!!i.value?.typeName?.startsWith("Box("):!1}catch{return!1}}function ld({expr:e,env:t,context:n}){ge(e,I.dyn,1);let r=e.args[0],i=n.expectedType,o;if(n.expectedType&&be(n.expectedType.type)){let h=n.expectedType.type;if(o=En(et(),"",{requiredTraits:h.requiredTraits.map(d=>d.traitType),negativeTraits:h.negativeTraits.map(d=>d.traitType),env:t,context:n}),F(r)&&dg(r.func,t,{...n})&&E(r.args[0],"=>")){let{boxType:d,env:v}=sd(o,t,n);t=v,i={type:d,env:t}}else i={type:o,env:n.expectedType.env}}else i=void 0;let a=N({expr:r,env:t,context:{...n,expectedType:i}});if(!a.$)throw y({token:r.token,errorMessage:`Failed to evaluate the value expression for 'dyn':
|
|
11019
11019
|
${w(r)}`});let s=a.$.type,l=s,u=a;if(!ct(l)&&!(x(l)&&Ce(l))){let{boxType:h,env:d}=sd(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},$=N({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':
|
|
11020
11020
|
${w(r)}`});t=$.$.env,l=$.$.type,u=$,e.args[0]=$}else t=a.$.env;zt(u,n),t=u.$.env;let c=[],f=[],p=new Set,_;if(n.expectedType&&be(n.expectedType.type))_=n.expectedType.type;else if(hn(l)){let h=l.fields[0].type;if(h.trait){let d=[];for(let v of h.trait.fields)v.assignedValue&&ht(v.assignedValue)&&d.push(v.assignedValue.type);_=ko({requiredTraits:d,negativeTraits:[],env:t}),t=$o({dynType:_,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&&ht(d.assignedValue)&&h.push(d.assignedValue.type);_=ko({requiredTraits:h,negativeTraits:[],env:t}),t=$o({dynType:_,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(hn(l)){let h=l.fields[0].type;(x(h)||be(h))&&m.push(...h.negativeTraits.map(d=>d.traitType)??[])}for(let{traitType:h}of _.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 _.requiredTraits)if(!p.has(h))if(hn(l)&&(x(l.fields[0].type)||be(l.fields[0].type))){let d=l.fields[0].type,v=!1,T=x(d)&&d.resolvedConcreteType?d.resolvedConcreteType:s!==l?s:void 0;if(T?.trait){for(let $ of T.trait.fields)if($.assignedValue&&ht($.assignedValue)&&q({type:h,env:t},{type:$.assignedValue.type,env:t})){f.push($.assignedValue),c.push($.assignedValue.type),p.add(h),v=!0;break}}if(!v){let $=d.requiredTraits.map(C=>C.traitType);for(let C of $)if(q({type:h,env:t},{type:C,env:t})){let L=[];for(let R=0;R<h.fields.length;R++){let S=h.fields[R],G=C.fields.findIndex(P=>P.label===S.label);G===-1?L.push(void 0):L.push(C.fields[G].assignedValue)}let b=Ti(h,L);f.push(b),c.push(b.type),p.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=hn(l)?l.fields[0].type:l;if(d.trait){let v=!1;for(let T of d.trait.fields)if(T.assignedValue&&ht(T.assignedValue)&&q({type:h,env:t},{type:T.assignedValue.type,env:t})){f.push(T.assignedValue),c.push(T.assignedValue.type),p.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 _.requiredTraits){let d=c.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(f[d])}return e.$={env:t,value:void 0,type:_,pathCollection:a.$.pathCollection,dynCallTraitValues:g},Pe(e,!0),e}function ud(e,t,n){if(e.token.type==="float"){let r=parseFloat(e.token.value),i="ComptimeFloat";if(n.expectedType){let a=n.expectedType.type;go(a)?i="F32":ho(a)&&(i="F64")}let o=Ht(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 cd(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;so(u)?o="Usize":lo(u)?o="Isize":Wn(u)?o="U8":uo(u)?o="I8":co(u)?o="U16":fo(u)?o="I16":po(u)?o="U32":_o(u)?o="I32":mo(u)?o="U64":yo(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=Ht(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 fd(e,t){if(e.token.type==="string"){let n=nn(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 mg({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 _=a.args[0];throw y({token:_.token,errorMessage:"Labelled field is not allowed in tuple value."})}let u=r.expectedType?.type,c;if(u){if(!we(u))throw y({token:e.token,errorMessage:`(2) Failed to evaluate the tuple fields. Expected type to be:
|
|
11021
11021
|
${A(u)}`});let _=u.fields[t];if(!_)throw y({token:e.token,errorMessage:`Failed to get the tuple field at index ${t}`});c=_.type}let f=N({expr:s,env:n,context:{...r,expectedType:c?{type:c,env:n}:void 0}});if(zt(f,r),!f.$)throw y({token:s.token,errorMessage:`Failed to evaluate the tuple field: ${w(s)}`});n=f.$.env;let p=f.$.value;if(p&&D(f.$.value))throw y({token:s.token,errorMessage:`Cannot store a type value in tuple, please use module instead:
|
|
11022
11022
|
${w(s)}`});return!c||!Qr(c,n)?l=dt({type:f.$.type,expectedType:void 0,expr:void 0,env:n}):l=f.$.type,o.push(f),e!==s&&(e.$={env:n,type:l,value:p,pathCollection:[]}),{type:{exprs:{expr:e,labelExpr:void 0,typeExpr:void 0,defaultValueExpr:void 0,assignedValueExpr:void 0},type:l,label:i.toString()},value:p,env:n}}function yg({args:e,env:t,context:n}){let r=[],i=[],o=[];for(let l=0;l<e.length;l++){let u=e[l],{type:c,value:f,env:p}=mg({expr:u,env:t,tupleFieldIndex:l,context:{...n},elementIndex:l,runtimeArgExprsInOrder:o});r.push(c),i.push(f),t=p}let a=da(r),s=i.some(l=>!l)?void 0:na(a,i);return{type:a,value:s,env:t,runtimeArgExprsInOrder:o}}function pd({expr:e,env:t,context:n}){if(!E(e,I.tuple))throw y({token:e.token,errorMessage:`Expected tuple, got ${e.tag}`});if(e.args.length===0)return e.$={env:t,value:j,type:j.type,pathCollection:[]},e;let{type:r,value:i,env:o,runtimeArgExprsInOrder:a}=yg({args:e.args,env:t,context:n});return t=o,r.fields.forEach(s=>{if(s.exprs.defaultValueExpr)throw y({token:s.exprs.defaultValueExpr.token,errorMessage:"Tuple value field cannot have default value."});if(s.exprs.labelExpr)throw y({token:s.exprs.labelExpr.token,errorMessage:"Tuple value field cannot have labels."})}),e.$={env:t,value:i,type:r,pathCollection:[],runtimeArgExprsInOrder:a},Pe(e,!0),e}function za({expr:e,env:t,context:n}){if(!E(e,":",2))throw y({token:e.token,errorMessage:'Expected ":" for variable binding.'});let r=e.args[0],i=e.args[1],o=N({expr:i,env:t,context:{...n}});if(!o.$)throw y({token:i.token,errorMessage:`Failed to evaluate rhs expression:
|
|
11023
11023
|
${w(i)}`});t=o.$.env;let a=o.$.value;if(!D(a))throw y({token:i.token,errorMessage:`Expected type for rhs, got ${w(i)}`});let s=a.value;if(ke(s)&&_e(s.length))throw y({token:i.token,errorMessage:`Array type with inferred length '_' is not allowed in type annotations.
|
|
11024
|
-
Use explicit length like 'Array(i32, 3)' or omit the type annotation and initialize with 'arr := Array(i32, _)(1, 2, 3)'`});vr(s,o.token);let l=!1,u=!1;if(F(r)&&E(r,I.comptime)){if(l=!0,r.args.length!==1)throw y({token:r.token,errorMessage:`Expected one argument for "comptime" , got ${r.args.length}`});r=r.args[0]}if(F(r)&&E(r,I.given)){if(r.args.length!==1)throw y({token:r.token,errorMessage:`Expected exactly one argument for "given", got ${r.args.length}`});u=!0,l=!0,r=r.args[0]}if(l=l||n.forceCompileTimeBindings===!0,!l&&n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"&&n.isEvaluatingFunctionBodyOrAsyncBlock?.type.return.isCompileTimeOnly)throw y({token:r.token,errorMessage:"Unexpected runtime variable binding in a compile-time only function body."});if(!Ye(r))throw y({token:r.token,errorMessage:`Invalid binding to "${r.token.value}", expected identifier or operator`});if(
|
|
11025
|
-
${A(s)}`});if(
|
|
11024
|
+
Use explicit length like 'Array(i32, 3)' or omit the type annotation and initialize with 'arr := Array(i32, _)(1, 2, 3)'`});vr(s,o.token);let l=!1,u=!1;if(F(r)&&E(r,I.comptime)){if(l=!0,r.args.length!==1)throw y({token:r.token,errorMessage:`Expected one argument for "comptime" , got ${r.args.length}`});r=r.args[0]}if(F(r)&&E(r,I.given)){if(r.args.length!==1)throw y({token:r.token,errorMessage:`Expected exactly one argument for "given", got ${r.args.length}`});u=!0,l=!0,r=r.args[0]}if(l=l||n.forceCompileTimeBindings===!0,!l&&n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="function-body"&&n.isEvaluatingFunctionBodyOrAsyncBlock?.type.return.isCompileTimeOnly)throw y({token:r.token,errorMessage:"Unexpected runtime variable binding in a compile-time only function body."});if(!Ye(r))throw y({token:r.token,errorMessage:`Invalid binding to "${r.token.value}", expected identifier or operator`});if(rr(s,t)&&!l)throw y({token:r.token,errorMessage:`Expected "comptime" for compile-time known value binding:
|
|
11025
|
+
${A(s)}`});if(ir(s,t)&&l)throw y({token:r.token,errorMessage:`Unexpected "comptime" for ${A(s)} which can only be used at runtime.`});let c=r.token.value;if(!l&&z(s)&&On(s))throw y({token:r.token,errorMessage:`Runtime variables with generic function types are not allowed:
|
|
11026
11026
|
${A(s)}
|
|
11027
11027
|
|
|
11028
11028
|
Generic functions must be compile-time known to enable monomorphization. Consider using:
|
|
11029
|
-
comptime(${c}) : ${A(s)}`});let{env:f}=fe({env:t,variable:{name:c,type:s,isCompileTimeOnly:l,value:l?[Y(s,{variableName:c,env:t,context:n})]:void 0,token:r.token,initializedAtToken:void 0,consumedAtToken:void 0,isReassignable:!0,isOwningTheRcValue:Le(s),isImplicit:u}});return t=f,r.$={env:t,type:s,pathCollection:[[c]]},e.$={env:t,type:j.type,value:j,pathCollection:[]},{expr:e,variableExpr:r,variableName:c}}function Ba({expr:e,env:t,context:n,throwErrorOnUndefined:r}){let i=e.token.value;if(i==="Type"){let o=J(et());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="Module"){let o=J(_n(1));return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="Trait"){let o=J(_n(1));return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="unit"){let o=J(Sn());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="comptime_int"){let o=J(xr());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="comptime_float"){let o=J(Ei());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="comptime_string"){let o=J(Vt());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="bool"){let o=J(Ze());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="usize"){let o=J(yt());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="isize"){let o=J($i());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="u8"){let o=J(Ci());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="i8"){let o=J(bi());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="u16"){let o=J(ki());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="i16"){let o=J(wi());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="u32"){let o=J(Fi());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="i32"){let o=J(Vr());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="u64"){let o=J(Li());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="i64"){let o=J(Ai());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="f32"){let o=J(Ii());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="f64"){let o=J(Dr());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="char"){let o=J(ru());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="short"){let o=J(iu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="ushort"){let o=J(ou());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="int"){let o=J(au());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="uint"){let o=J(su());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="long"){let o=J(lu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="ulong"){let o=J(uu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="longlong"){let o=J(cu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="ulonglong"){let o=J(fu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="longdouble"){let o=J(pu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="void"){let o=J(_u());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="Expr"){let o=J(ln());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="Self"&&n.SelfType){let o=J(n.SelfType);return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="SelfTrait"&&n.SelfTraitType){let o=J(n.SelfTraitType);return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="SelfModule"&&n.SelfModuleType){let o=J(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&&!z(a.type)&&!D(a.value?.[0]))throw y({token:e.token,errorMessage:`Variable "${i}" is not initialized`});let s=a.type.isExtern==="c"&&_e(a.value?.[0])&&!(z(a.type)||qe(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&&Qi(a.name,a.frameLevel,"own",e.token,n)}if(n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="async-block"){let l=n.isEvaluatingFunctionBodyOrAsyncBlock.evaluationEnv.frames.length;a.frameLevel<l&&Qi(a.name,a.frameLevel,"own",e.token,n)}return e}else throw y({token:e.token,errorMessage:`Variable "${i}" not found.`})}}function Cl(e,t){let n=Hl(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 gg(e,t){if(ke(e)&&_e(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]&&!_e(i.value[0]))return
|
|
11029
|
+
comptime(${c}) : ${A(s)}`});let{env:f}=fe({env:t,variable:{name:c,type:s,isCompileTimeOnly:l,value:l?[Y(s,{variableName:c,env:t,context:n})]:void 0,token:r.token,initializedAtToken:void 0,consumedAtToken:void 0,isReassignable:!0,isOwningTheRcValue:Le(s),isImplicit:u}});return t=f,r.$={env:t,type:s,pathCollection:[[c]]},e.$={env:t,type:j.type,value:j,pathCollection:[]},{expr:e,variableExpr:r,variableName:c}}function Ba({expr:e,env:t,context:n,throwErrorOnUndefined:r}){let i=e.token.value;if(i==="Type"){let o=J(et());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="Module"){let o=J(_n(1));return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="Trait"){let o=J(_n(1));return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="unit"){let o=J(Sn());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="comptime_int"){let o=J(xr());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="comptime_float"){let o=J(Ei());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="comptime_string"){let o=J(Vt());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="bool"){let o=J(Ze());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="usize"){let o=J(yt());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="isize"){let o=J($i());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="u8"){let o=J(Ci());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="i8"){let o=J(bi());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="u16"){let o=J(ki());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="i16"){let o=J(wi());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="u32"){let o=J(Fi());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="i32"){let o=J(Vr());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="u64"){let o=J(Li());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="i64"){let o=J(Ai());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="f32"){let o=J(Ii());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="f64"){let o=J(Dr());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="char"){let o=J(ru());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="short"){let o=J(iu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="ushort"){let o=J(ou());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="int"){let o=J(au());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="uint"){let o=J(su());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="long"){let o=J(lu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="ulong"){let o=J(uu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="longlong"){let o=J(cu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="ulonglong"){let o=J(fu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="longdouble"){let o=J(pu());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="void"){let o=J(_u());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="Expr"){let o=J(ln());return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="Self"&&n.SelfType){let o=J(n.SelfType);return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="SelfTrait"&&n.SelfTraitType){let o=J(n.SelfTraitType);return e.$={env:t,type:o.type,value:o,pathCollection:[]},e}else if(i==="SelfModule"&&n.SelfModuleType){let o=J(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&&!z(a.type)&&!D(a.value?.[0]))throw y({token:e.token,errorMessage:`Variable "${i}" is not initialized`});let s=a.type.isExtern==="c"&&_e(a.value?.[0])&&!(z(a.type)||qe(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&&Qi(a.name,a.frameLevel,"own",e.token,n)}if(n.isEvaluatingFunctionBodyOrAsyncBlock?.kind==="async-block"){let l=n.isEvaluatingFunctionBodyOrAsyncBlock.evaluationEnv.frames.length;a.frameLevel<l&&Qi(a.name,a.frameLevel,"own",e.token,n)}return e}else throw y({token:e.token,errorMessage:`Variable "${i}" not found.`})}}function Cl(e,t){let n=Hl(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 gg(e,t){if(ke(e)&&_e(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]&&!_e(i.value[0]))return sr(e.childType,i.value[0])}}}return e}function _d({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=Ba({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}=za({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}".
|
|
11030
11030
|
You can mutate fields (e.g., ${o}.field = value) but cannot reassign itself.`});if(i=N({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,ei(i,t),Rr(i),zt(i,n),t=i.$.env,mt(i.$?.controlFlow)&&Cl(i,i.$.controlFlow);let l=i.$?.type;if(!l)try{let{expr:d,type:v,env:T}=Lr({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)}
|
|
11031
11031
|
${d}`})}if(s.isCompileTimeOnly||(l=dt({type:l,expectedType:s.type,expr:i,env:t})),!q({type:s.type,env:t},{type:l,env:t}))if(Si(s.type))try{let{expr:d,type:v,env:T}=Lr({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 $=gg(s.type,t);t=Be(t,s,{...s,type:$})}else throw y({token:r.token,errorMessage:`Incompatible types:
|
|
11032
11032
|
- Expected: ${A(s.type)}
|
|
@@ -11064,11 +11064,11 @@ ${c instanceof pn||c instanceof An?c.toString():c instanceof Error?c.message:Str
|
|
|
11064
11064
|
(${w(l)}) = ${w(a)}`});if(a=N({expr:a,env:t,context:{...n,expectedType:void 0,isInsideGivenHandler:s?!0:n.isInsideGivenHandler}}),a.$?.env&&(t=a.$?.env),a.$?.type&&vr(a.$.type,a.token),mt(a.$?.controlFlow)&&Cl(a,a.$.controlFlow),Rr(a),U(l)){if(ei(a,t),zt(a,{...n}),a.$?.env&&(t=a.$?.env),!Ye(l))throw y({token:l.token,errorMessage:`Invalid assignment to ${l.token.value}, expected identifier or operator`});let u=s||r,c=s?!1:i,f=a.$?.type;if(l.$?.type){try{let{expr:d,type:v,env:T}=Lr({expr:a,type:l.$?.type,env:t,context:{...n}});a=d,f=v,t=T}catch(d){throw y({token:a.token,errorMessage:`(evaluateInitializationAssignment) Failed to synthesize type for expression: ${w(a)}
|
|
11065
11065
|
${d}`})}if(!q({type:l.$.type,env:t},{type:f,env:t}))throw y({token:l.token,errorMessage:`Incompatible types:
|
|
11066
11066
|
- Defined: ${A(l.$.type)}
|
|
11067
|
-
- Given : ${A(f)}`})}else{if(!f)throw y({token:a.token,errorMessage:`Failed to evaluate, got ${w(a)}`});let d=f;c&&(d=dt({type:f,expectedType:void 0,expr:a,env:t})),l.$={...l.$,env:t,type:d,pathCollection:[]}}if(!u&&
|
|
11067
|
+
- Given : ${A(f)}`})}else{if(!f)throw y({token:a.token,errorMessage:`Failed to evaluate, got ${w(a)}`});let d=f;c&&(d=dt({type:f,expectedType:void 0,expr:a,env:t})),l.$={...l.$,env:t,type:d,pathCollection:[]}}if(!u&&rr(l.$.type,t))throw y({token:e.token,errorMessage:`Expected "::" instead of ":=" for compile-time known value assignment:
|
|
11068
11068
|
${w(e)}
|
|
11069
11069
|
|
|
11070
11070
|
Type:
|
|
11071
|
-
${A(l.$.type)}`});if(u&&
|
|
11071
|
+
${A(l.$.type)}`});if(u&&ir(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:
|
|
11072
11072
|
${w(e)}`});let p=a.$?.value;if(D(p)&&!p.value.typeName&&p.value!==n.SelfType?p.value.typeName=l.token.value:ne(p)&&!p.funcName?(p.funcName=l.token.value,p.funcId+=`_${l.token.value}`):(ze(p)||ht(p))&&!p.type.typeName&&p.type!==n.SelfType&&(p.type.typeName=l.token.value),s&&ne(p)&&(p.isModuleEffectMember=!0),!p&&u)throw y({token:l.token,errorMessage:`Expected compile-time value for "${l.token.value}".
|
|
11073
11073
|
Got runtime value. Please consider using ":=" instead of "::":
|
|
11074
11074
|
${w(a)}`});l.$={...l.$,env:t,type:l.$.type,value:u?p?rn(p):Y(l.$.type,{variableName:l.token.value,env:t,context:n}):void 0,pathCollection:[]};let _=l.$.type;x(_)&&f&&x(f)&&f.resolvedConcreteType&&(_={..._,resolvedConcreteType:f.resolvedConcreteType},l.$.type=_);let m=Fo(a,t,t.modulePath),g=m;m?.consumedAtToken&&(g=void 0);let{env:h}=fe({env:t,variable:{name:l.token.value,type:_,isCompileTimeOnly:u,value:l.$.value?[l.$.value]:void 0,token:l.token,initializedAtToken:l.token,consumedAtToken:void 0,isOwningTheRcValue:Le(_),isOwningTheSameRcValueAs:g,isReassignable:!s,isImplicit:s}});return t=h,l.$.env=t,s&&(o.$={env:t,value:j,type:j.type,pathCollection:[]}),e.$={env:t,value:j,type:j.type,pathCollection:[],isCompileTimeOnlyAssignment:u},e}else{let u=s||r,{env:c,runtimeDestructurings:f}=bd({lhs:l,rhs:a,env:t,isCompileTimeOnly:s||r,context:{...n}});return t=c,e.$={env:t,value:j,type:j.type,pathCollection:[],runtimeDestructurings:f,isCompileTimeOnlyAssignment:u},e}}function kg(e){return F(e)?E(e,"|",2):!1}function Ll(e){if(!kg(e))return[e];let t=e,n=t.args[0],r=t.args[1];return[...Ll(n),...Ll(r)]}function wg(e){return Ir(e)||Nr(e)||qn(e)||gn(e)||gt(e)||St(e)||Ft(e)}function wd({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)?N({expr:i,env:t,context:{...n,expectedType:void 0}}):vt({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(Ne(a)?(u=a.childType,l=a.tag):u=a,wg(u))return Fg({expr:e,env:t,context:n,scrutineeExpr:o,scrutineeType:u,scrutineeValue:s});if(!ye(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 c=u,f=r.slice(1),p=[],_,m=new Set,g=!1,h=!1,d=[],v=[];for(let $=0;$<f.length;$++){let C=f[$],L=t;if(!F(C)||!E(C,"=>",2))throw y({token:C.token,errorMessage:`Expected ":" for match pattern, got ${w(C)}`});let b=C.args[0],R=C.args[1];if(F(b)&&E(b,".",1)||Et(b,"_")){if(h)throw y({token:b.token,errorMessage:'Wildcard pattern "_" can only be used once and must be the last match arm in a "match" expression.'});let S;if(F(b)){if(S=b.args[0],!U(S))throw y({token:b.token,errorMessage:`Expected identifier for enum variant, got ${w(S)}`})}else h=!0,S=b;let G=S.token.value,P=c.variants.find(de=>de.name===G);if(!P&&G!=="_")throw y({token:b.token,errorMessage:`Enum variant "${G}" not found in ${A(c)}`});if(P&&P.fields&&P.fields.length>0)throw y({token:b.token,errorMessage:`Enum variant "${G}" has ${P.fields.length} field(s) and must be destructured. Use .${G}(...) instead of .${G}`});if(m.add(G),G!=="_"&&It(s)&&s.variantName!==G)continue;let O={...c,selectedVariantName:G==="_"?void 0:G};S.$={env:L,type:O,value:void 0,pathCollection:[]};let B=O;l&&l==="Ptr"&&(B=si(O));let ae=R;L=Oe(L),b.$={env:L,type:B,value:void 0,pathCollection:[],caseExecuted:!0};let K=vt({expr:ae,env:L,context:{...n,isExecuting:It(s)&&s.variantName===G},variablesToAdd:[]});if(!K.$?.type)throw y({token:ae.token,errorMessage:`Expected type for match result expression, got ${w(ae)}`});let W=lt(K.$.env,!0);if(L=W,K.$={...K.$,env:W},n.expectedType&&!q(n.expectedType,{type:K.$.type,env:K.$.env}))throw y({token:K.token,errorMessage:`Incompatible type with expected type:
|
|
@@ -11103,7 +11103,7 @@ ${w(e)}`});if(E(e,".",1)){let s=e.args[0];if(!U(s)&&!Ye(s))throw y({token:s.toke
|
|
|
11103
11103
|
${w(s)}`});let l=n.expectedType?.type;if(!ye(l))throw y({token:e.token,errorMessage:"Failed to infer enum variant type."});let u=s.token.value,c=l,f=c.variants.find(_=>_.name===u);if(!f)throw y({token:s.token,errorMessage:`Enum variant "${u}" not found in enum`});let p={...c,selectedVariantName:u};if(!f.fields)e.$={env:t,type:p,value:Kr(p,u,[]),pathCollection:[]},s.$={env:t,type:p,pathCollection:[]};else{let _=J(p);e.$={env:t,value:_,type:_.type,pathCollection:[]},s.$=e.$}return e}if(!E(e,".",2))throw y({token:e.token,errorMessage:`Expected "." with 2 arguments, got:
|
|
11104
11104
|
${w(e)}`});let r=e.args[0],i=e.args[1];if(r=N({expr:r,env:t,context:{...n,expectedType:void 0}}),r.$?.env&&(t=r.$?.env),U(i)&&i.token.value==="*"){if(Ne(r.$?.type)){let s=r.$.type,l=s.childType;x(l)&&(l=Ot(t,l));let u=r.$?.value;if(vi(u)){let c=u.targetValue[0],f;return Rn(c)?f=c.elements[u.targetIndex]:f=c,e.$={env:t,type:l,value:f,originType:s,isAccessingProperty:!0,pathCollection:[],sourceVariable:r.$.sourceVariable},e.$.ptrTargetValue=u.targetValue,e.$.ptrTargetIndex=u.targetIndex,i.$=e.$,e}if(_e(u)){let c=Y(l,{variableName:u.variableName?`${u.variableName}.*`:void 0,env:t,context:n});return e.$={env:t,type:l,value:c,originType:s,isAccessingProperty:!0,pathCollection:[]},i.$=e.$,e}return e.$={env:t,type:l,value:void 0,originType:s,isAccessingProperty:!0,pathCollection:[]},i.$=e.$,Pe(e,!1),e}if(Tt(r.$?.type)){let s=r.$.type,l=s.childType;return x(l)&&(l=Ot(t,l)),e.$={env:t,type:l,value:void 0,originType:s,isAccessingProperty:!0,pathCollection:[]},i.$=e.$,Pe(e,!1),e}}if(D(r.$?.value)){let s=r.$.value;if(ye(s.value)){if(!U(i))throw y({token:i.token,errorMessage:`Expected identifier for enum variant, got:
|
|
11105
11105
|
${w(i)}`});{let p=i.token.value,_=s.value.trait.fields.find(m=>m.label===p);if(_)return e.$={env:t,type:_.type,value:_.assignedValue,pathCollection:[],isAccessingProperty:!0},i.$=e.$,e}let l=i.token.value,u=s.value,c=u.variants.find(p=>p.name===l);if(!c)throw y({token:i.token,errorMessage:`Enum variant "${l}" not found in enum`});let f={...u,selectedVariantName:l};if(!c.fields)e.$={env:t,type:f,value:Kr(f,l,[]),isAccessingProperty:!0,pathCollection:[]},i.$=e.$;else{let p=J(f);e.$={env:t,type:p.type,value:p,isAccessingProperty:!0,pathCollection:[]},i.$=e.$}return e}else if(s.value.trait){if(!Ye(i))throw y({token:i.token,errorMessage:`Expected identifier for type method, got:
|
|
11106
|
-
${w(i)}`});let l=i.token.value,u=s.value.trait.fields.findLast(c=>c.label===l);if(u){if(u.assignedValue){let c=u.assignedValue.type;return e.$={env:t,type:c,value:u.assignedValue,pathCollection:[],isAccessingProperty:!0},i.$=e.$,e}if(u.unassignedSomeType){let c=J(u.unassignedSomeType);return e.$={env:t,type:c.type,value:c,pathCollection:[],isAccessingProperty:!0},i.$=e.$,e}return e.$={env:t,type:u.type,value:void 0,pathCollection:[],isAccessingProperty:!0},i.$=e.$,e}else{for(let p of s.value.trait.fields)if(p.label===""&&p.assignedValue&&ht(p.assignedValue)){let _=p.assignedValue,m=_.type,g=m.fields.findIndex(h=>h.label===l);if(g>=0){let h=m.fields[g],d=_.fields[g];if(z(h.type))continue;if(d)return e.$={env:t,type:d.type,value:d,pathCollection:[],isAccessingProperty:!0},i.$=e.$,e;if(h.unassignedSomeType){let v=J(h.unassignedSomeType);return e.$={env:t,type:v.type,value:v,pathCollection:[],isAccessingProperty:!0},i.$=e.$,e}}}let c=
|
|
11106
|
+
${w(i)}`});let l=i.token.value,u=s.value.trait.fields.findLast(c=>c.label===l);if(u){if(u.assignedValue){let c=u.assignedValue.type;return e.$={env:t,type:c,value:u.assignedValue,pathCollection:[],isAccessingProperty:!0},i.$=e.$,e}if(u.unassignedSomeType){let c=J(u.unassignedSomeType);return e.$={env:t,type:c.type,value:c,pathCollection:[],isAccessingProperty:!0},i.$=e.$,e}return e.$={env:t,type:u.type,value:void 0,pathCollection:[],isAccessingProperty:!0},i.$=e.$,e}else{for(let p of s.value.trait.fields)if(p.label===""&&p.assignedValue&&ht(p.assignedValue)){let _=p.assignedValue,m=_.type,g=m.fields.findIndex(h=>h.label===l);if(g>=0){let h=m.fields[g],d=_.fields[g];if(z(h.type))continue;if(d)return e.$={env:t,type:d.type,value:d,pathCollection:[],isAccessingProperty:!0},i.$=e.$,e;if(h.unassignedSomeType){let v=J(h.unassignedSomeType);return e.$={env:t,type:v.type,value:v,pathCollection:[],isAccessingProperty:!0},i.$=e.$,e}}}let c=cr({concreteType:s.value,methodName:l,env:t});if(c.length===1){let p=c[0];return e.$={env:t,type:p.type,value:p.value,pathCollection:[],isAccessingProperty:!0},i.$=e.$,e}let f=Ca({concreteType:s.value,propertyName:l,env:t});return f?(e.$={env:t,type:f.type,value:f.value,pathCollection:[],isAccessingProperty:!0},i.$=e.$,e):(e.$=void 0,e)}}else if(ve(s.value)){if(!Ye(i))throw y({token:i.token,errorMessage:`Expected identifier for type method, got:
|
|
11107
11107
|
${w(i)}`});let l=i.token.value,c=s.value.fields.find(f=>f.label===l);return c?(e.$={env:t,type:c.type,value:c.assignedValue??Y(c.type,{variableName:c.label,env:t,context:n}),pathCollection:[],isAccessingProperty:!0},i.$=e.$,e):(e.$=void 0,e)}else if(Ve(s.value)){if(!Ye(i))throw y({token:i.token,errorMessage:`Expected identifier for type method, got:
|
|
11108
11108
|
${w(i)}`});let l=i.token.value,u=s.value;if(u.receiverType&&u.receiverType.trait){for(let p of u.receiverType.trait.fields)if(p.label===""&&p.assignedValue&&ht(p.assignedValue)){let _=p.assignedValue,m=_.type;if(!q({type:u,env:t},{type:m,env:t}))continue;let g=m.fields.findIndex(h=>h.label===l&&z(h.type));if(g>=0){let h=m.fields[g];if(z(h.type)){let d=_.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 f=Su({concreteType:u.receiverType,traitType:u,methodName:l,env:t});if(f)return e.$={env:t,type:f.type,value:f.value,pathCollection:[],isAccessingProperty:!0},i.$=e.$,e}let c=u.fields.find(f=>f.label===l);return c?(e.$={env:t,type:c.type,value:c.assignedValue??Y(c.type,{variableName:c.label,env:t,context:n}),pathCollection:[],isAccessingProperty:!0},i.$=e.$,e):(e.$=void 0,e)}}let o=r.$?.type,a=r.$?.type;for(;o&&Ne(o);)o=o.childType;if(we(o)||ce(o)||_t(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:
|
|
11109
11109
|
${w(i)}`});let c=s.length;if(u<0||u>=c)throw y({token:i.token,errorMessage:`Index out of bounds: ${u} for accessing field in:
|
|
@@ -11113,7 +11113,7 @@ ${w(i)}`});let s=i.token.value,l=o.variants.find(u=>u.name===o.selectedVariantNa
|
|
|
11113
11113
|
${w(e)}`});let r=n.isEvaluatingFunctionBodyOrAsyncBlock.type;if(!E(e,I.recur))throw y({token:e.token,errorMessage:`Expected recur, got:
|
|
11114
11114
|
${w(e)}`});if(n.isAnalyzingCtfeCapability||n.isValidatingFunctionDefinition){let o=n.isEvaluatingFunctionBodyOrAsyncBlock.value,{returnType:a,runtimeArgExprsInOrder:s,callerEnv:l}=Gr({functionValue:ne(o)?o:void 0,functionType:r,expr:e,functionCalleeExpr:e.func,argExprs:e.args,callerEnv:t,context:n,isMethodCall:!1,skipSpecialization:!0,skipCtfeExecution:!0});return t=lt(l),e.$={type:a,value:Y(a,{variableName:"recur_result_"+Ge(t.modulePath),env:t,context:n}),env:t,pathCollection:[],runtimeArgExprsInOrder:s},e}return Mn({expr:e,env:t,givenFunc:{type:r,value:n.isEvaluatingFunctionBodyOrAsyncBlock.value??void 0},context:{...n}})}function Id({expr:e,env:t,context:n}){if(!E(e,I.runtime,1))throw y({token:e.token,errorMessage:`Expected runtime(expr), got:
|
|
11115
11115
|
${w(e)}`});if(n.isAnalyzingCtfeCapability)throw y({token:e.token,errorMessage:'Cannot use "runtime" during compile-time function evaluation analysis. The "runtime" keyword forces runtime evaluation and prevents CTFE.'});let r=e.args[0],i=N({expr:r,env:t,context:{...n}});if(!i.$?.type)throw y({token:i.token,errorMessage:`Failed to evaluate runtime argument:
|
|
11116
|
-
${w(i)}`});let o=dt({type:i.$.type,expectedType:void 0,expr:i,env:i.$.env??t});return e.$={type:o,value:void 0,env:i.$.env??t,pathCollection:i.$.pathCollection??[]},e}function Nd({expr:e,env:t,context:n}){ge(e,"<:",2);let r=e.args[0],i=e.args[1],o=N({expr:r,env:t,context:{...n}});if(!o.$||!o.$.value||!D(o.$.value))throw y({token:r.token,errorMessage:"Expected type for left-hand side expression."});t=o.$.env;let a=o.$.value;if(n.isInsideWhereClause&&!x(a.value))throw y({token:r.token,errorMessage:`In a where clause, the left-hand side of <: must be a type parameter (SomeType), got: ${w(r)} of type ${A(a.value)}`});let s=[];if(F(i)&&E(i,I.tuple))for(let _ of i.args)F(_)&&E(_,"!")&&_.args.length===1?s.push({expr:_.args[0],isNegated:!0}):s.push({expr:_,isNegated:!1});else F(i)&&E(i,"!")&&i.args.length===1?s.push({expr:i.args[0],isNegated:!0}):s.push({expr:i,isNegated:!1});let l=[];for(let{expr:_,isNegated:m}of s){let g=N({expr:_,env:t,context:{...n}});if(!g.$||!g.$.value||!D(g.$.value)||!Ve(g.$.value.value))throw y({token:_.token,errorMessage:"Expected trait type for right-hand side expression."});t=g.$.env;let h=g.$.value.value;if(h.receiverType)throw y({token:_.token,errorMessage:"Expected trait type already has a receiver type assigned."});if(m&&!n.isInsideWhereClause)throw y({token:_.token,errorMessage:"Negated trait constraints !(Trait) are only allowed in where clauses."});l.push({traitType:h,expr:_,isNegated:m})}if(n.isInsideWhereClause&&x(a.value)){let _=a.value;for(let{traitType:m,isNegated:g}of l){let h={...m,receiverType:_};t=
|
|
11116
|
+
${w(i)}`});let o=dt({type:i.$.type,expectedType:void 0,expr:i,env:i.$.env??t});return e.$={type:o,value:void 0,env:i.$.env??t,pathCollection:i.$.pathCollection??[]},e}function Nd({expr:e,env:t,context:n}){ge(e,"<:",2);let r=e.args[0],i=e.args[1],o=N({expr:r,env:t,context:{...n}});if(!o.$||!o.$.value||!D(o.$.value))throw y({token:r.token,errorMessage:"Expected type for left-hand side expression."});t=o.$.env;let a=o.$.value;if(n.isInsideWhereClause&&!x(a.value))throw y({token:r.token,errorMessage:`In a where clause, the left-hand side of <: must be a type parameter (SomeType), got: ${w(r)} of type ${A(a.value)}`});let s=[];if(F(i)&&E(i,I.tuple))for(let _ of i.args)F(_)&&E(_,"!")&&_.args.length===1?s.push({expr:_.args[0],isNegated:!0}):s.push({expr:_,isNegated:!1});else F(i)&&E(i,"!")&&i.args.length===1?s.push({expr:i.args[0],isNegated:!0}):s.push({expr:i,isNegated:!1});let l=[];for(let{expr:_,isNegated:m}of s){let g=N({expr:_,env:t,context:{...n}});if(!g.$||!g.$.value||!D(g.$.value)||!Ve(g.$.value.value))throw y({token:_.token,errorMessage:"Expected trait type for right-hand side expression."});t=g.$.env;let h=g.$.value.value;if(h.receiverType)throw y({token:_.token,errorMessage:"Expected trait type already has a receiver type assigned."});if(m&&!n.isInsideWhereClause)throw y({token:_.token,errorMessage:"Negated trait constraints !(Trait) are only allowed in where clauses."});l.push({traitType:h,expr:_,isNegated:m})}if(n.isInsideWhereClause&&x(a.value)){let _=a.value;for(let{traitType:m,isNegated:g}of l){let h={...m,receiverType:_};t=Kn({env:t,someType:_,traitType:h,isNegated:g})}return e.$={env:t,value:a,type:a.type,pathCollection:[]},e}if(l.length>1)throw y({token:i.token,errorMessage:"Multiple trait constraints (tuple form) are only allowed in where clauses."});let{traitType:u}=l[0],c=a.value;if(!x(c)&&!Nt({targetType:c,traitType:u,env:t}))throw y({token:e.token,errorMessage:`Type "${A(c)}" does not implement trait "${u.typeName??A(u)}".`});let f={...u,receiverType:a.value},p=J(f);return e.$={env:t,value:p,type:p.type,pathCollection:[]},e}function Sd({expr:e,env:t,context:n}){if(!E(e,I.test))throw y({token:e.token,errorMessage:`Expected test, got ${e.tag}`});if(e.args.length!==2&&e.args.length!==3)throw y({token:e.token,errorMessage:`test expects 2 or 3 arguments (name, [using clause], body), got ${e.args.length}`});let r=e.args.length===3,i=e.args[0],o=r?e.args[1]:void 0,a=r?e.args[2]:e.args[1];if(o&&!E(o,I.using))throw y({token:o.token,errorMessage:`Expected using(...) clause as second argument, got: ${w(o)}`});let s=N({expr:i,env:t,context:{...n}});if(!s.$||!s.$.value)throw y({token:i.token,errorMessage:`Failed to evaluate test name: ${w(i)}`});if(t=s.$.env,!He(s.$.value))throw y({token:i.token,errorMessage:`Expected string for test name, got ${w(i)}`});if(r){let l=xe(o);o.$={env:t,type:j.type,value:j,pathCollection:[],originalExpr:l};let u=xe(a);a.$={env:t,type:j.type,value:j,pathCollection:[],originalExpr:u}}else{let l=xe(a),u=N({expr:a,env:t,context:{...n,isEvaluatingFunctionBodyOrAsyncBlock:{kind:"test-block",evaluationEnv:t}}});if(!u.$)throw y({token:a.token,errorMessage:`Failed to evaluate test body: ${w(a)}`});if(!ue(u.$.type))throw y({token:a.token,errorMessage:`Test body must have 'unit' type, got ${A(u.$.type)}`});u.$.originalExpr=l}return e.$={env:t,type:j.type,value:j,pathCollection:[]},e}function xd({expr:e,env:t,context:n}){if(!E(e,k.typeof,1))throw y({token:e.token,errorMessage:`Expected "typeof" with 1 argument, got:
|
|
11117
11117
|
${w(e)}`});let r=e.args[0],i=N({expr:r,env:t,context:{...n}});if(i.$?.env&&(t=i.$.env),!i.$?.type)throw y({token:r.token,errorMessage:`Expected type for expression, got:
|
|
11118
11118
|
${w(r)}`});let o=i.$.type,a=J(o);return e.$={env:t,type:a.type,value:a,pathCollection:[]},e}function Ga({expr:e,env:t,context:n}){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 r=e.args[0],i,o;e.args.length===3?(i=e.args[1],o=e.args[2]):o=e.args[1];let a=vt({expr:r,env:t,context:{...n},variablesToAdd:[]});if(!a.$)throw y({token:r.token,errorMessage:`Failed to evaluate the condition expression:
|
|
11119
11119
|
${w(r)}`});if(!gn(a.$.type))throw y({token:r.token,errorMessage:`Expected bool type for condition expression, got:
|
|
@@ -11122,4 +11122,4 @@ ${w(o)}`});if(mt(u.$.controlFlow)){if(nt(u.$.controlFlow,"return")||nt(u.$.contr
|
|
|
11122
11122
|
${w(i)}`});f=p.$.env}if(Ue(s))return Ga({expr:e,env:f,context:{...n}});e.$={env:f,pathCollection:[],type:j.type,value:l?j:void 0}}return e}if(!ue(u.$.type))throw y({token:o.token,errorMessage:`Expected the while loop body to return unit, but got:
|
|
11123
11123
|
${A(u.$.type)}`});let c=u.$.value===void 0;if(t=u.$.env,i){let f=N({expr:i,env:t,context:{...n}});if(!f.$)throw y({token:i.token,errorMessage:`Failed to evaluate the step expression:
|
|
11124
11124
|
${w(i)}`});t=f.$.env}return Ue(s)&&s.value===!0&&c?(e.$={env:t,pathCollection:[],type:j.type,value:void 0},e):Ue(s)&&s.value===!0?Ga({expr:e,env:t,context:{...n}}):(e.$={env:t,pathCollection:[],type:j.type,value:l?j:void 0},e)}}function Vd(e){let t=process.env[e];return t==="1"||t?.toLowerCase()==="true"}var Lg=Vd("YO_DEBUG_EVAL")||Vd("YO_DEBUG_EVAL_PROFILE"),Dd=globalThis,io=Dd.__yoEvalProfilerState??(Dd.__yoEvalProfilerState={evalCount:0,evalStart:0});function Wr({expr:e,env:t,context:n}){if(Lg&&(io.evalStart||(io.evalStart=Date.now()),io.evalCount++,io.evalCount%1e5===0&&console.log(`[EVAL] ${io.evalCount} calls, ${Date.now()-io.evalStart}ms elapsed`)),U(e))switch(e.token.type){case"identifier":case"operator":return Ba({expr:e,env:t,context:{...n},throwErrorOnUndefined:!0});case"integer":return cd(e,t,{...n});case"float":return ud(e,t,{...n});case"string":return fd(e,t);case"char":return od(e,t);case"bool":return id(e,t);default:throw y({token:e.token,errorMessage:`(1) Evaluating the expression (tag: ${e.tag}, token: ${e.token.type}) below is not implemented:
|
|
11125
|
-
${w(e)}`})}else if(E(e,":",2)){let{expr:r}=za({expr:e,env:t,context:n});return r}else{if(E(e,":=",2)||E(e,"::",2))return kd({expr:e,env:t,context:n});if(E(e,"=",2))return _d({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))?Na({expr:e,env:t,context:{...n,isUnsafeFunctionType:E(e.args[0],I.unsafe_fn)}}):F(e.args[0])&&E(e.args[0],I.Fn)?H_({expr:e,env:t,context:{...n}}):Ua({expr:e,env:t,context:{...n}});if(E(e,"=>",2))return F(e.args[0])&&E(e.args[0],I.fn)?z_({expr:e,env:t,context:{...n}}):Ua({expr:e,env:t,context:{...n}});if(E(e,"=>>",2))return Ua({expr:e,env:t,context:{...n}});if(E(e,I.recur))return Ad({expr:e,env:t,context:{...n}});if(E(e,I.runtime))return Id({expr:e,env:t,context:{...n}});if(E(e,I.extern))return gd({expr:e,env:t,context:{...n}});if(E(e,I.c_include))return dd({expr:e,env:t,context:{...n}});if(E(e,I.test))return Sd({expr:e,env:t,context:{...n}});if(E(e,I.cond))return md({expr:e,env:t,context:{...n}});if(E(e,I.match))return wd({expr:e,env:t,context:{...n}});if(E(e,I.tuple))return pd({expr:e,env:t,context:{...n}});if(E(e,I.array))return rd({expr:e,env:t,context:{...n}});if(E(e,I.comptime_list))return ad({expr:e,env:t,context:{...n}});if(E(e,I.dyn))return ld({expr:e,env:t,context:{...n}});if(E(e,I.struct))return to({expr:e,env:t,context:{...n}});if(E(e,I.object))return X_({expr:e,env:t,context:{...n}});if(E(e,I.newtype))return K_({expr:e,env:t,context:{...n}});if(E(e,I.enum))return q_({expr:e,env:t,context:{...n}});if(E(e,I.union))return nd({expr:e,env:t,context:{...n}});if(E(e,"."))return Ld({expr:e,env:t,context:{...n}});if(E(e,I.begin))return vt({expr:e,env:t,context:{...n},variablesToAdd:[]});if(E(e,I.module))return j_({expr:e,env:t,context:{...n}});if(E(e,I.trait))return ed({expr:e,env:t,context:{...n}});if(E(e,I.Impl))return u_({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 xd({expr:e,env:t,context:{...n}});if(E(e,k.sizeof))return F_({expr:e,env:t,context:{...n}});if(E(e,k.alignof))return qf({expr:e,env:t,context:{...n}});if(E(e,k.typeid))return V_({expr:e,env:t,context:{...n}});if(E(e,k.downcast))return wp({expr:e,env:t,context:{...n}});if(E(e,k.rc))return w_({expr:e,env:t,context:{...n}});if(E(e,"<:"))return Nd({expr:e,env:t,context:{...n}});if(E(e,k.the))return L_({expr:e,env:t,context:{...n}});if(E(e,I.import))return Cd({expr:e,env:t,context:{...n},stdPath:n.stdPath});if(E(e,I.open))return Fd({expr:e,env:t,context:{...n}});if(E(e,I.Ptr,1))return P_({expr:e,env:t,context:{...n}});if(E(e,I.Iso,1))return Yp({expr:e,env:t,context:{...n}});if(E(e,I.Arc,1))return Vp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_address_of,1))return k_({expr:e,env:t,context:{...n}});if(E(e,I.Tuple))return td({expr:e,env:t,context:{...n}});if(E(e,I.Array))return U_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_array_fill,2))return Yf({expr:e,env:t,context:{...n}});if(E(e,I.Slice))return Q_({expr:e,env:t,context:{...n}});if(E(e,I.ComptimeList))return B_({expr:e,env:t,context:{...n}});if(E(e,I.Future))return Y_({expr:e,env:t,context:{...n}});if(E(e,I.Concrete))return G_({expr:e,env:t,context:{...n}});if(E(e,I.Dyn))return W_({expr:e,env:t,context:{...n}});if(E(e,k.comptime_expect_error))return Xf({expr:e,env:t,context:{...n}});if(E(e,k.comptime_assert))return jf({expr:e,env:t,context:{...n}});if(E(e,k.comptime_fn))return Qf({expr:e,env:t,context:{...n}});if(E(e,k.comptime_print))return sp({expr:e,env:t,context:{...n}});if(E(e,k.panic))return p_({expr:e,env:t,context:{...n}});if(E(e,k.macro_expand))return f_({expr:e,env:t,context:{...n}});if(E(e,I.op_and)||E(e,I.op_or))return Hf({expr:e,env:t,context:{...n}});if(E(e,I.escape))return yd({expr:e,env:t,context:{...n}});if(E(e,k.consume))return up({expr:e,env:t,context:{...n}});if(E(e,k.___drop))return Jp({expr:e,env:t,context:{...n}});if(E(e,k.___dup))return e_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_decr_rc))return cp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_incr_rc))return fp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_decr_rc_atomic))return _p({expr:e,env:t,context:{...n}});if(E(e,k.__yo_incr_rc_atomic))return pp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_iso_extract))return vp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_iso_dispose))return Tp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_arc_dispose))return Ep({expr:e,env:t,context:{...n}});if(E(e,k.__yo_drop_array_element))return $p({expr:e,env:t,context:{...n}});if(E(e,k.__yo_dup_array_element))return Cp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_drop_tuple_element))return bp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_dup_tuple_element))return kp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_rc_own))return dp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_dyn_drop))return mp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_dyn_dup))return yp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_sometype_drop))return gp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_sometype_dup))return hp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_gc_collect))return s_({expr:e,env:t,context:{...n}});if(E(e,I.quote))return c_({expr:e,env:t,context:{...n}});if(E(e,I.gensym))return l_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_is_atom))return t_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_is_fn_call))return n_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_get_callee))return r_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_get_args))return i_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_to_string))return o_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_eq))return a_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_car))return Zf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_cdr))return Jf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_cons))return ep({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_append))return tp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_length))return np({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_element_type))return rp({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 ap({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 Kf({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 lp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_type_to_comptime_string,1))return A_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_are_types_compatible,2))return I_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_type_contains_rc_type,1))return N_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_type_can_form_rc_cycle,1))return S_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_type_impls,2))return x_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_var_print_info,1))return M_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_var_is_owning_the_rc_value))return O_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_var_has_other_aliases))return R_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_process_platform)||E(e,k.__yo_process_arch))return E_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_build_project)||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)){for(let r=0;r<e.args.length;r++)e.args[r]=Wr({expr:e.args[r],env:t,context:{...n}});return b_({expr:e,env:t,context:{...n}})}else return E(e,I.while)?Ga({expr:e,env:t,context:{...n}}):E(e,k.va_start)?D_({expr:e,env:t,context:{...n}}):Mn({expr:e,env:t,context:{...n}})}}function Ig(e){let t=e;for(;;){let n=Ko.join(t,"std");if(Ag(n))return n;let r=Ko.dirname(t);if(r===t)break;t=r}return Ko.join(__dirname,"../std")}var Md=class{constructor(t){this.modules=new Map;this.dependencies=new Map;this.dependents=new Map;this.allowPartialModule=t?.allowPartialModule??!1,this.stdPath=t?.stdPath??Ig(__dirname),this.codeGenratorC=new Fa,Nl(Wr),Yu(Wf)}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)No(r),Io(r),this.clearDependencies(r),sa(r),this.modules.delete(r);No(t),Io(t),this.clearDependencies(t),sa(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())No(t),Io(t),sa(t);this.modules.clear(),this.dependencies.clear(),this.dependents.clear(),Gs(),Uu(),ql()}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 c of o)this.deleteModuleAndDependents(c);let a=t,s=new xo({modulePath:t,stdPath:this.stdPath,loadModule:c=>this.loadModule(c,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()}};export{yi as Emitter,qa as IdentifierRegex,Md as ModuleManager,Wa as Operators,ie as PlaceholderToken,xg as RAIIToken,Xt as TokenType,oo as charIsOperator,Gs as clearAllGlobalImplState,Io as clearGenericImplsFromModule,No as clearImplsFromModule,lE as debug,Il as findMatchingBracketTokenIndex,Qt as generateExprFromCode,Qn as stringIsOperator,Sl as tokenize};
|
|
11125
|
+
${w(e)}`})}else if(E(e,":",2)){let{expr:r}=za({expr:e,env:t,context:n});return r}else{if(E(e,":=",2)||E(e,"::",2))return kd({expr:e,env:t,context:n});if(E(e,"=",2))return _d({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))?Na({expr:e,env:t,context:{...n,isUnsafeFunctionType:E(e.args[0],I.unsafe_fn)}}):F(e.args[0])&&E(e.args[0],I.Fn)?H_({expr:e,env:t,context:{...n}}):Ua({expr:e,env:t,context:{...n}});if(E(e,"=>",2))return F(e.args[0])&&E(e.args[0],I.fn)?z_({expr:e,env:t,context:{...n}}):Ua({expr:e,env:t,context:{...n}});if(E(e,"=>>",2))return Ua({expr:e,env:t,context:{...n}});if(E(e,I.recur))return Ad({expr:e,env:t,context:{...n}});if(E(e,I.runtime))return Id({expr:e,env:t,context:{...n}});if(E(e,I.extern))return gd({expr:e,env:t,context:{...n}});if(E(e,I.c_include))return dd({expr:e,env:t,context:{...n}});if(E(e,I.test))return Sd({expr:e,env:t,context:{...n}});if(E(e,I.cond))return md({expr:e,env:t,context:{...n}});if(E(e,I.match))return wd({expr:e,env:t,context:{...n}});if(E(e,I.tuple))return pd({expr:e,env:t,context:{...n}});if(E(e,I.array))return rd({expr:e,env:t,context:{...n}});if(E(e,I.comptime_list))return ad({expr:e,env:t,context:{...n}});if(E(e,I.dyn))return ld({expr:e,env:t,context:{...n}});if(E(e,I.struct))return to({expr:e,env:t,context:{...n}});if(E(e,I.object))return X_({expr:e,env:t,context:{...n}});if(E(e,I.newtype))return K_({expr:e,env:t,context:{...n}});if(E(e,I.enum))return q_({expr:e,env:t,context:{...n}});if(E(e,I.union))return nd({expr:e,env:t,context:{...n}});if(E(e,"."))return Ld({expr:e,env:t,context:{...n}});if(E(e,I.begin))return vt({expr:e,env:t,context:{...n},variablesToAdd:[]});if(E(e,I.module))return j_({expr:e,env:t,context:{...n}});if(E(e,I.trait))return ed({expr:e,env:t,context:{...n}});if(E(e,I.Impl))return u_({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 xd({expr:e,env:t,context:{...n}});if(E(e,k.sizeof))return F_({expr:e,env:t,context:{...n}});if(E(e,k.alignof))return qf({expr:e,env:t,context:{...n}});if(E(e,k.typeid))return V_({expr:e,env:t,context:{...n}});if(E(e,k.downcast))return wp({expr:e,env:t,context:{...n}});if(E(e,k.rc))return w_({expr:e,env:t,context:{...n}});if(E(e,"<:"))return Nd({expr:e,env:t,context:{...n}});if(E(e,k.the))return L_({expr:e,env:t,context:{...n}});if(E(e,I.import))return Cd({expr:e,env:t,context:{...n},stdPath:n.stdPath});if(E(e,I.open))return Fd({expr:e,env:t,context:{...n}});if(E(e,I.Ptr,1))return P_({expr:e,env:t,context:{...n}});if(E(e,I.Iso,1))return Yp({expr:e,env:t,context:{...n}});if(E(e,I.Arc,1))return Vp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_address_of,1))return k_({expr:e,env:t,context:{...n}});if(E(e,I.Tuple))return td({expr:e,env:t,context:{...n}});if(E(e,I.Array))return U_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_array_fill,2))return Yf({expr:e,env:t,context:{...n}});if(E(e,I.Slice))return Q_({expr:e,env:t,context:{...n}});if(E(e,I.ComptimeList))return B_({expr:e,env:t,context:{...n}});if(E(e,I.Future))return Y_({expr:e,env:t,context:{...n}});if(E(e,I.Concrete))return G_({expr:e,env:t,context:{...n}});if(E(e,I.Dyn))return W_({expr:e,env:t,context:{...n}});if(E(e,k.comptime_expect_error))return Xf({expr:e,env:t,context:{...n}});if(E(e,k.comptime_assert))return jf({expr:e,env:t,context:{...n}});if(E(e,k.comptime_fn))return Qf({expr:e,env:t,context:{...n}});if(E(e,k.comptime_print))return sp({expr:e,env:t,context:{...n}});if(E(e,k.panic))return p_({expr:e,env:t,context:{...n}});if(E(e,k.macro_expand))return f_({expr:e,env:t,context:{...n}});if(E(e,I.op_and)||E(e,I.op_or))return Hf({expr:e,env:t,context:{...n}});if(E(e,I.escape))return yd({expr:e,env:t,context:{...n}});if(E(e,k.consume))return up({expr:e,env:t,context:{...n}});if(E(e,k.___drop))return Jp({expr:e,env:t,context:{...n}});if(E(e,k.___dup))return e_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_decr_rc))return cp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_incr_rc))return fp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_decr_rc_atomic))return _p({expr:e,env:t,context:{...n}});if(E(e,k.__yo_incr_rc_atomic))return pp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_iso_extract))return vp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_iso_dispose))return Tp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_arc_dispose))return Ep({expr:e,env:t,context:{...n}});if(E(e,k.__yo_drop_array_element))return $p({expr:e,env:t,context:{...n}});if(E(e,k.__yo_dup_array_element))return Cp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_drop_tuple_element))return bp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_dup_tuple_element))return kp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_rc_own))return dp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_dyn_drop))return mp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_dyn_dup))return yp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_sometype_drop))return gp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_sometype_dup))return hp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_gc_collect))return s_({expr:e,env:t,context:{...n}});if(E(e,I.quote))return c_({expr:e,env:t,context:{...n}});if(E(e,I.gensym))return l_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_is_atom))return t_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_is_fn_call))return n_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_get_callee))return r_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_get_args))return i_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_to_string))return o_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_expr_eq))return a_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_car))return Zf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_cdr))return Jf({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_cons))return ep({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_append))return tp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_length))return np({expr:e,env:t,context:{...n}});if(E(e,k.__yo_comptime_list_element_type))return rp({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 ap({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 Kf({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 lp({expr:e,env:t,context:{...n}});if(E(e,k.__yo_type_to_comptime_string,1))return A_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_are_types_compatible,2))return I_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_type_contains_rc_type,1))return N_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_type_can_form_rc_cycle,1))return S_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_type_impls,2))return x_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_var_print_info,1))return M_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_var_is_owning_the_rc_value))return O_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_var_has_other_aliases))return R_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_process_platform)||E(e,k.__yo_process_arch))return E_({expr:e,env:t,context:{...n}});if(E(e,k.__yo_build_project)||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)){for(let r=0;r<e.args.length;r++)e.args[r]=Wr({expr:e.args[r],env:t,context:{...n}});return b_({expr:e,env:t,context:{...n}})}else return E(e,I.while)?Ga({expr:e,env:t,context:{...n}}):E(e,k.va_start)?D_({expr:e,env:t,context:{...n}}):Mn({expr:e,env:t,context:{...n}})}}function Ig(e){let t=e;for(;;){let n=Ko.join(t,"std");if(Ag(n))return n;let r=Ko.dirname(t);if(r===t)break;t=r}return Ko.join(__dirname,"../std")}var Md=class{constructor(t){this.modules=new Map;this.dependencies=new Map;this.dependents=new Map;this.allowPartialModule=t?.allowPartialModule??!1,this.stdPath=t?.stdPath??Ig(__dirname),this.codeGenratorC=new Fa,Nl(Wr),Yu(Wf)}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)No(r),Io(r),this.clearDependencies(r),sa(r),this.modules.delete(r);No(t),Io(t),this.clearDependencies(t),sa(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())No(t),Io(t),sa(t);this.modules.clear(),this.dependencies.clear(),this.dependents.clear(),Gs(),Uu(),ql()}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 c of o)this.deleteModuleAndDependents(c);let a=t,s=new xo({modulePath:t,stdPath:this.stdPath,loadModule:c=>this.loadModule(c,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()}};export{yi as Emitter,qa as IdentifierRegex,Md as ModuleManager,Wa as Operators,ie as PlaceholderToken,xg as RAIIToken,Xt as TokenType,oo as charIsOperator,Gs as clearAllGlobalImplState,Io as clearGenericImplsFromModule,No as clearImplsFromModule,lE as debug,Il as findMatchingBracketTokenIndex,Qt as generateExprFromCode,Zn as stringIsOperator,Sl as tokenize};
|