source: imaps-frontend/node_modules/@babel/plugin-transform-block-scoping/lib/validation.js

main
Last change on this file was 79a0317, checked in by stefan toskovski <stefantoska84@…>, 4 days ago

F4 Finalna Verzija

  • Property mode set to 100644
File size: 4.9 KB
Line 
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.validateUsage = validateUsage;
7var _core = require("@babel/core");
8function validateUsage(path, state, tdzEnabled) {
9 const dynamicTDZNames = [];
10 for (const name of Object.keys(path.getBindingIdentifiers())) {
11 const binding = path.scope.getBinding(name);
12 if (!binding) continue;
13 if (tdzEnabled) {
14 if (injectTDZChecks(binding, state)) dynamicTDZNames.push(name);
15 }
16 if (path.node.kind === "const") {
17 disallowConstantViolations(name, binding, state);
18 }
19 }
20 return dynamicTDZNames;
21}
22function disallowConstantViolations(name, binding, state) {
23 for (const violation of binding.constantViolations) {
24 const readOnlyError = state.addHelper("readOnlyError");
25 const throwNode = _core.types.callExpression(readOnlyError, [_core.types.stringLiteral(name)]);
26 if (violation.isAssignmentExpression()) {
27 const {
28 operator,
29 left,
30 right
31 } = violation.node;
32 if (operator === "=") {
33 const exprs = [right];
34 exprs.push(throwNode);
35 violation.replaceWith(_core.types.sequenceExpression(exprs));
36 } else if (["&&=", "||=", "??="].includes(operator)) {
37 violation.replaceWith(_core.types.logicalExpression(operator.slice(0, -1), left, _core.types.sequenceExpression([right, throwNode])));
38 } else {
39 violation.replaceWith(_core.types.sequenceExpression([_core.types.binaryExpression(operator.slice(0, -1), left, right), throwNode]));
40 }
41 } else if (violation.isUpdateExpression()) {
42 violation.replaceWith(_core.types.sequenceExpression([_core.types.unaryExpression("+", violation.get("argument").node), throwNode]));
43 } else if (violation.isForXStatement()) {
44 violation.ensureBlock();
45 violation.get("left").replaceWith(_core.types.variableDeclaration("var", [_core.types.variableDeclarator(violation.scope.generateUidIdentifier(name))]));
46 violation.node.body.body.unshift(_core.types.expressionStatement(throwNode));
47 }
48 }
49}
50function getTDZStatus(refPath, bindingPath) {
51 const executionStatus = bindingPath._guessExecutionStatusRelativeTo(refPath);
52 if (executionStatus === "before") {
53 return "outside";
54 } else if (executionStatus === "after") {
55 return "inside";
56 } else {
57 return "maybe";
58 }
59}
60const skipTDZChecks = new WeakSet();
61function buildTDZAssert(status, node, state) {
62 if (status === "maybe") {
63 const clone = _core.types.cloneNode(node);
64 skipTDZChecks.add(clone);
65 return _core.types.callExpression(state.addHelper("temporalRef"), [clone, _core.types.stringLiteral(node.name)]);
66 } else {
67 return _core.types.callExpression(state.addHelper("tdz"), [_core.types.stringLiteral(node.name)]);
68 }
69}
70function getTDZReplacement(path, state, id = path.node) {
71 var _path$scope$getBindin;
72 if (skipTDZChecks.has(id)) return;
73 skipTDZChecks.add(id);
74 const bindingPath = (_path$scope$getBindin = path.scope.getBinding(id.name)) == null ? void 0 : _path$scope$getBindin.path;
75 if (!bindingPath || bindingPath.isFunctionDeclaration()) return;
76 const status = getTDZStatus(path, bindingPath);
77 if (status === "outside") return;
78 if (status === "maybe") {
79 bindingPath.parent._tdzThis = true;
80 }
81 return {
82 status,
83 node: buildTDZAssert(status, id, state)
84 };
85}
86function injectTDZChecks(binding, state) {
87 const allUsages = new Set(binding.referencePaths);
88 binding.constantViolations.forEach(allUsages.add, allUsages);
89 let dynamicTdz = false;
90 for (const path of binding.constantViolations) {
91 const {
92 node
93 } = path;
94 if (skipTDZChecks.has(node)) continue;
95 skipTDZChecks.add(node);
96 if (path.isUpdateExpression()) {
97 const arg = path.get("argument");
98 const replacement = getTDZReplacement(path, state, arg.node);
99 if (!replacement) continue;
100 if (replacement.status === "maybe") {
101 dynamicTdz = true;
102 path.insertBefore(replacement.node);
103 } else {
104 path.replaceWith(replacement.node);
105 }
106 } else if (path.isAssignmentExpression()) {
107 const nodes = [];
108 const ids = path.getBindingIdentifiers();
109 for (const name of Object.keys(ids)) {
110 const replacement = getTDZReplacement(path, state, ids[name]);
111 if (replacement) {
112 nodes.push(_core.types.expressionStatement(replacement.node));
113 if (replacement.status === "inside") break;
114 if (replacement.status === "maybe") dynamicTdz = true;
115 }
116 }
117 if (nodes.length > 0) path.insertBefore(nodes);
118 }
119 }
120 for (const path of binding.referencePaths) {
121 if (path.parentPath.isUpdateExpression()) continue;
122 if (path.parentPath.isFor({
123 left: path.node
124 })) continue;
125 const replacement = getTDZReplacement(path, state);
126 if (!replacement) continue;
127 if (replacement.status === "maybe") dynamicTdz = true;
128 path.replaceWith(replacement.node);
129 }
130 return dynamicTdz;
131}
132
133//# sourceMappingURL=validation.js.map
Note: See TracBrowser for help on using the repository browser.