Skip to content

Commit

Permalink
asyncify typecheckasync, fix workerOpAsync return value
Browse files Browse the repository at this point in the history
  • Loading branch information
jwunderl committed Sep 11, 2024
1 parent c4f4bb0 commit 0447661
Showing 1 changed file with 18 additions and 14 deletions.
32 changes: 18 additions & 14 deletions webapp/src/compiler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -462,7 +462,7 @@ function decompileSnippetsCoreAsync(opts: pxtc.CompileOptions): Promise<string[]
return workerOpAsync("decompileSnippets", { options: opts })
}

export function workerOpAsync<T extends keyof pxtc.service.ServiceOps>(op: T, arg: pxtc.service.OpArg): Promise<any> {
export function workerOpAsync<T extends keyof pxtc.service.ServiceOps>(op: T, arg: pxtc.service.OpArg): Promise<ReturnType<pxtc.service.ServiceOps[T]>> {
const startTm = Date.now()
pxt.debug("worker op: " + op)
return pxt.worker.getWorker(pxt.webConfig.workerjs)
Expand Down Expand Up @@ -544,27 +544,31 @@ export function snippetAsync(qName: string, python?: boolean): Promise<string> {
return initStep.then(() => workerOpAsync("snippet", {
snippet: { qName, python },
runtime: pxt.appTarget.runtime
})).then(res => res as string)
}));
}

export async function typecheckAsync(): Promise<pxtc.CompileResult> {
const epkg = pkg.mainEditorPkg();
const isFirstTypeCheck = !firstTypecheck;
let p = epkg.buildAssetsAsync()
.then(() => pkg.mainPkg.getCompileOptionsAsync())
.then(opts => {
opts.testMode = true // show errors in all top-level code
return workerOpAsync("setOptions", { options: opts })
})
.then(() => workerOpAsync("allDiags", {}) as Promise<pxtc.CompileResult>)
.then(r => { setDiagnostics("typecheck", r.diagnostics, r.sourceMap); return r; })
.then(r => {
const p = (async () => {
try {
await epkg.buildAssetsAsync();
const opts = await pkg.mainPkg.getCompileOptionsAsync();
// show errors in all top-level code
opts.testMode = true;
await workerOpAsync("setOptions", { options: opts });
const r = await workerOpAsync("allDiags", {});
setDiagnostics("typecheck", r.diagnostics, r.sourceMap);
if (isFirstTypeCheck) {
refreshLanguageServiceApisInfo();
await ensureApisInfoAsync();
}
return ensureApisInfoAsync().then(() => r);
})
.catch(catchUserErrorAndSetDiags(null))
return r;
} catch (e) {
catchUserErrorAndSetDiags(null);
return undefined;
}
})();
if (isFirstTypeCheck) firstTypecheck = p;
return p;
}
Expand Down

0 comments on commit 0447661

Please sign in to comment.