From b86dc3438683327ed8928802a76e2a22603af706 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Thu, 1 Oct 2020 15:20:01 -0700 Subject: [PATCH] Limit when we allow nested unique symbols to be serialized to when their declaration is within the same file as the context --- src/compiler/checker.ts | 2 +- ...WithNonlocalPrivateUniqueSymbol.errors.txt | 11 ++++++++ ...pressionWithNonlocalPrivateUniqueSymbol.js | 28 +++++++++++++++++++ ...ionWithNonlocalPrivateUniqueSymbol.symbols | 17 +++++++++++ ...ssionWithNonlocalPrivateUniqueSymbol.types | 18 ++++++++++++ ...pressionWithNonlocalPrivateUniqueSymbol.ts | 7 +++++ 6 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.errors.txt create mode 100644 tests/baselines/reference/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.js create mode 100644 tests/baselines/reference/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.symbols create mode 100644 tests/baselines/reference/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.types create mode 100644 tests/cases/compiler/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 467cd7e5d95..4f03135f479 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5812,7 +5812,7 @@ namespace ts { } const oldFlags = context.flags; if (type.flags & TypeFlags.UniqueESSymbol && - type.symbol === symbol) { + type.symbol === symbol && (!context.enclosingDeclaration || some(symbol.declarations, d => getSourceFileOfNode(d) === getSourceFileOfNode(context.enclosingDeclaration!)))) { context.flags |= NodeBuilderFlags.AllowUniqueESSymbolType; } const result = typeToTypeNodeHelper(type, context); diff --git a/tests/baselines/reference/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.errors.txt b/tests/baselines/reference/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.errors.txt new file mode 100644 index 00000000000..43bc069f6de --- /dev/null +++ b/tests/baselines/reference/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.errors.txt @@ -0,0 +1,11 @@ +tests/cases/compiler/b.ts(2,14): error TS2527: The inferred type of 'A1' references an inaccessible 'unique symbol' type. A type annotation is necessary. + + +==== tests/cases/compiler/a.ts (0 errors) ==== + type AX = { readonly A: unique symbol }; + export const A: AX = 0 as any; +==== tests/cases/compiler/b.ts (1 errors) ==== + import { A } from './a'; + export const A1 = A; + ~~ +!!! error TS2527: The inferred type of 'A1' references an inaccessible 'unique symbol' type. A type annotation is necessary. \ No newline at end of file diff --git a/tests/baselines/reference/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.js b/tests/baselines/reference/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.js new file mode 100644 index 00000000000..b6cf51808c8 --- /dev/null +++ b/tests/baselines/reference/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.js @@ -0,0 +1,28 @@ +//// [tests/cases/compiler/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.ts] //// + +//// [a.ts] +type AX = { readonly A: unique symbol }; +export const A: AX = 0 as any; +//// [b.ts] +import { A } from './a'; +export const A1 = A; + +//// [a.js] +"use strict"; +exports.__esModule = true; +exports.A = void 0; +exports.A = 0; +//// [b.js] +"use strict"; +exports.__esModule = true; +exports.A1 = void 0; +var a_1 = require("./a"); +exports.A1 = a_1.A; + + +//// [a.d.ts] +declare type AX = { + readonly A: unique symbol; +}; +export declare const A: AX; +export {}; diff --git a/tests/baselines/reference/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.symbols b/tests/baselines/reference/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.symbols new file mode 100644 index 00000000000..3294e8e38c3 --- /dev/null +++ b/tests/baselines/reference/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.symbols @@ -0,0 +1,17 @@ +=== tests/cases/compiler/a.ts === +type AX = { readonly A: unique symbol }; +>AX : Symbol(AX, Decl(a.ts, 0, 0)) +>A : Symbol(A, Decl(a.ts, 0, 11)) + +export const A: AX = 0 as any; +>A : Symbol(A, Decl(a.ts, 1, 12)) +>AX : Symbol(AX, Decl(a.ts, 0, 0)) + +=== tests/cases/compiler/b.ts === +import { A } from './a'; +>A : Symbol(A, Decl(b.ts, 0, 8)) + +export const A1 = A; +>A1 : Symbol(A1, Decl(b.ts, 1, 12)) +>A : Symbol(A, Decl(b.ts, 0, 8)) + diff --git a/tests/baselines/reference/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.types b/tests/baselines/reference/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.types new file mode 100644 index 00000000000..3582fd3db6b --- /dev/null +++ b/tests/baselines/reference/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.types @@ -0,0 +1,18 @@ +=== tests/cases/compiler/a.ts === +type AX = { readonly A: unique symbol }; +>AX : AX +>A : unique symbol + +export const A: AX = 0 as any; +>A : AX +>0 as any : any +>0 : 0 + +=== tests/cases/compiler/b.ts === +import { A } from './a'; +>A : { readonly A: unique symbol; } + +export const A1 = A; +>A1 : { readonly A: unique symbol; } +>A : { readonly A: unique symbol; } + diff --git a/tests/cases/compiler/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.ts b/tests/cases/compiler/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.ts new file mode 100644 index 00000000000..e0dcbdfecbd --- /dev/null +++ b/tests/cases/compiler/declarationEmitExpressionWithNonlocalPrivateUniqueSymbol.ts @@ -0,0 +1,7 @@ +// @declaration: true +// @filename: a.ts +type AX = { readonly A: unique symbol }; +export const A: AX = 0 as any; +// @filename: b.ts +import { A } from './a'; +export const A1 = A; \ No newline at end of file