[6a3a178] | 1 | import {
|
---|
| 2 | AST_Binary,
|
---|
| 3 | AST_Conditional,
|
---|
| 4 | AST_Dot,
|
---|
| 5 | AST_Object,
|
---|
| 6 | AST_Sequence,
|
---|
| 7 | AST_Statement,
|
---|
| 8 | AST_Sub,
|
---|
| 9 | AST_UnaryPostfix,
|
---|
| 10 | AST_PrefixedTemplateString
|
---|
| 11 | } from "../ast.js";
|
---|
| 12 |
|
---|
| 13 | // return true if the node at the top of the stack (that means the
|
---|
| 14 | // innermost node in the current output) is lexically the first in
|
---|
| 15 | // a statement.
|
---|
| 16 | function first_in_statement(stack) {
|
---|
| 17 | let node = stack.parent(-1);
|
---|
| 18 | for (let i = 0, p; p = stack.parent(i); i++) {
|
---|
| 19 | if (p instanceof AST_Statement && p.body === node)
|
---|
| 20 | return true;
|
---|
| 21 | if ((p instanceof AST_Sequence && p.expressions[0] === node) ||
|
---|
| 22 | (p.TYPE === "Call" && p.expression === node) ||
|
---|
| 23 | (p instanceof AST_PrefixedTemplateString && p.prefix === node) ||
|
---|
| 24 | (p instanceof AST_Dot && p.expression === node) ||
|
---|
| 25 | (p instanceof AST_Sub && p.expression === node) ||
|
---|
| 26 | (p instanceof AST_Conditional && p.condition === node) ||
|
---|
| 27 | (p instanceof AST_Binary && p.left === node) ||
|
---|
| 28 | (p instanceof AST_UnaryPostfix && p.expression === node)
|
---|
| 29 | ) {
|
---|
| 30 | node = p;
|
---|
| 31 | } else {
|
---|
| 32 | return false;
|
---|
| 33 | }
|
---|
| 34 | }
|
---|
| 35 | }
|
---|
| 36 |
|
---|
| 37 | // Returns whether the leftmost item in the expression is an object
|
---|
| 38 | function left_is_object(node) {
|
---|
| 39 | if (node instanceof AST_Object) return true;
|
---|
| 40 | if (node instanceof AST_Sequence) return left_is_object(node.expressions[0]);
|
---|
| 41 | if (node.TYPE === "Call") return left_is_object(node.expression);
|
---|
| 42 | if (node instanceof AST_PrefixedTemplateString) return left_is_object(node.prefix);
|
---|
| 43 | if (node instanceof AST_Dot || node instanceof AST_Sub) return left_is_object(node.expression);
|
---|
| 44 | if (node instanceof AST_Conditional) return left_is_object(node.condition);
|
---|
| 45 | if (node instanceof AST_Binary) return left_is_object(node.left);
|
---|
| 46 | if (node instanceof AST_UnaryPostfix) return left_is_object(node.expression);
|
---|
| 47 | return false;
|
---|
| 48 | }
|
---|
| 49 |
|
---|
| 50 | export { first_in_statement, left_is_object };
|
---|