From 477e4b1a9dbc5705a14901a686a09a8644151185 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Fri, 2 Oct 2020 10:50:12 -0700 Subject: [PATCH] Fix function merged with export as namespace sourcefile (#40908) Previously it crashed because the function-checking code didn't expect a node with no parent. --- src/compiler/checker.ts | 2 +- .../reference/sourceFileMergeWithFunction.js | 14 ++++++++++++++ .../sourceFileMergeWithFunction.symbols | 16 ++++++++++++++++ .../reference/sourceFileMergeWithFunction.types | 16 ++++++++++++++++ .../salsa/sourceFileMergeWithFunction.ts | 8 ++++++++ 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/sourceFileMergeWithFunction.js create mode 100644 tests/baselines/reference/sourceFileMergeWithFunction.symbols create mode 100644 tests/baselines/reference/sourceFileMergeWithFunction.types create mode 100644 tests/cases/conformance/salsa/sourceFileMergeWithFunction.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index cf7bbed8ca5..553cb022e0c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -32040,7 +32040,7 @@ namespace ts { for (const current of declarations) { const node = current; const inAmbientContext = node.flags & NodeFlags.Ambient; - const inAmbientContextOrInterface = node.parent.kind === SyntaxKind.InterfaceDeclaration || node.parent.kind === SyntaxKind.TypeLiteral || inAmbientContext; + const inAmbientContextOrInterface = node.parent && (node.parent.kind === SyntaxKind.InterfaceDeclaration || node.parent.kind === SyntaxKind.TypeLiteral) || inAmbientContext; if (inAmbientContextOrInterface) { // check if declarations are consecutive only if they are non-ambient // 1. ambient declarations can be interleaved diff --git a/tests/baselines/reference/sourceFileMergeWithFunction.js b/tests/baselines/reference/sourceFileMergeWithFunction.js new file mode 100644 index 00000000000..bd8940e92a2 --- /dev/null +++ b/tests/baselines/reference/sourceFileMergeWithFunction.js @@ -0,0 +1,14 @@ +//// [tests/cases/conformance/salsa/sourceFileMergeWithFunction.ts] //// + +//// [types.d.ts] +declare function foo(props: any): any; +export default foo; +export as namespace foo; + +//// [foo.ts] +/// +declare function foo(): any; + + +//// [foo.js] +/// diff --git a/tests/baselines/reference/sourceFileMergeWithFunction.symbols b/tests/baselines/reference/sourceFileMergeWithFunction.symbols new file mode 100644 index 00000000000..11c05743387 --- /dev/null +++ b/tests/baselines/reference/sourceFileMergeWithFunction.symbols @@ -0,0 +1,16 @@ +=== tests/cases/conformance/salsa/foo.ts === +/// +declare function foo(): any; +>foo : Symbol(foo, Decl(types.d.ts, 0, 0), Decl(foo.ts, 0, 0)) + +=== tests/cases/conformance/salsa/types.d.ts === +declare function foo(props: any): any; +>foo : Symbol(foo, Decl(types.d.ts, 0, 0)) +>props : Symbol(props, Decl(types.d.ts, 0, 21)) + +export default foo; +>foo : Symbol(foo, Decl(types.d.ts, 0, 0)) + +export as namespace foo; +>foo : Symbol(foo, Decl(types.d.ts, 1, 19)) + diff --git a/tests/baselines/reference/sourceFileMergeWithFunction.types b/tests/baselines/reference/sourceFileMergeWithFunction.types new file mode 100644 index 00000000000..0058b39c63b --- /dev/null +++ b/tests/baselines/reference/sourceFileMergeWithFunction.types @@ -0,0 +1,16 @@ +=== tests/cases/conformance/salsa/foo.ts === +/// +declare function foo(): any; +>foo : typeof import("tests/cases/conformance/salsa/types") + +=== tests/cases/conformance/salsa/types.d.ts === +declare function foo(props: any): any; +>foo : (props: any) => any +>props : any + +export default foo; +>foo : (props: any) => any + +export as namespace foo; +>foo : typeof import("tests/cases/conformance/salsa/types") + diff --git a/tests/cases/conformance/salsa/sourceFileMergeWithFunction.ts b/tests/cases/conformance/salsa/sourceFileMergeWithFunction.ts new file mode 100644 index 00000000000..d96e5b4d5c1 --- /dev/null +++ b/tests/cases/conformance/salsa/sourceFileMergeWithFunction.ts @@ -0,0 +1,8 @@ +// @Filename: types.d.ts +declare function foo(props: any): any; +export default foo; +export as namespace foo; + +// @Filename: foo.ts +/// +declare function foo(): any;