diff options
Diffstat (limited to 'node_modules/@babel/helper-create-class-features-plugin/lib/misc.js')
| -rw-r--r-- | node_modules/@babel/helper-create-class-features-plugin/lib/misc.js | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/node_modules/@babel/helper-create-class-features-plugin/lib/misc.js b/node_modules/@babel/helper-create-class-features-plugin/lib/misc.js index 27b5a844..f11864b6 100644 --- a/node_modules/@babel/helper-create-class-features-plugin/lib/misc.js +++ b/node_modules/@babel/helper-create-class-features-plugin/lib/misc.js @@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.extractComputedKeys = extractComputedKeys; exports.injectInitialization = injectInitialization; +exports.memoiseComputedKey = memoiseComputedKey; var _core = require("@babel/core"); var _helperEnvironmentVisitor = require("@babel/helper-environment-visitor"); const findBareSupers = _core.traverse.visitors.merge([{ @@ -82,10 +83,32 @@ function injectInitialization(path, constructor, nodes, renamer, lastReturnsThis constructor.get("body").unshiftContainer("body", nodes); } } +function memoiseComputedKey(keyNode, scope, hint) { + const isUidReference = _core.types.isIdentifier(keyNode) && scope.hasUid(keyNode.name); + if (isUidReference) { + return; + } + const isMemoiseAssignment = _core.types.isAssignmentExpression(keyNode, { + operator: "=" + }) && _core.types.isIdentifier(keyNode.left) && scope.hasUid(keyNode.left.name); + if (isMemoiseAssignment) { + return _core.types.cloneNode(keyNode); + } else { + const ident = _core.types.identifier(hint); + scope.push({ + id: ident, + kind: "let" + }); + return _core.types.assignmentExpression("=", _core.types.cloneNode(ident), keyNode); + } +} function extractComputedKeys(path, computedPaths, file) { + const { + scope + } = path; const declarations = []; const state = { - classBinding: path.node.id && path.scope.getBinding(path.node.id.name), + classBinding: path.node.id && scope.getBinding(path.node.id.name), file }; for (const computedPath of computedPaths) { @@ -97,24 +120,10 @@ function extractComputedKeys(path, computedPaths, file) { } const computedNode = computedPath.node; if (!computedKey.isConstantExpression()) { - const scope = path.scope; - const isUidReference = _core.types.isIdentifier(computedKey.node) && scope.hasUid(computedKey.node.name); - const isMemoiseAssignment = computedKey.isAssignmentExpression({ - operator: "=" - }) && _core.types.isIdentifier(computedKey.node.left) && scope.hasUid(computedKey.node.left.name); - if (isUidReference) { - continue; - } else if (isMemoiseAssignment) { - declarations.push(_core.types.expressionStatement(_core.types.cloneNode(computedNode.key))); - computedNode.key = _core.types.cloneNode(computedNode.key.left); - } else { - const ident = path.scope.generateUidIdentifierBasedOnNode(computedNode.key); - scope.push({ - id: ident, - kind: "let" - }); - declarations.push(_core.types.expressionStatement(_core.types.assignmentExpression("=", _core.types.cloneNode(ident), computedNode.key))); - computedNode.key = _core.types.cloneNode(ident); + const assignment = memoiseComputedKey(computedKey.node, scope, scope.generateUidBasedOnNode(computedKey.node)); + if (assignment) { + declarations.push(_core.types.expressionStatement(assignment)); + computedNode.key = _core.types.cloneNode(assignment.left); } } } |
