@@ -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" ;
@@ -1061,7 +1089,7 @@ module.exports = function(ast, extra) {
1061
1089
} else { // class
1062
1090
1063
1091
/**
1064
- * Unlinke in object literal methods, class method params can have decorators
1092
+ * Unlike in object literal methods, class method params can have decorators
1065
1093
*/
1066
1094
method . params = node . parameters . map ( function ( param ) {
1067
1095
var convertedParam = convertChild ( param ) ;
@@ -1380,7 +1408,11 @@ module.exports = function(ast, extra) {
1380
1408
right : convertChild ( node . initializer )
1381
1409
} ) ;
1382
1410
} else {
1383
- return convert ( node . name , parent ) ;
1411
+ var convertedParameter = convert ( node . name , parent ) ;
1412
+ if ( node . type ) {
1413
+ convertedParameter . typeAnnotation = convertTypeAnnotation ( node . type ) ;
1414
+ }
1415
+ return convertedParameter ;
1384
1416
}
1385
1417
1386
1418
break ;
@@ -1626,12 +1658,24 @@ module.exports = function(ast, extra) {
1626
1658
break ;
1627
1659
1628
1660
case SyntaxKind . PropertyAccessExpression :
1629
- assign ( result , {
1630
- type : "MemberExpression" ,
1631
- object : convertChild ( node . expression ) ,
1632
- property : convertChild ( node . name ) ,
1633
- computed : false
1634
- } ) ;
1661
+ if ( isJSXToken ( parent ) ) {
1662
+ var jsxMemberExpression = {
1663
+ type : "MemberExpression" ,
1664
+ object : convertChild ( node . expression ) ,
1665
+ property : convertChild ( node . name )
1666
+ } ;
1667
+ var isNestedMemberExpression = ( node . expression . kind === SyntaxKind . PropertyAccessExpression ) ;
1668
+ jsxMemberExpression . object . type = ( isNestedMemberExpression ) ? "MemberExpression" : "JSXIdentifier" ;
1669
+ jsxMemberExpression . property . type = "JSXIdentifier" ;
1670
+ assign ( result , jsxMemberExpression ) ;
1671
+ } else {
1672
+ assign ( result , {
1673
+ type : "MemberExpression" ,
1674
+ object : convertChild ( node . expression ) ,
1675
+ property : convertChild ( node . name ) ,
1676
+ computed : false
1677
+ } ) ;
1678
+ }
1635
1679
break ;
1636
1680
1637
1681
case SyntaxKind . ElementAccessExpression :
0 commit comments