summaryrefslogtreecommitdiff
path: root/node_modules/@babel/plugin-transform-block-scoping/lib/validation.js
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:31:11 +0800
committerlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:31:11 +0800
commitaa773172311dcada759dfbaac485f4bc6e00bc21 (patch)
treeca6d9a5eff3ab8f689f9acb4f0df791d9486813d /node_modules/@babel/plugin-transform-block-scoping/lib/validation.js
parentc5a5384e846f242e901e859fe600d695d8990a9a (diff)
added babel
Diffstat (limited to 'node_modules/@babel/plugin-transform-block-scoping/lib/validation.js')
-rw-r--r--node_modules/@babel/plugin-transform-block-scoping/lib/validation.js133
1 files changed, 133 insertions, 0 deletions
diff --git a/node_modules/@babel/plugin-transform-block-scoping/lib/validation.js b/node_modules/@babel/plugin-transform-block-scoping/lib/validation.js
new file mode 100644
index 00000000..3985a42b
--- /dev/null
+++ b/node_modules/@babel/plugin-transform-block-scoping/lib/validation.js
@@ -0,0 +1,133 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.validateUsage = validateUsage;
+var _core = require("@babel/core");
+function validateUsage(path, state, tdzEnabled) {
+ const dynamicTDZNames = [];
+ for (const name of Object.keys(path.getBindingIdentifiers())) {
+ const binding = path.scope.getBinding(name);
+ if (!binding) continue;
+ if (tdzEnabled) {
+ if (injectTDZChecks(binding, state)) dynamicTDZNames.push(name);
+ }
+ if (path.node.kind === "const") {
+ disallowConstantViolations(name, binding, state);
+ }
+ }
+ return dynamicTDZNames;
+}
+function disallowConstantViolations(name, binding, state) {
+ for (const violation of binding.constantViolations) {
+ const readOnlyError = state.addHelper("readOnlyError");
+ const throwNode = _core.types.callExpression(readOnlyError, [_core.types.stringLiteral(name)]);
+ if (violation.isAssignmentExpression()) {
+ const {
+ operator,
+ left,
+ right
+ } = violation.node;
+ if (operator === "=") {
+ const exprs = [right];
+ exprs.push(throwNode);
+ violation.replaceWith(_core.types.sequenceExpression(exprs));
+ } else if (["&&=", "||=", "??="].includes(operator)) {
+ violation.replaceWith(_core.types.logicalExpression(operator.slice(0, -1), left, _core.types.sequenceExpression([right, throwNode])));
+ } else {
+ violation.replaceWith(_core.types.sequenceExpression([_core.types.binaryExpression(operator.slice(0, -1), left, right), throwNode]));
+ }
+ } else if (violation.isUpdateExpression()) {
+ violation.replaceWith(_core.types.sequenceExpression([_core.types.unaryExpression("+", violation.get("argument").node), throwNode]));
+ } else if (violation.isForXStatement()) {
+ violation.ensureBlock();
+ violation.get("left").replaceWith(_core.types.variableDeclaration("var", [_core.types.variableDeclarator(violation.scope.generateUidIdentifier(name))]));
+ violation.node.body.body.unshift(_core.types.expressionStatement(throwNode));
+ }
+ }
+}
+function getTDZStatus(refPath, bindingPath) {
+ const executionStatus = bindingPath._guessExecutionStatusRelativeTo(refPath);
+ if (executionStatus === "before") {
+ return "outside";
+ } else if (executionStatus === "after") {
+ return "inside";
+ } else {
+ return "maybe";
+ }
+}
+const skipTDZChecks = new WeakSet();
+function buildTDZAssert(status, node, state) {
+ if (status === "maybe") {
+ const clone = _core.types.cloneNode(node);
+ skipTDZChecks.add(clone);
+ return _core.types.callExpression(state.addHelper("temporalRef"), [clone, _core.types.stringLiteral(node.name)]);
+ } else {
+ return _core.types.callExpression(state.addHelper("tdz"), [_core.types.stringLiteral(node.name)]);
+ }
+}
+function getTDZReplacement(path, state, id = path.node) {
+ var _path$scope$getBindin;
+ if (skipTDZChecks.has(id)) return;
+ skipTDZChecks.add(id);
+ const bindingPath = (_path$scope$getBindin = path.scope.getBinding(id.name)) == null ? void 0 : _path$scope$getBindin.path;
+ if (!bindingPath || bindingPath.isFunctionDeclaration()) return;
+ const status = getTDZStatus(path, bindingPath);
+ if (status === "outside") return;
+ if (status === "maybe") {
+ bindingPath.parent._tdzThis = true;
+ }
+ return {
+ status,
+ node: buildTDZAssert(status, id, state)
+ };
+}
+function injectTDZChecks(binding, state) {
+ const allUsages = new Set(binding.referencePaths);
+ binding.constantViolations.forEach(allUsages.add, allUsages);
+ let dynamicTdz = false;
+ for (const path of binding.constantViolations) {
+ const {
+ node
+ } = path;
+ if (skipTDZChecks.has(node)) continue;
+ skipTDZChecks.add(node);
+ if (path.isUpdateExpression()) {
+ const arg = path.get("argument");
+ const replacement = getTDZReplacement(path, state, arg.node);
+ if (!replacement) continue;
+ if (replacement.status === "maybe") {
+ dynamicTdz = true;
+ path.insertBefore(replacement.node);
+ } else {
+ path.replaceWith(replacement.node);
+ }
+ } else if (path.isAssignmentExpression()) {
+ const nodes = [];
+ const ids = path.getBindingIdentifiers();
+ for (const name of Object.keys(ids)) {
+ const replacement = getTDZReplacement(path, state, ids[name]);
+ if (replacement) {
+ nodes.push(_core.types.expressionStatement(replacement.node));
+ if (replacement.status === "inside") break;
+ if (replacement.status === "maybe") dynamicTdz = true;
+ }
+ }
+ if (nodes.length > 0) path.insertBefore(nodes);
+ }
+ }
+ for (const path of binding.referencePaths) {
+ if (path.parentPath.isUpdateExpression()) continue;
+ if (path.parentPath.isFor({
+ left: path.node
+ })) continue;
+ const replacement = getTDZReplacement(path, state);
+ if (!replacement) continue;
+ if (replacement.status === "maybe") dynamicTdz = true;
+ path.replaceWith(replacement.node);
+ }
+ return dynamicTdz;
+}
+
+//# sourceMappingURL=validation.js.map