@@ -447,6 +447,22 @@ module.exports = function(ast, extra) {
447
447
} ;
448
448
}
449
449
450
+ /**
451
+ * Converts a child into a class implements node. This creates an intermediary
452
+ * ClassImplements node to match what Flow does.
453
+ * @param {TSNode } child The TypeScript AST node to convert.
454
+ * @returns {ESTreeNode } The type annotation node.
455
+ */
456
+ function convertClassImplements ( child ) {
457
+ var id = convertChild ( child . expression ) ;
458
+ return {
459
+ type : "ClassImplements" ,
460
+ loc : id . loc ,
461
+ range : id . range ,
462
+ id : id
463
+ } ;
464
+ }
465
+
450
466
/**
451
467
* For nodes that are copied directly from the TypeScript AST into
452
468
* ESTree mostly as-is. The only difference is the addition of a type
@@ -1171,12 +1187,22 @@ module.exports = function(ast, extra) {
1171
1187
1172
1188
case SyntaxKind . ClassDeclaration :
1173
1189
case SyntaxKind . ClassExpression :
1174
- var lastClassToken = node . heritageClauses ? node . heritageClauses [ node . heritageClauses . length - 1 ] : node . name ;
1190
+ var heritageClauses = node . heritageClauses || [ ] ;
1191
+ var lastClassToken = heritageClauses . length ? heritageClauses [ heritageClauses . length - 1 ] : node . name ;
1175
1192
if ( ! lastClassToken ) { // no name
1176
1193
lastClassToken = node . getFirstToken ( ) ;
1177
1194
}
1178
1195
1179
- var openBrace = ts . findNextToken ( lastClassToken , ast ) ;
1196
+ var openBrace = ts . findNextToken ( lastClassToken , ast ) ,
1197
+ hasExtends = ( heritageClauses . length && node . heritageClauses [ 0 ] . token === SyntaxKind . ExtendsKeyword ) ,
1198
+ superClass ,
1199
+ hasImplements = false ;
1200
+
1201
+ if ( hasExtends ) {
1202
+ superClass = heritageClauses . shift ( ) ;
1203
+ }
1204
+
1205
+ hasImplements = heritageClauses . length > 0 ;
1180
1206
1181
1207
assign ( result , {
1182
1208
type : SyntaxKind [ node . kind ] ,
@@ -1189,7 +1215,8 @@ module.exports = function(ast, extra) {
1189
1215
range : [ openBrace . getStart ( ) , result . range [ 1 ] ] ,
1190
1216
loc : getLocFor ( openBrace . getStart ( ) , node . end , ast )
1191
1217
} ,
1192
- superClass : ( node . heritageClauses ? convertChild ( node . heritageClauses [ 0 ] . types [ 0 ] . expression ) : null )
1218
+ superClass : ( superClass ? convertChild ( superClass . types [ 0 ] . expression ) : null ) ,
1219
+ implements : hasImplements ? heritageClauses [ 0 ] . types . map ( convertClassImplements ) : [ ]
1193
1220
} ) ;
1194
1221
1195
1222
var filteredMembers = node . members . filter ( isESTreeClassMember ) ;
0 commit comments