summaryrefslogtreecommitdiff
path: root/src/node_modules/terser/lib/utils/first_in_statement.js
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2021-12-21 16:52:28 +0100
committerMinteck <contact@minteck.org>2021-12-21 16:52:28 +0100
commit46e43f4bde4a35785b4997b81e86cd19f046b69b (patch)
treec53c2f826f777f9d6b2d249dab556feb72a6c3a6 /src/node_modules/terser/lib/utils/first_in_statement.js
downloadlangdetect-46e43f4bde4a35785b4997b81e86cd19f046b69b.tar.gz
langdetect-46e43f4bde4a35785b4997b81e86cd19f046b69b.tar.bz2
langdetect-46e43f4bde4a35785b4997b81e86cd19f046b69b.zip
Commit
Diffstat (limited to 'src/node_modules/terser/lib/utils/first_in_statement.js')
-rw-r--r--src/node_modules/terser/lib/utils/first_in_statement.js50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/node_modules/terser/lib/utils/first_in_statement.js b/src/node_modules/terser/lib/utils/first_in_statement.js
new file mode 100644
index 0000000..19228b6
--- /dev/null
+++ b/src/node_modules/terser/lib/utils/first_in_statement.js
@@ -0,0 +1,50 @@
+import {
+ AST_Binary,
+ AST_Conditional,
+ AST_Dot,
+ AST_Object,
+ AST_Sequence,
+ AST_Statement,
+ AST_Sub,
+ AST_UnaryPostfix,
+ AST_PrefixedTemplateString
+} from "../ast.js";
+
+// return true if the node at the top of the stack (that means the
+// innermost node in the current output) is lexically the first in
+// a statement.
+function first_in_statement(stack) {
+ let node = stack.parent(-1);
+ for (let i = 0, p; p = stack.parent(i); i++) {
+ if (p instanceof AST_Statement && p.body === node)
+ return true;
+ if ((p instanceof AST_Sequence && p.expressions[0] === node) ||
+ (p.TYPE === "Call" && p.expression === node) ||
+ (p instanceof AST_PrefixedTemplateString && p.prefix === node) ||
+ (p instanceof AST_Dot && p.expression === node) ||
+ (p instanceof AST_Sub && p.expression === node) ||
+ (p instanceof AST_Conditional && p.condition === node) ||
+ (p instanceof AST_Binary && p.left === node) ||
+ (p instanceof AST_UnaryPostfix && p.expression === node)
+ ) {
+ node = p;
+ } else {
+ return false;
+ }
+ }
+}
+
+// Returns whether the leftmost item in the expression is an object
+function left_is_object(node) {
+ if (node instanceof AST_Object) return true;
+ if (node instanceof AST_Sequence) return left_is_object(node.expressions[0]);
+ if (node.TYPE === "Call") return left_is_object(node.expression);
+ if (node instanceof AST_PrefixedTemplateString) return left_is_object(node.prefix);
+ if (node instanceof AST_Dot || node instanceof AST_Sub) return left_is_object(node.expression);
+ if (node instanceof AST_Conditional) return left_is_object(node.condition);
+ if (node instanceof AST_Binary) return left_is_object(node.left);
+ if (node instanceof AST_UnaryPostfix) return left_is_object(node.expression);
+ return false;
+}
+
+export { first_in_statement, left_is_object };