Skip to content

Commit f4856f9

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

33 files changed

+392
-32
lines changed

lib/ast-converter.js

+30-3
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

+2-1
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

+2-1
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

+2-1
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

+2-1
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

+2-1
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

+2-1
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

+2-1
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

+2-1
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

+2-1
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+
};

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

+2-1
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+
};

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

+2-1
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": {
@@ -809,4 +810,4 @@ module.exports = {
809810
]
810811
}
811812
]
812-
};
813+
};

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

+2-1
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": {
@@ -641,4 +642,4 @@ module.exports = {
641642
]
642643
}
643644
]
644-
};
645+
};

tests/fixtures/ecma-features/classes/class-two-methods-computed-constructor.result.js

+2-1
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": {
@@ -553,4 +554,4 @@ module.exports = {
553554
]
554555
}
555556
]
556-
};
557+
};

tests/fixtures/ecma-features/classes/class-two-methods-semi.result.js

+2-1
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": {
@@ -533,4 +534,4 @@ module.exports = {
533534
]
534535
}
535536
]
536-
};
537+
};

tests/fixtures/ecma-features/classes/class-two-methods-three-semi.result.js

+2-1
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": {
@@ -569,4 +570,4 @@ module.exports = {
569570
]
570571
}
571572
]
572-
};
573+
};

tests/fixtures/ecma-features/classes/class-two-methods-two-semi.result.js

+2-1
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": {
@@ -551,4 +552,4 @@ module.exports = {
551552
]
552553
}
553554
]
554-
};
555+
};

tests/fixtures/ecma-features/classes/class-two-methods.result.js

+2-1
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": {
@@ -515,4 +516,4 @@ module.exports = {
515516
]
516517
}
517518
]
518-
};
519+
};

tests/fixtures/ecma-features/classes/class-two-static-methods-named-constructor.result.js

+2-1
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": {
@@ -551,4 +552,4 @@ module.exports = {
551552
]
552553
}
553554
]
554-
};
555+
};

tests/fixtures/ecma-features/classes/class-with-constructor.result.js

+2-1
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/derived-class-assign-to-var.result.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ module.exports = {
119119
"value": 0,
120120
"raw": "0"
121121
},
122+
"implements": [],
122123
"body": {
123124
"type": "ClassBody",
124125
"loc": {
@@ -326,4 +327,4 @@ module.exports = {
326327
]
327328
}
328329
]
329-
};
330+
};

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ module.exports = {
6767
"value": 0,
6868
"raw": "0"
6969
},
70+
"implements": [],
7071
"body": {
7172
"type": "ClassBody",
7273
"loc": {
@@ -235,4 +236,4 @@ module.exports = {
235236
]
236237
}
237238
]
238-
};
239+
};

tests/fixtures/ecma-features/classes/empty-class-double-semi.result.js

+2-1
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": {
@@ -180,4 +181,4 @@ module.exports = {
180181
]
181182
}
182183
]
183-
};
184+
};

0 commit comments

Comments
 (0)