From e02a0f2a450da7591b8baf5700eb771ff604e1b8 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Thu, 27 Sep 2018 16:11:46 -0700 Subject: [PATCH] Fix parent points in unreachable code (#27400) In the binder, unreachable code mistakenly skips the `bindJSDoc` call in `bindChildrenWorker`, which sets parent pointers. The fix is to call `bindJSDoc` in the case of unreachable code as well. --- src/compiler/binder.ts | 1 + .../jsdocBindingInUnreachableCode.symbols | 12 ++++++++++++ .../reference/jsdocBindingInUnreachableCode.types | 15 +++++++++++++++ .../jsdoc/jsdocBindingInUnreachableCode.ts | 11 +++++++++++ 4 files changed, 39 insertions(+) create mode 100644 tests/baselines/reference/jsdocBindingInUnreachableCode.symbols create mode 100644 tests/baselines/reference/jsdocBindingInUnreachableCode.types create mode 100644 tests/cases/conformance/jsdoc/jsdocBindingInUnreachableCode.ts diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 38d6f55824254..b7d0d6f0f0eb6 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -640,6 +640,7 @@ namespace ts { function bindChildrenWorker(node: Node): void { if (checkUnreachable(node)) { bindEachChild(node); + bindJSDoc(node); return; } switch (node.kind) { diff --git a/tests/baselines/reference/jsdocBindingInUnreachableCode.symbols b/tests/baselines/reference/jsdocBindingInUnreachableCode.symbols new file mode 100644 index 0000000000000..62ef96f854a44 --- /dev/null +++ b/tests/baselines/reference/jsdocBindingInUnreachableCode.symbols @@ -0,0 +1,12 @@ +=== tests/cases/conformance/jsdoc/bug27341.js === +if (false) { + /** + * @param {string} s + */ + const x = function (s) { +>x : Symbol(x, Decl(bug27341.js, 4, 9)) +>s : Symbol(s, Decl(bug27341.js, 4, 24)) + + }; +} + diff --git a/tests/baselines/reference/jsdocBindingInUnreachableCode.types b/tests/baselines/reference/jsdocBindingInUnreachableCode.types new file mode 100644 index 0000000000000..d1d01d17e969b --- /dev/null +++ b/tests/baselines/reference/jsdocBindingInUnreachableCode.types @@ -0,0 +1,15 @@ +=== tests/cases/conformance/jsdoc/bug27341.js === +if (false) { +>false : false + + /** + * @param {string} s + */ + const x = function (s) { +>x : (s: string) => void +>function (s) { } : (s: string) => void +>s : string + + }; +} + diff --git a/tests/cases/conformance/jsdoc/jsdocBindingInUnreachableCode.ts b/tests/cases/conformance/jsdoc/jsdocBindingInUnreachableCode.ts new file mode 100644 index 0000000000000..2c4accf993b22 --- /dev/null +++ b/tests/cases/conformance/jsdoc/jsdocBindingInUnreachableCode.ts @@ -0,0 +1,11 @@ +// @allowJs: true +// @noEmit: true +// @checkJs: true +// @Filename: bug27341.js +if (false) { + /** + * @param {string} s + */ + const x = function (s) { + }; +}