mirror of https://github.com/webpack/webpack.git
cleanup, renaming
This commit is contained in:
parent
432d338f9a
commit
77abab8c97
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const { topLevelSymbolTag } = require("../optimize/InnerGraph");
|
||||
const InnerGraph = require("../optimize/InnerGraph");
|
||||
const ConstDependency = require("./ConstDependency");
|
||||
const HarmonyExportExpressionDependency = require("./HarmonyExportExpressionDependency");
|
||||
const HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency");
|
||||
|
|
@ -87,15 +87,13 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|||
dep.loc = Object.create(statement.loc);
|
||||
dep.loc.index = -1;
|
||||
parser.state.current.addDependency(dep);
|
||||
const topLevelSymbol = parser.getTagData(
|
||||
InnerGraph.addVariableUsage(
|
||||
parser,
|
||||
expr.type.endsWith("Declaration") && expr.id
|
||||
? expr.id.name
|
||||
: "*default*",
|
||||
topLevelSymbolTag
|
||||
"default"
|
||||
);
|
||||
if (topLevelSymbol) {
|
||||
topLevelSymbol.addDependency("default");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
);
|
||||
|
|
@ -107,10 +105,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|||
const harmonyNamedExports = (parser.state.harmonyNamedExports =
|
||||
parser.state.harmonyNamedExports || new Set());
|
||||
harmonyNamedExports.add(name);
|
||||
const topLevelSymbol = parser.getTagData(id, topLevelSymbolTag);
|
||||
if (topLevelSymbol) {
|
||||
topLevelSymbol.addDependency(name);
|
||||
}
|
||||
InnerGraph.addVariableUsage(parser, id, name);
|
||||
if (settings) {
|
||||
dep = new HarmonyExportImportedSpecifierDependency(
|
||||
settings.source,
|
||||
|
|
|
|||
|
|
@ -86,13 +86,9 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|||
|
||||
InnerGraph.addDependency(parser.state, dep);
|
||||
if (!currentTopLevelSymbol) {
|
||||
InnerGraph.setUsage(parser.state, dep, true);
|
||||
InnerGraph.addUsage(parser.state, dep, true);
|
||||
} else {
|
||||
InnerGraph.setUsage(
|
||||
parser.state,
|
||||
dep,
|
||||
new Set([currentTopLevelSymbol])
|
||||
);
|
||||
InnerGraph.addUsage(parser.state, dep, currentTopLevelSymbol);
|
||||
}
|
||||
};
|
||||
parser.hooks.expression
|
||||
|
|
|
|||
|
|
@ -7,11 +7,10 @@
|
|||
|
||||
/** @typedef {import("estree").Node} AnyNode */
|
||||
/** @typedef {import("../Dependency")} Dependency */
|
||||
/** @typedef {import("../dependencies/HarmonyImportSpecifierDependency")} HarmonyImportSpecifierDependency */
|
||||
/** @typedef {import("../dependencies/PureExpressionDependency")} PureExpressionDependency */
|
||||
/** @typedef {import("../Parser").ParserState} ParserState */
|
||||
/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
|
||||
/** @typedef {Map<TopLevelSymbol | Dependency, Set<string | TopLevelSymbol> | true>} InnerGraph */
|
||||
/** @typedef {false|{innerGraph: InnerGraph, allExportDependentDependencies: Set<PureExpressionDependency|HarmonyImportSpecifierDependency>, currentTopLevelSymbol: TopLevelSymbol|void}} State */
|
||||
/** @typedef {false|{innerGraph: InnerGraph, allExportDependentDependencies: Set<Dependency>, currentTopLevelSymbol: TopLevelSymbol|void}} State */
|
||||
|
||||
/** @type {WeakMap<ParserState, State>} */
|
||||
const parserStateMap = new WeakMap();
|
||||
|
|
@ -61,32 +60,44 @@ exports.isEnabled = parserState => {
|
|||
/**
|
||||
* @param {ParserState} state parser state
|
||||
* @param {TopLevelSymbol | Dependency} symbol the symbol
|
||||
* @param {Set<string | TopLevelSymbol> | true} usage usage data
|
||||
* @param {string | TopLevelSymbol | true} usage usage data
|
||||
* @returns {void}
|
||||
*/
|
||||
exports.setUsage = (state, symbol, usage) => {
|
||||
exports.addUsage = (state, symbol, usage) => {
|
||||
const innerGraphState = getState(state);
|
||||
|
||||
if (innerGraphState) {
|
||||
innerGraphState.innerGraph.set(symbol, usage);
|
||||
const { innerGraph } = innerGraphState;
|
||||
const info = innerGraph.get(symbol);
|
||||
if (usage === true) {
|
||||
innerGraph.set(symbol, true);
|
||||
} else if (info === undefined) {
|
||||
innerGraph.set(symbol, new Set([usage]));
|
||||
} else if (info !== true) {
|
||||
info.add(usage);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {JavascriptParser} parser the parser
|
||||
* @param {string} name name of variable
|
||||
* @param {string | TopLevelSymbol | true} usage usage data
|
||||
* @returns {void}
|
||||
*/
|
||||
exports.addVariableUsage = (parser, name, usage) => {
|
||||
const symbol = /** @type {TopLevelSymbol} */ (parser.getTagData(
|
||||
name,
|
||||
topLevelSymbolTag
|
||||
));
|
||||
if (symbol) {
|
||||
exports.addUsage(parser.state, symbol, usage);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {ParserState} state parser state
|
||||
* @param {TopLevelSymbol | Dependency} symbol the symbol
|
||||
* @returns {Set<string | TopLevelSymbol> | true} usage data
|
||||
*/
|
||||
exports.getUsage = (state, symbol) => {
|
||||
const innerGraphState = getState(state);
|
||||
|
||||
if (innerGraphState) {
|
||||
return innerGraphState.innerGraph.get(symbol);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {ParserState} state parser state
|
||||
* @returns {Map<Dependency, Set<string | TopLevelSymbol> | true>} usage data
|
||||
* @returns {Map<Dependency, Set<string> | true>} usage data
|
||||
*/
|
||||
exports.inferDependencyUsage = state => {
|
||||
const innerGraphState = getState(state);
|
||||
|
|
@ -140,25 +151,18 @@ exports.inferDependencyUsage = state => {
|
|||
}
|
||||
}
|
||||
|
||||
/** @type {Map<Dependency, true | Set<string>>} */
|
||||
const result = new Map();
|
||||
for (const dep of allExportDependentDependencies) {
|
||||
const value = innerGraph.get(dep);
|
||||
switch (value) {
|
||||
case undefined:
|
||||
dep.usedByExports = false;
|
||||
break;
|
||||
case true:
|
||||
dep.usedByExports = true;
|
||||
break;
|
||||
default:
|
||||
dep.usedByExports = /** @type {Set<string>} */ (value);
|
||||
break;
|
||||
}
|
||||
const value = /** @type {true | Set<string>} */ (innerGraph.get(dep));
|
||||
result.set(dep, value);
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {ParserState} state parser state
|
||||
* @param {PureExpressionDependency|HarmonyImportSpecifierDependency} dep dependency
|
||||
* @param {Dependency} dep dependency
|
||||
*/
|
||||
exports.addDependency = (state, dep) => {
|
||||
const innerGraphState = getState(state);
|
||||
|
|
@ -193,61 +197,35 @@ exports.getTopLevelSymbol = state => {
|
|||
};
|
||||
|
||||
/**
|
||||
* @param {ParserState} state parser state
|
||||
* @returns {Set<PureExpressionDependency|HarmonyImportSpecifierDependency>} dependencies
|
||||
*/
|
||||
exports.getExportDependentDependencies = state => {
|
||||
const innerGraphState = getState(state);
|
||||
|
||||
if (innerGraphState) {
|
||||
return innerGraphState.allExportDependentDependencies;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {TODO} parser parser
|
||||
* @param {string} name symbol name
|
||||
* @returns {TopLevelSymbol} usage data
|
||||
* @param {JavascriptParser} parser parser
|
||||
* @param {string} name name of variable
|
||||
* @returns {TopLevelSymbol} symbol
|
||||
*/
|
||||
exports.tagTopLevelSymbol = (parser, name) => {
|
||||
const innerGraphState = getState(parser.state);
|
||||
const { innerGraph } = innerGraphState || {};
|
||||
if (!innerGraphState) return;
|
||||
|
||||
parser.defineVariable(name);
|
||||
|
||||
const existingTag = parser.getTagData(name, topLevelSymbolTag);
|
||||
const existingTag = /** @type {TopLevelSymbol} */ (parser.getTagData(
|
||||
name,
|
||||
topLevelSymbolTag
|
||||
));
|
||||
if (existingTag) {
|
||||
return existingTag;
|
||||
}
|
||||
|
||||
const fn = new TopLevelSymbol(name, innerGraph);
|
||||
const fn = new TopLevelSymbol(name);
|
||||
parser.tagVariable(name, topLevelSymbolTag, fn);
|
||||
return fn;
|
||||
};
|
||||
|
||||
class TopLevelSymbol {
|
||||
/**
|
||||
* @param {string} name name of the function
|
||||
* @param {InnerGraph} innerGraph reference to the graph
|
||||
* @param {string} name name of the variable
|
||||
*/
|
||||
constructor(name, innerGraph) {
|
||||
constructor(name) {
|
||||
this.name = name;
|
||||
this.innerGraph = innerGraph;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string | TopLevelSymbol | true} dep export or top level symbol or always
|
||||
* @returns {void}
|
||||
*/
|
||||
addDependency(dep) {
|
||||
const info = this.innerGraph.get(this);
|
||||
if (dep === true) {
|
||||
this.innerGraph.set(this, true);
|
||||
} else if (info === undefined) {
|
||||
this.innerGraph.set(this, new Set([dep]));
|
||||
} else if (info !== true) {
|
||||
info.add(dep);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -118,7 +118,22 @@ class InnerGraphPlugin {
|
|||
parser.hooks.finish.tap("InnerGraphPlugin", () => {
|
||||
if (!InnerGraph.isEnabled(parser.state)) return;
|
||||
|
||||
InnerGraph.inferDependencyUsage(parser.state);
|
||||
for (const [dependency, usage] of InnerGraph.inferDependencyUsage(
|
||||
parser.state
|
||||
)) {
|
||||
const dep = /** @type {Dependency & { usedByExports: boolean | Set<string> }} */ (dependency);
|
||||
switch (usage) {
|
||||
case undefined:
|
||||
dep.usedByExports = false;
|
||||
break;
|
||||
case true:
|
||||
dep.usedByExports = true;
|
||||
break;
|
||||
default:
|
||||
dep.usedByExports = usage;
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
/** @type {WeakMap<{}, TopLevelSymbol>} */
|
||||
const statementWithTopLevelSymbol = new WeakMap();
|
||||
|
|
@ -209,7 +224,7 @@ class InnerGraphPlugin {
|
|||
const dep = new PureExpressionDependency(decl.init.range);
|
||||
dep.loc = decl.loc;
|
||||
parser.state.module.addDependency(dep);
|
||||
InnerGraph.setUsage(parser.state, dep, new Set([fn]));
|
||||
InnerGraph.addUsage(parser.state, dep, fn);
|
||||
InnerGraph.addDependency(parser.state, dep);
|
||||
}
|
||||
InnerGraph.setTopLevelSymbol(parser.state, fn);
|
||||
|
|
@ -226,7 +241,11 @@ class InnerGraphPlugin {
|
|||
const currentTopLevelSymbol = InnerGraph.getTopLevelSymbol(
|
||||
parser.state
|
||||
);
|
||||
topLevelSymbol.addDependency(currentTopLevelSymbol || true);
|
||||
InnerGraph.addUsage(
|
||||
parser.state,
|
||||
topLevelSymbol,
|
||||
currentTopLevelSymbol || true
|
||||
);
|
||||
});
|
||||
parser.hooks.assign
|
||||
.for(topLevelSymbolTag)
|
||||
|
|
|
|||
Loading…
Reference in New Issue