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

Commit f4856f9

Browse files
authored
Fix: Class implements conversion (fixes #39) (#43)
1 parent 795a418 commit f4856f9

33 files changed

+392
-32
lines changed

lib/ast-converter.js

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,22 @@ module.exports = function(ast, extra) {
447447
};
448448
}
449449

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+
450466
/**
451467
* For nodes that are copied directly from the TypeScript AST into
452468
* ESTree mostly as-is. The only difference is the addition of a type
@@ -1171,12 +1187,22 @@ module.exports = function(ast, extra) {
11711187

11721188
case SyntaxKind.ClassDeclaration:
11731189
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;
11751192
if (!lastClassToken) { // no name
11761193
lastClassToken = node.getFirstToken();
11771194
}
11781195

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;
11801206

11811207
assign(result, {
11821208
type: SyntaxKind[node.kind],
@@ -1189,7 +1215,8 @@ module.exports = function(ast, extra) {
11891215
range: [ openBrace.getStart(), result.range[1] ],
11901216
loc: getLocFor(openBrace.getStart(), node.end, ast)
11911217
},
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) : []
11931220
});
11941221

11951222
var filteredMembers = node.members.filter(isESTreeClassMember);

tests/fixtures/ecma-features/classes/class-accessor-properties.result.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ module.exports = {
5050
"name": "A"
5151
},
5252
"superClass": null,
53+
"implements": [],
5354
"body": {
5455
"type": "ClassBody",
5556
"loc": {
@@ -606,4 +607,4 @@ module.exports = {
606607
]
607608
}
608609
]
609-
};
610+
};

tests/fixtures/ecma-features/classes/class-computed-static-method.result.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ module.exports = {
5050
"name": "A"
5151
},
5252
"superClass": null,
53+
"implements": [],
5354
"body": {
5455
"type": "ClassBody",
5556
"loc": {
@@ -420,4 +421,4 @@ module.exports = {
420421
]
421422
}
422423
]
423-
};
424+
};

tests/fixtures/ecma-features/classes/class-expression.result.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ module.exports = {
4949
],
5050
"id": null,
5151
"superClass": null,
52+
"implements": [],
5253
"body": {
5354
"type": "ClassBody",
5455
"loc": {
@@ -181,4 +182,4 @@ module.exports = {
181182
]
182183
}
183184
]
184-
};
185+
};

tests/fixtures/ecma-features/classes/class-method-named-prototype.result.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ module.exports = {
5050
"name": "A"
5151
},
5252
"superClass": null,
53+
"implements": [],
5354
"body": {
5455
"type": "ClassBody",
5556
"loc": {
@@ -348,4 +349,4 @@ module.exports = {
348349
]
349350
}
350351
]
351-
};
352+
};

tests/fixtures/ecma-features/classes/class-method-named-static.result.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ module.exports = {
5050
"name": "A"
5151
},
5252
"superClass": null,
53+
"implements": [],
5354
"body": {
5455
"type": "ClassBody",
5556
"loc": {
@@ -366,4 +367,4 @@ module.exports = {
366367
]
367368
}
368369
]
369-
};
370+
};

tests/fixtures/ecma-features/classes/class-one-method-super.result.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ module.exports = {
5050
"name": "A"
5151
},
5252
"superClass": null,
53+
"implements": [],
5354
"body": {
5455
"type": "ClassBody",
5556
"loc": {
@@ -473,4 +474,4 @@ module.exports = {
473474
]
474475
}
475476
]
476-
};
477+
};

tests/fixtures/ecma-features/classes/class-one-method.result.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ module.exports = {
5050
"name": "A"
5151
},
5252
"superClass": null,
53+
"implements": [],
5354
"body": {
5455
"type": "ClassBody",
5556
"loc": {
@@ -348,4 +349,4 @@ module.exports = {
348349
]
349350
}
350351
]
351-
};
352+
};

tests/fixtures/ecma-features/classes/class-static-method-named-prototype.result.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ module.exports = {
5050
"name": "A"
5151
},
5252
"superClass": null,
53+
"implements": [],
5354
"body": {
5455
"type": "ClassBody",
5556
"loc": {
@@ -403,4 +404,4 @@ module.exports = {
403404
]
404405
}
405406
]
406-
};
407+
};

tests/fixtures/ecma-features/classes/class-static-method-named-static.result.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ module.exports = {
5050
"name": "A"
5151
},
5252
"superClass": null,
53+
"implements": [],
5354
"body": {
5455
"type": "ClassBody",
5556
"loc": {
@@ -384,4 +385,4 @@ module.exports = {
384385
]
385386
}
386387
]
387-
};
388+
};

0 commit comments

Comments
 (0)