119 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| var t = require("@babel/types");
 | |
| var convertComments = require("./convertComments");
 | |
| 
 | |
| module.exports = function(ast, traverse, code) {
 | |
|   var state = { source: code };
 | |
| 
 | |
|   // Monkey patch visitor keys in order to be able to traverse the estree nodes
 | |
|   t.VISITOR_KEYS.Property = t.VISITOR_KEYS.ObjectProperty;
 | |
|   t.VISITOR_KEYS.MethodDefinition = [
 | |
|     "key",
 | |
|     "value",
 | |
|     "decorators",
 | |
|     "returnType",
 | |
|     "typeParameters",
 | |
|   ];
 | |
| 
 | |
|   traverse(ast, astTransformVisitor, null, state);
 | |
| 
 | |
|   delete t.VISITOR_KEYS.Property;
 | |
|   delete t.VISITOR_KEYS.MethodDefinition;
 | |
| };
 | |
| 
 | |
| var astTransformVisitor = {
 | |
|   noScope: true,
 | |
|   enter(path) {
 | |
|     var node = path.node;
 | |
| 
 | |
|     // private var to track original node type
 | |
|     node._babelType = node.type;
 | |
| 
 | |
|     if (node.innerComments) {
 | |
|       node.trailingComments = node.innerComments;
 | |
|       delete node.innerComments;
 | |
|     }
 | |
| 
 | |
|     if (node.trailingComments) {
 | |
|       convertComments(node.trailingComments);
 | |
|     }
 | |
| 
 | |
|     if (node.leadingComments) {
 | |
|       convertComments(node.leadingComments);
 | |
|     }
 | |
|   },
 | |
|   exit(path) {
 | |
|     var node = path.node;
 | |
| 
 | |
|     if (path.isJSXText()) {
 | |
|       node.type = "Literal";
 | |
|     }
 | |
| 
 | |
|     if (
 | |
|       path.isRestElement() &&
 | |
|       path.parent &&
 | |
|       path.parent.type === "ObjectPattern"
 | |
|     ) {
 | |
|       node.type = "ExperimentalRestProperty";
 | |
|     }
 | |
| 
 | |
|     if (
 | |
|       path.isSpreadElement() &&
 | |
|       path.parent &&
 | |
|       path.parent.type === "ObjectExpression"
 | |
|     ) {
 | |
|       node.type = "ExperimentalSpreadProperty";
 | |
|     }
 | |
| 
 | |
|     if (path.isTypeParameter()) {
 | |
|       node.type = "Identifier";
 | |
|       node.typeAnnotation = node.bound;
 | |
|       delete node.bound;
 | |
|     }
 | |
| 
 | |
|     // flow: prevent "no-undef"
 | |
|     // for "Component" in: "let x: React.Component"
 | |
|     if (path.isQualifiedTypeIdentifier()) {
 | |
|       delete node.id;
 | |
|     }
 | |
|     // for "b" in: "var a: { b: Foo }"
 | |
|     if (path.isObjectTypeProperty()) {
 | |
|       delete node.key;
 | |
|     }
 | |
|     // for "indexer" in: "var a: {[indexer: string]: number}"
 | |
|     if (path.isObjectTypeIndexer()) {
 | |
|       delete node.id;
 | |
|     }
 | |
|     // for "param" in: "var a: { func(param: Foo): Bar };"
 | |
|     if (path.isFunctionTypeParam()) {
 | |
|       delete node.name;
 | |
|     }
 | |
| 
 | |
|     // modules
 | |
| 
 | |
|     if (path.isImportDeclaration()) {
 | |
|       delete node.isType;
 | |
|     }
 | |
| 
 | |
|     // template string range fixes
 | |
|     if (path.isTemplateLiteral()) {
 | |
|       for (var j = 0; j < node.quasis.length; j++) {
 | |
|         var q = node.quasis[j];
 | |
|         q.range[0] -= 1;
 | |
|         if (q.tail) {
 | |
|           q.range[1] += 1;
 | |
|         } else {
 | |
|           q.range[1] += 2;
 | |
|         }
 | |
|         q.loc.start.column -= 1;
 | |
|         if (q.tail) {
 | |
|           q.loc.end.column += 1;
 | |
|         } else {
 | |
|           q.loc.end.column += 2;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   },
 | |
| };
 | 
