diff options
Diffstat (limited to 'js')
-rw-r--r-- | js/compiler.ts | 36 | ||||
-rw-r--r-- | js/os.ts | 68 |
2 files changed, 42 insertions, 62 deletions
diff --git a/js/compiler.ts b/js/compiler.ts index 4ffef30fc..27b97dd2d 100644 --- a/js/compiler.ts +++ b/js/compiler.ts @@ -55,8 +55,7 @@ interface CompilerLookup { * easily mocked. */ interface Os { - codeCache: typeof os.codeCache; - codeFetch: typeof os.codeFetch; + fetchModuleMetaData: typeof os.fetchModuleMetaData; exit: typeof os.exit; } @@ -251,7 +250,10 @@ class Compiler implements ts.LanguageServiceHost, ts.FormatDiagnosticsHost { } else { // We query Rust with a CodeFetch message. It will load the sourceCode, // and if there is any outputCode cached, will return that as well. - const fetchResponse = this._os.codeFetch(moduleSpecifier, containingFile); + const fetchResponse = this._os.fetchModuleMetaData( + moduleSpecifier, + containingFile + ); moduleId = fetchResponse.moduleName; fileName = fetchResponse.filename; mediaType = fetchResponse.mediaType; @@ -307,22 +309,26 @@ class Compiler implements ts.LanguageServiceHost, ts.FormatDiagnosticsHost { // Deno specific compiler API - /** Retrieve the output of the TypeScript compiler for a given module and - * cache the result. + /** Retrieve the output of the TypeScript compiler for a given module. */ compile( moduleSpecifier: ModuleSpecifier, containingFile: ContainingFile - ): ModuleMetaData { + ): { outputCode: OutputCode; sourceMap: SourceMap } { this._log("compiler.compile", { moduleSpecifier, containingFile }); const moduleMetaData = this._resolveModule(moduleSpecifier, containingFile); const { fileName, mediaType, moduleId, sourceCode } = moduleMetaData; this._scriptFileNames = [fileName]; console.warn("Compiling", moduleId); + let outputCode: string; + let sourceMap = ""; // Instead of using TypeScript to transpile JSON modules, we will just do // it directly. if (mediaType === msg.MediaType.Json) { - moduleMetaData.outputCode = jsonEsmTemplate(sourceCode, fileName); + outputCode = moduleMetaData.outputCode = jsonEsmTemplate( + sourceCode, + fileName + ); } else { const service = this._service; assert( @@ -373,20 +379,14 @@ class Compiler implements ts.LanguageServiceHost, ts.FormatDiagnosticsHost { outputFile.name.endsWith(".js"), "Expected second emitted file to be JavaScript" ); - moduleMetaData.outputCode = `${ + outputCode = moduleMetaData.outputCode = `${ outputFile.text }\n//# sourceURL=${fileName}`; - moduleMetaData.sourceMap = sourceMapFile.text; + sourceMap = moduleMetaData.sourceMap = sourceMapFile.text; } moduleMetaData.scriptVersion = "1"; - this._os.codeCache( - fileName, - sourceCode, - moduleMetaData.outputCode, - moduleMetaData.sourceMap - ); - return moduleMetaData; + return { outputCode, sourceMap }; } // TypeScript Language Service and Format Diagnostic Host API @@ -532,9 +532,9 @@ window.compilerMain = function compilerMain() { const json = decoder.decode(data); const { specifier, referrer } = JSON.parse(json) as CompilerLookup; - const moduleMetaData = compiler.compile(specifier, referrer); + const result = compiler.compile(specifier, referrer); - const responseJson = JSON.stringify(moduleMetaData); + const responseJson = JSON.stringify(result); const response = encoder.encode(responseJson); postMessage(response); }; @@ -3,6 +3,7 @@ import * as msg from "gen/msg_generated"; import { handleAsyncMsgFromRust, sendSync } from "./dispatch"; import * as flatbuffers from "./flatbuffers"; import { libdeno } from "./libdeno"; +import { TextDecoder } from "./text_encoding"; import { assert } from "./util"; import * as util from "./util"; @@ -27,7 +28,7 @@ export function setGlobals( execPath = execPath_; } -interface CodeInfo { +interface ResponseModuleMetaData { moduleName: string | undefined; filename: string | undefined; mediaType: msg.MediaType; @@ -60,63 +61,42 @@ export function exit(exitCode = 0): never { return util.unreachable(); } +const decoder = new TextDecoder(); + // @internal -export function codeFetch(specifier: string, referrer: string): CodeInfo { - util.log("os.codeFetch", { specifier, referrer }); - // Send CodeFetch message +export function fetchModuleMetaData( + specifier: string, + referrer: string +): ResponseModuleMetaData { + util.log("os.fetchModuleMetaData", { specifier, referrer }); + // Send FetchModuleMetaData message const builder = flatbuffers.createBuilder(); const specifier_ = builder.createString(specifier); const referrer_ = builder.createString(referrer); - msg.CodeFetch.startCodeFetch(builder); - msg.CodeFetch.addSpecifier(builder, specifier_); - msg.CodeFetch.addReferrer(builder, referrer_); - const inner = msg.CodeFetch.endCodeFetch(builder); - const baseRes = sendSync(builder, msg.Any.CodeFetch, inner); + msg.FetchModuleMetaData.startFetchModuleMetaData(builder); + msg.FetchModuleMetaData.addSpecifier(builder, specifier_); + msg.FetchModuleMetaData.addReferrer(builder, referrer_); + const inner = msg.FetchModuleMetaData.endFetchModuleMetaData(builder); + const baseRes = sendSync(builder, msg.Any.FetchModuleMetaData, inner); assert(baseRes != null); assert( - msg.Any.CodeFetchRes === baseRes!.innerType(), + msg.Any.FetchModuleMetaDataRes === baseRes!.innerType(), `base.innerType() unexpectedly is ${baseRes!.innerType()}` ); - const codeFetchRes = new msg.CodeFetchRes(); - assert(baseRes!.inner(codeFetchRes) != null); + const fetchModuleMetaDataRes = new msg.FetchModuleMetaDataRes(); + assert(baseRes!.inner(fetchModuleMetaDataRes) != null); + const dataArray = fetchModuleMetaDataRes.dataArray(); + const sourceCode = dataArray ? decoder.decode(dataArray) : undefined; // flatbuffers returns `null` for an empty value, this does not fit well with // idiomatic TypeScript under strict null checks, so converting to `undefined` return { - moduleName: codeFetchRes.moduleName() || undefined, - filename: codeFetchRes.filename() || undefined, - mediaType: codeFetchRes.mediaType(), - sourceCode: codeFetchRes.sourceCode() || undefined + moduleName: fetchModuleMetaDataRes.moduleName() || undefined, + filename: fetchModuleMetaDataRes.filename() || undefined, + mediaType: fetchModuleMetaDataRes.mediaType(), + sourceCode }; } -// @internal -export function codeCache( - filename: string, - sourceCode: string, - outputCode: string, - sourceMap: string -): void { - util.log("os.codeCache", { - filename, - sourceCodeLength: sourceCode.length, - outputCodeLength: outputCode.length, - sourceMapLength: sourceMap.length - }); - const builder = flatbuffers.createBuilder(); - const filename_ = builder.createString(filename); - const sourceCode_ = builder.createString(sourceCode); - const outputCode_ = builder.createString(outputCode); - const sourceMap_ = builder.createString(sourceMap); - msg.CodeCache.startCodeCache(builder); - msg.CodeCache.addFilename(builder, filename_); - msg.CodeCache.addSourceCode(builder, sourceCode_); - msg.CodeCache.addOutputCode(builder, outputCode_); - msg.CodeCache.addSourceMap(builder, sourceMap_); - const inner = msg.CodeCache.endCodeCache(builder); - const baseRes = sendSync(builder, msg.Any.CodeCache, inner); - assert(baseRes == null); // Expect null or error. -} - function createEnv(inner: msg.EnvironRes): { [index: string]: string } { const env: { [index: string]: string } = {}; |