From 8a24fe75c94d4dc2763437bb15b98eb0d08702e4 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Wed, 10 Aug 2022 16:38:38 -0400 Subject: [PATCH] Fix up code so we don't crash when TS itself is emitted with let/const (#50151) --- src/compiler/checker.ts | 6 ++++-- src/services/services.ts | 6 +++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ff3499f5461..d3f4581ee0c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -27075,9 +27075,11 @@ namespace ts { case AssignmentDeclarationKind.ExportsProperty: case AssignmentDeclarationKind.Prototype: case AssignmentDeclarationKind.PrototypeProperty: - let valueDeclaration = binaryExpression.left.symbol?.valueDeclaration; - // falls through case AssignmentDeclarationKind.ModuleExports: + let valueDeclaration: Declaration | undefined; + if (kind !== AssignmentDeclarationKind.ModuleExports) { + valueDeclaration = binaryExpression.left.symbol?.valueDeclaration; + } valueDeclaration ||= binaryExpression.symbol?.valueDeclaration; const annotated = valueDeclaration && getEffectiveTypeAnnotationNode(valueDeclaration); return annotated ? getTypeFromTypeNode(annotated) : undefined; diff --git a/src/services/services.ts b/src/services/services.ts index ecd7eae9530..15540e28acf 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1363,6 +1363,11 @@ namespace ts { onUnRecoverableConfigFileDiagnostic: noop, }; + // The call to isProgramUptoDate below may refer back to documentRegistryBucketKey; + // calculate this early so it's not undefined if downleveled to a var (or, if emitted + // as a const variable without downleveling, doesn't crash). + const documentRegistryBucketKey = documentRegistry.getKeyForCompilationSettings(newSettings); + // If the program is already up-to-date, we can reuse it if (isProgramUptoDate(program, rootFileNames, newSettings, (_path, fileName) => host.getScriptVersion(fileName), fileName => compilerHost!.fileExists(fileName), hasInvalidatedResolution, hasChangedAutomaticTypeDirectiveNames, getParsedCommandLine, projectReferences)) { return; @@ -1374,7 +1379,6 @@ namespace ts { // the program points to old source files that have been invalidated because of // incremental parsing. - const documentRegistryBucketKey = documentRegistry.getKeyForCompilationSettings(newSettings); const options: CreateProgramOptions = { rootNames: rootFileNames, options: newSettings,