@@ -244,6 +244,34 @@ function fixExports(node, result, ast) {
244
244
return result ;
245
245
}
246
246
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
+
247
275
/**
248
276
* Extends and formats a given error object
249
277
* @param {Object } error the error object
@@ -331,12 +359,12 @@ function getTokenType(token) {
331
359
332
360
// Some JSX tokens have to be determined based on their parent
333
361
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 ) ) {
335
363
return "JSXIdentifier" ;
336
364
}
337
365
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 ) {
340
368
return "JSXMemberExpression" ;
341
369
}
342
370
@@ -616,12 +644,12 @@ module.exports = function(ast, extra) {
616
644
617
645
if ( tagNameToken . type === "JSXMemberExpression" ) {
618
646
619
- var isNestedMemberExpression = ( node . tagName . left . kind === SyntaxKind . FirstNode ) ;
647
+ var isNestedMemberExpression = ( node . tagName . expression . kind === SyntaxKind . PropertyAccessExpression ) ;
620
648
621
649
// Convert TSNode left and right objects into ESTreeNode object
622
650
// 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 ) ;
625
653
626
654
// Assign the appropriate types
627
655
tagNameToken . object . type = ( isNestedMemberExpression ) ? "JSXMemberExpression" : "JSXIdentifier" ;
@@ -1626,12 +1654,24 @@ module.exports = function(ast, extra) {
1626
1654
break ;
1627
1655
1628
1656
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
+ }
1635
1675
break ;
1636
1676
1637
1677
case SyntaxKind . ElementAccessExpression :
0 commit comments