Skip to content
5 changes: 5 additions & 0 deletions src/compiler/binder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<Node>).flags &= ~NodeFlags.Unreachable;
}

if (currentFlow === unreachableFlow) {
if (canHaveFlowNode(node)) {
node.flowNode = undefined;
Expand Down
44 changes: 44 additions & 0 deletions tests/cases/fourslash/unreachableCodeAfterEdit.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/// <reference path="fourslash.ts" />

// @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<string>;
//// unseal(data: string): Promise<string>;
//// }
////
//// export class TransparentCrypto implements ISecretStorageCrypto {
//// async seal(data: string): Promise<string> {
//// return data;
//// }
//// async unseal(data: string): Promise<string> {
//// 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);
23 changes: 23 additions & 0 deletions tests/cases/fourslash/unusedLabelAfterEdit.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/// <reference path="fourslash.ts" />

// @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);