You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							54 lines
						
					
					
						
							2.1 KiB
						
					
					
				
			
		
		
	
	
							54 lines
						
					
					
						
							2.1 KiB
						
					
					
				| import {
 | |
|     AST_Binary,
 | |
|     AST_Conditional,
 | |
|     AST_Chain,
 | |
|     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_Chain && 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_Chain) 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 };
 |