From 7a2b2cebbf28aed17b1436c0147c87ae7c149af8 Mon Sep 17 00:00:00 2001 From: Martin Probst Date: Fri, 4 Jan 2019 17:13:14 +0100 Subject: [PATCH] Do not emit code for `@extends` tags in JS. (#29244) When transpiling JavaScript, TS3.1+ emits `@extends` tags as code. E.g. /** @extends {SuperClass} */ class SubClass {} Causes an ES5 emit that references SuperClass: /** * @extends {SomeBase} */ var SubClass = /** @class */ (function (_super) { __extends(SubClass, _super); function SubClass() { return _super !== null && _super.apply(this, arguments) || this; } return SubClass; }(SomeBase)); Note the literal references to `SomeBase`. This appears to be an accidental effect of 0f55566cf4. It refactored `getEffectiveBaseTypeNode` for type checking, but missed an instance where it is also used for emit logic. This change fixes the problem by specifically getting the heritage clauses directly off the AST. Change-Id: I3128a757e5924e2528c61230a90ac13650852542 --- src/compiler/transformers/es2015.ts | 2 +- tests/baselines/reference/extendsJavaScript.js | 18 ++++++++++++++++++ .../reference/extendsJavaScript.symbols | 9 +++++++++ .../reference/extendsJavaScript.types | 9 +++++++++ tests/cases/compiler/extendsJavaScript.ts | 11 +++++++++++ 5 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/extendsJavaScript.js create mode 100644 tests/baselines/reference/extendsJavaScript.symbols create mode 100644 tests/baselines/reference/extendsJavaScript.types create mode 100644 tests/cases/compiler/extendsJavaScript.ts diff --git a/src/compiler/transformers/es2015.ts b/src/compiler/transformers/es2015.ts index 66f635a31e9..6cbd962a816 100644 --- a/src/compiler/transformers/es2015.ts +++ b/src/compiler/transformers/es2015.ts @@ -780,7 +780,7 @@ namespace ts { enableSubstitutionsForBlockScopedBindings(); } - const extendsClauseElement = getEffectiveBaseTypeNode(node); + const extendsClauseElement = getClassExtendsHeritageElement(node); const classFunction = createFunctionExpression( /*modifiers*/ undefined, /*asteriskToken*/ undefined, diff --git a/tests/baselines/reference/extendsJavaScript.js b/tests/baselines/reference/extendsJavaScript.js new file mode 100644 index 00000000000..c9fbdbaf587 --- /dev/null +++ b/tests/baselines/reference/extendsJavaScript.js @@ -0,0 +1,18 @@ +//// [extendsJavaScript.js] +/** + * @extends {SomeBase} + */ +class MyClass { + +} + + +//// [extendsJavaScript.js] +/** + * @extends {SomeBase} + */ +var MyClass = /** @class */ (function () { + function MyClass() { + } + return MyClass; +}()); diff --git a/tests/baselines/reference/extendsJavaScript.symbols b/tests/baselines/reference/extendsJavaScript.symbols new file mode 100644 index 00000000000..db070bf9d6b --- /dev/null +++ b/tests/baselines/reference/extendsJavaScript.symbols @@ -0,0 +1,9 @@ +=== tests/cases/compiler/extendsJavaScript.js === +/** + * @extends {SomeBase} + */ +class MyClass { +>MyClass : Symbol(MyClass, Decl(extendsJavaScript.js, 0, 0)) + +} + diff --git a/tests/baselines/reference/extendsJavaScript.types b/tests/baselines/reference/extendsJavaScript.types new file mode 100644 index 00000000000..e4d34df51aa --- /dev/null +++ b/tests/baselines/reference/extendsJavaScript.types @@ -0,0 +1,9 @@ +=== tests/cases/compiler/extendsJavaScript.js === +/** + * @extends {SomeBase} + */ +class MyClass { +>MyClass : MyClass + +} + diff --git a/tests/cases/compiler/extendsJavaScript.ts b/tests/cases/compiler/extendsJavaScript.ts new file mode 100644 index 00000000000..f938bbc9faf --- /dev/null +++ b/tests/cases/compiler/extendsJavaScript.ts @@ -0,0 +1,11 @@ +// @allowJs: true +// @checkJs: false +// @outDir: ./out +// @filename: extendsJavaScript.js + +/** + * @extends {SomeBase} + */ +class MyClass { + +}