{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-markus/demos/tom/trace.js"],"names":["_","loadPlugin","ErrorEvent","Event","ASTChangeEvent","TraceLogParser","clone","object","constructor","name","cloneDeep","Trace","_log","counter","pluginRound","locations","filenames","fileRegistry","Map","astNodeRegistry","log","event","push","startTraversion","createTraceID","nodeID","isTraceID","serialize","serialized","JSON","stringify","traceIdentifierName","deserializedFrom","obj","trace","parse","on","source","pluginData","data","oldAST","transformedAST","analyze","register","astNode","state","has","get","filename","file","opts","fileID","set","start","loc","end","location","line","column","id","resolve","locationID","startLine","startColumn","endLine","endColumn","notify","objectID","key","oldValue","newValue","arrayProperty","enterPlugin","traceID","leavePlugin","startTraversePlugin","endTraversePlugin","aboutToEnter","position","left","value","undefined","enterFunction","leave","return","returnValue","beginLoop","loopType","nextLoopIteration","args","map","forIterator","iterator","forKeys","keys","endLoop","beginCondition","conditionType","conditionTest","endCondition","assignment","right","error","stack","parser","sections"],"mappings":"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","file":"trace.js","sourcesContent":["import * as _ from 'src/external/lodash/lodash.js';\nimport loadPlugin from 'demos/tom/plugin-load-promise.js';\nimport { ErrorEvent, Event, ASTChangeEvent } from 'demos/tom/Events.js';\nimport TraceLogParser from 'demos/tom/TraceLogParser.js';\n\nfunction clone(object) {\n    if (object && object.constructor.name === 'NodePath') {\n        return 'NodePath';\n    }\n\n    return _.cloneDeep(object);\n}\n\nexport default class Trace {\n    constructor() {\n        this._log = [];\n        \n        this.counter = 0;\n        this.pluginRound = 0;\n\n        this.locations = [];\n        this.filenames = [];\n        this.fileRegistry = new Map();\n        this.astNodeRegistry = new Map();\n    }\n\n    log(event) {\n        this._log.push(event);\n    }\n\n    startTraversion() {\n        this.log(new Event('startTraversion'));\n    }\n\n    createTraceID() {\n        return {\n            // plugin round not needed, but nice for debugging\n            pluginRound: this.pluginRound,\n            nodeID: this.counter++,\n            isTraceID: true\n        }\n    }\n\n    serialize() {\n        const serialized = {};\n\n        serialized._log = JSON.stringify(this._log);\n        serialized.locations = JSON.stringify(this.locations);\n        serialized.filenames = JSON.stringify(this.filenames);\n        serialized.astNodeRegistry = JSON.stringify([...this.astNodeRegistry]);\n\n        return serialized;\n    }\n\n    static get traceIdentifierName() {\n        return '__currentTrace__';\n    }\n\n    static deserializedFrom(obj) {\n        const trace = new Trace();\n\n        trace._log = JSON.parse(obj._log);\n        trace.locations = JSON.parse(obj.locations);\n        trace.filenames = JSON.parse(obj.filenames);\n        trace.astNodeRegistry = new Map(JSON.parse(obj.astNodeRegistry));\n\n        return trace;\n    }\n\n    static async on(source, pluginData) {\n        const data = await loadPlugin(source, pluginData);\n        const obj = {\n            locations: data.locations,\n            oldAST: JSON.parse(data.oldAST),\n            trace: Trace.deserializedFrom(data.trace),\n        };\n\n        const trace = obj.trace;\n\n        trace.oldAST = obj.oldAST;\n        trace.transformedAST = obj.transformedAST;\n\n\n        trace.analyze();\n        return trace;\n    }\n\n    /*MD ## Position tracking MD*/\n\n    register(astNode, state) {\n        if (this.astNodeRegistry.has(astNode)) {\n            return this.astNodeRegistry.get(astNode);\n        }\n\n        const filename = state.file.opts.filename;\n        let fileID;\n\n        if (this.fileRegistry.has(filename)) {\n            fileID = this.fileRegistry.get(filename)\n        } else {\n            fileID = this.filenames.push(filename) - 1;\n            this.fileRegistry.set(filename, fileID);\n        }\n\n        const start = astNode.loc.start;\n        const end = astNode.loc.end;\n\n        const location = [\n            fileID,\n            start.line,\n            start.column,\n            end.line,\n            end.column\n        ];\n\n        const id = this.locations.push(location) - 1;\n        this.astNodeRegistry.set(astNode, id);\n\n        return id;\n    }\n\n    resolve(locationID) {\n        const location = this.locations[locationID];\n        return {\n            filename: this.filenames[location[0]],\n            startLine: location[1],\n            startColumn: location[2],\n            endLine: location[3],\n            endColumn: location[4]\n        }\n    }\n\n    /*MD ## AST changes MD*/\n\n    notify(objectID, key, oldValue, newValue, arrayProperty) {\n        const event = new ASTChangeEvent(objectID, key, oldValue, newValue);\n        this.log(event);\n        event.arrayProperty = arrayProperty;\n    }\n\n    /*MD ## Plugins MD*/\n\n    enterPlugin(name, traceID) {\n        this.log(new Event('enterPlugin', [name, traceID]));\n        this.pluginRound++;\n    }\n\n    leavePlugin(name) {\n        this.log(new Event('leavePlugin', name));\n    }\n    \n    startTraversePlugin(name, traceID) {\n        this.log(new Event('enterTraversePlugin', [name, traceID]));\n    }\n    \n    endTraversePlugin(name) {\n        this.log(new Event('leaveTraversePlugin', name));\n    }\n\n    /*MD ## Functions MD*/\n\n    aboutToEnter(position, name) {\n        this.log(new Event('aboutToEnter', name, position));\n    }\n\n    left(position, value) {\n        this.log(new Event('left', undefined, position));\n        return value;\n    }\n\n    enterFunction(position, name) {\n        this.log(new Event('enterFunction', name, position));\n    }\n\n    leave(position) {\n        this.log(new Event('leave', undefined, position));\n    }\n\n    return (position, returnValue) {\n        this.log(new Event('return', clone(returnValue), position));\n        return returnValue;\n    }\n\n\n    /*MD ## Loops MD*/\n\n    beginLoop(position, loopType) {\n        this.log(new Event('beginLoop', loopType, position));\n    }\n\n    nextLoopIteration(position, ...args) {\n        this.log(new Event('nextLoopIteration', args.map(clone), position));\n    }\n\n    forIterator(position, iterator) {\n        this.log(new Event('forIterator', iterator, position));\n        return iterator;\n    }\n\n    forKeys(position, keys) {\n        this.log(new Event('forKeys', keys, position));\n        return keys;\n    }\n\n    endLoop(position) {\n        this.log(new Event('endLoop', undefined, position));\n    }\n\n    /*MD ## Conditions MD*/\n\n    beginCondition(position, conditionType) {\n        this.log(new Event('beginCondition', conditionType, position));\n    }\n\n    conditionTest(position, value) {\n        this.log(new Event('conditionTest', clone(value), position));\n        return value;\n    }\n\n    endCondition(position) {\n        this.log(new Event('endCondition', undefined, position));\n    }\n\n    /*MD ## Assignments MD*/\n    assignment(position, left, right) {\n        this.log(new Event('assignment', [clone(left), clone(right)], position));\n        return right;\n    }\n\n    /*MD ## Error MD*/\n\n    error(error) {\n        this.log(new ErrorEvent('error', [error.stack]));\n    }\n\n    /*MD ## Analyzation MD*/\n\n    analyze() {\n        const parser = new TraceLogParser(this);\n        this.sections = parser.parse();\n    }\n}\n"]}