{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tom/demos/tom/babel-plugin-tracer.md"],"names":["t","types","error","path","message","buildCodeFrameError","returnVisitor","ReturnStatement","node","alreadyVisited","log","stringLiteral","returnValue","argument","identifier","sequenceExpression","name","visitor","CallExpression","sequence","replaceWith","expressionStatement","Function","id","body","get","unshiftContainer","pushContainer","traverse","Trace"],"mappings":";;;;;uBAMe,gBAAqB;AAAA,YAAJA,CAAI,QAAXC,KAAW;;AAChC,iBAASC,KAAT,CAAeC,IAAf,EAAqBC,OAArB,EAA8B;AAC1B,kBAAMD,KAAKE,mBAAL,CAAyBD,OAAzB,CAAN;AACH;;AAED,YAAME,gBAAgB;AACpBC,2BADoB,2BACJJ,IADI,EACE;AACpB,oBAAGA,KAAKK,IAAL,CAAUC,cAAb,EAA6B;AACzB;AACH;AACDN,qBAAKK,IAAL,CAAUC,cAAV,GAA2B,IAA3B;AACA,oBAAMC,MAAMV,EAAEW,aAAF,CAAgB,iBAAhB,CAAZ;AACA,oBAAMC,cAAcT,KAAKK,IAAL,CAAUK,QAAV,GAAqBV,KAAKK,IAAL,CAAUK,QAA/B,GAA0Cb,EAAEc,UAAF,CAAa,WAAb,CAA9D;AACAX,qBAAKK,IAAL,CAAUK,QAAV,GAAqBb,EAAEe,kBAAF,CAAqB,CAACL,GAAD,EAAME,WAAN,CAArB,CAArB;AACD;AATmB,SAAtB;;AAYA,eAAO;AACHI,kBAAM,QADH;AAEHC,qBAAS;AACLC,8BADK,0BACUf,IADV,EACgB;AACjB,wBAAGA,KAAKK,IAAL,CAAUC,cAAb,EAA6B;AACzB;AACH;AACDN,yBAAKK,IAAL,CAAUC,cAAV,GAA2B,IAA3B;AACA,wBAAMC,MAAMV,EAAEW,aAAF,CAAgB,yBAAhB,CAAZ;AACA,wBAAMQ,WAAWnB,EAAEe,kBAAF,CAAqB,CAACL,GAAD,EAAMP,KAAKK,IAAX,CAArB,CAAjB;AACAL,yBAAKiB,WAAL,CAAiBpB,EAAEqB,mBAAF,CAAsBF,QAAtB,CAAjB;AACH,iBATI;AAULG,wBAVK,oBAUInB,IAVJ,EAUU;AACX,wBAAMoB,KAAKpB,KAAKK,IAAL,CAAUe,EAArB;AACA,wBAAMP,OAAOO,KAAKA,GAAGP,IAAR,GAAe,oBAA5B;AACA,wBAAMQ,OAAOrB,KAAKsB,GAAL,CAAS,MAAT,CAAb;AACAD,yBAAKE,gBAAL,CAAsB,MAAtB,EAA8B1B,EAAEqB,mBAAF,CAAsBrB,EAAEW,aAAF,CAAgB,gBAAhB,CAAtB,CAA9B;AACAa,yBAAKG,aAAL,CAAmB,MAAnB,EAA2B3B,EAAEqB,mBAAF,CAAsBrB,EAAEW,aAAF,CAAgB,gBAAhB,CAAtB,CAA3B;AACAR,yBAAKyB,QAAL,CAActB,aAAd;AACH;AAjBI;AAFN,SAAP;AAsBH,K;;;;;;;AA7CKuB,iB,GACF,iBAAc;AAAA;AAEb,a","file":"babel-plugin-tracer.md","sourcesContent":["class Trace {\n    constructor() {\n    \n    }\n}\n\nexport default function({types: t}) {\n    function error(path, message) {\n        throw path.buildCodeFrameError(message);\n    }\n    \n    const returnVisitor = {\n      ReturnStatement(path) {\n        if(path.node.alreadyVisited) {\n            return;\n        }\n        path.node.alreadyVisited = true;\n        const log = t.stringLiteral('Leave by return');\n        const returnValue = path.node.argument ? path.node.argument : t.identifier('undefined');\n        path.node.argument = t.sequenceExpression([log, returnValue])\n      }\n    }\n\n    return {\n        name: 'tracer',\n        visitor: {\n            CallExpression(path) {\n                if(path.node.alreadyVisited) {\n                    return;\n                }\n                path.node.alreadyVisited = true;\n                const log = t.stringLiteral('About to enter function');\n                const sequence = t.sequenceExpression([log, path.node]);\n                path.replaceWith(t.expressionStatement(sequence));\n            },\n            Function(path) {\n                const id = path.node.id;\n                const name = id ? id.name : 'anonymous function';\n                const body = path.get('body'); \n                body.unshiftContainer('body', t.expressionStatement(t.stringLiteral('Enter function')));\n                body.pushContainer('body', t.expressionStatement(t.stringLiteral('Leave function')));\n                path.traverse(returnVisitor);\n            }\n        }\n    }\n}"]}