mirror of https://github.com/webpack/webpack.git
move flatter algo into InnerGraph
This commit is contained in:
parent
721ce54bdf
commit
68a61677dc
|
@ -82,12 +82,9 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|||
const addDepToInnerGraph = dep => {
|
||||
if (!InnerGraph.isEnabled(parser.state)) return;
|
||||
|
||||
const allExportDependentDependencies = InnerGraph.getExportDependentDependencies(
|
||||
parser.state
|
||||
);
|
||||
const currentTopLevelSymbol = InnerGraph.getTopLevelSymbol(parser.state);
|
||||
|
||||
allExportDependentDependencies.add(dep);
|
||||
InnerGraph.addDependency(parser.state, dep);
|
||||
if (!currentTopLevelSymbol) {
|
||||
InnerGraph.setUsage(parser.state, dep, true);
|
||||
} else {
|
||||
|
|
|
@ -86,13 +86,85 @@ exports.getUsage = (state, symbol) => {
|
|||
|
||||
/**
|
||||
* @param {ParserState} state parser state
|
||||
* @returns {IterableIterator<TopLevelSymbol | Dependency>} graph nodes
|
||||
* @returns {Map<Dependency, Set<string | TopLevelSymbol> | true>} usage data
|
||||
*/
|
||||
exports.getNodesIterable = state => {
|
||||
exports.inferDependencyUsage = state => {
|
||||
const innerGraphState = getState(state);
|
||||
|
||||
if (!innerGraphState) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { allExportDependentDependencies, innerGraph } = innerGraphState;
|
||||
// flatten graph to terminal nodes (string, undefined or true)
|
||||
const nonTerminal = new Set(innerGraph.keys());
|
||||
while (nonTerminal.size > 0) {
|
||||
for (const key of nonTerminal) {
|
||||
/** @type {Set<string|TopLevelSymbol> | true} */
|
||||
let newSet = new Set();
|
||||
let isTerminal = true;
|
||||
const value = innerGraph.get(key);
|
||||
if (value !== true && value !== undefined) {
|
||||
for (const item of value) {
|
||||
if (typeof item === "string") {
|
||||
newSet.add(item);
|
||||
} else {
|
||||
const itemValue = innerGraph.get(item);
|
||||
if (itemValue === true) {
|
||||
newSet = true;
|
||||
break;
|
||||
}
|
||||
if (itemValue !== undefined) {
|
||||
for (const i of itemValue) {
|
||||
if (i === key) continue;
|
||||
if (value.has(i)) continue;
|
||||
newSet.add(i);
|
||||
if (typeof i !== "string") {
|
||||
isTerminal = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (newSet === true) {
|
||||
innerGraph.set(key, true);
|
||||
} else if (newSet.size === 0) {
|
||||
innerGraph.set(key, undefined);
|
||||
} else {
|
||||
innerGraph.set(key, newSet);
|
||||
}
|
||||
}
|
||||
if (isTerminal) {
|
||||
nonTerminal.delete(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {ParserState} state parser state
|
||||
* @param {PureExpressionDependency|HarmonyImportSpecifierDependency} dep dependency
|
||||
*/
|
||||
exports.addDependency = (state, dep) => {
|
||||
const innerGraphState = getState(state);
|
||||
|
||||
if (innerGraphState) {
|
||||
return innerGraphState.innerGraph.keys();
|
||||
innerGraphState.allExportDependentDependencies.add(dep);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -118,69 +118,7 @@ class InnerGraphPlugin {
|
|||
parser.hooks.finish.tap("InnerGraphPlugin", () => {
|
||||
if (!InnerGraph.isEnabled(parser.state)) return;
|
||||
|
||||
const allExportDependentDependencies = InnerGraph.getExportDependentDependencies(
|
||||
parser.state
|
||||
);
|
||||
// flatten graph to terminal nodes (string, undefined or true)
|
||||
const nonTerminal = new Set(
|
||||
InnerGraph.getNodesIterable(parser.state)
|
||||
);
|
||||
while (nonTerminal.size > 0) {
|
||||
for (const key of nonTerminal) {
|
||||
/** @type {Set<string|TopLevelSymbol> | true} */
|
||||
let newSet = new Set();
|
||||
let isTerminal = true;
|
||||
const value = InnerGraph.getUsage(parser.state, key);
|
||||
if (value !== true && value !== undefined) {
|
||||
for (const item of value) {
|
||||
if (typeof item === "string") {
|
||||
newSet.add(item);
|
||||
} else {
|
||||
const itemValue = InnerGraph.getUsage(parser.state, item);
|
||||
if (itemValue === true) {
|
||||
newSet = true;
|
||||
break;
|
||||
}
|
||||
if (itemValue !== undefined) {
|
||||
for (const i of itemValue) {
|
||||
if (i === key) continue;
|
||||
if (value.has(i)) continue;
|
||||
newSet.add(i);
|
||||
if (typeof i !== "string") {
|
||||
isTerminal = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (newSet === true) {
|
||||
InnerGraph.setUsage(parser.state, key, true);
|
||||
} else if (newSet.size === 0) {
|
||||
InnerGraph.setUsage(parser.state, key, undefined);
|
||||
} else {
|
||||
InnerGraph.setUsage(parser.state, key, newSet);
|
||||
}
|
||||
}
|
||||
if (isTerminal) {
|
||||
nonTerminal.delete(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const dep of allExportDependentDependencies) {
|
||||
const value = InnerGraph.getUsage(parser.state, dep);
|
||||
switch (value) {
|
||||
case undefined:
|
||||
dep.usedByExports = false;
|
||||
break;
|
||||
case true:
|
||||
dep.usedByExports = true;
|
||||
break;
|
||||
default:
|
||||
dep.usedByExports = /** @type {Set<string>} */ (value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
InnerGraph.inferDependencyUsage(parser.state);
|
||||
});
|
||||
/** @type {WeakMap<{}, TopLevelSymbol>} */
|
||||
const statementWithTopLevelSymbol = new WeakMap();
|
||||
|
@ -285,9 +223,6 @@ class InnerGraphPlugin {
|
|||
});
|
||||
parser.hooks.declarator.tap("InnerGraphPlugin", (decl, statement) => {
|
||||
if (!InnerGraph.isEnabled(parser.state)) return;
|
||||
const allExportDependentDependencies = InnerGraph.getExportDependentDependencies(
|
||||
parser.state
|
||||
);
|
||||
const fn = declWithTopLevelSymbol.get(decl);
|
||||
if (fn) {
|
||||
if (pureDeclarators.has(decl)) {
|
||||
|
@ -295,7 +230,7 @@ class InnerGraphPlugin {
|
|||
dep.loc = decl.loc;
|
||||
parser.state.module.addDependency(dep);
|
||||
InnerGraph.setUsage(parser.state, dep, new Set([fn]));
|
||||
allExportDependentDependencies.add(dep);
|
||||
InnerGraph.addDependency(parser.state, dep);
|
||||
}
|
||||
InnerGraph.setTopLevelSymbol(parser.state, fn);
|
||||
parser.walkExpression(decl.init);
|
||||
|
|
Loading…
Reference in New Issue