Skip to content
This repository was archived by the owner on Jan 19, 2019. It is now read-only.

Commit a355bc7

Browse files
JamesHenrynzakas
authored andcommitted
Breaking: Update JSX tagName conversion for TS 2 (refs #105) (#108)
1 parent 37662b2 commit a355bc7

File tree

1 file changed

+52
-12
lines changed

1 file changed

+52
-12
lines changed

lib/ast-converter.js

+52-12
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,34 @@ function fixExports(node, result, ast) {
244244
return result;
245245
}
246246

247+
/**
248+
* Returns true if a given TSNode is a JSX token
249+
* @param {TSNode} node TSNode to be checked
250+
* @returns {boolean} is a JSX token
251+
*/
252+
function isJSXToken(node) {
253+
return (
254+
node.kind >= SyntaxKind.JsxElement
255+
&& node.kind <= SyntaxKind.JsxAttribute
256+
);
257+
}
258+
259+
/**
260+
* Returns true if a given TSNode has a JSX token within its hierarchy
261+
* @param {TSNode} node TSNode to be checked
262+
* @returns {boolean} has JSX ancestor
263+
*/
264+
function hasJSXAncestor(node) {
265+
while (node) {
266+
if (isJSXToken(node)) {
267+
return true;
268+
}
269+
node = node.parent;
270+
}
271+
return false;
272+
}
273+
274+
247275
/**
248276
* Extends and formats a given error object
249277
* @param {Object} error the error object
@@ -331,12 +359,12 @@ function getTokenType(token) {
331359

332360
// Some JSX tokens have to be determined based on their parent
333361
if (token.parent) {
334-
if (token.kind === SyntaxKind.Identifier && token.parent.kind === SyntaxKind.FirstNode) {
362+
if (token.kind === SyntaxKind.Identifier && token.parent.kind === SyntaxKind.PropertyAccessExpression && hasJSXAncestor(token)) {
335363
return "JSXIdentifier";
336364
}
337365

338-
if (token.parent.kind >= SyntaxKind.JsxElement && token.parent.kind <= SyntaxKind.JsxAttribute) {
339-
if (token.kind === SyntaxKind.FirstNode) {
366+
if (isJSXToken(token.parent)) {
367+
if (token.kind === SyntaxKind.PropertyAccessExpression) {
340368
return "JSXMemberExpression";
341369
}
342370

@@ -616,12 +644,12 @@ module.exports = function(ast, extra) {
616644

617645
if (tagNameToken.type === "JSXMemberExpression") {
618646

619-
var isNestedMemberExpression = (node.tagName.left.kind === SyntaxKind.FirstNode);
647+
var isNestedMemberExpression = (node.tagName.expression.kind === SyntaxKind.PropertyAccessExpression);
620648

621649
// Convert TSNode left and right objects into ESTreeNode object
622650
// and property objects
623-
tagNameToken.object = convertChild(node.tagName.left);
624-
tagNameToken.property = convertChild(node.tagName.right);
651+
tagNameToken.object = convertChild(node.tagName.expression);
652+
tagNameToken.property = convertChild(node.tagName.name);
625653

626654
// Assign the appropriate types
627655
tagNameToken.object.type = (isNestedMemberExpression) ? "JSXMemberExpression" : "JSXIdentifier";
@@ -1626,12 +1654,24 @@ module.exports = function(ast, extra) {
16261654
break;
16271655

16281656
case SyntaxKind.PropertyAccessExpression:
1629-
assign(result, {
1630-
type: "MemberExpression",
1631-
object: convertChild(node.expression),
1632-
property: convertChild(node.name),
1633-
computed: false
1634-
});
1657+
if (isJSXToken(parent)) {
1658+
var jsxMemberExpression = {
1659+
type: "MemberExpression",
1660+
object: convertChild(node.expression),
1661+
property: convertChild(node.name)
1662+
};
1663+
var isNestedMemberExpression = (node.expression.kind === SyntaxKind.PropertyAccessExpression);
1664+
jsxMemberExpression.object.type = (isNestedMemberExpression) ? "MemberExpression" : "JSXIdentifier";
1665+
jsxMemberExpression.property.type = "JSXIdentifier";
1666+
assign(result, jsxMemberExpression);
1667+
} else {
1668+
assign(result, {
1669+
type: "MemberExpression",
1670+
object: convertChild(node.expression),
1671+
property: convertChild(node.name),
1672+
computed: false
1673+
});
1674+
}
16351675
break;
16361676

16371677
case SyntaxKind.ElementAccessExpression:

0 commit comments

Comments
 (0)