pxt-core
Version:
Microsoft MakeCode provides Blocks / JavaScript / Python tools and editors
1 lines • 90.6 kB
JavaScript
var pxt;!function(e){!function(e){let t;!function(e){e[e.NonLocal=0]="NonLocal",e[e.Global=1]="Global"}(t=e.VarModifier||(e.VarModifier={})),e.isIndex=function(e){return"Index"===e.kind},e.isSubscript=function(e){return"Subscript"===e.kind}}(e.py||(e.py={}))}(pxt||(pxt={})),function(e){!function(t){var n=e.blocks;let r,i,s,o,a,l,u,c,p,f,m=0,d=0,y=0,k="???";function x(e){return null==e}function T(e){return null!=e}function g(t){return e.tickEvent("python.todo.statement",{kind:t.kind}),n.mkStmt(n.mkText("TODO: "+t.kind))}function h(t){return e.tickEvent("python.todo.expression",{kind:t.kind}),n.mkText(" {TODO: "+t.kind+"} ")}const v=L({primType:"string"}),S=L({primType:"number"}),b=L({primType:"boolean"}),N=L({primType:"void"}),E=L({primType:"any"});let C;const U={str:v,string:v,number:S,bool:b,void:N,any:E};function I(e){switch(e){case ts.SyntaxKind.StringKeyword:return v;case ts.SyntaxKind.NumberKeyword:return S;case ts.SyntaxKind.BooleanKeyword:return b;case ts.SyntaxKind.VoidKeyword:return N;case ts.SyntaxKind.AnyKeyword:return E;default:return C}}function A(t){let n=e.U.flatClone(t);return delete n.pyAST,delete n.pyInstanceType,delete n.pyRetType,delete n.pySymbolType,delete n.moduleTypeMarker,delete n.declared,n.parameters&&(n.parameters=n.parameters.map((t=>(delete(t=e.U.flatClone(t)).pyType,t)))),n}function P(t){if("("==t[0]&&e.U.endsWith(t,")"))return P(t.slice(1,-1));const n=t.indexOf(" => ");if(n>0){const e=t.slice(n+4);if(-1==e.indexOf(")[]")){const r=P(e),i=t.slice(1,n-1);return $(r,(i?i.split(/, /):[]).map((e=>P(e.replace(/\w+\??: /,"")))))}}if(e.U.endsWith(t,"[]"))return F(P(t.slice(0,-2)));if("_py.Array"===t)return F(E);const r=e.U.lookup(U,t);if(r)return r;if(!!t&&!isNaN(t))return S;if("T"==t||"U"==t)return L({primType:"'"+t});if(t.indexOf("|")>=0){return L({primType:"@union",typeArgs:t.split("|").map((e=>e.trim())).map(P)})}let i=_(t+"@type")||_(t);return i?7==i.kind?S:8==i.kind||9==i.kind?i.pyInstanceType||L({classType:i}):6==i.kind?S:(H(null,9502,e.U.lf("'{0}' is not a type near '{1}'",t,k||"???")),L({primType:t})):(H(null,9501,e.U.lf("unknown type '{0}' near '{1}'",t,k||"???")),L({primType:t}))}function w(t){var n;if(!t.pySymbolType){if(k=t.pyQName,t.parameters){pxtc.service.isTaggedTemplate(t)&&(t.parameters=[{name:"literal",description:"",type:"string",options:{}}]);for(let e of t.parameters)e.pyType||(e.pyType=P(e.type))}const r=t.pyRetType;if(xe(t))t.pyRetType=L({moduleType:t});else if(t.retType)if((null===(n=t.qName)||void 0===n?void 0:n.endsWith(".__constructor"))&&"void"===t.retType){const e=K(t.qName.substring(0,t.qName.lastIndexOf(".")));t.pyRetType=e?L({classType:e}):P(t.retType)}else t.pyRetType=P(t.retType);else t.pyRetType||(e.U.oops("no type for: "+t.pyQName),t.pyRetType=L({}));if(r&&ee(t.pyAST,r,t.pyRetType),3==t.kind||1==t.kind){let n=t.parameters.map((e=>e.pyType));if(n.some(x))return H(null,9526,e.U.lf("function symbol is missing parameter types near '{1}'",k||"???")),L({});t.pySymbolType=$(t.pyRetType,n.filter(T))}else t.pySymbolType=t.pyRetType;8!=t.kind&&9!=t.kind||(t.pyInstanceType=L({classType:t})),k=void 0}return t.pySymbolType}function _(t){return e.U.lookup(i,t)||e.U.lookup(r,t)}function K(e){var t;if(!e)return;let n=_(e);if(n)w(n);else if(e.indexOf(".")&&!e.endsWith(".__constructor")){const n=e.substring(0,e.lastIndexOf(".")),r=K(n);if(8===(null==r?void 0:r.kind)&&(null===(t=r.extendsTypes)||void 0===t?void 0:t.length))return K(r.extendsTypes[0]+e.substring(n.length))}return n}function L(t={}){let n=e.U.flatClone(t);return n.tid=++d,n}function F(e){return L({primType:"@array",typeArgs:[e]})}function $(e,t){return L({primType:"@fn"+t.length,typeArgs:[e].concat(t)})}function O(t){return!!e.U.startsWith(t.primType||"","@fn")}function R(t){return!!t.primType&&!e.U.startsWith(t.primType,"@")}function D(t){return!!e.U.startsWith(t.primType||"","@union")}function q(){return s.currFun||s.currClass||s.currModule}function M(){let e=q();for(;e&&e.parent;)e=e.parent;return e}function G(){return"main"==s.currModule.name&&!s.currFun&&!s.currClass}function B(t,n,r){const i=K(n);return i||H(t,9503,e.U.lf("No module named '{0}'",n)),i}function Q(e,n,r,i){i||(i=q());let s=i.vars[e],o=null==s?void 0:s.symbol;if(!o){let n=W(i);n&&(n+=".");let a=n+e;o="ClassDef"===i.kind?oe(2,a):!ae(i)||r!==t.VarModifier.Global&&r!==t.VarModifier.NonLocal?ae(i)?se(4,e):oe(4,a):oe(4,e),s={symbol:o,modifier:r},i.vars[e]=s}for(let e of Object.keys(n))o[e]=n[e];return s}function z(e){return e.unifyWith?(e.unifyWith=z(e.unifyWith),e.unifyWith):e}function W(e){let t=e,n="";t.parent&&"FunctionDef"!==t.parent.kind&&"AsyncFunctionDef"!==t.parent.kind&&(n=W(t.parent),n?n+=".":n="");let r=e;return"Module"==e.kind&&"main"==r.name?"":r.name?n+r.name:n+"?"+e.kind}function j(t){let n=e.U.lookup(Ue,t);if(n)return n;for(let n of e.U.values(s.currModule.vars)){let r=n.symbol;if(r.isImport){if(r.expandsTo==t)return r.pyName||H(null,9553,lf("missing pyName")),r.pyName;if(r.isImport&&e.U.startsWith(t,(r.expandsTo||"")+"."))return r.pyName+t.slice(r.expandsTo.length)}}return t}function V(e){return(e=z(e)).primType?e.typeArgs&&"@array"==e.primType?V(e.typeArgs[0])+"[]":O(e)&&e.typeArgs?"("+e.typeArgs.slice(1).map((e=>"_: "+V(e))).join(", ")+") => "+V(e.typeArgs[0]):D(e)&&e.typeArgs?e.typeArgs.map(V).join(" | "):e.primType+"":e.classType&&e.classType.pyQName?j(e.classType.pyQName)+"":e.moduleType&&e.moduleType.pyQName?j(e.moduleType.pyQName)+"":"any"}function H(e,t,n){l.push(function(e,t,n,r){return e||(e=o),e&&s&&s.currModule?{fileName:a,start:e.startPos,length:e.endPos-e.startPos,line:void 0,column:void 0,code:n,category:t,messageText:r}:{fileName:a,start:0,length:0,line:void 0,column:void 0,code:n,category:t,messageText:r}}(e,pxtc.DiagnosticCategory.Error,t,n))}function J(e){return e.primType?e.primType:e.classType?e.classType:e.moduleType?(e.moduleType.moduleTypeMarker||(e.moduleType.moduleTypeMarker={}),e.moduleType.moduleTypeMarker):null}function X(e){return!J(z(e))}function Y(t,n,r){var i;(n=z(n)).classType!=r&&(X(n)?n.classType=r:ee(t,n,(w(i=r),i.pyInstanceType||H(null,9527,e.U.lf("Instance type symbol '{0}' is missing pyInstanceType",i)),i.pyInstanceType)))}function Z(e,t){ee(e,ke(e),t)}function ee(t,n,r){if(n===r)return;if((n=z(n))===(r=z(r))||ie(n)||ie(r))return;if("any"===n.primType)return void(n.unifyWith=r);const i=J(n),s=J(r);if(i&&s)if(i===s){if(n.unifyWith=r,n.typeArgs&&r.typeArgs)for(let e=0;e<Math.min(n.typeArgs.length,r.typeArgs.length);++e)ee(t,n.typeArgs[e],r.typeArgs[e]);n.unifyWith=r}else!function(t,n,r){H(t,9500,e.U.lf("types not compatible: {0} and {1}",V(n),V(r)))}(t,n,r);else i&&!s?ee(t,r,n):(y++,n.unifyWith=r)}function te(e,t){const n=z(e),r=z(t);if(n===r)return!0;const i=J(n),s=J(r);if(i===s)return!0;if(i&&s){if(re(i)&&re(s)&&i.extendsTypes&&i.extendsTypes.length&&i.extendsTypes.some((e=>e===s.qName)))return!0;if(D(r)){for(let e of r.typeArgs||[])if(te(n,e))return!0;return!1}}return!1}function ne(e,t){const n=z(ke(e)),r=z(t);te(n,r)||(O(n)||O(r)||R(n)||R(r))&&ee(e,n,r)}function re(e){return!!(null==e?void 0:e.name)}function ie(e){var t;return!!(null===(t=null==e?void 0:e.primType)||void 0===t?void 0:t.startsWith("'"))}function se(e,t){let n=/(.*)\.(.*)/.exec(t),r=n?n[2]:t;return{kind:e,name:r,pyName:r,qName:t,pyQName:t,namespace:n?n[1]:"",attributes:{},pyRetType:L()}}function oe(t,n){let r=i[n];return r?(r.kind=t,r):(r=se(t,n),r.pyQName||H(null,9527,e.U.lf("Symbol '{0}' is missing pyQName",n)),i[r.pyQName]=r,r)}function ae(e){let t=e;for(;t;){if("FunctionDef"==t.kind)return!0;t=t.parent}return!1}function le(t,n,r){if(!n.symInfo){let i=W(n);e.U.endsWith(i,".__init__")&&(i=i.slice(0,-9)+".__constructor"),ae(r=r||q())?n.symInfo=se(t,i):n.symInfo=oe(t,i);const s=n.symInfo;s.pyAST=n,s.pyName||H(null,9528,e.U.lf("Symbol '{0}' is missing pyName",s.qName||s.name)),r.vars[s.pyName]={symbol:s}}return n.symInfo}function ue(t){let n=t.symInfo.qName;return e.U.values(i).filter((e=>e.namespace==n&&2==e.kind))}function ce(t,n,r,i=!1,s=!1){let o;o="__init__"===n?t.pyQName+".__constructor":n.startsWith(t.pyQName+".")?n:t.pyQName+"."+n;let a=K(o);if(a)return a;if(!s)for(let i of t.extendsTypes||[]){let s=K(i);if(s){s==t&&e.U.userError("field lookup loop on: "+s.qName+" / "+n);let i=ce(s,n,r,!0);if(i)return i}}if(!i&&t.pyAST&&"ClassDef"==t.pyAST.kind){let e=oe(2,o);return e.isInstance=!r,e}return null}function pe(t,n,r=!1){const i=ke(t),o=function(e){let t=z(e);return[t.classType,...fe(t.primType),t.moduleType].filter(T)}(i);for(let l of o){let o=!!i.moduleType,u=ce(l,n,o,r);if(u)return o?u.isInstance&&H(null,9505,e.U.lf("the field '{0}' of '{1}' is not static",n,l.pyQName)):ze(t)?u.isProtected=!0:"Name"==(a=t).kind&&"self"==a.id&&(s.currClass||H(null,9529,e.U.lf("no class context found for {0}",u.pyQName)),u.namespace!=s.currClass.symInfo.qName&&(u.isProtected=!0)),u}var a;return null}function fe(e){let t=[];return"@array"==e?t=[_("_py.Array"),_("Array")]:"string"==e&&(t=[_("_py.String"),_("String")]),t.filter((e=>!!e))}function me(t){let n=q(),r=e.U.lookup(n.vars,t);if(r)return r;for(;n;){let r=e.U.lookup(n.vars,t);if(r)return r;do{n=n.parent}while(n&&"ClassDef"==n.kind)}return null}function de(e){if(!e)return null;const t=e.indexOf(".");if(t>0){const n=me(e.slice(0,t)),r=null==n?void 0:n.symbol;r&&r.pyQName!=r.pyName&&(e=r.pyQName+e.slice(t))}else{const t=me(e);if(t)return t}let n=K(e);return n?{symbol:n}:void 0}function ye(e){var t;return null===(t=de(e))||void 0===t?void 0:t.symbol}function ke(e){return e.tsType?z(e.tsType):(e.tsType=L(),e.tsType)}function xe(e){if(!e)return!1;switch(e.kind){case 5:case 9:case 8:case 6:return!0;default:return!1}}function Te(t){const n=e.U.flatClone(s);let r;try{r=t()}finally{s=n}return r}function ge(e,t){return 0==t.length?n.mkText(""):n.mkGroup([n.mkText("/* TODO: "+e+" "),n.mkGroup(t),n.mkText(" */"),n.mkNewLine()])}function he(e){let t=tt(e.value);return e.arg?n.mkInfix(n.mkText(e.arg),"=",t):n.mkGroup([n.mkText("**"),t])}function ve(n){if(!n)return L();let r=Re(n);if(r){let t=_(r+"@type")||_(r);if(t){if(w(t),6==t.kind)return S;if(t.pyInstanceType)return t.pyInstanceType}else if(U[r])return U[r];H(n,9506,e.U.lf("cannot find type '{0}'",r))}else if(t.isSubscript(n)){if("List"===Re(n.value)&&t.isIndex(n.slice)){return F(ve(n.slice.value))}}return H(n,9507,e.U.lf("invalid type syntax")),L({})}function Se(e){return e.pyName&&"_"==e.pyName[0]?e.isProtected?n.mkText("protected "):n.mkText("private "):n.mkText("")}const be={Sub:1,Div:1,Pow:1,LShift:1,RShift:1,BitOr:1,BitXor:1,BitAnd:1,FloorDiv:1,Mult:1},Ne={Eq:1,NotEq:1,Lt:1,LtE:1,Gt:1,GtE:1},Ee={Add:"+",Sub:"-",Mult:"*",MatMult:"Math.matrixMult",Div:"/",Mod:"%",Pow:"**",LShift:"<<",RShift:">>",BitOr:"|",BitXor:"^",BitAnd:"&",FloorDiv:"Math.idiv",And:"&&",Or:"||",Eq:"==",NotEq:"!=",Lt:"<",LtE:"<=",Gt:">",GtE:">=",Is:"===",IsNot:"!==",In:"py.In",NotIn:"py.NotIn"},Ce={Invert:"~",Not:"!",UAdd:"P+",USub:"P-"},Ue={"adafruit_bus_device.i2c_device.I2CDevice":"pins.I2CDevice"};function Ie(e){s.blockDepth++;const t=n.mkBlock(e.map(nt));return s.blockDepth--,t}function Ae(e){e.vars||(e.vars={},e.parent=q(),e.blockDepth=s.blockDepth)}function Pe(e,t=!1){return"any"===V(e)?t?n.mkText(": any"):n.mkText(""):n.mkText(": "+V(e))}function we(t,r){try{return Te(r)}catch(r){return e.log(r),n.mkStmt(ge(`conversion failed for ${t.name||t.kind}`,[]))}}function _e(e){if(!e||!e.pyAST)return!1;if("FunctionDef"!=e.pyAST.kind)return!1;const t=e.pyAST;return!(!t.callers||1!=t.callers.length)&&!t.callers[0].inCalledPosition}function Ke(t,r=!1){return we(t,(()=>{var i,o,a,l;const u=!!s.currClass&&!s.currFun,c=G(),p=!!s.currFun;Ae(t);const f=ye(W(t)),d=le(u?1:3,t);if(!r&&(f&&f.declared===m&&H(t,9520,lf("Duplicate function declaration")),d.declared=m,_e(d)))return n.mkText("");u&&(d.isInstance=!0),s.currFun=t;let y="",k=t.name;let x=[ge("decorators",t.decorator_list.filter((e=>"property"==Re(e)?(y="get",!1):"Attribute"!=e.kind||"setter"!=e.attr||"Name"!=e.value.kind||(k=e.value.id,y="set",!1))).map(tt))];if(t.body.length>=1&&"Raise"==t.body[0].kind&&(t.alwaysThrows=!0),u)if(s.currClass||H(t,9531,lf("method '{0}' is missing current class context",d.pyQName)),d.pyRetType||H(t,9532,lf("method '{0}' is missing a return type",d.pyQName)),"__init__"==t.name)x.push(n.mkText("constructor")),Y(t,d.pyRetType,s.currClass.symInfo);else{if("__get__"==k||"__set__"==k){let e=t.vars.value,n=null==e?void 0:e.symbol;if("__set__"==k&&n){let e=ce(s.currClass.symInfo,"__get__",!1);e&&e.pyAST&&"FunctionDef"==e.pyAST.kind&&ee(t,n.pyRetType,e.pyRetType)}k=k.replace(/_/g,"")}y||(y="_"==k[0]?d.isProtected?"protected":"private":"public",t.symInfo.isStatic&&(y+=" static")),x.push(n.mkText(y+" "),qe(k))}else e.U.assert(!y),"_"==t.name[0]||c||r||p?x.push(n.mkText("function "),qe(k)):x.push(n.mkText("export function "),qe(k));let T="__init__"==t.name?void 0:t.returns?ve(t.returns):d.pyRetType;x.push(function(t,r){var i;const s=t.args;s.kwonlyargs.length&&H(t,9517,e.U.lf("keyword-only arguments not supported yet"));let o=s.args.slice();if(r?"self"!==(null===(i=o[0])||void 0===i?void 0:i.arg)?t.symInfo.isStatic=!0:o.shift():o.some((e=>"self"==e.arg))&&H(t,9519,e.U.lf("non-methods cannot have an argument called 'self'")),!t.symInfo.parameters){let r=s.defaults.length-o.length;t.symInfo.parameters=o.map((i=>{i.annotation||H(t,9519,e.U.lf("Arg '{0}' missing annotation",i.arg));let o=ve(i.annotation),a="";return r>=0&&(a=n.flattenNode([tt(s.defaults[r])]).output,ee(i,o,ke(s.defaults[r]))),r++,{name:i.arg,description:"",type:"",initializer:a,default:a,pyType:o}}))}let a=t.symInfo.parameters.map((r=>{let i=Q(r.name,{isParam:!0}),s=null==i?void 0:i.symbol;r.pyType||H(t,9530,e.U.lf("parameter '{0}' missing pyType",r.name)),ee(t,w(s),r.pyType);let o=[qe(r.name),Pe(r.pyType,!0)];return r.default&&o.push(n.mkText(" = "+r.default)),n.mkGroup(o)}));return s.vararg&&a.push(n.mkText("TODO *"+s.vararg.arg)),s.kwarg&&a.push(n.mkText("TODO **"+s.kwarg.arg)),n.H.mkParenthesizedExpression(n.mkCommaSep(a))}(t,u),T&&z(T)!=N?Pe(T):n.mkText("")),w(d);let g=t.body.map(nt);if("__init__"==t.name){if(s.currClass||H(t,9533,lf("__init__ method '{0}' is missing current class context",d.pyQName)),null===(i=s.currClass)||void 0===i?void 0:i.baseClass){const e=t.body[0],n=s.currClass.baseClass.pyQName+".__constructor";(null===(l=null===(a=null===(o=e.value)||void 0===o?void 0:o.func)||void 0===a?void 0:a.symbolInfo)||void 0===l?void 0:l.pyQName)!==n&&H(t,9575,lf("Sub classes must call 'super().__init__' as the first statement inside an __init__ method"))}for(let e of ue(s.currClass)){let t=e.pyAST;t&&t.value&&g.push(n.mkStmt(n.mkText(`this.${Oe(e.pyName)} = `),tt(t.value)))}}const h=ot(t);x.push(n.mkBlock(h.concat(g)));let v=n.mkGroup(x);return r?x[x.length-1].noFinalNewline=!0:v=n.mkStmt(v),v}))}const Le={FunctionDef:e=>Ke(e),ClassDef:t=>we(t,(()=>{Ae(t);const r=le(8,t);e.U.assert(!s.currClass);let i=G();s.currClass=t,t.isNamespace=t.decorator_list.some((e=>"Name"==e.kind&&"namespace"==e.id));let o=t.isNamespace?[n.mkText("namespace "),qe(t.name)]:[ge("keywords",t.keywords.map(he)),ge("decorators",t.decorator_list.map(tt)),n.mkText(i?"class ":"export class "),qe(t.name)];if(!t.isNamespace&&t.bases.length>0)if("Enum"==Re(t.bases[0]))t.isEnum=!0;else{o.push(n.mkText(" extends ")),o.push(n.mkCommaSep(t.bases.map(tt)));let e=function(e){let t=ye(De(e));return t&&t.pyAST&&"ClassDef"==t.pyAST.kind?t.pyAST:null}(t.bases[0]);if(e)t.baseClass=e.symInfo,r.extendsTypes=[e.symInfo.pyQName];else{const e=Re(t.bases[0]);if(e){const n=ye(e),i=K(e);t.baseClass=n||i,t.baseClass&&(r.extendsTypes=[t.baseClass.pyQName])}}}const a=t.body.filter((e=>t.isNamespace||"FunctionDef"===e.kind)),l=t.isNamespace?[]:t.body.filter((e=>-1===a.indexOf(e)&&"Pass"!==e.kind));let u=Ie(a);o.push(u);let c=!1;if(l.length){c=!0;const e=Ie(l),r=n.mkStmt(n.mkGroup([n.mkText(`public static __init${t.name}() `),e]));u.children.unshift(r)}if(!t.isNamespace){const e=ue(t).map((e=>(e.pyName&&e.pyRetType||H(t,9535,lf("field definition missing py name or return type",e.qName)),e))),r=e.filter((e=>!e.isInstance)),i=e.filter((e=>e.isInstance)).map((e=>n.mkStmt(Se(e),qe(e.pyName),Pe(e.pyRetType)))),s=r.map((e=>n.mkGroup([n.mkStmt(Se(e),n.mkText("static "),qe(e.pyName),Pe(e.pyRetType)),mt(Oe(t.name),Oe(e.pyName),V(e.pyRetType))])));u.children=s.concat(i).concat(u.children)}return c&&(o=[n.mkStmt(n.mkGroup(o)),n.mkStmt(n.mkText(`${t.name}.__init${t.name}()`))]),n.mkStmt(n.mkGroup(o))})),Return:e=>{if(e.value){let t=s.currFun;return t&&(t.symInfo.pyRetType||H(e,9536,lf("function '{0}' missing return type",t.symInfo.pyQName)),Z(e.value,t.symInfo.pyRetType)),n.mkStmt(n.mkText("return "),tt(e.value))}return n.mkStmt(n.mkText("return"))},AugAssign:e=>{let t=Ee[e.op];return t.length>3?n.mkStmt(n.mkInfix(tt(e.target),"=",n.H.mkCall(t,[tt(e.target),tt(e.value)]))):n.mkStmt(tt(e.target),n.mkText(" "+t+"= "),tt(e.value))},Assign:e=>Fe(e),AnnAssign:e=>Fe(e),For:t=>{if(e.U.assert(0==t.orelse.length),t.target.forTargetEndPos=t.endPos,Me(t.iter,"range")){let e=t.iter,r=tt(t.target),i=qe(De(t.target));Z(t.target,S);let s=1==e.args.length?n.mkText("0"):tt(e.args[0]),o=tt(e.args[1==e.args.length?0:1]);if(e.args.length<=2)return n.mkStmt(n.mkText("for ("),n.mkInfix(r,"=",s),n.mkText("; "),n.mkInfix(i,"<",o),n.mkText("; "),n.mkPostfix([i],"++"),n.mkText(")"),Ie(t.body));let a="Num"===e.args[2].kind?e.args[2].n:void 0;if(null==a&&"UnaryOp"===e.args[2].kind){const t=e.args[2];"Num"===t.operand.kind&&("UAdd"===t.op?a=t.operand.n:"USub"===t.op&&(a=-t.operand.n))}if(void 0!==a){const l=a>0?"<":">";return n.mkStmt(n.mkText("for ("),n.mkInfix(r,"=",s),n.mkText("; "),n.mkInfix(i,l,o),n.mkText("; "),n.mkInfix(i,"+=",tt(e.args[2])),n.mkText(")"),Ie(t.body))}}if(m>1){const e=ke(t.target);Z(t.iter,ke(t.iter)==v?e:F(e))}return n.mkStmt(n.mkText("for ("),tt(t.target),n.mkText(" of "),tt(t.iter),n.mkText(")"),Ie(t.body))},While:t=>(e.U.assert(0==t.orelse.length),n.mkStmt(n.mkText("while ("),tt(t.test),n.mkText(")"),Ie(t.body))),If:t=>{let r=t=>{let i=[n.mkText("if ("),tt(t.test),n.mkText(")"),Ie(t.body)];return t.orelse.length&&(i[i.length-1].noFinalNewline=!0,1==t.orelse.length&&"If"==t.orelse[0].kind?(i.push(n.mkText(" else ")),e.U.pushRange(i,r(t.orelse[0]))):i.push(n.mkText(" else"),Ie(t.orelse))),i};return n.mkStmt(n.mkGroup(r(t)))},With:t=>{if(1==t.items.length&&function(e,t){let n=ke(e);return!(!n.classType||n.classType.pyQName!=t)||V(n)==t}(t.items[0].context_expr,"pins.I2CDevice")){let r=t.items[0],i=[],s=tt(r.context_expr);if(r.optional_vars){let e=Re(r.optional_vars);if(e){let o=Q(e,{isLocal:!0}),a=null==o?void 0:o.symbol;e=Oe(e),i.push(n.mkStmt(n.mkText("const "+e+" = "),s)),a.pyRetType||H(t,9537,lf("function '{0}' missing return type",a.pyQName)),Z(r.context_expr,a.pyRetType),s=n.mkText(e)}}return i.push(n.mkStmt(n.mkInfix(s,".",n.mkText("begin()")))),e.U.pushRange(i,t.body.map(nt)),i.push(n.mkStmt(n.mkInfix(s,".",n.mkText("end()")))),n.mkGroup(i)}let r=[],i=t.items.map(((e,t)=>{let i="with"+t;if(e.optional_vars){let t=De(e.optional_vars);Q(t,{isLocal:!0}),i=Oe(t)}return r.push(n.mkStmt(n.mkText(i+".end()"))),n.mkStmt(n.mkText("const "+i+" = "),n.mkInfix(tt(e.context_expr),".",n.mkText("begin()")))}));return e.U.pushRange(i,t.body.map(nt)),e.U.pushRange(i,r),n.mkBlock(i)},Raise:e=>{let t,r=e.exc||e.cause;if(!r)return n.mkStmt(n.mkText("throw"));if(r&&"Call"==r.kind){let e=r;1==e.args.length&&(t=tt(e.args[0]))}return t||(t=n.mkGroup([n.mkText("`"),tt(r),n.mkText("`")])),n.mkStmt(n.H.mkCall("control.fail",[t]))},Assert:e=>(e.msg||H(e,9537,lf("assert missing message")),n.mkStmt(n.H.mkCall("control.assert",[e.test,e.msg].filter((e=>!!e)).map(tt)))),Import:e=>{for(let t of e.names)t.asname&&Q(t.asname,{expandsTo:t.name}),B(e,t.name);return n.mkText("")},ImportFrom:e=>{let t=[];for(let r of e.names)if("*"==r.name)e.module||H(e,9538,lf("import missing module name")),Q(e.module,{isImportStar:!0});else{let i=e.module+"."+r.name,s=K(i),o=r.asname||r.name;xe(s)?(Q(o,{isImport:s,expandsTo:i}),t.push(n.mkStmt(n.mkText(`import ${Oe(o)} = ${i}`)))):Q(o,{expandsTo:i})}return n.mkGroup(t)},ExprStmt:e=>{return"Str"==e.value.kind?((t=e.value.s).trim().split(/\n/).length<=1?t=t.trim():t+="\n",n.mkStmt(n.mkText("/** "+t+" */"))):n.mkStmt(tt(e.value));var t},Pass:e=>n.mkStmt(n.mkText("")),Break:e=>n.mkStmt(n.mkText("break")),Continue:e=>n.mkStmt(n.mkText("continue")),Delete:t=>(H(t,9550,e.U.lf("delete statements are unsupported")),g(t)),Try:e=>{let t=[n.mkText("try"),Ie(e.body.concat(e.orelse))];for(let r of e.handlers)t.push(n.mkText("catch ("),r.name?qe(r.name):n.mkText("_")),r.type&&t.push(n.mkText("/* instanceof "),tt(r.type),n.mkText(" */")),t.push(n.mkText(")"),Ie(r.body));return e.finalbody.length&&t.push(n.mkText("finally"),Ie(e.finalbody)),n.mkStmt(n.mkGroup(t))},AsyncFunctionDef:t=>(H(t,9551,e.U.lf("async function definitions are unsupported")),g(t)),AsyncFor:t=>(H(t,9552,e.U.lf("async for statements are unsupported")),g(t)),AsyncWith:t=>(H(t,9553,e.U.lf("async with statements are unsupported")),g(t)),Global:r=>{const i=M();q();for(const n of r.names){e.U.lookup(i.vars,n)||H(r,9521,e.U.lf("No binding found for global variable"));Q(n,{},t.VarModifier.Global).firstRefPos<r.startPos&&H(r,9522,e.U.lf("Variable referenced before global declaration"))}return n.mkStmt(n.mkText(""))},Nonlocal:r=>{const i=M(),s=q();for(const n of r.names){const o=st(n,s);o&&o!==i&&o.vars[n].modifier!==t.VarModifier.Global||H(r,9523,e.U.lf("No binding found for nonlocal variable"));Q(n,{},t.VarModifier.NonLocal).firstRefPos<r.startPos&&H(r,9524,e.U.lf("Variable referenced before nonlocal declaration"))}return n.mkStmt(n.mkText(""))}};function Fe(t){let r,i,o,a;if("Assign"===t.kind){if(1!=t.targets.length)return H(t,9553,e.U.lf("multi-target assignment statements are unsupported")),g(t);a=t.targets[0],o=t.value,r=null,i=null}else{if("AnnAssign"!==t.kind)return t;a=t.target,o=t.value||null,r=t.annotation,i=ve(r),Z(a,i)}let l,u="",c=!!o&&Me(o,"const"),p=Re(a)||"";if(G()||s.currClass||s.currFun||"_"==p[0]||(u="export "),p&&s.currClass&&!s.currFun){c=!(!o||!s.currClass.isNamespace);let e=ce(s.currClass.symInfo,p,!0);if(e||H(t,9544,lf("cannot get class field")),0==m)return n.mkText("/* skip for now */");e.pyRetType||H(t,9539,lf("function '{0}' missing return type",e.pyQName)),Z(a,e.pyRetType),e.isInstance=!1,s.currClass.isNamespace&&(u=`export ${c?"const":"let"} `)}if(!o)return H(t,9555,e.U.lf("unable to determine value of assignment")),g(t);if(Z(a,ke(o)),c)return Q(De(a),{}),/^static /.test(u)||/const/.test(u)||(u+="const "),n.mkStmt(n.mkText(u),n.mkInfix(tt(a),"=",tt(o)));if(!u&&"Tuple"==a.kind)return function(t,r,i){if(r.elts.filter((e=>"Name"!==e.kind)).length)return H(t,9556,e.U.lf("non-trivial tuple assignment unsupported")),g(t);const s=r.elts.map(Re).map((e=>e?q().vars[e]:void 0));if(s.some((e=>void 0!==(null==e?void 0:e.modifier)))){const e=function(){const e=q();return void 0===e.nextHelperVariableId&&(e.nextHelperVariableId=0),"___tempvar"+e.nextHelperVariableId++}(),t=[n.mkStmt(n.mkInfix(n.mkGroup([n.mkText("let "),n.mkText(e)]),"=",tt(i)))];for(let i=0;i<s.length;i++){const s=o(r.elts[i]);t.push(n.mkStmt(n.mkInfix(s,"=",n.mkGroup([n.mkText(e),n.mkText(`[${i}]`)]))))}return n.mkGroup(t)}{let e=[n.mkText("let "),n.mkText("[")],t=r.elts.map((e=>e)).map((e=>o(e,!0)));return e.push(n.mkCommaSep(t)),e.push(n.mkText("]")),n.mkStmt(n.mkInfix(n.mkGroup(e),"=",tt(i)))}function o(e,t=!1){Ve(e,"identifierCompletion"),ke(e);Xe(e);return $e(e,t)}}(t,a,o);if("Name"===a.kind){const e=q().vars[p],t=null==e?void 0:e.symbol;t&&4===t.kind&&void 0===e.modifier&&(void 0===e.firstAssignPos||e.firstAssignPos>a.startPos)&&(e.firstAssignPos=a.startPos,e.firstAssignDepth=s.blockDepth)}if(r&&i&&("NameConstant"===o.kind&&null===o.value||"List"===o.kind&&0===o.elts.length)){const e=V(i);l=n.mkInfix(tt(a),":",n.mkText(e))}return l||(l=tt(a)),n.mkStmt(n.mkText(u),n.mkInfix(l,"=",tt(o)))}function $e(e,t=!1){var r,i;let o=e.id,a=de(o),l=null==a?void 0:a.symbol,u=q().vars[o],c=null==u?void 0:u.symbol;return void 0===e.isdef&&(!l||4===l.kind&&l!==c?(s.currClass&&!s.currFun?(e.isdef=!1,a=Q(o,{})):(e.isdef=!0,a=Q(o,{isLocal:!0})),l=a.symbol):e.isdef=!1,e.symbolInfo=l,e.tsType||H(e,9540,lf("definition missing ts type")),l.pyRetType||H(e,9568,lf("missing py return type")),ee(e,e.tsType,l.pyRetType)),e.isdef&&at(a,q())&&(e.isdef=!1),Ye(a,e),e.isdef&&!t?n.mkGroup([n.mkText("let "),qe(o)]):!(null==l?void 0:l.namespace)||!(null==l?void 0:l.qName)||(null===(r=s.currClass)||void 0===r?void 0:r.isNamespace)&&(null===(i=s.currClass)||void 0===i?void 0:i.name)===(null==l?void 0:l.namespace)?qe(o):qe(l.qName)}function Oe(e){return n.isReservedWord(e)?e+"_":e||e}function Re(e){var t;if("Name"==e.kind){let t=e.id,n=me(t),r=null==n?void 0:n.symbol;if(r){if(r.expandsTo)return r.expandsTo;if(s.currClass&&!s.currFun&&!(null==n?void 0:n.modifier)&&r.qName)return r.qName}return t}if("Attribute"==e.kind){let t=Re(e.value);if(t)return t+"."+e.attr}if(ze(e)&&(null===(t=s.currClass)||void 0===t?void 0:t.baseClass))return s.currClass.baseClass.qName}function De(e){let t=Re(e);return t||H(null,9542,lf("Cannot get name of unknown expression kind '{0}'",e.kind)),t}function qe(e){return"self"==e?n.mkText("this"):n.mkText(Oe(e))}function Me(e,t){if("Call"!=e.kind)return!1;return Re(e.func)===t}function Ge(t,r,i){let s=Ee[r];return e.U.assert(!!s),s.length>3?n.H.mkCall(s,[t,i]):n.mkInfix(t,s,i)}const Be={memoryview:{n:"",t:C},const:{n:"",t:S},"micropython.const":{n:"",t:S}};const Qe=function(){let e={};return Object.keys(pxtc.ts2PyFunNameMap).forEach((t=>{let n=pxtc.ts2PyFunNameMap[t];if(n&&n.n){let r={n:t,t:I(n.t),scale:n.scale};e[n.n]=r}})),Object.keys(Be).forEach((t=>{e[t]=Be[t]})),e}();function ze(e){return Me(e,"super")&&0==e.args.length}function We(e){return e.type==n.NT.Prefix&&'"'==e.op[0]?n.mkText(n.backtickLit(JSON.parse(e.op))):e}function je(e){return c&&e.startPos<=c.position&&c.position<=e.endPos}function Ve(e,t){m>100&&c&&null==p&&(c.type==t||"symbol"==c.type)&&je(e)&&(p=e,f=q())}function He(e,t){if(t&&t.pyAST&&"FunctionDef"==t.pyAST.kind){let n=t.pyAST;n.callers||(n.callers=[]),n.callers.indexOf(e)<0&&n.callers.push(e)}}const Je={BoolOp:e=>{let t=tt(e.values[0]);for(let n=1;n<e.values.length;++n)t=Ge(t,e.op,tt(e.values[n]));return t},BinOp:e=>{let t=function(e){if("Mod"==e.op&&"Str"==e.left.kind&&("Tuple"==e.right.kind||"List"==e.right.kind)){let t=e.left.s,r=e.right.elts;r=r.slice();let i=[n.mkText("`")];return t.replace(/([^%]+)|(%[\d\.]*([a-zA-Z%]))/g,((e,t,s,o)=>{if(t)i.push(n.mkText(t.replace(/[`\\$]/g,(e=>"\\"+e))));else{let e=r.shift(),t=e?tt(e):n.mkText("???");i.push(n.mkText("${"),t,n.mkText("}"))}return""})),i.push(n.mkText("`")),n.mkGroup(i)}return null}(e);if(t)return t;const r=tt(e.left),i=tt(e.right);return ct(e.left)&&ct(e.right)&&"Add"===e.op?n.H.extensionCall("concat",[r,i],!1):(t=Ge(r,e.op,i),be[e.op]&&(Z(e.left,S),Z(e.right,S),e.tsType||H(e,9570,lf("binary op missing ts type")),ee(e,e.tsType,S)),t)},UnaryOp:t=>{let r=Ce[t.op];return"Not"!==t.op?(Z(t,S),Z(t.operand,S)):Z(t,b),e.U.assert(!!r),n.mkInfix(null,r,tt(t.operand))},Lambda:t=>(H(t,9574,e.U.lf("lambda expressions are not supported yet")),h(t)),IfExp:e=>n.mkInfix(n.mkInfix(tt(e.test),"?",tt(e.body)),":",tt(e.orelse)),Dict:e=>{s.blockDepth++;const t=e.keys.map(((t,r)=>{const i=e.values[r];return void 0===t?h(e):n.mkStmt(n.mkInfix(tt(t),":",tt(i)),n.mkText(","))})),r=n.mkBlock(t);return s.blockDepth--,r},Set:e=>h(e),ListComp:e=>h(e),SetComp:e=>h(e),DictComp:e=>h(e),GeneratorExp:e=>{if(1==e.generators.length&&"Comprehension"==e.generators[0].kind){let t=e.generators[0];if(0==t.ifs.length)return Te((()=>{let r=De(t.target);return Q(r,{isParam:!0}),n.mkInfix(tt(t.iter),".",n.H.mkCall("map",[n.mkGroup([qe(r),n.mkText(" => "),tt(e.elt)])]))}))}return h(e)},Await:e=>h(e),Yield:e=>h(e),YieldFrom:e=>h(e),Compare:e=>{if(1==e.ops.length&&("In"==e.ops[0]||"NotIn"==e.ops[0])){z(ke(e.comparators[0]))==v&&Z(e.left,v);let t=n.mkInfix(tt(e.comparators[0]),".",n.H.mkCall("indexOf",[tt(e.left)]));return n.mkInfix(t,"In"==e.ops[0]?">=":"<",n.mkText("0"))}let t=tt(e.left),r=tt(e.comparators[0]);const i=(e,i,s)=>{Ne[e]&&pt(i)&&pt(s)&&n.flattenNode([t])!==n.flattenNode([r])&&(t=n.H.mkParenthesizedExpression(n.mkGroup([t,n.mkText(" as any")])),r=n.H.mkParenthesizedExpression(n.mkGroup([r,n.mkText(" as any")])))};i(e.ops[0],e.left,e.comparators[0]);let s=Ge(t,e.ops[0],r);for(let n=1;n<e.ops.length;++n)t=tt(e.comparators[n-1]),r=tt(e.comparators[n]),i(e.ops[n],e.comparators[n-1],e.comparators[n]),s=Ge(s,"And",Ge(t,e.ops[n],r));return s},Call:t=>{var r,i,o,a,l;t.func.inCalledPosition=!0;let u,m,d=Re(t.func),y=ye(d),k=y&&8==y.kind,x=y,T="";if(k)x=ye(y.pyQName+".__constructor"),x||(x=le(3,ft(null==y?void 0:y.pyAST)));else if("Attribute"==t.func.kind){let e=t.func;m=e.value,u=ke(m),(u.classType||u.primType)&&(T=e.attr,x=pe(m,T,!0),x&&(T=x.name))}let g=t.args.slice();if("super"==d&&0==g.length)return s.currClass&&s.currClass.baseClass&&(t.tsType||H(t,9543,lf("call expr missing ts type")),Y(t,t.tsType,s.currClass.baseClass)),n.mkText("super");if(Me(t,"int")&&1===g.length&&g[0]){const e=g[0],t=tt(e),r=ke(e);if("string"===r.primType)return n.mkGroup([n.mkText("parseInt"),n.mkText("("),t,n.mkText(")")]);if("number"===r.primType)return n.mkGroup([n.mkInfix(n.mkText("Math"),".",n.mkText("trunc")),n.mkText("("),t,n.mkText(")")])}if(!x){let t=e.U.lookup(Qe,d);if(t&&(T=""),T&&(d=V(u)+"."+T,t=e.U.lookup(Qe,d),t||"@array"!=J(z(u))||(d="Array."+T,t=e.U.lookup(Qe,d))),T="",t)if("."==t.n[0]&&g.length){if(m=g.shift(),u=ke(m),T=t.n.slice(1),x=pe(m,T),x&&2==x.kind)return n.mkInfix(tt(m),".",n.mkText(T))}else x=K(t.n)}if(Me(t,"str"))return ee(t,t.tsType,v),n.mkInfix(n.mkText('""'),"+",tt(t.args[0]));const h="Attribute"===t.func.kind&&ze(t.func.value);!x&&h&&(x=K(d));const S="__init__"===(null===(r=s.currFun)||void 0===r?void 0:r.name)&&"__constructor"===(null==x?void 0:x.name)&&(null===(o=null===(i=s.currClass)||void 0===i?void 0:i.baseClass)||void 0===o?void 0:o.pyQName)===(null==x?void 0:x.namespace)&&h;S&&(x=ye((null===(l=null===(a=s.currClass)||void 0===a?void 0:a.baseClass)||void 0===l?void 0:l.pyQName)+".__constructor")),x||H(t,9508,e.U.lf("can't find called function '{0}'",d));let b,N=x?x.parameters:null,C=[];if(N){for(g.length>N.length&&H(t,9510,e.U.lf("too many arguments in call to '{0}'",x.pyQName));g.length<N.length;)g.push(null);g=g.slice(0,N.length);for(let n of t.keywords){let t=N.findIndex((e=>e.name==n.arg));t<0?H(n,9511,e.U.lf("'{0}' doesn't have argument named '{1}'",x.pyQName,n.arg)):null!=g[t]?H(n,9512,e.U.lf("argument '{0} already specified in call to '{1}'",n.arg,x.pyQName)):g[t]=n.value}for(let e=g.length-1;e>=0&&(N[e].initializer&&null==g[e]);e--)g.pop();for(let r=0;r<g.length;++r){let i=g[r];if(null!=i||N[r].initializer)if(i){N[r].pyType||H(t,9545,lf("formal arg missing py type"));const e=N[r].pyType;"any"!==e.primType&&ne(i,e),"Name"==i.kind&&_e(i.symbolInfo)?C.push(Ke(i.symbolInfo.pyAST,!0)):C.push(tt(i))}else N[r].initializer||H(t,9547,lf("formal arg missing initializer")),C.push(n.mkText(N[r].initializer));else H(t,9513,e.U.lf("missing argument '{0}' in call to '{1}'",N[r].name,x.pyQName)),C.push(n.mkText("null"))}}else x&&H(t,9509,e.U.lf("calling non-function")),C=g.map(tt);if(!p&&c&&"signature"==c.type&&je(t)){p=t,f=q(),c.auxResult=0;for(let e=0;e<g.length;++e){c.auxResult=e;let t=g[e];if(!t)break;if(t.startPos<=c.position&&c.position<=t.endPos)break}}if(x)if(x.pyRetType||H(t,9549,lf("function missing pyRetType")),m&&ct(m)&&u?function(e,t,n){switch(t.qName){case"Array.pop":case"Array.removeAt":case"Array.shift":case"Array.find":case"Array.get":case"Array._pickRandom":Z(e,n.typeArgs[0]);break;case"Array.concat":case"Array.slice":case"Array.filter":case"Array.fill":Z(e,n);break;case"Array.reduce":if("Call"===e.kind&&e.args.length>1){const t=ke(e.args[1]);t&&Z(e,t)}break;case"Array.map":Z(e,F(E));break;default:Z(e,t.pyRetType)}}(t,x,u):Z(t,x.pyRetType),t.symbolInfo=x,x.attributes.py2tsOverride){const e=function(e){const t=new RegExp(/([^\$]*\()?([^\$\(]*)\$(\d)(?:(?:(?:=(\d+|'[a-zA-Z0-9_]*'|false|true|null|undefined))|(\?)|))/,"y"),n=[];let r,i=0;do{i=t.lastIndex,r=t.exec(e),r&&(r[1]&&n.push({kind:"text",text:r[1]}),n.push({kind:"arg",prefix:r[2],index:parseInt(r[3]),default:r[4],isOptional:!!r[5]}))}while(r);null!=i?n.push({kind:"text",text:e.substr(i)}):n.push({kind:"text",text:e});return{parts:n}}(x.attributes.py2tsOverride);if(e){T&&!m&&H(t,9550,lf("missing recv"));let r=function(e,t,r){const i=[];for(const r of e.parts)if("text"===r.kind)i.push(n.mkText(r.text));else if(t[r.index]||r.default)r.prefix&&i.push(n.mkText(r.prefix)),t[r.index]?i.push(t[r.index]):i.push(n.mkText(r.default));else if(!r.isOptional)return;if(r)return n.mkInfix(r,".",n.mkGroup(i));return n.mkGroup(i)}(e,C,T?tt(m):void 0);return r||H(t,9555,lf("buildOverride failed unexpectedly")),r}}else if(x.attributes.pyHelper)return n.mkGroup([n.mkInfix(n.mkText("_py"),".",n.mkText(x.attributes.pyHelper)),n.mkText("("),n.mkCommaSep(m?[tt(m)].concat(C):C),n.mkText(")")]);S?b=n.mkText("super"):T?(b=n.mkInfix(tt(m),".",n.mkText(T)),Ve(t.func,"memberCompletion")):b=tt(t.func);let U=[b,n.mkText("("),n.mkCommaSep(C),n.mkText(")")];return x&&1==C.length&&pxtc.service.isTaggedTemplate(x)&&(U=[b,We(C[0])]),k&&(y&&y.pyQName||H(t,9551,lf("missing namedSymbol or pyQName")),U[0]=n.mkText(j(y.pyQName)),U.unshift(n.mkText("new "))),n.mkGroup(U)},Num:e=>(e.tsType||H(e,9556,lf("tsType missing")),ee(e,e.tsType,S),n.mkText(e.ns)),Str:e=>(e.tsType||H(e,9557,lf("tsType missing")),ee(e,e.tsType,v),n.mkText(n.stringLit(e.s))),FormattedValue:e=>h(e),JoinedStr:e=>h(e),Bytes:t=>n.mkText(`hex\`${e.U.toHex(new Uint8Array(t.s))}\``),NameConstant:e=>(null!==e.value&&(e.tsType||H(e,9558,lf("tsType missing")),ee(e,e.tsType,b)),n.mkText(JSON.stringify(e.value))),Ellipsis:e=>h(e),Constant:e=>h(e),Attribute:t=>{let r=tt(t.value),i=ke(t.value),s=pe(t.value,t.attr),o=t.attr;if(Ve(t,"memberCompletion"),s)t.symbolInfo=s,He(t,s),t.tsType&&s.pyRetType||H(t,9559,lf("tsType or pyRetType missing")),ee(t,t.tsType,s.pyRetType),o=s.name;else if(i.moduleType){let n=K(i.moduleType.pyQName+"."+t.attr);n?(t.symbolInfo=n,He(t,n),Z(t,w(n)),o=n.name):H(t,9514,e.U.lf("module '{0}' has no attribute '{1}'",i.moduleType.pyQName,t.attr))}else m>2&&H(t,9515,e.U.lf("unknown object type; cannot lookup attribute '{0}'",t.attr));return n.mkInfix(r,".",n.mkText(Oe(o)))},Subscript:e=>{if("Index"==e.slice.kind){const t=z(ke(e.value));if(ct(e.value)){Z(e,t.typeArgs[0])}else"string"===t.primType?Z(e,t):m>2&&X(ke(e))&&Z(e,E);let r=e.slice.value;return m>2&&X(ke(r))&&Z(r,S),n.mkGroup([tt(e.value),n.mkText("["),tt(r),n.mkText("]")])}if("Slice"==e.slice.kind){const t=ke(e.value);Z(e,t);let r=e.slice;if(r.step){const i="string"===(null==t?void 0:t.primType);return n.H.mkCall(i?"_py.stringSlice":"_py.slice",[tt(e.value),r.lower?tt(r.lower):n.mkText("null"),r.upper?tt(r.upper):n.mkText("null"),tt(r.step)])}return n.mkInfix(tt(e.value),".",n.H.mkCall("slice",[r.lower?tt(r.lower):n.mkText("0"),r.upper?tt(r.upper):null].filter(T)))}return h(e)},Starred:e=>n.mkGroup([n.mkText("... "),tt(e.value)]),Name:e=>{if(Ve(e,"identifierCompletion"),"self"==e.id&&s.currClass)return e.tsType||H(e,9560,lf("missing tsType")),Y(e,e.tsType,s.currClass.symInfo),n.mkText("this");let t=Xe(e),r=null==t?void 0:t.symbol;if(r&&r.isImport)return qe(r.name);if(Ye(t,e),e.ctx.indexOf("Load")>=0){if(!r)return qe(De(e));if(!(null==r?void 0:r.qName))return H(e,9561,lf("missing qName")),qe("unknown");return qe(r.qName.replace("@type",""))}return $e(e)},List:Ze,Tuple:Ze};function Xe(t){let n=de(t.id),r=null==n?void 0:n.symbol;if(!n){let r=e.U.lookup(Qe,t.id);r&&(n=de(r.n))}if(n&&r){if(t.symbolInfo=r,t.tsType||H(t,9562,lf("missing tsType")),ee(t,t.tsType,w(r)),r.isImport)return n;He(t,r),t.forTargetEndPos&&n.forVariableEndPos!==t.forTargetEndPos&&(n.forVariableEndPos?n.lastRefPos=n.forVariableEndPos+1:n.forVariableEndPos=t.forTargetEndPos)}else m>0&&H(t,9516,e.U.lf("name '{0}' is not defined",t.id));return n}function Ye(e,n){if(e){if(e.modifier===t.VarModifier.Global){const t=M();t&&t.vars[e.symbol.name]&&(e=t.vars[e.symbol.name])}else if(e.modifier===t.VarModifier.NonLocal){const t=st(e.symbol.name,q());t&&(e=t.vars[e.symbol.name])}(void 0===e.firstRefPos||e.firstRefPos>n.startPos)&&(e.firstRefPos=n.startPos),(void 0===e.lastRefPos||e.lastRefPos<n.startPos)&&(e.lastRefPos=n.startPos)}}function Ze(e){return e.tsType||H(e,9563,lf("missing tsType")),ee(e,e.tsType,F(e.elts[0]?ke(e.elts[0]):L())),n.mkGroup([n.mkText("["),n.mkCommaSep(e.elts.map(tt)),n.mkText("]")])}function et(e){return`${e.startPos}:${e.endPos}`}function tt(t){o=t;let n=Je[t.kind];n||e.U.oops(t.kind+" - unknown expr"),ke(t);const r=n(t);return r.id=et(t),r}function nt(t){o=t;let r=Le[t.kind];r||e.U.oops(t.kind+" - unknown stmt");let i=(t._comments||[]).map((e=>e.value)),s=r(t);return i.length&&(s=n.mkGroup(i.map((e=>n.mkStmt(n.H.mkComment(e)))).concat(s))),s.id=et(t),s}function rt(e){return!e||(e.type==n.NT.Prefix&&""==e.op?e.children.every(rt):e.type==n.NT.NewLine)}function it(e){const t=qe(e.name),r=V(w(e));return n.mkStmt(n.mkGroup([n.mkText("let "),t,n.mkText(": "+r+";")]))}function st(e,n){if(!n)return;const r=n.vars&&n.vars[e];return r&&r.modifier!=t.VarModifier.NonLocal?n:st(e,n.parent)}function ot(e){const t=[];let n;for(const r of Object.keys(e.vars))n=e.vars[r],at(n,e)&&t.push(it(null==n?void 0:n.symbol));return t}function at(e,t){return!!(4===e.symbol.kind&&!e.symbol.isParam&&void 0===e.modifier&&(e.lastRefPos>e.forVariableEndPos||e.firstRefPos<e.firstAssignPos||e.firstAssignDepth>t.blockDepth)&&!(function(e){return"Module"===e.kind&&"main"===e.name}(t)&&0===e.firstAssignDepth))}function lt(t){if(e.U.assert("Module"==t.kind),t.tsBody)return;var r;s={currClass:void 0,currFun:void 0,currModule:r=t,blockDepth:0},a=r.tsFilename.replace(/\.ts$/,".py"),t.vars||(t.vars={});let i=ot(t).concat(t.body.map(nt));return i.every(rt)?void 0:"main"==t.name?i:[n.mkText("namespace "+t.name+" "),n.mkBlock(i)]}function ut(e){m=e,l=[],y=0,o=void 0}function ct(e){const t=z(ke(e));return t&&"@array"===t.primType}function pt(e){switch(e.kind){case"Num":case"Str":return!0;case"NameConstant":return null!==e.value}return!1}function ft(e,t=e.symInfo){var n;const r=_(t.pyQName+".__constructor");if(!r&&(null===(n=t.extendsTypes)||void 0===n?void 0:n.length)){const n=ye(t.extendsTypes[0])||K(t.extendsTypes[0]);if(n)return ft(e,n)}const i={kind:"FunctionDef",name:"__init__",startPos:e.startPos,endPos:e.endPos,parent:e,body:[],args:{kind:"Arguments",startPos:0,endPos:0,args:[{startPos:0,endPos:0,kind:"Arg",arg:"self"}],kw_defaults:[],kwonlyargs:[],defaults:[]},decorator_list:[],vars:{},symInfo:se(3,e.symInfo.qName+".__constructor")};return i.symInfo.parameters=[],i.symInfo.pyRetType=L({classType:e.symInfo}),r&&(i.args.args.push(...r.parameters.map((e=>({startPos:0,endPos:0,kind:"Arg",arg:e.name})))),i.symInfo.parameters.push(...r.parameters.map((e=>{if(e.pyType)return e;return Object.assign(Object.assign({},e),{pyType:P(e.type)})})))),i}function mt(e,t,r){const i=`___${t}_is_set`,s=`___${t}`;return n.mkStmt(n.mkStmt(n.mkText(`private ${i}: boolean`)),n.mkStmt(n.mkText(`private ${s}: ${r}`)),n.mkStmt(n.mkText(`get ${t}(): ${r}`),n.mkBlock([n.mkText(`return this.${i} ? this.${s} : ${e}.${t}`)])),n.mkStmt(n.mkText(`set ${t}(value: ${r})`),n.mkBlock([n.mkStmt(n.mkText(`this.${i} = true`)),n.mkStmt(n.mkText(`this.${s} = value`))])))}t.py2ts=function(s){let o=[];const m={};l=[],e.U.assert(!!s.sourceFiles,"missing sourceFiles! Cannot convert py to ts");let d=s.sourceFiles.filter((t=>e.U.endsWith(t,".py")));if(0==d.length)return{outfiles:m,diagnostics:l,success:0===l.length,sourceMap:[]};let k=(e,t)=>e.substr(0,e.length-t.length),x=e.U.toDictionary(d,(e=>k(e,".py"))),T=s.sourceFiles.filter((t=>e.U.endsWith(t,".ts"))).filter((e=>k(e,".ts")in x));e.U.assert(!!s.apisInfo,"missing apisInfo! Cannot convert py to ts"),a=d[0],function(t,n){i={},r={};let s=e.U.toDictionary(n,(e=>e));for(let n of e.U.values(t.byQName)){if(s.hasOwnProperty(n.fileName))continue;let t=n;t.extendsTypes&&(t.extendsTypes=t.extendsTypes.filter((e=>e!=t.qName))),t.pyQName&&t.qName||H(null,9526,e.U.lf("Symbol '{0}' is missing qName for '{1}'",t.name,t.pyQName?"ts":"py")),r[t.pyQName]=t,r[t.qName]=t}C=P("Buffer")}(s.apisInfo,T),u=s,c=void 0,s.generatedFiles||(s.generatedFiles=[]);for(const t of d){let n=t,r=t.replace(/\.py$/,"").replace(/.*\//,""),i=s.fileSystem[t];try{a=t;let s=e.py.lex(i),u=e.py.parse(i,n,s);e.U.pushRange(l,u.diagnostics),o.push({kind:"Module",body:u.stmts,blockDepth:0,name:r,source:i,tsFilename:n.replace(/\.py$/,".ts")})}catch(t){e.log("Parse error",t)}}const g=l;for(let t=0;t<5;++t){ut(t);for(let t of o)try{lt(t)}catch(t){e.log("Conv pass error",t)}if(0==y)break}ut(1e3),p=void 0,c=s.syntaxInfo||{position:0,type:"symbol"};let h=[];for(let t of o)try{let e=lt(t);if(!e)continue;let r=n.flattenNode(e);function v(e){let t=e.id.split(":");if(2!=t.length)return;let n=t.map((e=>parseInt(e)));return{py:{startPos:n[0],endPos:n[1]},ts:{startPos:e.startPos,endPos:e.endPos}}}s.sourceFiles.push(t.tsFilename),s.generatedFiles.push(t.tsFilename),s.fileSystem[t.tsFilename]=r.output,m[t.tsFilename]=r.output,h=r.sourceMap.map(v).filter((e=>!!e))}catch(t){e.log("Conv error",t)}l=g.concat(l);let S={};const b=e.U.values(r).concat(e.U.values(i));let N=[];const E=e=>{if((e=>{switch(e.kind){case 6:case 7:case 4:case 3:case 5:return!0;case 2:case 1:return!e.isInstance;default:return!1}})(e)&&N.indexOf(e)<0){let t=A(e);S[t.qName||t.name]=t}};for(let t=f;t;t=t.parent)t&&t.vars&&e.U.values(t.vars).map((e=>e.symbol)).forEach(E);if(b.forEach(E),c&&p){if(p=p,c.beginPos=p.startPos,c.endPos=p.endPos,c.symbols||(c.symbols=[]),N=c.symbols.slice(),"memberCompletion"==c.type&&"Attribute"==p.kind){const e=ke(p.value);if(e.moduleType)for(let t of b)t.isInstance||t.namespace!=e.moduleType.qName||c.symbols.push(t);else if(e.classType||e.primType){const t=e.classType||fe(e.primType).reduce(((e,t)=>e||t),null);if(t){t.extendsTypes&&t.qName||H(null,9567,lf("missing extendsTypes or qName"));let e=t.extendsTypes.concat(t.qName);for(let t of b)t.isInstance&&e.indexOf(t.namespace)>=0&&c.symbols.push(t)}}}else if("identifierCompletion"==c.type)c.symbols=e.U.values(S);else{let e=p.symbolInfo;e&&c.symbols.push(e)}c.symbols=c.symbols.map(A)}let U=function(){for(let e of l)t.patchPosition(e,s.fileSystem[e.fileName]);return l}();return{outfiles:m,success:0===U.length,diagnostics:U,syntaxInfo:c,globalNames:S,sourceMap:h}}}(e.py||(e.py={}))}(pxt||(pxt={})),function(e){!function(t){let n;!function(e){e[e.Id=0]="Id",e[e.Op=1]="Op",e[e.Keyword=2]="Keyword",e[e.Number=3]="Number",e[e.String=4]="String",e[e.NewLine=5]="NewLine",e[e.Comment=6]="Comment",e[e.Indent=7]="Indent",e[e.Dedent=8]="Dedent",e[e.EOF=9]="EOF",e[e.Error=10]="Error"}(n=t.TokenType||(t.TokenType={})),t.keywords={False:!0,None:!0,True:!0,and:!0,as:!0,assert:!0,async:!0,await:!0,break:!0,class:!0,continue:!0,def:!0,del:!0,elif:!0,else:!0,except:!0,finally:!0,for:!0,from:!0,global:!0,if:!0,import:!0,in:!0,is:!0,lambda:!0,nonlocal:!0,not:!0,or:!0,pass:!0,raise:!0,return:!0,try:!0,while:!0,with:!0,yield:!0};let r,i,s=[];const o={"%":"Mod","&":"BitAnd","*":"Mult","**":"Pow","+":"Add","-":"Sub","/":"Div","//":"FloorDiv","<<":"LShift",">>":"RShift","@":"MatMult","^":"BitXor","|":"BitOr"},a={"!":"Bang","!=":"NotEq","(":"LParen",")":"RParen",",":"Comma","->":"Arrow",".":"Dot",":":"Colon",";":"Semicolon","<":"Lt","<=":"LtE","=":"Assign","==":"Eq",">":"Gt",">=":"GtE","[":"LSquare","]":"RSquare","{":"LBracket","}":"RBracket","~":"Invert"},l={b:/^[_0-1]$/,B:/^[_0-1]$/,o:/^[_0-7]$/,O:/^[_0-7]$/,x:/^[_0-9a-fA-F]$/,X:/^[_0-9a-fA-F]$/},u={b:2,B:2,o:8,O:8,x:16,X:16};let c,p,f=0,m=0;function d(e,t){let n=0,r=0;for(let i=0;i<e;++i)10==t.charCodeAt(i)&&(n++,r=i);return{line:n,column:e-r-1}}function y(e){switch(e.type){case n.Id:return`id(${e.value})`;case n.Op:return"'"+i[e.value]+"'";case n.Keyword:return e.value;case n.Number:return`num(${e.value})`;case n.String:return e.stringPrefix+JSON.stringify(e.value);case n.NewLine:return"<nl>";case n.Comment:return`/* ${e.value} */`;case n.Indent:return"indent"+e.value;case n.Dedent:return"dedent";case n.Error:return`[ERR: ${e.value}]`;case n.EOF:return"End of file";default:return"???"}}t.position=d,t.patchPosition=function(e,t){if(!e.start&&!e.length)return e.start=0,e.length=0,e.line=0,void(e.column=0);let n=d(e.start,t);e.line=n.line,e.column=n.column,e.length>0&&(n=d(e.start+e.length-1,t),e.endLine=n.line,e.endColumn=n.column+2)},t.tokenToString=y,t.friendlyTokenToString=function(e,t){let n=e.endPos-e.startPos,r="";return r=0==n?y(e):n>20?"`"+t.slice(e.startPos,e.startPos+20)+"`...":"`"+t.slice(e.startPos,e.endPos)+"`",r=r.replace(/\r/g,"").replace(/\n/g,"\\n").replace(/\t/g,"\\t"),r},t.tokensToString=function(e){let t="",r=0;for(let i of e){let e=y(i);r+e.length>70&&(r=0,t+="\n"),0!=r&&(t+=" "),t+=e,r+=e.length,i.type!=n.NewLine&&i.type!=n.Comment||(r=0,t+="\n")}return t},t.lex=function(d){for(0==s.length&&function(){const n={'"':S,"'":S,"#":C,"\\":E,".":I};r=e.U.clone(a);for(let e of Object.keys(o))r[e]=o[e],r[e+"="]=o[e]+"Assign";i={};for(let e of Object.keys(r))i[r[e]]=e;for(let e=0;e<128;++e)if(t.rx.isIdentifierStart(e))s[e]=x;else{let i=String.fromCharCode(e);if(n.hasOwnProperty(i))s[e]=n[i];else if(r.hasOwnProperty(i)){let t=!1,n=r[i];for(let e of Object.keys(r))e!=i&&e.startsWith(i)&&(t=!0);s[e]=t?()=>g(n):()=>T(n)}else t.rx.isSpace(e)?s[e]=()=>{}:13==e?s[e]=()=>{10==p.charCodeAt(f)&&f++,b()}:t.rx.isNewline(e)?s[e]=b:A(e)?s[e]=U:s[e]=P}}(),p=d,c=[],f=0,m=0,N();f<p.length;){m=f;const e=p.charCodeAt(f++);e<128?s[e]():t.rx.isIdentifierStart(e)?x():t.rx.isSpace(e)||(t.rx.isNewline(e)?b():P())}return m=f,b(),y(n.EOF,""),c;function y(e,t,n){let r={type:e,value:t,startPos:m,endPos:f,auxValue:n};return c.push(r),r}function k(e){y(n.Error,e)}function x(){for(;t.rx.isIdentifierChar(p.charCodeAt(f));)f++;let e=p.slice(m,f),r=p.charCodeAt(f);t.keywords.hasOwnProperty(e)?y(n.Keyword,e):34==r||39==r?v(e):y(n.Id,e)}function T(e){y(n.Op,e)}function g(e){let t=p.slice(m,f+1);if(2==t.length&&r.hasOwnProperty(t)){let n=p.slice(m,f+2);3==n.length&&r.hasOwnProperty(n)?(f+=2,e=r[n]):(f++,e=r[t])}T(e)}function h(e){switch(e){case 97:return 7;case 98:return 8;case 102:return 12;case 110:return 10;case 114:return 13;case 116:return 9;case 118:return 11;default:return 0}}function v(r){const i=p.charCodeAt(f++);let s=!1;p.charCodeAt(f)==i&&p.charCodeAt(f+1)==i&&(f+=2,s=!0);let o=(r=r.toLowerCase()).indexOf("r")>=0,a="",l="";for(;;){const n=p.charCodeAt(f++);if(n==i){if(!s)break;if(p.charCodeAt(f)==i&&p.charCodeAt(f+1)==i){f+=2;break}l+="\\"+String.fromCharCode(i),a+=String.fromCharCode(i)}else if(92==n){let n=p.charCodeAt(f++);if(13==n&&10==p.charCodeAt(f)&&(n=10,f++),34==n||39==n||92==n)o&&(l+="\\",a+="\\"),l+="\\"+String.fromCharCode(n),a+=String.fromCharCode(n);else if(!o&&h(n))l+="\\"+String.fromCharCode(n),a+=String.fromCharCode(h(n));else if(t.rx.isNewline(n))o&&(a+="\\"+String.fromCharCode(n),l+="\\\\",l+=10==n?"\\n":"\\u"+("0000"+n.toString(16)).slice(-4));else if(o||48!=n)if(o||117!=n&&120!=n)l+="\\\\"+String.fromCharCode(n),a+="\\"+String.fromCharCode(n);else{let t=117==n?4:2,r=p.slice(f,f+t);f+=t;let i=parseInt(r,16);isNaN(i)&&k(e.U.lf("invalid unicode or hex escape")),l+="\\"+String.fromCharCode(n)+r,a+=String.fromCharCode(i)}else l+="\\\\x00",a+="\0"}else{if(isNaN(n)){k(e.U.lf("end of file in a string"));break}if(t.rx.isNewline(n)&&!s){k(e.U.lf("new line in a string"));break}a+=String.fromCharCode(n),l+=String.fromCharCode(n)}}let u=y(n.String,a);u.quoted=l,u.stringPrefix=r}function S(){f--,v("")}function b(){y(n.NewLine,""),N()}function N(){let e=0;for(;;){const t=p.charCodeAt(f);if(9!=t){if(32!=t)break;e++,f++}else e=e+8&-8,f++}y(n.Indent,""+e)}function E(){let n=p.charCodeAt(f);t.rx.isNewline(n)?(f++,13==n&&10==p.charCodeAt(f)&&f++):k(e.U.lf("unexpected character after line continuation character"))}function C(){for(y(n.NewLine,"");f<p.length&&!t.rx.isNewline(p.charCodeAt(f));)f++;y(n.Comment,p.slice(m+1,f)),13==p.charCodeAt(f)&&10==p.charCodeAt(f+1)&&f++,f++,N()}function U(){let t=p[m],r="";if("0"==t){let i=p[f];const s=l[i];if(s){for(f++;;){const e=p[f];if(!s.test(e))break;r+=e,f++}if(r){let s=parseInt(r,u[i]);isNaN(s)&&k(e.U.lf("invalid number")),y(n.Number,t+i+r,s)}else k(e.U.lf("expecting numbers to follow 0b, 0o, 0x"));return}}let i=!1,s=!1,o=!1;for(f=m;;){const e=p.charCodeAt(f);if(!o||43!=e&&45!=e)if(o=!1,95==e||A(e));else if(s||i||46!=e){if(s||69!=e&&101!=e)break;s=!0,o=!0}else i=!0;else;r+=String.fromCharCode(e),f++}!i&&!s&&"0"==t&&r.length>1&&!/^0+/.test(r)&&k(e.U.lf("unexpected leading zero"));let a=parseFloat(r);isNaN(a)&&k(e.U.lf("invalid number")),y(n.Number,r,a)}function I(){A(p.charCodeAt(f))?U():y(n.Op,"Dot")}function A(e){return 48<=e&&e<=57}function P(){k(e.U.lf("invalid token"))}}}(e.py||(e.py={}))}(pxt||(pxt={})),function(e){!function(t){let n,r,i,s,o,a,l,u,c;function p(){return r[o]}function f(){for(;r[o];o++){let i=r[o];if(i.type!=t.TokenType.Comment){if(n>=0&&i.type==t.TokenType.Op)switch(i.value){case"LParen":case"LSquare":case"LBracket":n++;break;case"RParen":case"RSquare":case"RBracket":n--}if(i.type!=t.TokenType.Error){if(n>0){if(i.type==t.TokenType.NewLine||i.type==t.TokenType.Indent)continue}else if(i.type==t.TokenType.Indent){if(r[o+1].type==t.TokenType.NewLine){o++;continue}let n=parseInt(i.value),s=l[l.length-1];if(n==s)continue;if(n>s)return void l.push(n);{i.type=t.TokenType.Dedent;let s=0;for(;l.length;){let t=l[l.length-1];if(!(t>n)){for(t!=n&&d(9552,e.U.lf("inconsitent indentation"));s>1;)r.splice(o,0,i),s--;return}l.pop(),s++}}}return}d(9551,i.value)}else a.push(i)}}function m(){u=p(),u.type!=t.TokenType.EOF&&(o++,f())}function d(n,r){r||(r=e.U.lf("invalid syntax")),n||(n=9550);const o=p(),a={code:n,category:pxtc.DiagnosticCategory.Error,messageText:e.U.lf("{0} near {1}",r,t.friendlyTokenToString(o,i)),fil