{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tom/demos/tom/babel-plugin-tracer.js"],"names":["Trace","wrapAST","types","t","error","path","message","buildCodeFrameError","returnVisitor","ReturnStatement","state","node","alreadyVisited","returnValue","argument","identifier","returnNode","callOnTrace","location","methodName","args","shouldBeStatement","call","callExpression","memberExpression","traceIdenifierName","expressionStatement","astNode","filename","file","opts","start","loc","end","locationObject","startLine","line","startColumn","column","endLine","endColumn","id","register","numericLiteral","modifyFunction","name","body","get","unshiftContainer","stringLiteral","pushContainer","traverse","resolveName","callee","type","object","property","nameFromCallExpression","visitor","Program","CallExpression","isGenerated","isMemberExpression","computed","aboutToEnter","replaceWith","insertBefore","isFunctionExpression","ArrowFunctionExpression","key","Loop","insertAfter","ForStatement","init","declarations","map","declaration","ForOfStatement","ForInStatement","Conditional","test","parent","AssignmentExpression","right","left"],"mappings":"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","file":"babel-plugin-tracer.js","sourcesContent":["import Trace from 'demos/tom/trace.js';\nimport wrapAST from 'demos/tom/wrapAST.js';\n\nexport default function({ types: t }) {\n    function error(path, message) {\n        throw path.buildCodeFrameError(message);\n    }\n\n    const returnVisitor = {\n        ReturnStatement(path, state) {\n            if (path.node.alreadyVisited) {\n                return;\n            }\n            path.node.alreadyVisited = true;\n\n            const returnValue = path.node.argument ? path.node.argument : t.identifier('undefined');\n            const returnNode = callOnTrace('return', [location(path.node, state), returnValue]);\n            path.node.argument = returnNode;\n        }\n    }\n\n    function callOnTrace(methodName, args = [], shouldBeStatement = false) {\n        let call = t.callExpression(t.memberExpression(t.identifier(Trace.traceIdenifierName), t.identifier(methodName)),\n            args);\n        if (shouldBeStatement) {\n            call = t.expressionStatement(call);\n        }\n        return call;\n    }\n\n    function location(astNode, state) {\n        const filename = state.file.opts.filename;\n\n        const start = astNode.loc.start;\n        const end = astNode.loc.end;\n\n        const locationObject = {\n            filename,\n            startLine: start.line,\n            startColumn: start.column,\n            endLine: end.line,\n            endColumn: end.column\n        }\n\n        const id = Trace.register(locationObject);\n\n        return t.numericLiteral(id);\n    }\n\n    function modifyFunction(name, path, state) {\n        const body = path.get('body');\n        body.unshiftContainer('body', t.expressionStatement(callOnTrace('enterFunction', [location(path.node, state), t\n            .stringLiteral(name)\n        ])));\n        body.pushContainer('body', t.expressionStatement(callOnTrace('leave', [location(path.node, state)])));\n        path.traverse(returnVisitor, state);\n    }\n\n    function resolveName(callee) {\n        if (callee.type === 'MemberExpression') {\n            return resolveName(callee.object) + `.${callee.property.name}`;\n        } else if (callee.type === 'CallExpression') {\n            return resolveName(callee.callee);\n        } else {\n            return callee.name;\n        }\n    }\n\n    function nameFromCallExpression(path) {\n        const callee = path.node.callee;\n        if (callee.type === 'MemberExpression') {\n            return resolveName(callee)\n        } else {\n            return callee.name || 'anonymous function';\n        }\n    }\n\n    return {\n        name: 'tracer',\n        visitor: {\n            Program(path) {\n                // wrapAST(path.node, {notify(){console.log(...arguments)}})\n            },\n            CallExpression(path) {\n                if (path.node.alreadyVisited || path.isGenerated()) {\n                    return;\n                }\n\n\n                path.node.alreadyVisited = true;\n                let callee = path.get('callee');\n                let name;\n\n                if (t.isMemberExpression(callee)) {\n                    callee.node.computed = true;\n                    callee = path.get('callee.property');\n\n                    name = callee.node.name || 'anonymous function';\n\n                    const aboutToEnter = callOnTrace('aboutToEnter',\n                        [\n                            location(callee.node, this),\n                            t.stringLiteral(name)\n                        ]);\n                    callee.replaceWith(t.stringLiteral(name));\n                    callee.insertBefore(aboutToEnter);\n                    return;\n                } else if (t.isFunctionExpression(callee)) {\n                    name = callee.node.id.name || 'anonymous function';\n                } else { // identifier or anonymous\n                    name = callee.node.name || 'anonymous function';\n                }\n\n                const aboutToEnter = callOnTrace('aboutToEnter',\n                    [\n                        location(callee.node, this),\n                        t.stringLiteral(name)\n                    ]);\n\n                callee.insertBefore(aboutToEnter);\n\n\n            },\n            ArrowFunctionExpression(path) {\n\n            },\n            \"ClassMethod|ObjectMethod\"(path) {\n                const name = path.node.key.name;\n                modifyFunction(name, path, this);\n            },\n            \"FunctionDeclaration|FunctionExpression\"(path) {\n                const id = path.node.id;\n                const name = id ? id.name : 'anonymous function';\n                modifyFunction(name, path, this);\n            },\n            Loop(path) {\n                path.insertBefore(callOnTrace('beginLoop', [location(path.node, this), t.stringLiteral(path.type)]))\n                path.insertAfter(callOnTrace('endLoop', [location(path.node, this)]))\n            },\n            ForStatement(path) {\n                path.get('body').unshiftContainer('body', callOnTrace('nextLoopIteration', [location(path.node, this),\n                    ...path.node.init.declarations.map(declaration => declaration.id)\n                ]));\n            },\n            ForOfStatement(path) {\n\n            },\n            ForInStatement(path) {\n\n            },\n            Conditional(path) {\n                if (path.node.alreadyVisited) {\n                    return;\n                }\n\n                path.node.alreadyVisited = true;\n\n                path.node.test = callOnTrace('conditionTest', [\n                    location(path.node.test, this),\n                    path.node.test\n                ]);\n\n                // do not log else ifs\n                if (path.parent.type !== 'IfStatement') {\n                    path.insertBefore(callOnTrace('beginCondition', [\n                        location(path.node, this),\n                        t.stringLiteral(path.type)\n                    ]));\n                    path.insertAfter(callOnTrace('endCondition', [location(path.node, this)]));\n                }\n            },\n\n            AssignmentExpression(path) {\n                if (path.isGenerated()) {\n                    return;\n                }\n                path.node.right = callOnTrace('assignment', [\n                    location(path.node, this),\n                    t.stringLiteral(resolveName(path.node.left)), path.node.right\n                ]);\n            }\n        }\n    }\n}\n"]}