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.
		
		
		
		
		
			
		
			
				
					58 lines
				
				1.2 KiB
			
		
		
			
		
	
	
					58 lines
				
				1.2 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.default = hoistVariables; | ||
|  | 
 | ||
|  | var _t = require("@babel/types"); | ||
|  | 
 | ||
|  | const { | ||
|  |   assignmentExpression, | ||
|  |   expressionStatement, | ||
|  |   identifier | ||
|  | } = _t; | ||
|  | const visitor = { | ||
|  |   Scope(path, state) { | ||
|  |     if (state.kind === "let") path.skip(); | ||
|  |   }, | ||
|  | 
 | ||
|  |   FunctionParent(path) { | ||
|  |     path.skip(); | ||
|  |   }, | ||
|  | 
 | ||
|  |   VariableDeclaration(path, state) { | ||
|  |     if (state.kind && path.node.kind !== state.kind) return; | ||
|  |     const nodes = []; | ||
|  |     const declarations = path.get("declarations"); | ||
|  |     let firstId; | ||
|  | 
 | ||
|  |     for (const declar of declarations) { | ||
|  |       firstId = declar.node.id; | ||
|  | 
 | ||
|  |       if (declar.node.init) { | ||
|  |         nodes.push(expressionStatement(assignmentExpression("=", declar.node.id, declar.node.init))); | ||
|  |       } | ||
|  | 
 | ||
|  |       for (const name of Object.keys(declar.getBindingIdentifiers())) { | ||
|  |         state.emit(identifier(name), name, declar.node.init !== null); | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     if (path.parentPath.isFor({ | ||
|  |       left: path.node | ||
|  |     })) { | ||
|  |       path.replaceWith(firstId); | ||
|  |     } else { | ||
|  |       path.replaceWithMultiple(nodes); | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | function hoistVariables(path, emit, kind = "var") { | ||
|  |   path.traverse(visitor, { | ||
|  |     kind, | ||
|  |     emit | ||
|  |   }); | ||
|  | } |