Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c8dc5fa

Browse files
committed
Handle barrel imports (#17305)
1 parent 6104d28 commit c8dc5fa

File tree

7 files changed

+82
-57
lines changed

7 files changed

+82
-57
lines changed

lib/dependencies/HarmonyImportDependencyParserPlugin.js

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -212,18 +212,17 @@ module.exports = class HarmonyImportDependencyParserPlugin {
212212
.for(harmonySpecifierTag)
213213
.tap(
214214
"HarmonyImportDependencyParserPlugin",
215-
(expression, members, membersOptionals, memberRangeStarts) => {
215+
(expression, members, membersOptionals, memberRanges) => {
216216
const settings = /** @type {HarmonySettings} */ (
217217
parser.currentTagData
218218
);
219219
const nonOptionalMembers = getNonOptionalPart(
220220
members,
221221
membersOptionals
222222
);
223-
const rangeStarts = memberRangeStarts.slice(
223+
const ranges = memberRanges.slice(
224224
0,
225-
memberRangeStarts.length -
226-
(members.length - nonOptionalMembers.length)
225+
memberRanges.length - (members.length - nonOptionalMembers.length)
227226
);
228227
const expr =
229228
nonOptionalMembers !== members
@@ -241,7 +240,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
241240
expr.range,
242241
exportPresenceMode,
243242
settings.assertions,
244-
rangeStarts
243+
ranges
245244
);
246245
dep.referencedPropertiesInDestructuring =
247246
parser.destructuringAssignmentPropertiesFor(expr);
@@ -256,7 +255,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
256255
.for(harmonySpecifierTag)
257256
.tap(
258257
"HarmonyImportDependencyParserPlugin",
259-
(expression, members, membersOptionals, memberRangeStarts) => {
258+
(expression, members, membersOptionals, memberRanges) => {
260259
const { arguments: args, callee } = expression;
261260
const settings = /** @type {HarmonySettings} */ (
262261
parser.currentTagData
@@ -265,10 +264,9 @@ module.exports = class HarmonyImportDependencyParserPlugin {
265264
members,
266265
membersOptionals
267266
);
268-
const rangeStarts = memberRangeStarts.slice(
267+
const ranges = memberRanges.slice(
269268
0,
270-
memberRangeStarts.length -
271-
(members.length - nonOptionalMembers.length)
269+
memberRanges.length - (members.length - nonOptionalMembers.length)
272270
);
273271
const expr =
274272
nonOptionalMembers !== members
@@ -286,7 +284,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
286284
expr.range,
287285
exportPresenceMode,
288286
settings.assertions,
289-
rangeStarts
287+
ranges
290288
);
291289
dep.directImport = members.length === 0;
292290
dep.call = true;

lib/dependencies/HarmonyImportSpecifierDependency.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class HarmonyImportSpecifierDependency extends HarmonyImportDependency {
4343
* @param {Range} range range
4444
* @param {TODO} exportPresenceMode export presence mode
4545
* @param {Assertions=} assertions assertions
46-
* @param {number[]=} idRangeStarts range starts for members of ids; the two arrays are right-aligned
46+
* @param {Range[]=} idRanges ranges for members of ids; the two arrays are right-aligned
4747
*/
4848
constructor(
4949
request,
@@ -53,13 +53,13 @@ class HarmonyImportSpecifierDependency extends HarmonyImportDependency {
5353
range,
5454
exportPresenceMode,
5555
assertions,
56-
idRangeStarts // TODO webpack 6 make this non-optional. It must always be set to properly trim ids.
56+
idRanges // TODO webpack 6 make this non-optional. It must always be set to properly trim ids.
5757
) {
5858
super(request, sourceOrder, assertions);
5959
this.ids = ids;
6060
this.name = name;
6161
this.range = range;
62-
this.idRangeStarts = idRangeStarts;
62+
this.idRanges = idRanges;
6363
this.exportPresenceMode = exportPresenceMode;
6464
this.namespaceObjectAsContext = false;
6565
this.call = undefined;
@@ -261,7 +261,7 @@ class HarmonyImportSpecifierDependency extends HarmonyImportDependency {
261261
write(this.ids);
262262
write(this.name);
263263
write(this.range);
264-
write(this.idRangeStarts);
264+
write(this.idRanges);
265265
write(this.exportPresenceMode);
266266
write(this.namespaceObjectAsContext);
267267
write(this.call);
@@ -281,7 +281,7 @@ class HarmonyImportSpecifierDependency extends HarmonyImportDependency {
281281
this.ids = read();
282282
this.name = read();
283283
this.range = read();
284-
this.idRangeStarts = read();
284+
this.idRanges = read();
285285
this.exportPresenceMode = read();
286286
this.namespaceObjectAsContext = read();
287287
this.call = read();
@@ -320,23 +320,23 @@ HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependen
320320

321321
let [rangeStart, rangeEnd] = dep.range;
322322
if (trimmedIds.length !== ids.length) {
323-
// The array returned from dep.idRangeStarts is right-aligned with the array returned from dep.getIds.
323+
// The array returned from dep.idRanges is right-aligned with the array returned from dep.getIds.
324324
// Meaning, the two arrays may not always have the same number of elements, but the last element of
325-
// dep.idRangeStarts corresponds to [the starting range position of] the last element of dep.getIds.
326-
// Use this to find the correct range end position based on the number of ids that were trimmed.
325+
// dep.idRanges corresponds to [the expression fragment to the left of] the last element of dep.getIds.
326+
// Use this to find the correct replacement range based on the number of ids that were trimmed.
327327
const idx =
328-
dep.idRangeStarts === undefined
328+
dep.idRanges === undefined
329329
? -1 /* trigger failure case below */
330-
: dep.idRangeStarts.length + (trimmedIds.length - ids.length);
331-
if (idx < 0 || idx >= dep.idRangeStarts.length) {
330+
: dep.idRanges.length + (trimmedIds.length - ids.length);
331+
if (idx < 0 || idx >= dep.idRanges.length) {
332332
// cspell:ignore minifiers
333333
// Should not happen but we can't throw an error here because of backward compatibility with
334334
// external plugins in wp5. Instead, we just disable trimming for now. This may break some minifiers.
335335
trimmedIds = ids;
336336
// TODO webpack 6 remove the "trimmedIds = ids" above and uncomment the following line instead.
337337
// throw new Error("Missing range starts data for id replacement trimming.");
338338
} else {
339-
rangeEnd = dep.idRangeStarts[idx];
339+
[rangeStart, rangeEnd] = dep.idRanges[idx];
340340
}
341341
}
342342

lib/javascript/BasicEvaluatedExpression.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"use strict";
77

88
/** @typedef {import("estree").Node} EsTreeNode */
9+
/** @typedef {import("./JavascriptParser").Range} Range */
910
/** @typedef {import("./JavascriptParser").VariableInfoInterface} VariableInfoInterface */
1011

1112
const TypeUnknown = 0;
@@ -70,8 +71,8 @@ class BasicEvaluatedExpression {
7071
this.getMembers = undefined;
7172
/** @type {() => boolean[]} */
7273
this.getMembersOptionals = undefined;
73-
/** @type {() => number[]} */
74-
this.getMemberRangeStarts = undefined;
74+
/** @type {() => Range[]} */
75+
this.getMemberRanges = undefined;
7576
/** @type {EsTreeNode} */
7677
this.expression = undefined;
7778
}
@@ -386,22 +387,22 @@ class BasicEvaluatedExpression {
386387
* @param {string | VariableInfoInterface} rootInfo root info
387388
* @param {() => string[]} getMembers members
388389
* @param {() => boolean[]=} getMembersOptionals optional members
389-
* @param {() => number[]=} getMemberRangeStarts range start of progressively increasing sub-expressions
390+
* @param {() => Range[]=} getMemberRanges ranges of progressively increasing sub-expressions
390391
* @returns {this} this
391392
*/
392393
setIdentifier(
393394
identifier,
394395
rootInfo,
395396
getMembers,
396397
getMembersOptionals,
397-
getMemberRangeStarts
398+
getMemberRanges
398399
) {
399400
this.type = TypeIdentifier;
400401
this.identifier = identifier;
401402
this.rootInfo = rootInfo;
402403
this.getMembers = getMembers;
403404
this.getMembersOptionals = getMembersOptionals;
404-
this.getMemberRangeStarts = getMemberRangeStarts;
405+
this.getMemberRanges = getMemberRanges;
405406
this.sideEffects = true;
406407
return this;
407408
}

lib/javascript/JavascriptParser.js

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ const BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
9191
/** @typedef {import("../Parser").ParserState} ParserState */
9292
/** @typedef {import("../Parser").PreparsedAst} PreparsedAst */
9393
/** @typedef {{declaredScope: ScopeInfo, freeName: string | true, tagInfo: TagInfo | undefined}} VariableInfoInterface */
94-
/** @typedef {{ name: string | VariableInfo, rootInfo: string | VariableInfo, getMembers: () => string[], getMembersOptionals: () => boolean[], getMemberRangeStarts: () => number[] }} GetInfoResult */
94+
/** @typedef {{ name: string | VariableInfo, rootInfo: string | VariableInfo, getMembers: () => string[], getMembersOptionals: () => boolean[], getMemberRanges: () => Range[] }} GetInfoResult */
9595

9696
const EMPTY_ARRAY = [];
9797
const ALLOWED_MEMBER_TYPES_CALL_EXPRESSION = 0b01;
@@ -350,14 +350,14 @@ class JavascriptParser extends Parser {
350350
/** @type {HookMap<SyncBailHook<[BaseCallExpression], boolean | void>>} */
351351
call: new HookMap(() => new SyncBailHook(["expression"])),
352352
/** Something like "a.b()" */
353-
/** @type {HookMap<SyncBailHook<[CallExpression, string[], boolean[], number[]], boolean | void>>} */
353+
/** @type {HookMap<SyncBailHook<[CallExpression, string[], boolean[], Range[]], boolean | void>>} */
354354
callMemberChain: new HookMap(
355355
() =>
356356
new SyncBailHook([
357357
"expression",
358358
"members",
359359
"membersOptionals",
360-
"memberRangeStarts"
360+
"memberRanges"
361361
])
362362
),
363363
/** Something like "a.b().c.d" */
@@ -390,14 +390,14 @@ class JavascriptParser extends Parser {
390390
binaryExpression: new SyncBailHook(["binaryExpression"]),
391391
/** @type {HookMap<SyncBailHook<[Expression], boolean | void>>} */
392392
expression: new HookMap(() => new SyncBailHook(["expression"])),
393-
/** @type {HookMap<SyncBailHook<[Expression, string[], boolean[], number[]], boolean | void>>} */
393+
/** @type {HookMap<SyncBailHook<[Expression, string[], boolean[], Range[]], boolean | void>>} */
394394
expressionMemberChain: new HookMap(
395395
() =>
396396
new SyncBailHook([
397397
"expression",
398398
"members",
399399
"membersOptionals",
400-
"memberRangeStarts"
400+
"memberRanges"
401401
])
402402
),
403403
/** @type {HookMap<SyncBailHook<[Expression, string[]], boolean | void>>} */
@@ -1163,7 +1163,7 @@ class JavascriptParser extends Parser {
11631163
info.rootInfo,
11641164
info.getMembers,
11651165
info.getMembersOptionals,
1166-
info.getMemberRangeStarts
1166+
info.getMemberRanges
11671167
)
11681168
.setRange(expr.range);
11691169
}
@@ -1184,7 +1184,7 @@ class JavascriptParser extends Parser {
11841184
rootInfo: info,
11851185
getMembers: () => [],
11861186
getMembersOptionals: () => [],
1187-
getMemberRangeStarts: () => []
1187+
getMemberRanges: () => []
11881188
};
11891189
}
11901190
});
@@ -1199,7 +1199,7 @@ class JavascriptParser extends Parser {
11991199
rootInfo: info,
12001200
getMembers: () => [],
12011201
getMembersOptionals: () => [],
1202-
getMemberRangeStarts: () => []
1202+
getMemberRanges: () => []
12031203
};
12041204
}
12051205
});
@@ -3264,7 +3264,7 @@ class JavascriptParser extends Parser {
32643264
callee.getMembersOptionals
32653265
? callee.getMembersOptionals()
32663266
: callee.getMembers().map(() => false),
3267-
callee.getMemberRangeStarts ? callee.getMemberRangeStarts() : []
3267+
callee.getMemberRanges ? callee.getMemberRanges() : []
32683268
);
32693269
if (result1 === true) return;
32703270
const result2 = this.callHooksForInfo(
@@ -3308,14 +3308,14 @@ class JavascriptParser extends Parser {
33083308
if (result1 === true) return;
33093309
const members = exprInfo.getMembers();
33103310
const membersOptionals = exprInfo.getMembersOptionals();
3311-
const memberRangeStarts = exprInfo.getMemberRangeStarts();
3311+
const memberRanges = exprInfo.getMemberRanges();
33123312
const result2 = this.callHooksForInfo(
33133313
this.hooks.expressionMemberChain,
33143314
exprInfo.rootInfo,
33153315
expression,
33163316
members,
33173317
membersOptionals,
3318-
memberRangeStarts
3318+
memberRanges
33193319
);
33203320
if (result2 === true) return;
33213321
this.walkMemberExpressionWithExpressionName(
@@ -4271,23 +4271,23 @@ class JavascriptParser extends Parser {
42714271

42724272
/**
42734273
* @param {MemberExpression} expression a member expression
4274-
* @returns {{ members: string[], object: Expression | Super, membersOptionals: boolean[], memberRangeStarts: number[] }} member names (reverse order) and remaining object
4274+
* @returns {{ members: string[], object: Expression | Super, membersOptionals: boolean[], memberRanges: Range[] }} member names (reverse order) and remaining object
42754275
*/
42764276
extractMemberExpressionChain(expression) {
42774277
/** @type {AnyNode} */
42784278
let expr = expression;
42794279
const members = [];
42804280
const membersOptionals = [];
4281-
const memberRangeStarts = [];
4281+
const memberRanges = [];
42824282
while (expr.type === "MemberExpression") {
42834283
if (expr.computed) {
42844284
if (expr.property.type !== "Literal") break;
4285-
members.push(`${expr.property.value}`);
4286-
memberRangeStarts.push(expr.object.range[1]);
4285+
members.push(`${expr.property.value}`); // the literal
4286+
memberRanges.push(expr.object.range); // the range of the expression fragment before the literal
42874287
} else {
42884288
if (expr.property.type !== "Identifier") break;
4289-
members.push(expr.property.name);
4290-
memberRangeStarts.push(expr.object.range[1]);
4289+
members.push(expr.property.name); // the identifier
4290+
memberRanges.push(expr.object.range); // the range of the expression fragment before the identifier
42914291
}
42924292
membersOptionals.push(expr.optional);
42934293
expr = expr.object;
@@ -4296,7 +4296,7 @@ class JavascriptParser extends Parser {
42964296
return {
42974297
members,
42984298
membersOptionals,
4299-
memberRangeStarts,
4299+
memberRanges,
43004300
object: expr
43014301
};
43024302
}
@@ -4319,16 +4319,16 @@ class JavascriptParser extends Parser {
43194319
return { info, name };
43204320
}
43214321

4322-
/** @typedef {{ type: "call", call: CallExpression, calleeName: string, rootInfo: string | VariableInfo, getCalleeMembers: () => string[], name: string, getMembers: () => string[], getMembersOptionals: () => boolean[], getMemberRangeStarts: () => number[]}} CallExpressionInfo */
4323-
/** @typedef {{ type: "expression", rootInfo: string | VariableInfo, name: string, getMembers: () => string[], getMembersOptionals: () => boolean[], getMemberRangeStarts: () => number[]}} ExpressionExpressionInfo */
4322+
/** @typedef {{ type: "call", call: CallExpression, calleeName: string, rootInfo: string | VariableInfo, getCalleeMembers: () => string[], name: string, getMembers: () => string[], getMembersOptionals: () => boolean[], getMemberRanges: () => Range[]}} CallExpressionInfo */
4323+
/** @typedef {{ type: "expression", rootInfo: string | VariableInfo, name: string, getMembers: () => string[], getMembersOptionals: () => boolean[], getMemberRanges: () => Range[]}} ExpressionExpressionInfo */
43244324

43254325
/**
43264326
* @param {MemberExpression} expression a member expression
43274327
* @param {number} allowedTypes which types should be returned, presented in bit mask
43284328
* @returns {CallExpressionInfo | ExpressionExpressionInfo | undefined} expression info
43294329
*/
43304330
getMemberExpressionInfo(expression, allowedTypes) {
4331-
const { object, members, membersOptionals, memberRangeStarts } =
4331+
const { object, members, membersOptionals, memberRanges } =
43324332
this.extractMemberExpressionChain(expression);
43334333
switch (object.type) {
43344334
case "CallExpression": {
@@ -4355,7 +4355,7 @@ class JavascriptParser extends Parser {
43554355
name: objectAndMembersToName(`${calleeName}()`, members),
43564356
getMembers: memoize(() => members.reverse()),
43574357
getMembersOptionals: memoize(() => membersOptionals.reverse()),
4358-
getMemberRangeStarts: memoize(() => memberRangeStarts.reverse())
4358+
getMemberRanges: memoize(() => memberRanges.reverse())
43594359
};
43604360
}
43614361
case "Identifier":
@@ -4375,7 +4375,7 @@ class JavascriptParser extends Parser {
43754375
rootInfo,
43764376
getMembers: memoize(() => members.reverse()),
43774377
getMembersOptionals: memoize(() => membersOptionals.reverse()),
4378-
getMemberRangeStarts: memoize(() => memberRangeStarts.reverse())
4378+
getMemberRanges: memoize(() => memberRanges.reverse())
43794379
};
43804380
}
43814381
}

test/configCases/code-generation/re-export-namespace-concat/index.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ it("should use/preserve accessor form for import object and namespaces", functio
3535
const bb = obj1.up.down?.left.right;
3636

3737
data.nested.object3["unknownProperty"].depth = "deep";
38+
39+
(obj1)["aaa"].bbb;
40+
(m_1.obj1)["ccc"].ddd;
41+
(obj1["eee"]).fff;
42+
(m_1.obj1["ggg"]).hhh;
43+
(((m_1).obj1)["iii"]).jjj;
3844
}
3945

4046
/************ DO NOT MATCH BELOW THIS LINE ************/
@@ -60,4 +66,10 @@ it("should use/preserve accessor form for import object and namespaces", functio
6066
expectSourceToContain(source, 'const bb = obj1.up.down?.left.right;');
6167

6268
expectSourceToContain(source, 'data_namespaceObject.a.a["unknownProperty"].depth = "deep";');
69+
70+
expectSourceToContain(source, '(obj1)["aaa"].bbb;');
71+
expectSourceToContain(source, '(obj1)["ccc"].ddd;');
72+
expectSourceToContain(source, '(obj1["eee"]).fff;');
73+
expectSourceToContain(source, '(obj1["ggg"]).hhh;');
74+
expectSourceToContain(source, '((obj1)["iii"]).jjj;');
6375
});

0 commit comments

Comments
 (0)