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
This commit is contained in:
Martin Probst 2019-01-04 17:13:14 +01:00 committed by Wesley Wigham
parent b7d7d5f7b3
commit 7a2b2cebbf
5 changed files with 48 additions and 1 deletions

View File

@ -780,7 +780,7 @@ namespace ts {
enableSubstitutionsForBlockScopedBindings();
}
const extendsClauseElement = getEffectiveBaseTypeNode(node);
const extendsClauseElement = getClassExtendsHeritageElement(node);
const classFunction = createFunctionExpression(
/*modifiers*/ undefined,
/*asteriskToken*/ undefined,

View File

@ -0,0 +1,18 @@
//// [extendsJavaScript.js]
/**
* @extends {SomeBase}
*/
class MyClass {
}
//// [extendsJavaScript.js]
/**
* @extends {SomeBase}
*/
var MyClass = /** @class */ (function () {
function MyClass() {
}
return MyClass;
}());

View File

@ -0,0 +1,9 @@
=== tests/cases/compiler/extendsJavaScript.js ===
/**
* @extends {SomeBase}
*/
class MyClass {
>MyClass : Symbol(MyClass, Decl(extendsJavaScript.js, 0, 0))
}

View File

@ -0,0 +1,9 @@
=== tests/cases/compiler/extendsJavaScript.js ===
/**
* @extends {SomeBase}
*/
class MyClass {
>MyClass : MyClass
}

View File

@ -0,0 +1,11 @@
// @allowJs: true
// @checkJs: false
// @outDir: ./out
// @filename: extendsJavaScript.js
/**
* @extends {SomeBase}
*/
class MyClass {
}