remove originModule from Dependencies and add parent module to ModuleGraph

This commit is contained in:
Tobias Koppers 2018-08-07 14:20:53 +02:00
parent bff959901d
commit 3618cc1b3c
24 changed files with 137 additions and 137 deletions

View File

@ -626,7 +626,10 @@ class Compilation {
processModuleDependencies(module, callback) { processModuleDependencies(module, callback) {
const dependencies = new Map(); const dependencies = new Map();
const addDependency = dep => { let currentBlock = module;
const processDependency = dep => {
this.moduleGraph.setParents(dep, currentBlock, module);
const resourceIdent = dep.getResourceIdentifier(); const resourceIdent = dep.getResourceIdentifier();
if (resourceIdent) { if (resourceIdent) {
const factory = this.dependencyFactories.get(dep.constructor); const factory = this.dependencyFactories.get(dep.constructor);
@ -647,17 +650,18 @@ class Compilation {
} }
}; };
const addDependenciesBlock = block => { const processDependenciesBlock = block => {
if (block.dependencies) { if (block.dependencies) {
iterationOfArrayCallback(block.dependencies, addDependency); currentBlock = block;
iterationOfArrayCallback(block.dependencies, processDependency);
} }
if (block.blocks) { if (block.blocks) {
iterationOfArrayCallback(block.blocks, addDependenciesBlock); iterationOfArrayCallback(block.blocks, processDependenciesBlock);
} }
}; };
try { try {
addDependenciesBlock(module); processDependenciesBlock(module);
} catch (e) { } catch (e) {
callback(e); callback(e);
} }

View File

@ -90,7 +90,7 @@ class DelegatedModule extends Module {
); );
this.addDependency(this.delegatedSourceDependency); this.addDependency(this.delegatedSourceDependency);
this.addDependency( this.addDependency(
new DelegatedExportsDependency(this, this.delegateData.exports || true) new DelegatedExportsDependency(this.delegateData.exports || true)
); );
callback(); callback();
} }

View File

@ -7,6 +7,7 @@
const ModuleGraphConnection = require("./ModuleGraphConnection"); const ModuleGraphConnection = require("./ModuleGraphConnection");
/** @typedef {import("./DependenciesBlock")} DependenciesBlock */
/** @typedef {import("./Dependency")} Dependency */ /** @typedef {import("./Dependency")} Dependency */
/** @typedef {import("./Module")} Module */ /** @typedef {import("./Module")} Module */
@ -20,6 +21,8 @@ class ModuleGraph {
this._originMap = new Map(); this._originMap = new Map();
/** @type {Map<any, Object>} */ /** @type {Map<any, Object>} */
this._metaMap = new Map(); this._metaMap = new Map();
/** @type {Map<Dependency, {module: Module, block: DependenciesBlock}>} */
this._parentsMap = new Map();
} }
_getModuleSet(module) { _getModuleSet(module) {
@ -40,6 +43,34 @@ class ModuleGraph {
return connections; return connections;
} }
/**
* @param {Dependency} dependency the dependency
* @param {DependenciesBlock} block parent block
* @param {Module} module parent module
* @returns {void}
*/
setParents(dependency, block, module) {
this._parentsMap.set(dependency, { module, block });
}
/**
* @param {Dependency} dependency the dependency
* @returns {Module} parent module
*/
getParentModule(dependency) {
const entry = this._parentsMap.get(dependency);
return entry !== undefined ? entry.module : null;
}
/**
* @param {Dependency} dependency the dependency
* @returns {DependenciesBlock} parent block
*/
getParentBlock(dependency) {
const entry = this._parentsMap.get(dependency);
return entry !== undefined ? entry.block : null;
}
/** /**
* @param {Module} originModule the referencing module * @param {Module} originModule the referencing module
* @param {Dependency} dependency the referencing dependency * @param {Dependency} dependency the referencing dependency
@ -158,6 +189,15 @@ class ModuleGraph {
return connection !== undefined ? connection.originModule : null; return connection !== undefined ? connection.originModule : null;
} }
/**
* @param {Dependency} dependency the dependency to look for a referencing module
* @returns {Module} the original referencing module
*/
getResolvedOrigin(dependency) {
const connection = this._dependencyMap.get(dependency);
return connection !== undefined ? connection.resolvedOriginModule : null;
}
/** /**
* @param {Module} module the module * @param {Module} module the module
* @returns {ModuleGraphConnection[]} reasons why a module is included * @returns {ModuleGraphConnection[]} reasons why a module is included

View File

@ -17,6 +17,7 @@ class ModuleGraphConnection {
*/ */
constructor(originModule, dependency, module, explanation) { constructor(originModule, dependency, module, explanation) {
this.originModule = originModule; this.originModule = originModule;
this.resolvedOriginModule = originModule;
this.dependency = dependency; this.dependency = dependency;
this.resolvedModule = module; this.resolvedModule = module;
this.module = module; this.module = module;

View File

@ -170,8 +170,7 @@ class NodeStuffPlugin {
getModulePath( getModulePath(
parser.state.module.context, parser.state.module.context,
isHarmony ? harmonyModuleBuildin : moduleBuildin isHarmony ? harmonyModuleBuildin : moduleBuildin
), )
parser.state.module
); );
dep.loc = expr.loc; dep.loc = expr.loc;
parser.state.module.addDependency(dep); parser.state.module.addDependency(dep);

View File

@ -12,9 +12,8 @@ const NullDependency = require("./NullDependency");
/** @typedef {import("../ModuleGraph")} ModuleGraph */ /** @typedef {import("../ModuleGraph")} ModuleGraph */
class DelegatedExportsDependency extends NullDependency { class DelegatedExportsDependency extends NullDependency {
constructor(originModule, exports) { constructor(exports) {
super(); super();
this.originModule = originModule;
this.exports = exports; this.exports = exports;
} }
@ -28,8 +27,11 @@ class DelegatedExportsDependency extends NullDependency {
* @returns {DependencyReference} reference * @returns {DependencyReference} reference
*/ */
getReference(moduleGraph) { getReference(moduleGraph) {
if (!this.originModule) return null; return new DependencyReference(
return new DependencyReference(() => this.originModule, true, false); () => moduleGraph.getParentModule(this),
true,
false
);
} }
/** /**

View File

@ -12,8 +12,8 @@ const HarmonyImportDependency = require("./HarmonyImportDependency");
/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */ /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
class HarmonyAcceptImportDependency extends HarmonyImportDependency { class HarmonyAcceptImportDependency extends HarmonyImportDependency {
constructor(request, originModule, parserScope) { constructor(request, parserScope) {
super(request, originModule, NaN, parserScope); super(request, NaN, parserScope);
this.weak = true; this.weak = true;
} }

View File

@ -14,14 +14,6 @@ const NullDependency = require("./NullDependency");
/** @typedef {import("../Module")} Module */ /** @typedef {import("../Module")} Module */
class HarmonyCompatibilityDependency extends NullDependency { class HarmonyCompatibilityDependency extends NullDependency {
/**
* @param {Module} originModule the originating module
*/
constructor(originModule) {
super();
this.originModule = originModule;
}
get type() { get type() {
return "harmony export header"; return "harmony export header";
} }
@ -43,12 +35,11 @@ HarmonyCompatibilityDependency.Template = class HarmonyExportDependencyTemplate
* @param {DependencyTemplateContext} templateContext the template context * @param {DependencyTemplateContext} templateContext the template context
* @returns {InitFragment[]|null} the init fragments * @returns {InitFragment[]|null} the init fragments
*/ */
getInitFragments(dependency, { runtimeTemplate, moduleGraph }) { getInitFragments(dependency, { module, runtimeTemplate, moduleGraph }) {
const dep = /** @type {HarmonyCompatibilityDependency} */ (dependency); const usedExports = module.getUsedExports(moduleGraph);
const usedExports = dep.originModule.getUsedExports(moduleGraph);
if (usedExports === true || usedExports === null) { if (usedExports === true || usedExports === null) {
const content = runtimeTemplate.defineEsModuleFlagStatement({ const content = runtimeTemplate.defineEsModuleFlagStatement({
exportsArgument: dep.originModule.exportsArgument exportsArgument: module.exportsArgument
}); });
return [ return [
new InitFragment( new InitFragment(

View File

@ -18,7 +18,7 @@ module.exports = class HarmonyDetectionParserPlugin {
}); });
if (isHarmony) { if (isHarmony) {
const module = parser.state.module; const module = parser.state.module;
const compatDep = new HarmonyCompatibilityDependency(module); const compatDep = new HarmonyCompatibilityDependency();
compatDep.loc = { compatDep.loc = {
start: { start: {
line: -1, line: -1,

View File

@ -42,7 +42,6 @@ module.exports = class HarmonyExportDependencyParserPlugin {
parser.state.current.addDependency(clearDep); parser.state.current.addDependency(clearDep);
const sideEffectDep = new HarmonyImportSideEffectDependency( const sideEffectDep = new HarmonyImportSideEffectDependency(
source, source,
parser.state.module,
parser.state.lastHarmonyImportOrder, parser.state.lastHarmonyImportOrder,
parser.state.harmonyParserScope parser.state.harmonyParserScope
); );
@ -56,7 +55,6 @@ module.exports = class HarmonyExportDependencyParserPlugin {
"HarmonyExportDependencyParserPlugin", "HarmonyExportDependencyParserPlugin",
(statement, expr) => { (statement, expr) => {
const dep = new HarmonyExportExpressionDependency( const dep = new HarmonyExportExpressionDependency(
parser.state.module,
expr.range, expr.range,
statement.range statement.range
); );
@ -82,7 +80,6 @@ module.exports = class HarmonyExportDependencyParserPlugin {
const settings = parser.state.harmonySpecifier.get(id); const settings = parser.state.harmonySpecifier.get(id);
dep = new HarmonyExportImportedSpecifierDependency( dep = new HarmonyExportImportedSpecifierDependency(
settings.source, settings.source,
parser.state.module,
settings.sourceOrder, settings.sourceOrder,
parser.state.harmonyParserScope, parser.state.harmonyParserScope,
settings.id, settings.id,
@ -92,11 +89,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
this.strictExportPresence this.strictExportPresence
); );
} else { } else {
dep = new HarmonyExportSpecifierDependency( dep = new HarmonyExportSpecifierDependency(id, name);
parser.state.module,
id,
name
);
} }
dep.loc = Object.create(statement.loc); dep.loc = Object.create(statement.loc);
dep.loc.index = idx; dep.loc.index = idx;
@ -118,7 +111,6 @@ module.exports = class HarmonyExportDependencyParserPlugin {
} }
const dep = new HarmonyExportImportedSpecifierDependency( const dep = new HarmonyExportImportedSpecifierDependency(
source, source,
parser.state.module,
parser.state.lastHarmonyImportOrder, parser.state.lastHarmonyImportOrder,
parser.state.harmonyParserScope, parser.state.harmonyParserScope,
id, id,

View File

@ -14,9 +14,8 @@ const NullDependency = require("./NullDependency");
/** @typedef {import("../ModuleGraph")} ModuleGraph */ /** @typedef {import("../ModuleGraph")} ModuleGraph */
class HarmonyExportExpressionDependency extends NullDependency { class HarmonyExportExpressionDependency extends NullDependency {
constructor(originModule, range, rangeStatement) { constructor(range, rangeStatement) {
super(); super();
this.originModule = originModule;
this.range = range; this.range = range;
this.rangeStatement = rangeStatement; this.rangeStatement = rangeStatement;
} }
@ -45,10 +44,10 @@ HarmonyExportExpressionDependency.Template = class HarmonyExportDependencyTempla
* @param {DependencyTemplateContext} templateContext the context object * @param {DependencyTemplateContext} templateContext the context object
* @returns {void} * @returns {void}
*/ */
apply(dependency, source, { moduleGraph }) { apply(dependency, source, { module, moduleGraph }) {
const dep = /** @type {HarmonyExportExpressionDependency} */ (dependency); const dep = /** @type {HarmonyExportExpressionDependency} */ (dependency);
const used = dep.originModule.getUsedName(moduleGraph, "default"); const used = module.getUsedName(moduleGraph, "default");
const content = this.getContent(dep.originModule, used); const content = this.getContent(module, used);
if (dep.range) { if (dep.range) {
source.replace(dep.rangeStatement[0], dep.range[0] - 1, content + "("); source.replace(dep.rangeStatement[0], dep.range[0] - 1, content + "(");

View File

@ -66,7 +66,6 @@ const EMPTY_STAR_MODE = new ExportMode("empty-star");
class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency { class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
constructor( constructor(
request, request,
originModule,
sourceOrder, sourceOrder,
parserScope, parserScope,
id, id,
@ -75,7 +74,7 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
otherStarExports, otherStarExports,
strictExportPresence strictExportPresence
) { ) {
super(request, originModule, sourceOrder, parserScope); super(request, sourceOrder, parserScope);
this.id = id; this.id = id;
this.name = name; this.name = name;
this.activeExports = activeExports; this.activeExports = activeExports;
@ -95,8 +94,9 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
getMode(moduleGraph, ignoreUnused) { getMode(moduleGraph, ignoreUnused) {
const name = this.name; const name = this.name;
const id = this.id; const id = this.id;
const used = this.originModule.getUsedName(moduleGraph, name); const parentModule = moduleGraph.getParentModule(this);
const usedExports = this.originModule.getUsedExports(moduleGraph); const used = parentModule.getUsedName(moduleGraph, name);
const usedExports = parentModule.getUsedExports(moduleGraph);
const importedModule = moduleGraph.getModule(this); const importedModule = moduleGraph.getModule(this);
if (!importedModule) { if (!importedModule) {
@ -111,7 +111,7 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
return mode; return mode;
} }
const strictHarmonyModule = this.originModule.buildMeta.strictHarmonyModule; const strictHarmonyModule = parentModule.buildMeta.strictHarmonyModule;
if (name && id === "default" && importedModule.buildMeta) { if (name && id === "default" && importedModule.buildMeta) {
if (!importedModule.buildMeta.exportsType) { if (!importedModule.buildMeta.exportsType) {
const mode = new ExportMode( const mode = new ExportMode(
@ -379,7 +379,7 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
getWarnings(moduleGraph) { getWarnings(moduleGraph) {
if ( if (
this.strictExportPresence || this.strictExportPresence ||
this.originModule.buildMeta.strictHarmonyModule moduleGraph.getParentModule(this).buildMeta.strictHarmonyModule
) { ) {
return []; return [];
} }
@ -394,7 +394,7 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
getErrors(moduleGraph) { getErrors(moduleGraph) {
if ( if (
this.strictExportPresence || this.strictExportPresence ||
this.originModule.buildMeta.strictHarmonyModule moduleGraph.getParentModule(this).buildMeta.strictHarmonyModule
) { ) {
return this._getErrors(moduleGraph); return this._getErrors(moduleGraph);
} }
@ -410,7 +410,7 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
if (!importedModule.buildMeta || !importedModule.buildMeta.exportsType) { if (!importedModule.buildMeta || !importedModule.buildMeta.exportsType) {
// It's not an harmony module // It's not an harmony module
if ( if (
this.originModule.buildMeta.strictHarmonyModule && moduleGraph.getParentModule(this).buildMeta.strictHarmonyModule &&
this.id !== "default" this.id !== "default"
) { ) {
// In strict harmony modules we only support the default export // In strict harmony modules we only support the default export
@ -470,7 +470,11 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS
if (this.isUsed(dep, templateContext)) { if (this.isUsed(dep, templateContext)) {
const importFragments = super.getInitFragments(dep, templateContext); const importFragments = super.getInitFragments(dep, templateContext);
const exportFragment = new InitFragment( const exportFragment = new InitFragment(
this.getContent(dep, templateContext.moduleGraph), this.getContent(
dep,
templateContext.module,
templateContext.moduleGraph
),
InitFragment.STAGE_HARMONY_IMPORTS, InitFragment.STAGE_HARMONY_IMPORTS,
dep.sourceOrder dep.sourceOrder
); );
@ -487,16 +491,15 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS
* @param {DependencyTemplateContext} templateContext the template context * @param {DependencyTemplateContext} templateContext the template context
* @returns {Boolean} true, if (any) export is used * @returns {Boolean} true, if (any) export is used
*/ */
isUsed(dep, templateContext) { isUsed(dep, { moduleGraph, module }) {
const moduleGraph = templateContext.moduleGraph;
if (dep.name) { if (dep.name) {
return dep.originModule.isExportUsed(moduleGraph, dep.name); return module.isExportUsed(moduleGraph, dep.name);
} else { } else {
const importedModule = templateContext.moduleGraph.getModule(dep); const importedModule = moduleGraph.getModule(dep);
const activeFromOtherStarExports = dep._discoverActiveExportsFromOtherStartExports( const activeFromOtherStarExports = dep._discoverActiveExportsFromOtherStartExports(
templateContext.moduleGraph moduleGraph
); );
const usedExports = dep.originModule.getUsedExports(moduleGraph); const usedExports = module.getUsedExports(moduleGraph);
if (usedExports && usedExports !== true) { if (usedExports && usedExports !== true) {
// we know which exports are used // we know which exports are used
@ -528,12 +531,12 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS
/** /**
* @param {HarmonyExportImportedSpecifierDependency} dep dependency * @param {HarmonyExportImportedSpecifierDependency} dep dependency
* @param {Module} module the current module
* @param {ModuleGraph} moduleGraph the module graph * @param {ModuleGraph} moduleGraph the module graph
* @returns {string} the generated code * @returns {string} the generated code
*/ */
getContent(dep, moduleGraph) { getContent(dep, module, moduleGraph) {
const mode = dep.getMode(moduleGraph, false); const mode = dep.getMode(moduleGraph, false);
const module = dep.originModule;
const importedModule = moduleGraph.getModule(dep); const importedModule = moduleGraph.getModule(dep);
const importVar = dep.getImportVar(moduleGraph); const importVar = dep.getImportVar(moduleGraph);
@ -667,7 +670,7 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS
} else { } else {
content += "if(__WEBPACK_IMPORT_KEY__ !== 'default') "; content += "if(__WEBPACK_IMPORT_KEY__ !== 'default') ";
} }
const exportsName = dep.originModule.exportsArgument; const exportsName = module.exportsArgument;
return ( return (
content + content +
`(function(key) { __webpack_require__.d(${exportsName}, key, function() { return ${importVar}[key]; }) }(__WEBPACK_IMPORT_KEY__));\n` `(function(key) { __webpack_require__.d(${exportsName}, key, function() { return ${importVar}[key]; }) }(__WEBPACK_IMPORT_KEY__));\n`

View File

@ -15,9 +15,8 @@ const NullDependency = require("./NullDependency");
/** @typedef {import("../ModuleGraph")} ModuleGraph */ /** @typedef {import("../ModuleGraph")} ModuleGraph */
class HarmonyExportSpecifierDependency extends NullDependency { class HarmonyExportSpecifierDependency extends NullDependency {
constructor(originModule, id, name) { constructor(id, name) {
super(); super();
this.originModule = originModule;
this.id = id; this.id = id;
this.name = name; this.name = name;
} }
@ -55,23 +54,23 @@ HarmonyExportSpecifierDependency.Template = class HarmonyExportSpecifierDependen
* @param {DependencyTemplateContext} templateContext the template context * @param {DependencyTemplateContext} templateContext the template context
* @returns {InitFragment[]|null} the init fragments * @returns {InitFragment[]|null} the init fragments
*/ */
getInitFragments(dependency, { moduleGraph }) { getInitFragments(dependency, { module, moduleGraph }) {
return [ return [
new InitFragment( new InitFragment(
this.getContent(moduleGraph, dependency), this.getContent(dependency, module, moduleGraph),
InitFragment.STAGE_HARMONY_EXPORTS, InitFragment.STAGE_HARMONY_EXPORTS,
1 1
) )
]; ];
} }
getContent(moduleGraph, dep) { getContent(dep, module, moduleGraph) {
const used = dep.originModule.getUsedName(moduleGraph, dep.name); const used = module.getUsedName(moduleGraph, dep.name);
if (!used) { if (!used) {
return `/* unused harmony export ${dep.name || "namespace"} */\n`; return `/* unused harmony export ${dep.name || "namespace"} */\n`;
} }
const exportsName = dep.originModule.exportsArgument; const exportsName = module.exportsArgument;
return `/* harmony export (binding) */ __webpack_require__.d(${exportsName}, ${JSON.stringify( return `/* harmony export (binding) */ __webpack_require__.d(${exportsName}, ${JSON.stringify(
used used

View File

@ -23,13 +23,11 @@ class HarmonyImportDependency extends ModuleDependency {
/** /**
* *
* @param {string} request request string * @param {string} request request string
* @param {Module} originModule module which contains the dependency
* @param {number} sourceOrder source order * @param {number} sourceOrder source order
* @param {TODO} parserScope parser scope * @param {TODO} parserScope parser scope
*/ */
constructor(request, originModule, sourceOrder, parserScope) { constructor(request, sourceOrder, parserScope) {
super(request); super(request);
this.originModule = originModule;
this.sourceOrder = sourceOrder; this.sourceOrder = sourceOrder;
this.parserScope = parserScope; this.parserScope = parserScope;
} }
@ -70,13 +68,13 @@ class HarmonyImportDependency extends ModuleDependency {
* @param {DependencyTemplateContext} templateContext the template context * @param {DependencyTemplateContext} templateContext the template context
* @returns {string} name of the variable for the import * @returns {string} name of the variable for the import
*/ */
getImportStatement(update, { runtimeTemplate: runtime, moduleGraph }) { getImportStatement(update, { runtimeTemplate, module, moduleGraph }) {
return runtime.importStatement({ return runtimeTemplate.importStatement({
update, update,
module: moduleGraph.getModule(this), module: moduleGraph.getModule(this),
importVar: this.getImportVar(moduleGraph), importVar: this.getImportVar(moduleGraph),
request: this.request, request: this.request,
originModule: this.originModule originModule: module
}); });
} }

View File

@ -29,7 +29,6 @@ module.exports = class HarmonyImportDependencyParserPlugin {
parser.state.module.addDependency(clearDep); parser.state.module.addDependency(clearDep);
const sideEffectDep = new HarmonyImportSideEffectDependency( const sideEffectDep = new HarmonyImportSideEffectDependency(
source, source,
parser.state.module,
parser.state.lastHarmonyImportOrder, parser.state.lastHarmonyImportOrder,
parser.state.harmonyParserScope parser.state.harmonyParserScope
); );
@ -61,7 +60,6 @@ module.exports = class HarmonyImportDependencyParserPlugin {
const settings = parser.state.harmonySpecifier.get(name); const settings = parser.state.harmonySpecifier.get(name);
const dep = new HarmonyImportSpecifierDependency( const dep = new HarmonyImportSpecifierDependency(
settings.source, settings.source,
parser.state.module,
settings.sourceOrder, settings.sourceOrder,
parser.state.harmonyParserScope, parser.state.harmonyParserScope,
settings.id, settings.id,
@ -83,7 +81,6 @@ module.exports = class HarmonyImportDependencyParserPlugin {
if (settings.id !== null) return false; if (settings.id !== null) return false;
const dep = new HarmonyImportSpecifierDependency( const dep = new HarmonyImportSpecifierDependency(
settings.source, settings.source,
parser.state.module,
settings.sourceOrder, settings.sourceOrder,
parser.state.harmonyParserScope, parser.state.harmonyParserScope,
expr.property.name || expr.property.value, expr.property.name || expr.property.value,
@ -109,7 +106,6 @@ module.exports = class HarmonyImportDependencyParserPlugin {
if (settings.id !== null) return false; if (settings.id !== null) return false;
const dep = new HarmonyImportSpecifierDependency( const dep = new HarmonyImportSpecifierDependency(
settings.source, settings.source,
parser.state.module,
settings.sourceOrder, settings.sourceOrder,
parser.state.harmonyParserScope, parser.state.harmonyParserScope,
expr.callee.property.name || expr.callee.property.value, expr.callee.property.name || expr.callee.property.value,
@ -137,7 +133,6 @@ module.exports = class HarmonyImportDependencyParserPlugin {
const settings = parser.state.harmonySpecifier.get(name); const settings = parser.state.harmonySpecifier.get(name);
const dep = new HarmonyImportSpecifierDependency( const dep = new HarmonyImportSpecifierDependency(
settings.source, settings.source,
parser.state.module,
settings.sourceOrder, settings.sourceOrder,
parser.state.harmonyParserScope, parser.state.harmonyParserScope,
settings.id, settings.id,
@ -168,7 +163,6 @@ module.exports = class HarmonyImportDependencyParserPlugin {
const dependencies = requests.map(request => { const dependencies = requests.map(request => {
const dep = new HarmonyAcceptImportDependency( const dep = new HarmonyAcceptImportDependency(
request, request,
parser.state.module,
harmonyParserScope harmonyParserScope
); );
dep.loc = expr.loc; dep.loc = expr.loc;
@ -197,7 +191,6 @@ module.exports = class HarmonyImportDependencyParserPlugin {
const dependencies = requests.map(request => { const dependencies = requests.map(request => {
const dep = new HarmonyAcceptImportDependency( const dep = new HarmonyAcceptImportDependency(
request, request,
parser.state.module,
harmonyParserScope harmonyParserScope
); );
dep.loc = expr.loc; dep.loc = expr.loc;

View File

@ -15,8 +15,8 @@ const HarmonyImportDependency = require("./HarmonyImportDependency");
/** @typedef {import("./DependencyReference")} DependencyReference */ /** @typedef {import("./DependencyReference")} DependencyReference */
class HarmonyImportSideEffectDependency extends HarmonyImportDependency { class HarmonyImportSideEffectDependency extends HarmonyImportDependency {
constructor(request, originModule, sourceOrder, parserScope) { constructor(request, sourceOrder, parserScope) {
super(request, originModule, sourceOrder, parserScope); super(request, sourceOrder, parserScope);
} }
/** /**

View File

@ -20,7 +20,6 @@ const HarmonyImportDependency = require("./HarmonyImportDependency");
class HarmonyImportSpecifierDependency extends HarmonyImportDependency { class HarmonyImportSpecifierDependency extends HarmonyImportDependency {
constructor( constructor(
request, request,
originModule,
sourceOrder, sourceOrder,
parserScope, parserScope,
id, id,
@ -28,7 +27,7 @@ class HarmonyImportSpecifierDependency extends HarmonyImportDependency {
range, range,
strictExportPresence strictExportPresence
) { ) {
super(request, originModule, sourceOrder, parserScope); super(request, sourceOrder, parserScope);
this.id = id === null ? null : `${id}`; this.id = id === null ? null : `${id}`;
this.name = name; this.name = name;
this.range = range; this.range = range;
@ -78,7 +77,7 @@ class HarmonyImportSpecifierDependency extends HarmonyImportDependency {
getWarnings(moduleGraph) { getWarnings(moduleGraph) {
if ( if (
this.strictExportPresence || this.strictExportPresence ||
this.originModule.buildMeta.strictHarmonyModule moduleGraph.getParentModule(this).buildMeta.strictHarmonyModule
) { ) {
return []; return [];
} }
@ -93,7 +92,7 @@ class HarmonyImportSpecifierDependency extends HarmonyImportDependency {
getErrors(moduleGraph) { getErrors(moduleGraph) {
if ( if (
this.strictExportPresence || this.strictExportPresence ||
this.originModule.buildMeta.strictHarmonyModule moduleGraph.getParentModule(this).buildMeta.strictHarmonyModule
) { ) {
return this._getErrors(moduleGraph); return this._getErrors(moduleGraph);
} }
@ -109,7 +108,7 @@ class HarmonyImportSpecifierDependency extends HarmonyImportDependency {
if (!importedModule.buildMeta || !importedModule.buildMeta.exportsType) { if (!importedModule.buildMeta || !importedModule.buildMeta.exportsType) {
// It's not an harmony module // It's not an harmony module
if ( if (
this.originModule.buildMeta.strictHarmonyModule && moduleGraph.getParentModule(this).buildMeta.strictHarmonyModule &&
this.getId(moduleGraph) !== "default" this.getId(moduleGraph) !== "default"
) { ) {
// In strict harmony modules we only support the default export // In strict harmony modules we only support the default export
@ -195,13 +194,13 @@ HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependen
source.replace(dep.range[0], dep.range[1] - 1, content); source.replace(dep.range[0], dep.range[1] - 1, content);
} }
getContent(dep, { runtimeTemplate: runtime, moduleGraph }) { getContent(dep, { runtimeTemplate, module, moduleGraph }) {
const exportExpr = runtime.exportFromImport({ const exportExpr = runtimeTemplate.exportFromImport({
moduleGraph, moduleGraph,
module: moduleGraph.getModule(dep), module: moduleGraph.getModule(dep),
request: dep.request, request: dep.request,
exportName: dep.getId(moduleGraph), exportName: dep.getId(moduleGraph),
originModule: dep.originModule, originModule: module,
asiSafe: dep.shorthand, asiSafe: dep.shorthand,
isCall: dep.call, isCall: dep.call,
callContext: !dep.directImport, callContext: !dep.directImport,

View File

@ -13,7 +13,7 @@ module.exports = class ImportDependenciesBlock extends AsyncDependenciesBlock {
constructor(request, range, groupOptions, module, loc, originModule) { constructor(request, range, groupOptions, module, loc, originModule) {
super(groupOptions, module, loc, request); super(groupOptions, module, loc, request);
this.range = range; this.range = range;
const dep = new ImportDependency(request, originModule, this); const dep = new ImportDependency(request, this);
dep.loc = loc; dep.loc = loc;
this.addDependency(dep); this.addDependency(dep);
} }

View File

@ -12,9 +12,8 @@ const ModuleDependency = require("./ModuleDependency");
/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */ /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
class ImportDependency extends ModuleDependency { class ImportDependency extends ModuleDependency {
constructor(request, originModule, block) { constructor(request, block) {
super(request); super(request);
this.originModule = originModule;
this.block = block; this.block = block;
} }
@ -30,13 +29,13 @@ ImportDependency.Template = class ImportDependencyTemplate extends ModuleDepende
* @param {DependencyTemplateContext} templateContext the context object * @param {DependencyTemplateContext} templateContext the context object
* @returns {void} * @returns {void}
*/ */
apply(dependency, source, { runtimeTemplate, moduleGraph }) { apply(dependency, source, { runtimeTemplate, module, moduleGraph }) {
const dep = /** @type {ImportDependency} */ (dependency); const dep = /** @type {ImportDependency} */ (dependency);
const content = runtimeTemplate.moduleNamespacePromise({ const content = runtimeTemplate.moduleNamespacePromise({
block: dep.block, block: dep.block,
module: moduleGraph.getModule(dep), module: moduleGraph.getModule(dep),
request: dep.request, request: dep.request,
strict: dep.originModule.buildMeta.strictHarmonyModule, strict: module.buildMeta.strictHarmonyModule,
message: "import()" message: "import()"
}); });

View File

@ -12,9 +12,8 @@ const ModuleDependency = require("./ModuleDependency");
/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */ /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
class ImportEagerDependency extends ModuleDependency { class ImportEagerDependency extends ModuleDependency {
constructor(request, originModule, range) { constructor(request, range) {
super(request); super(request);
this.originModule = originModule;
this.range = range; this.range = range;
} }
@ -30,12 +29,12 @@ ImportEagerDependency.Template = class ImportEagerDependencyTemplate extends Mod
* @param {DependencyTemplateContext} templateContext the context object * @param {DependencyTemplateContext} templateContext the context object
* @returns {void} * @returns {void}
*/ */
apply(dependency, source, { runtimeTemplate, moduleGraph }) { apply(dependency, source, { runtimeTemplate, module, moduleGraph }) {
const dep = /** @type {ImportEagerDependency} */ (dependency); const dep = /** @type {ImportEagerDependency} */ (dependency);
const content = runtimeTemplate.moduleNamespacePromise({ const content = runtimeTemplate.moduleNamespacePromise({
module: moduleGraph.getModule(dep), module: moduleGraph.getModule(dep),
request: dep.request, request: dep.request,
strict: dep.originModule.buildMeta.strictHarmonyModule, strict: module.buildMeta.strictHarmonyModule,
message: "import() eager" message: "import() eager"
}); });
source.replace(dep.range[0], dep.range[1] - 1, content); source.replace(dep.range[0], dep.range[1] - 1, content);

View File

@ -187,18 +187,10 @@ class ImportParserPlugin {
} }
if (mode === "eager") { if (mode === "eager") {
const dep = new ImportEagerDependency( const dep = new ImportEagerDependency(param.string, expr.range);
param.string,
parser.state.module,
expr.range
);
parser.state.current.addDependency(dep); parser.state.current.addDependency(dep);
} else if (mode === "weak") { } else if (mode === "weak") {
const dep = new ImportWeakDependency( const dep = new ImportWeakDependency(param.string, expr.range);
param.string,
parser.state.module,
expr.range
);
parser.state.current.addDependency(dep); parser.state.current.addDependency(dep);
} else { } else {
const depBlock = new ImportDependenciesBlock( const depBlock = new ImportDependenciesBlock(

View File

@ -12,9 +12,8 @@ const ModuleDependency = require("./ModuleDependency");
/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */ /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
class ImportWeakDependency extends ModuleDependency { class ImportWeakDependency extends ModuleDependency {
constructor(request, originModule, range) { constructor(request, range) {
super(request); super(request);
this.originModule = originModule;
this.range = range; this.range = range;
this.weak = true; this.weak = true;
} }
@ -31,12 +30,12 @@ ImportWeakDependency.Template = class ImportDependencyTemplate extends ModuleDep
* @param {DependencyTemplateContext} templateContext the context object * @param {DependencyTemplateContext} templateContext the context object
* @returns {void} * @returns {void}
*/ */
apply(dependency, source, { runtimeTemplate, moduleGraph }) { apply(dependency, source, { runtimeTemplate, module, moduleGraph }) {
const dep = /** @type {ImportWeakDependency} */ (dependency); const dep = /** @type {ImportWeakDependency} */ (dependency);
const content = runtimeTemplate.moduleNamespacePromise({ const content = runtimeTemplate.moduleNamespacePromise({
module: moduleGraph.getModule(dep), module: moduleGraph.getModule(dep),
request: dep.request, request: dep.request,
strict: dep.originModule.buildMeta.strictHarmonyModule, strict: module.buildMeta.strictHarmonyModule,
message: "import() weak", message: "import() weak",
weak: true weak: true
}); });

View File

@ -17,11 +17,6 @@ const ModuleDependency = require("./ModuleDependency");
/** @typedef {import("../util/createHash").Hash} Hash */ /** @typedef {import("../util/createHash").Hash} Hash */
class ModuleDecoratorDependency extends ModuleDependency { class ModuleDecoratorDependency extends ModuleDependency {
constructor(request, originModule) {
super(request);
this.originModule = originModule;
}
/** /**
* Update the hash * Update the hash
* @param {Hash} hash hash to be updated * @param {Hash} hash hash to be updated
@ -50,17 +45,18 @@ ModuleDecoratorDependency.Template = class ModuleDecoratorDependencyTemplate ext
*/ */
getInitFragments(dependency, { runtimeTemplate, moduleGraph }) { getInitFragments(dependency, { runtimeTemplate, moduleGraph }) {
const dep = /** @type {ModuleDecoratorDependency} */ (dependency); const dep = /** @type {ModuleDecoratorDependency} */ (dependency);
const originModule = moduleGraph.getOrigin(dep);
return [ return [
new InitFragment( new InitFragment(
`/* module decorator */ ${ `/* module decorator */ ${
dep.originModule.moduleArgument originModule.moduleArgument
} = ${runtimeTemplate.moduleExports({ } = ${runtimeTemplate.moduleExports({
module: moduleGraph.getModule(dep), module: moduleGraph.getModule(dep),
request: dep.request request: dep.request
})}(${dep.originModule.moduleArgument});\n`, })}(${originModule.moduleArgument});\n`,
InitFragment.STAGE_PROVIDES, InitFragment.STAGE_PROVIDES,
0, 0,
`module decorator ${dep.originModule.id}` `module decorator ${originModule.id}`
) )
]; ];
} }

View File

@ -1282,7 +1282,7 @@ class HarmonyImportSpecifierDependencyConcatenatedTemplate extends DependencyTem
* @returns {void} * @returns {void}
*/ */
apply(dependency, source, templateContext) { apply(dependency, source, templateContext) {
const { moduleGraph } = templateContext; const { moduleGraph, module: parentModule } = templateContext;
const dep = /** @type {HarmonyImportSpecifierDependency} */ (dependency); const dep = /** @type {HarmonyImportSpecifierDependency} */ (dependency);
const module = moduleGraph.getModule(dep); const module = moduleGraph.getModule(dep);
const info = this.modulesMap.get(module); const info = this.modulesMap.get(module);
@ -1292,7 +1292,7 @@ class HarmonyImportSpecifierDependencyConcatenatedTemplate extends DependencyTem
} }
let content; let content;
const callFlag = dep.call ? "_call" : ""; const callFlag = dep.call ? "_call" : "";
const strictFlag = dep.originModule.buildMeta.strictHarmonyModule const strictFlag = parentModule.buildMeta.strictHarmonyModule
? "_strict" ? "_strict"
: ""; : "";
const id = dep.getId(moduleGraph); const id = dep.getId(moduleGraph);
@ -1371,7 +1371,7 @@ class HarmonyExportSpecifierDependencyConcatenatedTemplate extends DependencyTem
*/ */
getInitFragments(dependency, templateContext) { getInitFragments(dependency, templateContext) {
const dep = /** @type {HarmonyExportSpecifierDependency} */ (dependency); const dep = /** @type {HarmonyExportSpecifierDependency} */ (dependency);
if (dep.originModule === this.rootModule) { if (templateContext.module === this.rootModule) {
return this.originalTemplate.getInitFragments(dep, templateContext); return this.originalTemplate.getInitFragments(dep, templateContext);
} else { } else {
return null; return null;
@ -1385,8 +1385,7 @@ class HarmonyExportSpecifierDependencyConcatenatedTemplate extends DependencyTem
* @returns {void} * @returns {void}
*/ */
apply(dependency, source, templateContext) { apply(dependency, source, templateContext) {
const dep = /** @type {HarmonyExportSpecifierDependency} */ (dependency); if (templateContext.module === this.rootModule) {
if (dep.originModule === this.rootModule) {
this.originalTemplate.apply(dependency, source, templateContext); this.originalTemplate.apply(dependency, source, templateContext);
} }
} }
@ -1405,17 +1404,13 @@ class HarmonyExportExpressionDependencyConcatenatedTemplate extends DependencyTe
* @param {DependencyTemplateContext} templateContext the context object * @param {DependencyTemplateContext} templateContext the context object
* @returns {void} * @returns {void}
*/ */
apply( apply(dependency, source, { module, moduleGraph }) {
dependency,
source,
{ runtimeTemplate, dependencyTemplates, moduleGraph }
) {
const dep = /** @type {HarmonyExportExpressionDependency} */ (dependency); const dep = /** @type {HarmonyExportExpressionDependency} */ (dependency);
let content = let content =
"/* harmony default export */ var __WEBPACK_MODULE_DEFAULT_EXPORT__ = "; "/* harmony default export */ var __WEBPACK_MODULE_DEFAULT_EXPORT__ = ";
if (dep.originModule === this.rootModule) { if (module === this.rootModule) {
const used = dep.originModule.getUsedName(moduleGraph, "default"); const used = module.getUsedName(moduleGraph, "default");
const exportsName = dep.originModule.exportsArgument; const exportsName = module.exportsArgument;
if (used) { if (used) {
content += `${exportsName}[${JSON.stringify(used)}] = `; content += `${exportsName}[${JSON.stringify(used)}] = `;
} }
@ -1497,14 +1492,14 @@ class HarmonyExportImportedSpecifierDependencyConcatenatedTemplate extends Depen
* @returns {void} * @returns {void}
*/ */
apply(dependency, source, templateContext) { apply(dependency, source, templateContext) {
const { moduleGraph } = templateContext; const { moduleGraph, module } = templateContext;
const dep = /** @type {HarmonyExportImportedSpecifierDependency} */ (dependency); const dep = /** @type {HarmonyExportImportedSpecifierDependency} */ (dependency);
if (dep.originModule === this.rootModule) { if (module === this.rootModule) {
if (this.modulesMap.get(moduleGraph.getModule(dep))) { if (this.modulesMap.get(moduleGraph.getModule(dep))) {
const exportDefs = this.getExports(dep, { moduleGraph }); const exportDefs = this.getExports(dep, { moduleGraph });
for (const def of exportDefs) { for (const def of exportDefs) {
const info = this.modulesMap.get(def.module); const info = this.modulesMap.get(def.module);
const used = dep.originModule.getUsedName(moduleGraph, def.name); const used = module.getUsedName(moduleGraph, def.name);
if (!used) { if (!used) {
source.insert( source.insert(
-1, -1,
@ -1512,7 +1507,7 @@ class HarmonyExportImportedSpecifierDependencyConcatenatedTemplate extends Depen
); );
} }
let finalName; let finalName;
const strictFlag = dep.originModule.buildMeta.strictHarmonyModule const strictFlag = module.buildMeta.strictHarmonyModule
? "_strict" ? "_strict"
: ""; : "";
if (def.id === true) { if (def.id === true) {