(txtRes: string)
| 41 | sourceTabs.activateTab(infoTab); |
| 42 | |
| 43 | function loadFile(txtRes: string): void { |
| 44 | sourceTabs.clearTabsAndContent(); |
| 45 | disassemblyTabs.clearTabsAndContent(); |
| 46 | // If the JSON isn't properly terminated, assume compiler crashed and |
| 47 | // add best-guess empty termination |
| 48 | if (txtRes[txtRes.length - 2] === ",") { |
| 49 | txtRes += '{"name":"disassembly","type":"disassembly","data":""}]}'; |
| 50 | } |
| 51 | try { |
| 52 | sourceViews.forEach(sv => sv.hide()); |
| 53 | bytecodeSourceViews.forEach(bsv => bsv.hide()); |
| 54 | multiview?.hide(); |
| 55 | multiview = null; |
| 56 | document.getElementById("ranges").innerHTML = ""; |
| 57 | document.getElementById("ranges").style.visibility = "hidden"; |
| 58 | document.getElementById("show-hide-ranges").style.visibility = "hidden"; |
| 59 | disassemblyView?.hide(); |
| 60 | historyView?.hide(); |
| 61 | sourceViews = new Array<CodeView>(); |
| 62 | bytecodeSourceViews = new Array<BytecodeSourceView>(); |
| 63 | sourceResolver = new SourceResolver(); |
| 64 | selectionBroker = new SelectionBroker(sourceResolver); |
| 65 | |
| 66 | const jsonObj = JSON.parse(txtRes); |
| 67 | const mainFunction = sourceResolver.getMainFunction(jsonObj); |
| 68 | |
| 69 | sourceResolver.setInlinings(jsonObj.inlinings); |
| 70 | sourceResolver.setSourceLineToBytecodePosition(jsonObj.sourceLineToBytecodePosition); |
| 71 | sourceResolver.setSources(jsonObj.sources, mainFunction); |
| 72 | sourceResolver.setBytecodeSources(jsonObj.bytecodeSources); |
| 73 | sourceResolver.setFinalNodeOrigins(jsonObj.nodeOrigins); |
| 74 | sourceResolver.parsePhases(jsonObj.phases); |
| 75 | |
| 76 | const [sourceTab, sourceContainer] = sourceTabs.addTabAndContent("Source"); |
| 77 | sourceContainer.classList.add("viewpane", "scrollable"); |
| 78 | sourceTabs.activateTab(sourceTab); |
| 79 | |
| 80 | const sourceView = new CodeView(sourceContainer, selectionBroker, mainFunction, |
| 81 | sourceResolver, CodeMode.MainSource); |
| 82 | sourceView.show(); |
| 83 | sourceViews.push(sourceView); |
| 84 | |
| 85 | for (const source of sourceResolver.sources) { |
| 86 | const sourceView = new CodeView(sourceContainer, selectionBroker, source, |
| 87 | sourceResolver, CodeMode.InlinedSource); |
| 88 | sourceView.show(); |
| 89 | sourceViews.push(sourceView); |
| 90 | } |
| 91 | |
| 92 | if (sourceResolver.bytecodeSources.size > 0) { |
| 93 | const [_, bytecodeContainer] = sourceTabs.addTabAndContent("Bytecode"); |
| 94 | bytecodeContainer.classList.add("viewpane", "scrollable"); |
| 95 | |
| 96 | const bytecodeSources = Array.from(sourceResolver.bytecodeSources.values()).reverse(); |
| 97 | for (const source of bytecodeSources) { |
| 98 | const codeMode = source.sourceId == -1 ? CodeMode.MainSource : CodeMode.InlinedSource; |
| 99 | const bytecodeSourceView = new BytecodeSourceView(bytecodeContainer, selectionBroker, |
| 100 | source, sourceResolver, codeMode); |
no test coverage detected