{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-markus/demos/tom/TraceLogParser.js"],"names":["Event","eventTypes","FunctionSection","PluginSection","TraceSection","EarlyReturn","constructor","type","isEarlyReturn","TraceLogParser","trace","index","log","_log","peek","length","consume","result","consumeAsEvent","instantiateEvent","match","expected","matchPeek","next","matchEarlyReturn","object","entry","eventClass","__type__","event","Object","assign","defaultParse","section","higherSections","returnEntry","addEntry","leaveEntry","position","parsePlugin","parseFunction","isFunction","_name","data","parseCondition","parseTraversePlugin","change","sec","privateAddChange","addChange","plugin","condition","calledByNonNativeCode","fun","calledByNativeCode","e","sections","push","parse"],"mappings":"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","file":"TraceLogParser.js","sourcesContent":["import { Event, eventTypes } from 'demos/tom/Events.js';\nimport { FunctionSection, PluginSection, TraceSection } from 'demos/tom/Sections.js';\n\nclass EarlyReturn {\n    constructor(type) {\n        this.type = type;\n        this.isEarlyReturn = true;\n    }\n}\n\nexport default class TraceLogParser {\n    constructor(trace) {\n        this.trace = trace;\n        this.index = 0;\n    }\n    \n    get log() {\n        return this.trace._log;\n    }\n    \n    /*MD ## Parsing primitives MD*/\n    \n    peek() {\n        if(this.index < this.log.length) {\n            return this.log[this.index];\n        }\n        \n        return null;\n    }\n    \n    consume() {\n        const result = this.peek();\n        this.index++;\n        return result;\n    }\n    \n    consumeAsEvent() {\n        return this.instantiateEvent(this.consume());\n    }\n    \n    match(expected) {\n        const result = this.matchPeek(expected);\n        if(result) {\n            this.consume();\n        }        \n        return result;\n    }\n    \n    matchPeek(expected) {\n        const next = this.peek();\n        if(next && next.type === expected) {            \n            return true;\n        }\n        \n        return false;\n    }\n    \n    matchEarlyReturn(object, type) {\n        return object.isEarlyReturn && object.type === type;\n    }\n    \n    /*MD ## Parse methods MD*/\n    \n    instantiateEvent(entry) {\n        const eventClass = eventTypes[entry.__type__];\n        const event = Object.assign(new eventClass(), entry);\n        \n        return event;\n    }\n    \n    defaultParse(section, higherSections) {\n        while(this.peek()) {\n            if(this.match('leavePlugin')) {\n                return section;\n            } else if(this.matchPeek('return')) {\n                const returnEntry = this.consume();\n                section.addEntry(this.instantiateEvent(returnEntry));\n                \n                throw new EarlyReturn('function');\n            } else if(this.matchPeek('leave')) {\n                const leaveEntry = this.consume();\n                if(leaveEntry.position === this.peek().position) {\n                    this.match('left');\n                }\n                return section;\n            }\n            else if(this.matchPeek('enterPlugin')) {\n                section.addEntry(this.parsePlugin());\n            } else if(this.matchPeek('aboutToEnter')) {\n                this.parseFunction(section, [...higherSections, section]);\n            } else if(this.matchPeek('enterFunction')) {\n                if(!section.isFunction() || (section.isFunction() && section._name !== this.peek().data)) {\n                    // entered a function that got called from native code or babel\n\n                    this.parseFunction(section, [...higherSections, section], false);\n                } else {\n                    this.match('enterFunction');\n                }\n            } else if(this.matchPeek('beginCondition')) {\n                this.parseCondition(section, [...higherSections, section]);\n            } else if(this.matchPeek('enterTraversePlugin')) {\n                this.parseTraversePlugin(section, [...higherSections, section]);\n            } else if(this.match('leaveTraversePlugin')) {\n                return section;\n            } else if(this.matchPeek('astChangeEvent')) {\n                const change = this.consumeAsEvent();\n                \n                for(const sec of higherSections) {\n                    sec.privateAddChange(change);\n                }\n                \n                section.addChange(change);\n            } else if(this.matchPeek('error')) {\n                section.addEntry(this.consumeAsEvent());\n\n                throw new EarlyReturn('error');\n            } else if(this.match('endCondition')) {\n                return section;\n            } else if(this.match('left')) {\n                return section;\n            } else {\n                section.addEntry(this.consumeAsEvent());\n            }\n        }\n        \n        return section;\n    }\n    \n    parseTraversePlugin(section, higherSections) {\n        const entry = this.consume();\n        const plugin = new PluginSection('TraversePlugin:' + entry.data[0], entry.data[1]);\n        plugin.position = this.peek().position;\n        \n        section.addEntry(plugin);\n        \n        this.defaultParse(plugin, higherSections);\n        \n        return plugin;\n    }\n    \n    parseCondition(section, higherSections) {\n        const entry = this.consume();\n        const condition = new TraceSection('Condition');\n        condition.position = entry.position;\n        \n        section.addEntry(condition);\n        \n        this.defaultParse(condition, higherSections);\n        \n        return condition;\n    }\n    \n    parseFunction(section, higherSections, calledByNonNativeCode = true) {\n        const entry = calledByNonNativeCode ? this.consume() : this.peek();\n        const fun = new FunctionSection(entry.data);\n        fun.position = entry.position;\n        \n        if(!calledByNonNativeCode) {\n            fun.calledByNativeCode();\n        }\n        \n        section.addEntry(fun);\n        \n        try {\n            this.defaultParse(fun, higherSections);\n        } catch(e) {\n            if(this.matchEarlyReturn(e, 'function')) {\n                // triggered by return events\n            } else {\n                throw e;\n            }\n        }\n        \n        // Functions that got entered from native code or babel get not left event\n        if(fun.position === this.peek().position) {\n            this.match('left');\n        }\n        \n        return fun;\n    }\n    \n    parsePlugin(sections) {\n        const plugin = new PluginSection(...this.consume().data);\n        plugin.position = this.peek().position;\n        \n        sections.push(plugin);\n        this.defaultParse(plugin, []);\n        return plugin;\n    }\n    \n    parse() {\n        const sections = [];\n        \n        \n        // ignores everything before the actual start of the traversion\n        while(!this.match('startTraversion')) {\n            this.consume();\n        }\n        \n        try {\n            while(this.peek()) {\n                if(this.matchPeek('enterPlugin')) {\n                    this.parsePlugin(sections);\n                } else {\n                    // ignore all unwanted entries\n                    this.consume();\n                }\n            }\n        } catch(e) {\n            if (this.matchEarlyReturn(e, 'error')) {\n                // triggered by error events\n            } else {\n                throw e;\n            } \n        }\n        \n        return sections;\n    }\n}"]}