From cbde25f2298d4d3f5c47ea62877bc9017dedddaf Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Fri, 18 Nov 2016 11:01:28 -0800 Subject: [PATCH] Handle the scenario when heritage clause of interface is not entity name expression Fixes #12291 --- src/compiler/declarationEmitter.ts | 5 ++++- ...hNonEntityNameExpressionHeritage.errors.txt | 9 +++++++++ ...rfaceWithNonEntityNameExpressionHeritage.js | 18 ++++++++++++++++++ ...rfaceWithNonEntityNameExpressionHeritage.ts | 4 ++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/declarationEmitInterfaceWithNonEntityNameExpressionHeritage.errors.txt create mode 100644 tests/baselines/reference/declarationEmitInterfaceWithNonEntityNameExpressionHeritage.js create mode 100644 tests/cases/compiler/declarationEmitInterfaceWithNonEntityNameExpressionHeritage.ts diff --git a/src/compiler/declarationEmitter.ts b/src/compiler/declarationEmitter.ts index 7d2f61b6d6f..a7f24dc6321 100644 --- a/src/compiler/declarationEmitter.ts +++ b/src/compiler/declarationEmitter.ts @@ -1143,7 +1143,10 @@ namespace ts { const prevEnclosingDeclaration = enclosingDeclaration; enclosingDeclaration = node; emitTypeParameters(node.typeParameters); - emitHeritageClause(getInterfaceBaseTypeNodes(node), /*isImplementsList*/ false); + const interfaceExtendsTypes = filter(getInterfaceBaseTypeNodes(node), base => isEntityNameExpression(base.expression)); + if (interfaceExtendsTypes && interfaceExtendsTypes.length) { + emitHeritageClause(interfaceExtendsTypes, /*isImplementsList*/ false); + } write(" {"); writeLine(); increaseIndent(); diff --git a/tests/baselines/reference/declarationEmitInterfaceWithNonEntityNameExpressionHeritage.errors.txt b/tests/baselines/reference/declarationEmitInterfaceWithNonEntityNameExpressionHeritage.errors.txt new file mode 100644 index 00000000000..7dc3a70fdc7 --- /dev/null +++ b/tests/baselines/reference/declarationEmitInterfaceWithNonEntityNameExpressionHeritage.errors.txt @@ -0,0 +1,9 @@ +tests/cases/compiler/declarationEmitInterfaceWithNonEntityNameExpressionHeritage.ts(3,25): error TS2499: An interface can only extend an identifier/qualified-name with optional type arguments. + + +==== tests/cases/compiler/declarationEmitInterfaceWithNonEntityNameExpressionHeritage.ts (1 errors) ==== + + class A { } + interface Class extends (typeof A) { } + ~~~~~~~~~~ +!!! error TS2499: An interface can only extend an identifier/qualified-name with optional type arguments. \ No newline at end of file diff --git a/tests/baselines/reference/declarationEmitInterfaceWithNonEntityNameExpressionHeritage.js b/tests/baselines/reference/declarationEmitInterfaceWithNonEntityNameExpressionHeritage.js new file mode 100644 index 00000000000..ef2d2e479b0 --- /dev/null +++ b/tests/baselines/reference/declarationEmitInterfaceWithNonEntityNameExpressionHeritage.js @@ -0,0 +1,18 @@ +//// [declarationEmitInterfaceWithNonEntityNameExpressionHeritage.ts] + +class A { } +interface Class extends (typeof A) { } + +//// [declarationEmitInterfaceWithNonEntityNameExpressionHeritage.js] +var A = (function () { + function A() { + } + return A; +}()); + + +//// [declarationEmitInterfaceWithNonEntityNameExpressionHeritage.d.ts] +declare class A { +} +interface Class { +} diff --git a/tests/cases/compiler/declarationEmitInterfaceWithNonEntityNameExpressionHeritage.ts b/tests/cases/compiler/declarationEmitInterfaceWithNonEntityNameExpressionHeritage.ts new file mode 100644 index 00000000000..762adaad657 --- /dev/null +++ b/tests/cases/compiler/declarationEmitInterfaceWithNonEntityNameExpressionHeritage.ts @@ -0,0 +1,4 @@ +// @declaration: true + +class A { } +interface Class extends (typeof A) { } \ No newline at end of file