diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index cfa409e878c82..72b9e4acadedb 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -1091,6 +1091,11 @@ function createBinder(): (file: SourceFile, options: CompilerOptions) => void { // and set it before we descend into nodes that could actually be part of an assignment pattern. inAssignmentPattern = false; + // Clear Unreachable flag from previous binding (for incremental scenarios) + if (isPotentiallyExecutableNode(node)) { + (node as Mutable).flags &= ~NodeFlags.Unreachable; + } + if (currentFlow === unreachableFlow) { if (canHaveFlowNode(node)) { node.flowNode = undefined; diff --git a/tests/cases/fourslash/unreachableCodeAfterEdit.ts b/tests/cases/fourslash/unreachableCodeAfterEdit.ts new file mode 100644 index 0000000000000..af07c67463c98 --- /dev/null +++ b/tests/cases/fourslash/unreachableCodeAfterEdit.ts @@ -0,0 +1,44 @@ +/// + +// @allowUnreachableCode: false +// @lib: es2015 + +// @Filename: /base/browser/browser.ts +//// export const isStandalone = true; + +// @Filename: /base/browser/dom.ts +//// export function addDisposableListener() {} + +// @Filename: /base/browser/window.ts +//// export const mainWindow = {} as Window; + +// @Filename: /workbench.ts +//// /*before*/import { isStandalone } from './base/browser/browser'; +//// import { addDisposableListener } from './base/browser/dom'; +//// import { mainWindow } from './base/browser/window'; +//// +//// interface ISecretStorageCrypto { +//// seal(data: string): Promise; +//// unseal(data: string): Promise; +//// } +//// +//// export class TransparentCrypto implements ISecretStorageCrypto { +//// async seal(data: string): Promise { +//// return data; +//// } +//// async unseal(data: string): Promise { +//// return data; +//// } +//// } + +verify.numberOfErrorsInCurrentFile(0); + +goTo.marker("before"); +edit.insert("throw new Error('foo');\n"); + +verify.numberOfErrorsInCurrentFile(1); + +goTo.marker("before"); +edit.deleteAtCaret("throw new Error('foo');\n".length); + +verify.numberOfErrorsInCurrentFile(0); diff --git a/tests/cases/fourslash/unusedLabelAfterEdit.ts b/tests/cases/fourslash/unusedLabelAfterEdit.ts new file mode 100644 index 0000000000000..eb5fa6991fe7c --- /dev/null +++ b/tests/cases/fourslash/unusedLabelAfterEdit.ts @@ -0,0 +1,23 @@ +/// + +// @allowUnusedLabels: false + +//// myLabel: while (true) { +//// if (Math.random() > 0.5) { +//// /*marker*/break myLabel; +//// } +//// } + +verify.numberOfErrorsInCurrentFile(0); + +goTo.marker("marker"); +edit.deleteAtCaret("break myLabel;".length); +edit.insert("break;"); + +verify.numberOfErrorsInCurrentFile(1); + +goTo.marker("marker"); +edit.deleteAtCaret("break;".length); +edit.insert("break myLabel;"); + +verify.numberOfErrorsInCurrentFile(0);