Wire web playground to LSP code
This commit is contained in:
@@ -1,52 +1,50 @@
|
||||
import { shim } from "./emul";
|
||||
import { API, Message, ResponseMSG } from "./ipc";
|
||||
import { archive, preload } from "./preload";
|
||||
import { Main_main } from './newt';
|
||||
import { LSP_checkFile, LSP_codeActionInfo, LSP_compileJS, LSP_hoverInfo, LSP_updateFile } from './newt';
|
||||
|
||||
const LOG = console.log
|
||||
|
||||
console.log = (m) => {
|
||||
LOG(m)
|
||||
shim.stdout += "\n" + m;
|
||||
};
|
||||
// console.log = (m) => {
|
||||
// LOG(m)
|
||||
// shim.stdout += "\n" + m;
|
||||
// };
|
||||
|
||||
const invoke = <T extends (...args: any[]) => any>(fun:T, args: Parameters<T>): ReturnType<T> => {
|
||||
return fun.apply(undefined, args)
|
||||
}
|
||||
|
||||
const api: API = {
|
||||
// none of these are promises...
|
||||
updateFile: LSP_updateFile,
|
||||
typeCheck(filename) {
|
||||
shim.stdout = ""
|
||||
let diags = LSP_checkFile(filename);
|
||||
let output = shim.stdout
|
||||
return {diags,output}
|
||||
},
|
||||
hoverInfo: LSP_hoverInfo,
|
||||
codeActionInfo: LSP_codeActionInfo,
|
||||
compile: LSP_compileJS,
|
||||
}
|
||||
|
||||
const handleMessage = async function <K extends keyof API>(ev: { data: Message<K> }) {
|
||||
LOG("HANDLE", ev.data);
|
||||
await preload;
|
||||
shim.archive = archive;
|
||||
let key = ev.data.key
|
||||
if (key === 'typeCheck' || key === 'compile') {
|
||||
let {id, args: [fileName]} = ev.data
|
||||
LOG(key, fileName)
|
||||
const outfile = "out.js";
|
||||
const isCompile = key === 'compile';
|
||||
if (isCompile)
|
||||
shim.process.argv = ["browser", "newt", fileName, "-o", outfile, "--top"];
|
||||
else
|
||||
shim.process.argv = ["browser", "newt", fileName, "--top"];
|
||||
shim.stdout = "";
|
||||
shim.files[outfile] = new TextEncoder().encode("No JS output");
|
||||
|
||||
try {
|
||||
Main_main();
|
||||
} catch (e) {
|
||||
// make it clickable in console
|
||||
console.error(e);
|
||||
// make it visable on page
|
||||
shim.stdout += "\n" + String(e);
|
||||
}
|
||||
let result = isCompile ? new TextDecoder().decode(shim.files[outfile]) : shim.stdout
|
||||
sendResponse({id, result})
|
||||
} else if (key === 'save') {
|
||||
let {id, args: [fileName, content]} = ev.data
|
||||
LOG(`SAVE ${content?.length} to ${fileName}`)
|
||||
shim.files[fileName] = new TextEncoder().encode(content)
|
||||
LOG('send', {id, result: ''})
|
||||
sendResponse({id, result: ''})
|
||||
try {
|
||||
shim.stdout = ''
|
||||
let {id, key, args} = ev.data
|
||||
let result = await invoke(api[key], args)
|
||||
LOG('got', result)
|
||||
sendResponse<typeof key>({id, result})
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
}
|
||||
console.log(shim.stdout)
|
||||
|
||||
};
|
||||
|
||||
// hooks for worker.html to override
|
||||
let sendResponse: <K extends keyof API>(_: ResponseMSG) => void = postMessage;
|
||||
let sendResponse: <K extends keyof API>(_: ResponseMSG<K>) => void = postMessage;
|
||||
onmessage = handleMessage;
|
||||
|
||||
Reference in New Issue
Block a user