@@ -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" ;
@@ -1061,7 +1089,7 @@ module.exports = function(ast, extra) {
10611089 } else { // class
10621090
10631091 /**
1064- * Unlinke in object literal methods, class method params can have decorators
1092+ * Unlike in object literal methods, class method params can have decorators
10651093 */
10661094 method . params = node . parameters . map ( function ( param ) {
10671095 var convertedParam = convertChild ( param ) ;
@@ -1380,7 +1408,11 @@ module.exports = function(ast, extra) {
13801408 right : convertChild ( node . initializer )
13811409 } ) ;
13821410 } 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 ;
13841416 }
13851417
13861418 break ;
@@ -1626,12 +1658,24 @@ module.exports = function(ast, extra) {
16261658 break ;
16271659
16281660 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+ }
16351679 break ;
16361680
16371681 case SyntaxKind . ElementAccessExpression :
0 commit comments