From 6f72e24544928f1ea9fa50a9be0c6a73ba92e070 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Tue, 21 May 2024 13:44:35 -0700 Subject: [PATCH] Fix elided var handling in declaration emit visibility checks (#58605) Co-authored-by: TypeScript Bot --- src/compiler/checker.ts | 11 +++++++++-- .../declarationEmitInvalidExport.errors.txt | 5 ++++- .../reference/declarationEmitInvalidExport.js | 4 ---- .../declarationEmitVarInElidedBlock.errors.txt | 10 ++++++++++ .../declarationEmitVarInElidedBlock.symbols | 11 +++++++++++ .../declarationEmitVarInElidedBlock.types | 16 ++++++++++++++++ .../compiler/declarationEmitVarInElidedBlock.ts | 6 ++++++ 7 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 tests/baselines/reference/declarationEmitVarInElidedBlock.errors.txt create mode 100644 tests/baselines/reference/declarationEmitVarInElidedBlock.symbols create mode 100644 tests/baselines/reference/declarationEmitVarInElidedBlock.types create mode 100644 tests/cases/compiler/declarationEmitVarInElidedBlock.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a4020504f9c..df8026b71ec 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5862,9 +5862,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return { accessibility: SymbolAccessibility.Accessible }; } + if (!symbol) { + return { + accessibility: SymbolAccessibility.NotResolved, + errorSymbolName: getTextOfNode(firstIdentifier), + errorNode: firstIdentifier, + }; + } // Verify if the symbol is accessible - return (symbol && hasVisibleDeclarations(symbol, shouldComputeAliasToMakeVisible)) || { - accessibility: SymbolAccessibility.NotResolved, + return hasVisibleDeclarations(symbol, shouldComputeAliasToMakeVisible) || { + accessibility: SymbolAccessibility.NotAccessible, errorSymbolName: getTextOfNode(firstIdentifier), errorNode: firstIdentifier, }; diff --git a/tests/baselines/reference/declarationEmitInvalidExport.errors.txt b/tests/baselines/reference/declarationEmitInvalidExport.errors.txt index 781c383b958..afd6881f3be 100644 --- a/tests/baselines/reference/declarationEmitInvalidExport.errors.txt +++ b/tests/baselines/reference/declarationEmitInvalidExport.errors.txt @@ -1,11 +1,14 @@ +declarationEmitInvalidExport.ts(4,30): error TS4081: Exported type alias 'MyClass' has or is using private name 'myClass'. declarationEmitInvalidExport.ts(5,1): error TS1128: Declaration or statement expected. -==== declarationEmitInvalidExport.ts (1 errors) ==== +==== declarationEmitInvalidExport.ts (2 errors) ==== if (false) { export var myClass = 0; } export type MyClass = typeof myClass; + ~~~~~~~ +!!! error TS4081: Exported type alias 'MyClass' has or is using private name 'myClass'. } ~ !!! error TS1128: Declaration or statement expected. diff --git a/tests/baselines/reference/declarationEmitInvalidExport.js b/tests/baselines/reference/declarationEmitInvalidExport.js index aa91414f494..77fade49af2 100644 --- a/tests/baselines/reference/declarationEmitInvalidExport.js +++ b/tests/baselines/reference/declarationEmitInvalidExport.js @@ -14,7 +14,3 @@ Object.defineProperty(exports, "__esModule", { value: true }); if (false) { exports.myClass = 0; } - - -//// [declarationEmitInvalidExport.d.ts] -export type MyClass = typeof myClass; diff --git a/tests/baselines/reference/declarationEmitVarInElidedBlock.errors.txt b/tests/baselines/reference/declarationEmitVarInElidedBlock.errors.txt new file mode 100644 index 00000000000..28fae144d2d --- /dev/null +++ b/tests/baselines/reference/declarationEmitVarInElidedBlock.errors.txt @@ -0,0 +1,10 @@ +declarationEmitVarInElidedBlock.ts(4,22): error TS4025: Exported variable 'b' has or is using private name 'a'. + + +==== declarationEmitVarInElidedBlock.ts (1 errors) ==== + { + var a = ""; + } + export let b: typeof a; + ~ +!!! error TS4025: Exported variable 'b' has or is using private name 'a'. \ No newline at end of file diff --git a/tests/baselines/reference/declarationEmitVarInElidedBlock.symbols b/tests/baselines/reference/declarationEmitVarInElidedBlock.symbols new file mode 100644 index 00000000000..c8566c47cb6 --- /dev/null +++ b/tests/baselines/reference/declarationEmitVarInElidedBlock.symbols @@ -0,0 +1,11 @@ +//// [tests/cases/compiler/declarationEmitVarInElidedBlock.ts] //// + +=== declarationEmitVarInElidedBlock.ts === +{ + var a = ""; +>a : Symbol(a, Decl(declarationEmitVarInElidedBlock.ts, 1, 7)) +} +export let b: typeof a; +>b : Symbol(b, Decl(declarationEmitVarInElidedBlock.ts, 3, 10)) +>a : Symbol(a, Decl(declarationEmitVarInElidedBlock.ts, 1, 7)) + diff --git a/tests/baselines/reference/declarationEmitVarInElidedBlock.types b/tests/baselines/reference/declarationEmitVarInElidedBlock.types new file mode 100644 index 00000000000..b814ae55601 --- /dev/null +++ b/tests/baselines/reference/declarationEmitVarInElidedBlock.types @@ -0,0 +1,16 @@ +//// [tests/cases/compiler/declarationEmitVarInElidedBlock.ts] //// + +=== declarationEmitVarInElidedBlock.ts === +{ + var a = ""; +>a : string +> : ^^^^^^ +>"" : "" +> : ^^ +} +export let b: typeof a; +>b : string +> : ^^^^^^ +>a : string +> : ^^^^^^ + diff --git a/tests/cases/compiler/declarationEmitVarInElidedBlock.ts b/tests/cases/compiler/declarationEmitVarInElidedBlock.ts new file mode 100644 index 00000000000..76e62472c5f --- /dev/null +++ b/tests/cases/compiler/declarationEmitVarInElidedBlock.ts @@ -0,0 +1,6 @@ +// @declaration: true +// @emitDeclarationOnly: true +{ + var a = ""; +} +export let b: typeof a; \ No newline at end of file