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 };
|
---|