diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2018-09-08 16:40:16 -0400 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2018-09-09 23:12:22 -0400 |
commit | e2a285b871132f65f429fdbb7d5628a104f68e9a (patch) | |
tree | 39f226e25cac5aadb8aa73a83ff49b328780a7f6 /js/compiler.ts | |
parent | 8090fb252b434db986256651304cab04e0d426f8 (diff) |
Better NotFound error handling in CodeFetch
throwResolutionError was swallowing unrelated errors.
Diffstat (limited to 'js/compiler.ts')
-rw-r--r-- | js/compiler.ts | 52 |
1 files changed, 12 insertions, 40 deletions
diff --git a/js/compiler.ts b/js/compiler.ts index fdce8c2ed..624aab201 100644 --- a/js/compiler.ts +++ b/js/compiler.ts @@ -118,20 +118,6 @@ export class ModuleMetaData implements ts.IScriptSnapshot { } /** - * Throw a module resolution error, when a module is unsuccessfully resolved. - */ -function throwResolutionError( - message: string, - moduleSpecifier: ModuleSpecifier, - containingFile: ContainingFile -): never { - throw new Error( - // tslint:disable-next-line:max-line-length - `Cannot resolve module "${moduleSpecifier}" from "${containingFile}".\n ${message}` - ); -} - -/** * A singleton class that combines the TypeScript Language Service host API * with Deno specific APIs to provide an interface for compiling and running * TypeScript and JavaScript modules. @@ -514,9 +500,9 @@ export class DenoCompiler if (fileName && this._moduleMetaDataMap.has(fileName)) { return this._moduleMetaDataMap.get(fileName)!; } - let moduleId: ModuleId = ""; - let sourceCode: SourceCode | undefined; - let outputCode: OutputCode | undefined; + let moduleId: ModuleId; + let sourceCode: SourceCode; + let outputCode: OutputCode | null; if ( moduleSpecifier.startsWith(ASSETS) || containingFile.startsWith(ASSETS) @@ -524,38 +510,24 @@ export class DenoCompiler // Assets are compiled into the runtime javascript bundle. // we _know_ `.pop()` will return a string, but TypeScript doesn't so // not null assertion - const moduleId = moduleSpecifier.split("/").pop()!; + moduleId = moduleSpecifier.split("/").pop()!; const assetName = moduleId.includes(".") ? moduleId : `${moduleId}.d.ts`; assert(assetName in assetSourceCode, `No such asset "${assetName}"`); sourceCode = assetSourceCode[assetName]; fileName = `${ASSETS}/${assetName}`; + outputCode = ""; } 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. - let fetchResponse; - try { - fetchResponse = this._os.codeFetch(moduleSpecifier, containingFile); - } catch (e) { - return throwResolutionError( - `os.codeFetch message: ${e.message}`, - moduleSpecifier, - containingFile - ); - } - moduleId = fetchResponse.moduleName || ""; - fileName = fetchResponse.filename || undefined; - sourceCode = fetchResponse.sourceCode || undefined; - outputCode = fetchResponse.outputCode || undefined; - } - if (!sourceCode || sourceCode.length === 0 || !fileName) { - return throwResolutionError( - "Invalid source code or file name.", - moduleSpecifier, - containingFile - ); + const fetchResponse = this._os.codeFetch(moduleSpecifier, containingFile); + moduleId = fetchResponse.moduleName!; + fileName = fetchResponse.filename!; + sourceCode = fetchResponse.sourceCode!; + outputCode = fetchResponse.outputCode!; } + assert(sourceCode!.length > 0); this._log("resolveModule sourceCode length:", sourceCode.length); - this._log("resolveModule has outputCode:", !!outputCode); + this._log("resolveModule has outputCode:", outputCode! != null); this._setFileName(moduleSpecifier, containingFile, fileName); if (fileName && this._moduleMetaDataMap.has(fileName)) { return this._moduleMetaDataMap.get(fileName)!; |