From 2f8a646f8e5bb0331c4b52b4596806894817994a Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Wed, 12 Sep 2018 12:21:50 -0700 Subject: [PATCH] isExpandoFunctionDeclaration only checks values (#27052) Previously it checked types too, which caused a crash because types don't have valueDeclaration set. But expando functions can't export types, only values. --- src/compiler/checker.ts | 2 +- .../reference/declarationEmitOfFuncspace.js | 23 +++++++++++++++++++ .../declarationEmitOfFuncspace.symbols | 16 +++++++++++++ .../declarationEmitOfFuncspace.types | 13 +++++++++++ .../compiler/declarationEmitOfFuncspace.ts | 9 ++++++++ 5 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/declarationEmitOfFuncspace.js create mode 100644 tests/baselines/reference/declarationEmitOfFuncspace.symbols create mode 100644 tests/baselines/reference/declarationEmitOfFuncspace.types create mode 100644 tests/cases/compiler/declarationEmitOfFuncspace.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 974c74029eb..6bd0c0409d4 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -28154,7 +28154,7 @@ namespace ts { if (!symbol || !(symbol.flags & SymbolFlags.Function)) { return false; } - return !!forEachEntry(getExportsOfSymbol(symbol), p => isPropertyAccessExpression(p.valueDeclaration)); + return !!forEachEntry(getExportsOfSymbol(symbol), p => p.flags & SymbolFlags.Value && isPropertyAccessExpression(p.valueDeclaration)); } function getPropertiesOfContainerFunction(node: Declaration): Symbol[] { diff --git a/tests/baselines/reference/declarationEmitOfFuncspace.js b/tests/baselines/reference/declarationEmitOfFuncspace.js new file mode 100644 index 00000000000..5a60a51d7e6 --- /dev/null +++ b/tests/baselines/reference/declarationEmitOfFuncspace.js @@ -0,0 +1,23 @@ +//// [expando.ts] +// #27032 +function ExpandoMerge(n: number) { + return n; +} +namespace ExpandoMerge { + export interface I { } +} + + +//// [expando.js] +// #27032 +function ExpandoMerge(n) { + return n; +} + + +//// [expando.d.ts] +declare function ExpandoMerge(n: number): number; +declare namespace ExpandoMerge { + interface I { + } +} diff --git a/tests/baselines/reference/declarationEmitOfFuncspace.symbols b/tests/baselines/reference/declarationEmitOfFuncspace.symbols new file mode 100644 index 00000000000..cd86d57ae68 --- /dev/null +++ b/tests/baselines/reference/declarationEmitOfFuncspace.symbols @@ -0,0 +1,16 @@ +=== tests/cases/compiler/expando.ts === +// #27032 +function ExpandoMerge(n: number) { +>ExpandoMerge : Symbol(ExpandoMerge, Decl(expando.ts, 0, 0), Decl(expando.ts, 3, 1)) +>n : Symbol(n, Decl(expando.ts, 1, 22)) + + return n; +>n : Symbol(n, Decl(expando.ts, 1, 22)) +} +namespace ExpandoMerge { +>ExpandoMerge : Symbol(ExpandoMerge, Decl(expando.ts, 0, 0), Decl(expando.ts, 3, 1)) + + export interface I { } +>I : Symbol(I, Decl(expando.ts, 4, 24)) +} + diff --git a/tests/baselines/reference/declarationEmitOfFuncspace.types b/tests/baselines/reference/declarationEmitOfFuncspace.types new file mode 100644 index 00000000000..030ffa34a58 --- /dev/null +++ b/tests/baselines/reference/declarationEmitOfFuncspace.types @@ -0,0 +1,13 @@ +=== tests/cases/compiler/expando.ts === +// #27032 +function ExpandoMerge(n: number) { +>ExpandoMerge : (n: number) => number +>n : number + + return n; +>n : number +} +namespace ExpandoMerge { + export interface I { } +} + diff --git a/tests/cases/compiler/declarationEmitOfFuncspace.ts b/tests/cases/compiler/declarationEmitOfFuncspace.ts new file mode 100644 index 00000000000..9648178ae81 --- /dev/null +++ b/tests/cases/compiler/declarationEmitOfFuncspace.ts @@ -0,0 +1,9 @@ +// @declaration: true +// @Filename: expando.ts +// #27032 +function ExpandoMerge(n: number) { + return n; +} +namespace ExpandoMerge { + export interface I { } +}