This commit is contained in:
Ivan Kopeykin 2022-02-28 22:50:37 +03:00
parent 59437ccd10
commit 005e065fc4
4 changed files with 33 additions and 33 deletions

View File

@ -84,9 +84,9 @@ module.exports = class HarmonyImportDependencyParserPlugin {
apply(parser) {
const { exportPresenceMode } = this;
function getNonOptionalPart(members, membersOptions) {
function getNonOptionalPart(members, membersOptionals) {
let i = 0;
while (i < members.length && membersOptions[i] === false) i++;
while (i < members.length && membersOptionals[i] === false) i++;
return i !== members.length ? members.slice(0, i) : members;
}
@ -168,13 +168,13 @@ module.exports = class HarmonyImportDependencyParserPlugin {
.for(harmonySpecifierTag)
.tap(
"HarmonyImportDependencyParserPlugin",
(expression, members, membersOptions) => {
(expression, members, membersOptionals) => {
const settings = /** @type {HarmonySettings} */ (
parser.currentTagData
);
const nonOptionalMembers = getNonOptionalPart(
members,
membersOptions
membersOptionals
);
const expr =
nonOptionalMembers !== members
@ -204,14 +204,14 @@ module.exports = class HarmonyImportDependencyParserPlugin {
.for(harmonySpecifierTag)
.tap(
"HarmonyImportDependencyParserPlugin",
(expression, members, membersOptions) => {
(expression, members, membersOptionals) => {
const { arguments: args, callee } = expression;
const settings = /** @type {HarmonySettings} */ (
parser.currentTagData
);
const nonOptionalMembers = getNonOptionalPart(
members,
membersOptions
membersOptionals
);
const expr =
nonOptionalMembers !== members

View File

@ -68,7 +68,7 @@ class BasicEvaluatedExpression {
/** @type {() => string[]} */
this.getMembers = undefined;
/** @type {() => boolean[]} */
this.getMembersOptions = undefined;
this.getMembersOptionals = undefined;
/** @type {EsTreeNode} */
this.expression = undefined;
}
@ -344,12 +344,12 @@ class BasicEvaluatedExpression {
return this;
}
setIdentifier(identifier, rootInfo, getMembers, getMembersOptions) {
setIdentifier(identifier, rootInfo, getMembers, getMembersOptionals) {
this.type = TypeIdentifier;
this.identifier = identifier;
this.rootInfo = rootInfo;
this.getMembers = getMembers;
this.getMembersOptions = getMembersOptions;
this.getMembersOptionals = getMembersOptionals;
this.sideEffects = true;
return this;
}

View File

@ -57,7 +57,7 @@ const BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
/** @typedef {import("../Parser").ParserState} ParserState */
/** @typedef {import("../Parser").PreparsedAst} PreparsedAst */
/** @typedef {{declaredScope: ScopeInfo, freeName: string | true, tagInfo: TagInfo | undefined}} VariableInfoInterface */
/** @typedef {{ name: string | VariableInfo, rootInfo: string | VariableInfo, getMembers: () => string[], getMembersOptions: () => boolean[] }} GetInfoResult */
/** @typedef {{ name: string | VariableInfo, rootInfo: string | VariableInfo, getMembers: () => string[], getMembersOptionals: () => boolean[] }} GetInfoResult */
const EMPTY_ARRAY = [];
const ALLOWED_MEMBER_TYPES_CALL_EXPRESSION = 0b01;
@ -264,7 +264,7 @@ class JavascriptParser extends Parser {
/** Something like "a.b()" */
/** @type {HookMap<SyncBailHook<[CallExpressionNode, string[], boolean[]], boolean | void>>} */
callMemberChain: new HookMap(
() => new SyncBailHook(["expression", "members", "membersOptions"])
() => new SyncBailHook(["expression", "members", "membersOptionals"])
),
/** Something like "a.b().c.d" */
/** @type {HookMap<SyncBailHook<[ExpressionNode, string[], CallExpressionNode, string[]], boolean | void>>} */
@ -296,7 +296,7 @@ class JavascriptParser extends Parser {
expression: new HookMap(() => new SyncBailHook(["expression"])),
/** @type {HookMap<SyncBailHook<[ExpressionNode, string[], boolean[]], boolean | void>>} */
expressionMemberChain: new HookMap(
() => new SyncBailHook(["expression", "members", "membersOptions"])
() => new SyncBailHook(["expression", "members", "membersOptionals"])
),
/** @type {HookMap<SyncBailHook<[ExpressionNode, string[]], boolean | void>>} */
unhandledExpressionMemberChain: new HookMap(
@ -984,7 +984,7 @@ class JavascriptParser extends Parser {
info.name,
info.rootInfo,
info.getMembers,
info.getMembersOptions
info.getMembersOptionals
)
.setRange(expr.range);
}
@ -1006,7 +1006,7 @@ class JavascriptParser extends Parser {
name: info,
rootInfo: info,
getMembers: () => [],
getMembersOptions: () => []
getMembersOptionals: () => []
};
}
});
@ -1020,7 +1020,7 @@ class JavascriptParser extends Parser {
name: info,
rootInfo: info,
getMembers: () => [],
getMembersOptions: () => []
getMembersOptionals: () => []
};
}
});
@ -2743,8 +2743,8 @@ class JavascriptParser extends Parser {
callee.rootInfo,
expression,
callee.getMembers(),
callee.getMembersOptions
? callee.getMembersOptions()
callee.getMembersOptionals
? callee.getMembersOptionals()
: callee.getMembers().map(() => false)
);
if (result1 === true) return;
@ -2785,13 +2785,13 @@ class JavascriptParser extends Parser {
);
if (result1 === true) return;
const members = exprInfo.getMembers();
const membersOptions = exprInfo.getMembersOptions();
const membersOptionals = exprInfo.getMembersOptionals();
const result2 = this.callHooksForInfo(
this.hooks.expressionMemberChain,
exprInfo.rootInfo,
expression,
members,
membersOptions
membersOptionals
);
if (result2 === true) return;
this.walkMemberExpressionWithExpressionName(
@ -3629,13 +3629,13 @@ class JavascriptParser extends Parser {
/**
* @param {MemberExpressionNode} expression a member expression
* @returns {{ members: string[], object: ExpressionNode | SuperNode, membersOptions: boolean[] }} member names (reverse order) and remaining object
* @returns {{ members: string[], object: ExpressionNode | SuperNode, membersOptionals: boolean[] }} member names (reverse order) and remaining object
*/
extractMemberExpressionChain(expression) {
/** @type {AnyNode} */
let expr = expression;
const members = [];
const membersOptions = [];
const membersOptionals = [];
while (expr.type === "MemberExpression") {
if (expr.computed) {
if (expr.property.type !== "Literal") break;
@ -3644,13 +3644,13 @@ class JavascriptParser extends Parser {
if (expr.property.type !== "Identifier") break;
members.push(expr.property.name);
}
membersOptions.push(expr.optional);
membersOptionals.push(expr.optional);
expr = expr.object;
}
return {
members,
membersOptions,
membersOptionals,
object: expr
};
}
@ -3673,8 +3673,8 @@ class JavascriptParser extends Parser {
return { info, name };
}
/** @typedef {{ type: "call", call: CallExpressionNode, calleeName: string, rootInfo: string | VariableInfo, getCalleeMembers: () => string[], name: string, getMembers: () => string[], getMembersOptions: () => boolean[]}} CallExpressionInfo */
/** @typedef {{ type: "expression", rootInfo: string | VariableInfo, name: string, getMembers: () => string[], getMembersOptions: () => boolean[]}} ExpressionExpressionInfo */
/** @typedef {{ type: "call", call: CallExpressionNode, calleeName: string, rootInfo: string | VariableInfo, getCalleeMembers: () => string[], name: string, getMembers: () => string[], getMembersOptionals: () => boolean[]}} CallExpressionInfo */
/** @typedef {{ type: "expression", rootInfo: string | VariableInfo, name: string, getMembers: () => string[], getMembersOptionals: () => boolean[]}} ExpressionExpressionInfo */
/**
* @param {MemberExpressionNode} expression a member expression
@ -3682,7 +3682,7 @@ class JavascriptParser extends Parser {
* @returns {CallExpressionInfo | ExpressionExpressionInfo | undefined} expression info
*/
getMemberExpressionInfo(expression, allowedTypes) {
const { object, members, membersOptions } =
const { object, members, membersOptionals } =
this.extractMemberExpressionChain(expression);
switch (object.type) {
case "CallExpression": {
@ -3708,7 +3708,7 @@ class JavascriptParser extends Parser {
getCalleeMembers: memoize(() => rootMembers.reverse()),
name: objectAndMembersToName(`${calleeName}()`, members),
getMembers: memoize(() => members.reverse()),
getMembersOptions: memoize(() => membersOptions.reverse())
getMembersOptionals: memoize(() => membersOptionals.reverse())
};
}
case "Identifier":
@ -3727,7 +3727,7 @@ class JavascriptParser extends Parser {
name: objectAndMembersToName(resolvedRoot, members),
rootInfo,
getMembers: memoize(() => members.reverse()),
getMembersOptions: memoize(() => membersOptions.reverse())
getMembersOptionals: memoize(() => membersOptionals.reverse())
};
}
}

10
types.d.ts vendored
View File

@ -475,7 +475,7 @@ declare abstract class BasicEvaluatedExpression {
identifier?: string;
rootInfo: VariableInfoInterface;
getMembers: () => string[];
getMembersOptions: () => boolean[];
getMembersOptionals: () => boolean[];
expression: NodeEstreeIndex;
isUnknown(): boolean;
isNull(): boolean;
@ -528,7 +528,7 @@ declare abstract class BasicEvaluatedExpression {
identifier?: any,
rootInfo?: any,
getMembers?: any,
getMembersOptions?: any
getMembersOptionals?: any
): BasicEvaluatedExpression;
setWrapped(
prefix?: any,
@ -681,7 +681,7 @@ declare interface CallExpressionInfo {
getCalleeMembers: () => string[];
name: string;
getMembers: () => string[];
getMembersOptions: () => boolean[];
getMembersOptionals: () => boolean[];
}
declare interface CallbackAsyncQueue<T> {
(err?: null | WebpackError, result?: T): any;
@ -3805,7 +3805,7 @@ declare interface ExpressionExpressionInfo {
rootInfo: string | VariableInfo;
name: string;
getMembers: () => string[];
getMembersOptions: () => boolean[];
getMembersOptionals: () => boolean[];
}
type ExternalItem =
| string
@ -5391,7 +5391,7 @@ declare class JavascriptParser extends Parser {
| ImportExpression
| ChainExpression
| Super;
membersOptions: boolean[];
membersOptionals: boolean[];
};
getFreeInfoFromVariable(varName: string): {
name: string;