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