From acd9379f34dac38ccdaa9529ce8f073401aef38a Mon Sep 17 00:00:00 2001 From: Pionxzh Date: Sat, 13 Jul 2024 23:42:52 +0800 Subject: [PATCH] fix(un-variable-merging): should not split varaible declration in for init that was actually used --- .../__tests__/un-variable-merging.spec.ts | 8 ++++++++ .../src/transformations/un-variable-merging.ts | 15 +++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/unminify/src/transformations/__tests__/un-variable-merging.spec.ts b/packages/unminify/src/transformations/__tests__/un-variable-merging.spec.ts index a74dd2fa..22c7a1c9 100644 --- a/packages/unminify/src/transformations/__tests__/un-variable-merging.spec.ts +++ b/packages/unminify/src/transformations/__tests__/un-variable-merging.spec.ts @@ -59,12 +59,20 @@ inlineTest('variable declaration that is not used in for statement should not be for (var i = 0, j = 0, k = 0; j < 10; k++) { console.log(k); } + +for (var _len = arguments.length, _arguments = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + _arguments[_key - 2] = arguments[_key]; +} `, ` var i = 0; for (var j = 0, k = 0; j < 10; k++) { console.log(k); } + +for (var _len = arguments.length, _arguments = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + _arguments[_key - 2] = arguments[_key]; +} `, ) diff --git a/packages/unminify/src/transformations/un-variable-merging.ts b/packages/unminify/src/transformations/un-variable-merging.ts index 16e67159..0a9702bf 100644 --- a/packages/unminify/src/transformations/un-variable-merging.ts +++ b/packages/unminify/src/transformations/un-variable-merging.ts @@ -1,5 +1,6 @@ import { mergeComments } from '@wakaru/ast-utils/comments' import { replaceWithMultipleStatements } from '@wakaru/ast-utils/insert' +import { findReferences } from '@wakaru/ast-utils/reference' import { createJSCodeshiftTransformationRule } from '@wakaru/shared/rule' import type { ASTTransformation } from '@wakaru/shared/rule' import type { ForStatement } from 'jscodeshift' @@ -32,23 +33,21 @@ export const transformAST: ASTTransformation = (context) => { .find(j.VariableDeclaration) .forEach((p) => { if (j.ForStatement.check(p.parent.node)) { - const { init, test, update } = p.parent.node as ForStatement + const { init } = p.parent.node as ForStatement if (init && j.VariableDeclaration.check(init) && init.kind === 'var') { const initDeclarators = init.declarations // filter out the declarations that are used in test or update - const usedDeclarators = initDeclarators.filter((d) => { - if (!j.VariableDeclarator.check(d)) return false + const usedDeclarators = initDeclarators.filter((declarator) => { + if (!j.VariableDeclarator.check(declarator)) return false - const { id } = d + const { id } = declarator if (!j.Identifier.check(id)) return false // check if the name is declared outside of the for statement if (p.parent?.parent?.scope.lookup(id.name)) return true - const name = id.name - const isUsedInTest = test && j(test).find(j.Identifier, { name }).size() > 0 - const isUsedInUpdate = update && j(update).find(j.Identifier, { name }).size() > 0 - if (isUsedInTest || isUsedInUpdate) return true + const isUsed = findReferences(j, p.parent, id.name).size() > 1 + if (isUsed) return true return false })