summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--js/compiler.ts181
-rw-r--r--tests/error_004_missing_module.ts.out2
-rw-r--r--tests/error_005_missing_dynamic_import.ts.out2
3 files changed, 91 insertions, 94 deletions
diff --git a/js/compiler.ts b/js/compiler.ts
index 21610014a..e5632341d 100644
--- a/js/compiler.ts
+++ b/js/compiler.ts
@@ -218,7 +218,7 @@ export class DenoCompiler
return;
}
- this._window.define = this.makeDefine(moduleMetaData);
+ this._window.define = this._makeDefine(moduleMetaData);
this._globalEval(this.compile(moduleMetaData));
this._window.define = undefined;
}
@@ -268,6 +268,41 @@ export class DenoCompiler
}
/**
+ * Create a localized AMD `define` function and return it.
+ */
+ private _makeDefine(moduleMetaData: ModuleMetaData): AmdDefine {
+ return (deps: ModuleSpecifier[], factory: AmdFactory): void => {
+ this._log("compiler.localDefine", moduleMetaData.fileName);
+ moduleMetaData.factory = factory;
+ // when there are circular dependencies, we need to skip recursing the
+ // dependencies
+ moduleMetaData.gatheringDeps = true;
+ // we will recursively resolve the dependencies for any modules
+ moduleMetaData.deps = deps.map(dep => {
+ if (
+ dep === "require" ||
+ dep === "exports" ||
+ dep in DenoCompiler._builtins
+ ) {
+ return dep;
+ }
+ const dependencyMetaData = this.resolveModule(
+ dep,
+ moduleMetaData.fileName
+ );
+ if (!dependencyMetaData.gatheringDeps) {
+ this._gatherDependencies(dependencyMetaData);
+ }
+ return dependencyMetaData.fileName;
+ });
+ moduleMetaData.gatheringDeps = false;
+ if (!this._runQueue.includes(moduleMetaData)) {
+ this._runQueue.push(moduleMetaData);
+ }
+ };
+ }
+
+ /**
* Returns a require that specifically handles the resolution of a transpiled
* emit of a dynamic ES `import()` from TypeScript.
*/
@@ -296,6 +331,53 @@ export class DenoCompiler
}
/**
+ * Given a `moduleSpecifier` and `containingFile` retrieve the cached
+ * `fileName` for a given module. If the module has yet to be resolved
+ * this will return `undefined`.
+ */
+ private _resolveFileName(
+ moduleSpecifier: ModuleSpecifier,
+ containingFile: ContainingFile
+ ): ModuleFileName | undefined {
+ this._log("compiler.resolveFileName", { moduleSpecifier, containingFile });
+ const innerMap = this._fileNamesMap.get(containingFile);
+ if (innerMap) {
+ return innerMap.get(moduleSpecifier);
+ }
+ return undefined;
+ }
+
+ /**
+ * Resolve the `fileName` for a given `moduleSpecifier` and `containingFile`
+ */
+ private _resolveModuleName(
+ moduleSpecifier: ModuleSpecifier,
+ containingFile: ContainingFile
+ ): ModuleFileName | undefined {
+ const moduleMetaData = this.resolveModule(moduleSpecifier, containingFile);
+ return moduleMetaData ? moduleMetaData.fileName : undefined;
+ }
+
+ /**
+ * Caches the resolved `fileName` in relationship to the `moduleSpecifier`
+ * and `containingFile` in order to reduce calls to the privileged side
+ * to retrieve the contents of a module.
+ */
+ private _setFileName(
+ moduleSpecifier: ModuleSpecifier,
+ containingFile: ContainingFile,
+ fileName: ModuleFileName
+ ): void {
+ this._log("compiler.setFileName", { moduleSpecifier, containingFile });
+ let innerMap = this._fileNamesMap.get(containingFile);
+ if (!innerMap) {
+ innerMap = new Map();
+ this._fileNamesMap.set(containingFile, innerMap);
+ }
+ innerMap.set(moduleSpecifier, fileName);
+ }
+
+ /**
* Setup being able to map back source references back to their source
*
* TODO is this the best place for this? It is tightly coupled to how the
@@ -415,59 +497,6 @@ export class DenoCompiler
}
/**
- * Create a localized AMD `define` function and return it.
- */
- makeDefine(moduleMetaData: ModuleMetaData): AmdDefine {
- // TODO should this really be part of the public API of the compiler?
- return (deps: ModuleSpecifier[], factory: AmdFactory): void => {
- this._log("compiler.localDefine", moduleMetaData.fileName);
- moduleMetaData.factory = factory;
- // when there are circular dependencies, we need to skip recursing the
- // dependencies
- moduleMetaData.gatheringDeps = true;
- // we will recursively resolve the dependencies for any modules
- moduleMetaData.deps = deps.map(dep => {
- if (
- dep === "require" ||
- dep === "exports" ||
- dep in DenoCompiler._builtins
- ) {
- return dep;
- }
- const dependencyMetaData = this.resolveModule(
- dep,
- moduleMetaData.fileName
- );
- if (!dependencyMetaData.gatheringDeps) {
- this._gatherDependencies(dependencyMetaData);
- }
- return dependencyMetaData.fileName;
- });
- moduleMetaData.gatheringDeps = false;
- if (!this._runQueue.includes(moduleMetaData)) {
- this._runQueue.push(moduleMetaData);
- }
- };
- }
-
- /**
- * Given a `moduleSpecifier` and `containingFile` retrieve the cached
- * `fileName` for a given module. If the module has yet to be resolved
- * this will return `undefined`.
- */
- resolveFileName(
- moduleSpecifier: ModuleSpecifier,
- containingFile: ContainingFile
- ): ModuleFileName | undefined {
- this._log("compiler.resolveFileName", { moduleSpecifier, containingFile });
- const innerMap = this._fileNamesMap.get(containingFile);
- if (innerMap) {
- return innerMap.get(moduleSpecifier);
- }
- return undefined;
- }
-
- /**
* Given a `moduleSpecifier` and `containingFile`, resolve the module and
* return the `ModuleMetaData`.
*/
@@ -477,7 +506,7 @@ export class DenoCompiler
): ModuleMetaData {
this._log("compiler.resolveModule", { moduleSpecifier, containingFile });
assert(moduleSpecifier != null && moduleSpecifier.length > 0);
- let fileName = this.resolveFileName(moduleSpecifier, containingFile);
+ let fileName = this._resolveFileName(moduleSpecifier, containingFile);
if (fileName && this._moduleMetaDataMap.has(fileName)) {
return this._moduleMetaDataMap.get(fileName)!;
}
@@ -523,7 +552,7 @@ export class DenoCompiler
}
this._log("resolveModule sourceCode length:", sourceCode.length);
this._log("resolveModule has outputCode:", !!outputCode);
- this.setFileName(moduleSpecifier, containingFile, fileName);
+ this._setFileName(moduleSpecifier, containingFile, fileName);
if (fileName && this._moduleMetaDataMap.has(fileName)) {
return this._moduleMetaDataMap.get(fileName)!;
}
@@ -538,18 +567,6 @@ export class DenoCompiler
}
/**
- * Resolve the `fileName` for a given `moduleSpecifier` and `containingFile`
- */
- resolveModuleName(
- moduleSpecifier: ModuleSpecifier,
- containingFile: ContainingFile
- ): ModuleFileName | undefined {
- // TODO should this be part of the public API of the compiler?
- const moduleMetaData = this.resolveModule(moduleSpecifier, containingFile);
- return moduleMetaData ? moduleMetaData.fileName : undefined;
- }
-
- /**
* Load and run a module and all of its dependencies based on a module
* specifier and a containing file
*/
@@ -567,27 +584,7 @@ export class DenoCompiler
return moduleMetaData;
}
- /**
- * Caches the resolved `fileName` in relationship to the `moduleSpecifier`
- * and `containingFile` in order to reduce calls to the privileged side
- * to retrieve the contents of a module.
- */
- setFileName(
- moduleSpecifier: ModuleSpecifier,
- containingFile: ContainingFile,
- fileName: ModuleFileName
- ): void {
- // TODO should this be part of the public API of the compiler?
- this._log("compiler.setFileName", { moduleSpecifier, containingFile });
- let innerMap = this._fileNamesMap.get(containingFile);
- if (!innerMap) {
- innerMap = new Map();
- this._fileNamesMap.set(containingFile, innerMap);
- }
- innerMap.set(moduleSpecifier, fileName);
- }
-
- // TypeScript Language Service API
+ // TypeScript Language Service and Format Diagnostic Host API
getCanonicalFileName(fileName: string): string {
this._log("getCanonicalFileName", fileName);
@@ -674,11 +671,11 @@ export class DenoCompiler
let resolvedFileName;
if (name === "deno" || name === "compiler") {
// builtin modules are part of `globals.d.ts`
- resolvedFileName = this.resolveModuleName("globals.d.ts", ASSETS);
+ resolvedFileName = this._resolveModuleName("globals.d.ts", ASSETS);
} else if (name === "typescript") {
- resolvedFileName = this.resolveModuleName("typescript.d.ts", ASSETS);
+ resolvedFileName = this._resolveModuleName("typescript.d.ts", ASSETS);
} else {
- resolvedFileName = this.resolveModuleName(name, containingFile);
+ resolvedFileName = this._resolveModuleName(name, containingFile);
}
// According to the interface we shouldn't return `undefined` but if we
// fail to return the same length of modules to those we cannot resolve
diff --git a/tests/error_004_missing_module.ts.out b/tests/error_004_missing_module.ts.out
index dda14d25e..a64360f89 100644
--- a/tests/error_004_missing_module.ts.out
+++ b/tests/error_004_missing_module.ts.out
@@ -2,7 +2,7 @@ Error: Cannot resolve module "bad-module.ts" from "[WILDCARD]error_004_missing_m
os.codeFetch message: [WILDCARD] (os error 2)
at throwResolutionError (deno/js/compiler.ts:[WILDCARD])
at DenoCompiler.resolveModule (deno/js/compiler.ts:[WILDCARD])
- at DenoCompiler.resolveModuleName (deno/js/compiler.ts:[WILDCARD])
+ at DenoCompiler._resolveModuleName (deno/js/compiler.ts:[WILDCARD])
at moduleNames.map.name (deno/js/compiler.ts:[WILDCARD])
at Array.map (<anonymous>)
at DenoCompiler.resolveModuleNames (deno/js/compiler.ts:[WILDCARD])
diff --git a/tests/error_005_missing_dynamic_import.ts.out b/tests/error_005_missing_dynamic_import.ts.out
index b28875bc5..dbcaa0e9e 100644
--- a/tests/error_005_missing_dynamic_import.ts.out
+++ b/tests/error_005_missing_dynamic_import.ts.out
@@ -2,7 +2,7 @@ Error: Cannot resolve module "bad-module.ts" from "[WILDCARD]deno/tests/error_00
os.codeFetch message: [WILDCARD] (os error 2)
at throwResolutionError (deno/js/compiler.ts:[WILDCARD])
at DenoCompiler.resolveModule (deno/js/compiler.ts:[WILDCARD])
- at DenoCompiler.resolveModuleName (deno/js/compiler.ts:[WILDCARD])
+ at DenoCompiler._resolveModuleName (deno/js/compiler.ts:[WILDCARD])
at moduleNames.map.name (deno/js/compiler.ts:[WILDCARD])
at Array.map (<anonymous>)
at DenoCompiler.resolveModuleNames (deno/js/compiler.ts:[WILDCARD])