From 3381e72fb89dbff0169a93454671f63cd3a00a48 Mon Sep 17 00:00:00 2001 From: Martin Probst Date: Thu, 3 Jan 2019 10:22:03 +0100 Subject: [PATCH] Do not emit code for `@extends` tags in JS. 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 66f635a31e9cd..6cbd962a81658 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 0000000000000..c9fbdbaf587ce --- /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 0000000000000..db070bf9d6b80 --- /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 0000000000000..e4d34df51aa03 --- /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 0000000000000..f938bbc9faf6c --- /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 { + +}