From 54352dc1c9bbbe528dd6df8295ef2478bc696684 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 19 Dec 2018 15:28:21 -0800 Subject: [PATCH 1/3] Added test case. --- ...DefaultExportClassExtendingExpression01.ts | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 tests/cases/compiler/declarationEmitForDefaultExportClassExtendingExpression01.ts diff --git a/tests/cases/compiler/declarationEmitForDefaultExportClassExtendingExpression01.ts b/tests/cases/compiler/declarationEmitForDefaultExportClassExtendingExpression01.ts new file mode 100644 index 00000000000..3c4abc37deb --- /dev/null +++ b/tests/cases/compiler/declarationEmitForDefaultExportClassExtendingExpression01.ts @@ -0,0 +1,21 @@ +// @declaration: true + +interface Greeter { + getGreeting(): string; +} + +interface GreeterConstructor { + new (): Greeter; +} + +class A { + getGreeting() { + return 'hello'; + } +} + +const getGreeterBase = (): GreeterConstructor => A; + +export default class extends getGreeterBase() { +} + From 9277c03666d71f92a498c500cf108f2b62199468 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 19 Dec 2018 15:42:15 -0800 Subject: [PATCH 2/3] Check whether class declarations have a name, falling back to "default". --- src/compiler/transformers/declarations.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/compiler/transformers/declarations.ts b/src/compiler/transformers/declarations.ts index 973b9db618e..b54cf5bb858 100644 --- a/src/compiler/transformers/declarations.ts +++ b/src/compiler/transformers/declarations.ts @@ -1100,7 +1100,8 @@ namespace ts { if (extendsClause && !isEntityNameExpression(extendsClause.expression) && extendsClause.expression.kind !== SyntaxKind.NullKeyword) { // We must add a temporary declaration for the extends clause expression - const newId = createOptimisticUniqueName(`${unescapeLeadingUnderscores(input.name!.escapedText)}_base`); // TODO: GH#18217 + const oldId = input.name ? unescapeLeadingUnderscores(input.name.escapedText) : "default"; + const newId = createOptimisticUniqueName(`${oldId}_base`); getSymbolAccessibilityDiagnostic = () => ({ diagnosticMessage: Diagnostics.extends_clause_of_exported_class_0_has_or_is_using_private_name_1, errorNode: extendsClause, From dec3fe619904e758bee152edf2086ec75fdac02d Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 19 Dec 2018 15:50:33 -0800 Subject: [PATCH 3/3] Accepted baselines. --- ...DefaultExportClassExtendingExpression01.js | 68 +++++++++++++++++++ ...ltExportClassExtendingExpression01.symbols | 35 ++++++++++ ...aultExportClassExtendingExpression01.types | 32 +++++++++ 3 files changed, 135 insertions(+) create mode 100644 tests/baselines/reference/declarationEmitForDefaultExportClassExtendingExpression01.js create mode 100644 tests/baselines/reference/declarationEmitForDefaultExportClassExtendingExpression01.symbols create mode 100644 tests/baselines/reference/declarationEmitForDefaultExportClassExtendingExpression01.types diff --git a/tests/baselines/reference/declarationEmitForDefaultExportClassExtendingExpression01.js b/tests/baselines/reference/declarationEmitForDefaultExportClassExtendingExpression01.js new file mode 100644 index 00000000000..4d0006d52e6 --- /dev/null +++ b/tests/baselines/reference/declarationEmitForDefaultExportClassExtendingExpression01.js @@ -0,0 +1,68 @@ +//// [declarationEmitForDefaultExportClassExtendingExpression01.ts] +interface Greeter { + getGreeting(): string; +} + +interface GreeterConstructor { + new (): Greeter; +} + +class A { + getGreeting() { + return 'hello'; + } +} + +const getGreeterBase = (): GreeterConstructor => A; + +export default class extends getGreeterBase() { +} + + + +//// [declarationEmitForDefaultExportClassExtendingExpression01.js] +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +exports.__esModule = true; +var A = /** @class */ (function () { + function A() { + } + A.prototype.getGreeting = function () { + return 'hello'; + }; + return A; +}()); +var getGreeterBase = function () { return A; }; +var default_1 = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1() { + return _super !== null && _super.apply(this, arguments) || this; + } + return default_1; +}(getGreeterBase())); +exports["default"] = default_1; + + +//// [declarationEmitForDefaultExportClassExtendingExpression01.d.ts] +interface Greeter { + getGreeting(): string; +} +interface GreeterConstructor { + new (): Greeter; +} +declare const default_base: GreeterConstructor; +export default class extends default_base { +} +export {}; diff --git a/tests/baselines/reference/declarationEmitForDefaultExportClassExtendingExpression01.symbols b/tests/baselines/reference/declarationEmitForDefaultExportClassExtendingExpression01.symbols new file mode 100644 index 00000000000..8d298f58037 --- /dev/null +++ b/tests/baselines/reference/declarationEmitForDefaultExportClassExtendingExpression01.symbols @@ -0,0 +1,35 @@ +=== tests/cases/compiler/declarationEmitForDefaultExportClassExtendingExpression01.ts === +interface Greeter { +>Greeter : Symbol(Greeter, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 0, 0)) + + getGreeting(): string; +>getGreeting : Symbol(Greeter.getGreeting, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 0, 19)) +} + +interface GreeterConstructor { +>GreeterConstructor : Symbol(GreeterConstructor, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 2, 1)) + + new (): Greeter; +>Greeter : Symbol(Greeter, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 0, 0)) +} + +class A { +>A : Symbol(A, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 6, 1)) + + getGreeting() { +>getGreeting : Symbol(A.getGreeting, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 8, 9)) + + return 'hello'; + } +} + +const getGreeterBase = (): GreeterConstructor => A; +>getGreeterBase : Symbol(getGreeterBase, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 14, 5)) +>GreeterConstructor : Symbol(GreeterConstructor, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 2, 1)) +>A : Symbol(A, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 6, 1)) + +export default class extends getGreeterBase() { +>getGreeterBase : Symbol(getGreeterBase, Decl(declarationEmitForDefaultExportClassExtendingExpression01.ts, 14, 5)) +} + + diff --git a/tests/baselines/reference/declarationEmitForDefaultExportClassExtendingExpression01.types b/tests/baselines/reference/declarationEmitForDefaultExportClassExtendingExpression01.types new file mode 100644 index 00000000000..f1ec49f988e --- /dev/null +++ b/tests/baselines/reference/declarationEmitForDefaultExportClassExtendingExpression01.types @@ -0,0 +1,32 @@ +=== tests/cases/compiler/declarationEmitForDefaultExportClassExtendingExpression01.ts === +interface Greeter { + getGreeting(): string; +>getGreeting : () => string +} + +interface GreeterConstructor { + new (): Greeter; +} + +class A { +>A : A + + getGreeting() { +>getGreeting : () => string + + return 'hello'; +>'hello' : "hello" + } +} + +const getGreeterBase = (): GreeterConstructor => A; +>getGreeterBase : () => GreeterConstructor +>(): GreeterConstructor => A : () => GreeterConstructor +>A : typeof A + +export default class extends getGreeterBase() { +>getGreeterBase() : Greeter +>getGreeterBase : () => GreeterConstructor +} + +