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
			| 
								 
											3 years ago
										 
									 | 
							
								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 };
							 |