remove arguments, replace whole expression

This commit is contained in:
Tobias Koppers 2022-03-08 08:01:52 +01:00
parent 4fe01b2954
commit b095e8d138
11 changed files with 63 additions and 51 deletions

View File

@ -21,21 +21,9 @@ const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDepend
* a.x !== undefined; // if x value statically analyzable
*/
class HarmonyEvaluatedImportSpecifierDependency extends HarmonyImportSpecifierDependency {
constructor(
request,
sourceOrder,
ids,
name,
range,
assertions,
operator,
value,
importSpecifierRange
) {
constructor(request, sourceOrder, ids, name, range, assertions, operator) {
super(request, sourceOrder, ids, name, range, false, assertions);
this.operator = operator;
this.value = value;
this.importSpecifierRange = importSpecifierRange;
}
get type() {
@ -46,16 +34,12 @@ class HarmonyEvaluatedImportSpecifierDependency extends HarmonyImportSpecifierDe
super.serialize(context);
const { write } = context;
write(this.operator);
write(this.value);
write(this.importSpecifierRange);
}
deserialize(context) {
super.deserialize(context);
const { read } = context;
this.operator = read();
this.value = read();
this.importSpecifierRange = read();
}
}
@ -89,12 +73,20 @@ HarmonyEvaluatedImportSpecifierDependency.Template = class HarmonyEvaluatedImpor
if (typeof value === "boolean") {
source.replace(dep.range[0], dep.range[1] - 1, `${value}`);
} else {
this._applyForIds(
dependency,
const usedName = exportsInfo.getUsedName(ids, runtime);
const code = this._getCodeForIds(
dep,
source,
templateContext,
ids.slice(0, -1),
dep.importSpecifierRange
ids.slice(0, -1)
);
source.replace(
dep.range[0],
dep.range[1] - 1,
`${
usedName ? JSON.stringify(usedName[usedName.length - 1]) : '""'
} in ${code}`
);
}
}

View File

@ -159,9 +159,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
settings.name,
expression.range,
settings.assertions,
"in",
leftPart,
rightPart.range
"in"
);
dep.directImport = members.length === 0;
dep.asiSafe = !parser.isAsiPosition(expression.range[0]);

View File

@ -267,11 +267,23 @@ HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependen
if (connection && !connection.isTargetActive(runtime)) return;
const ids = dep.getIds(moduleGraph);
this._applyForIds(dependency, source, templateContext, ids, dep.range);
const exportExpr = this._getCodeForIds(dep, source, templateContext, ids);
const range = dep.range;
if (dep.shorthand) {
source.insert(range[1], `: ${exportExpr}`);
} else {
source.replace(range[0], range[1] - 1, exportExpr);
}
}
_applyForIds(dependency, source, templateContext, ids, range) {
const dep = /** @type {HarmonyImportSpecifierDependency} */ (dependency);
/**
* @param {HarmonyImportSpecifierDependency} dep dependency
* @param {ReplaceSource} source source
* @param {DependencyTemplateContext} templateContext context
* @param {string[]} ids ids
* @returns {string} generated code
*/
_getCodeForIds(dep, source, templateContext, ids) {
const { moduleGraph, module, runtime, concatenationScope } =
templateContext;
const connection = moduleGraph.getConnection(dep);
@ -305,7 +317,7 @@ HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependen
);
}
} else {
super.apply(dependency, source, templateContext);
super.apply(dep, source, templateContext);
const { runtimeTemplate, initFragments, runtimeRequirements } =
templateContext;
@ -326,11 +338,7 @@ HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependen
runtimeRequirements
});
}
if (dep.shorthand) {
source.insert(range[1], `: ${exportExpr}`);
} else {
source.replace(range[0], range[1] - 1, exportExpr);
}
return exportExpr;
}
};

View File

@ -8,6 +8,9 @@ import { h } from "./h.js";
import * as m from "./m";
import * as o from "./o";
import * as p from "./p";
import * as q from "./q";
import * as so from "./side-effect-free/o";
import * as sm from "./side-effect-free/m";
it("namespace export as from commonjs should override named export", function () {
expect(x).toBe(1);
@ -40,15 +43,20 @@ it("complex case should work correctly", () => {
});
it("should handle 'm in n' case", () => {
const obj = { a: "a" in m };
expect(obj.a).toBe(true);
expect("a" in o).toBe(true);
expect("a" in p).toBe(false);
expect("c" in m).toBe(false);
expect("c" in (false ? ({}) : m.d)).toBe(true);
expect("d" in m.d).toBe(false);
const obj = { aaa: "aaa" in m };
expect(obj.aaa).toBe(true);
expect("aaa" in o).toBe(true);
expect("aaa" in p).toBe(false);
expect("ccc" in m).toBe(false);
expect("aaa" in q).toBe(true);
expect("aaa" in so).toBe(true);
expect("ccc" in sm).toBe(false);
expect("ccc" in (false ? {} : m.ddd)).toBe(true);
expect("ccc" in (false ? {} : sm.ddd)).toBe(true);
expect("ddd" in m.ddd).toBe(false);
expect("ddd" in sm.ddd).toBe(false);
if (process.env.NODE_ENV === "production") {
expect(m.d.usedA).toBe(false);
expect(m.ddd.usedA).toBe(false);
expect(m.usedB).toBe(false);
expect(m.usedA).toBe(true);
expect(m.canMangleA).toBe(true);

View File

@ -1,6 +1,6 @@
export const a = 1;
export const b = 2;
export * as d from "./n";
export const usedA = __webpack_exports_info__.a.used;
export const canMangleA = __webpack_exports_info__.c.canMangle;
export const usedB = __webpack_exports_info__.b.used;
export const aaa = 1;
export const bbb = 2;
export * as ddd from "./n";
export const usedA = __webpack_exports_info__.aaa.used;
export const canMangleA = __webpack_exports_info__.ccc.canMangle;
export const usedB = __webpack_exports_info__.bbb.used;

View File

@ -1,5 +1,5 @@
export const c = 3;
export const m = () => ({});
export const a = 1;
export const ccc = 3;
export const mmm = () => ({});
export const aaa = 1;
export const usedA = __webpack_exports_info__.a.used;
export const canMangleC = __webpack_exports_info__.c.canMangle;

View File

@ -1,2 +1,2 @@
const exports_ = { a: 1, b: 2 };
const exports_ = { aaa: 1, bbb: 2 };
module.exports = exports_;

View File

@ -0,0 +1 @@
export * from "./o";

View File

@ -0,0 +1 @@
export * from "../m";

View File

@ -0,0 +1 @@
export * from "../o";

View File

@ -0,0 +1,3 @@
{
"sideEffects": false
}