From 3206df8e6d4580381cd3712e385574b0351c3ff0 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Wed, 26 Jan 2022 14:00:14 +0200 Subject: [PATCH] fix(47561): use parameter name from enclosing declaration (#47609) --- src/compiler/checker.ts | 3 +- .../typeParametersAvailableInNestedScope3.js | 37 ++++++++++++++ ...eParametersAvailableInNestedScope3.symbols | 48 +++++++++++++++++++ ...ypeParametersAvailableInNestedScope3.types | 40 ++++++++++++++++ .../typeParametersAvailableInNestedScope3.ts | 14 ++++++ 5 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/typeParametersAvailableInNestedScope3.js create mode 100644 tests/baselines/reference/typeParametersAvailableInNestedScope3.symbols create mode 100644 tests/baselines/reference/typeParametersAvailableInNestedScope3.types create mode 100644 tests/cases/conformance/types/typeParameters/typeParameterLists/typeParametersAvailableInNestedScope3.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5357b871d274b..c77092153d644 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -6397,7 +6397,8 @@ namespace ts { includePrivateSymbol?.(sym); } if (isIdentifier(node)) { - const name = sym.flags & SymbolFlags.TypeParameter ? typeParameterToName(getDeclaredTypeOfSymbol(sym), context) : factory.cloneNode(node); + const type = getDeclaredTypeOfSymbol(sym); + const name = sym.flags & SymbolFlags.TypeParameter && !isTypeSymbolAccessible(type.symbol, context.enclosingDeclaration) ? typeParameterToName(type, context) : factory.cloneNode(node); name.symbol = sym; // for quickinfo, which uses identifier symbol information return { introducesError, node: setEmitFlags(setOriginalNode(name, node), EmitFlags.NoAsciiEscaping) }; } diff --git a/tests/baselines/reference/typeParametersAvailableInNestedScope3.js b/tests/baselines/reference/typeParametersAvailableInNestedScope3.js new file mode 100644 index 0000000000000..44ea98b81d9b0 --- /dev/null +++ b/tests/baselines/reference/typeParametersAvailableInNestedScope3.js @@ -0,0 +1,37 @@ +//// [typeParametersAvailableInNestedScope3.ts] +function foo(v: T) { + function a(a: T) { return a; } + function b(): T { return v; } + + function c(v: T) { + function a(a: T) { return a; } + function b(): T { return v; } + return { a, b }; + } + + return { a, b, c }; +} + + +//// [typeParametersAvailableInNestedScope3.js] +function foo(v) { + function a(a) { return a; } + function b() { return v; } + function c(v) { + function a(a) { return a; } + function b() { return v; } + return { a: a, b: b }; + } + return { a: a, b: b, c: c }; +} + + +//// [typeParametersAvailableInNestedScope3.d.ts] +declare function foo(v: T): { + a: (a: T_1) => T_1; + b: () => T; + c: (v: T_2) => { + a: (a: T_3) => T_3; + b: () => T_2; + }; +}; diff --git a/tests/baselines/reference/typeParametersAvailableInNestedScope3.symbols b/tests/baselines/reference/typeParametersAvailableInNestedScope3.symbols new file mode 100644 index 0000000000000..18013106204b1 --- /dev/null +++ b/tests/baselines/reference/typeParametersAvailableInNestedScope3.symbols @@ -0,0 +1,48 @@ +=== tests/cases/conformance/types/typeParameters/typeParameterLists/typeParametersAvailableInNestedScope3.ts === +function foo(v: T) { +>foo : Symbol(foo, Decl(typeParametersAvailableInNestedScope3.ts, 0, 0)) +>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 0, 13)) +>v : Symbol(v, Decl(typeParametersAvailableInNestedScope3.ts, 0, 16)) +>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 0, 13)) + + function a(a: T) { return a; } +>a : Symbol(a, Decl(typeParametersAvailableInNestedScope3.ts, 0, 23)) +>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 1, 15)) +>a : Symbol(a, Decl(typeParametersAvailableInNestedScope3.ts, 1, 18)) +>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 1, 15)) +>a : Symbol(a, Decl(typeParametersAvailableInNestedScope3.ts, 1, 18)) + + function b(): T { return v; } +>b : Symbol(b, Decl(typeParametersAvailableInNestedScope3.ts, 1, 37)) +>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 0, 13)) +>v : Symbol(v, Decl(typeParametersAvailableInNestedScope3.ts, 0, 16)) + + function c(v: T) { +>c : Symbol(c, Decl(typeParametersAvailableInNestedScope3.ts, 2, 33)) +>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 4, 15)) +>v : Symbol(v, Decl(typeParametersAvailableInNestedScope3.ts, 4, 18)) +>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 4, 15)) + + function a(a: T) { return a; } +>a : Symbol(a, Decl(typeParametersAvailableInNestedScope3.ts, 4, 25)) +>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 5, 19)) +>a : Symbol(a, Decl(typeParametersAvailableInNestedScope3.ts, 5, 22)) +>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 5, 19)) +>a : Symbol(a, Decl(typeParametersAvailableInNestedScope3.ts, 5, 22)) + + function b(): T { return v; } +>b : Symbol(b, Decl(typeParametersAvailableInNestedScope3.ts, 5, 41)) +>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 4, 15)) +>v : Symbol(v, Decl(typeParametersAvailableInNestedScope3.ts, 4, 18)) + + return { a, b }; +>a : Symbol(a, Decl(typeParametersAvailableInNestedScope3.ts, 7, 16)) +>b : Symbol(b, Decl(typeParametersAvailableInNestedScope3.ts, 7, 19)) + } + + return { a, b, c }; +>a : Symbol(a, Decl(typeParametersAvailableInNestedScope3.ts, 10, 12)) +>b : Symbol(b, Decl(typeParametersAvailableInNestedScope3.ts, 10, 15)) +>c : Symbol(c, Decl(typeParametersAvailableInNestedScope3.ts, 10, 18)) +} + diff --git a/tests/baselines/reference/typeParametersAvailableInNestedScope3.types b/tests/baselines/reference/typeParametersAvailableInNestedScope3.types new file mode 100644 index 0000000000000..81e1ae7e73016 --- /dev/null +++ b/tests/baselines/reference/typeParametersAvailableInNestedScope3.types @@ -0,0 +1,40 @@ +=== tests/cases/conformance/types/typeParameters/typeParameterLists/typeParametersAvailableInNestedScope3.ts === +function foo(v: T) { +>foo : (v: T) => { a: (a: T) => T; b: () => T; c: (v: T) => { a: (a: T) => T; b: () => T; }; } +>v : T + + function a(a: T) { return a; } +>a : (a: T) => T +>a : T +>a : T + + function b(): T { return v; } +>b : () => T +>v : T + + function c(v: T) { +>c : (v: T) => { a: (a: T) => T; b: () => T; } +>v : T + + function a(a: T) { return a; } +>a : (a: T) => T +>a : T +>a : T + + function b(): T { return v; } +>b : () => T +>v : T + + return { a, b }; +>{ a, b } : { a: (a: T) => T; b: () => T; } +>a : (a: T) => T +>b : () => T + } + + return { a, b, c }; +>{ a, b, c } : { a: (a: T) => T; b: () => T; c: (v: T) => { a: (a: T) => T; b: () => T; }; } +>a : (a: T) => T +>b : () => T +>c : (v: T) => { a: (a: T) => T; b: () => T; } +} + diff --git a/tests/cases/conformance/types/typeParameters/typeParameterLists/typeParametersAvailableInNestedScope3.ts b/tests/cases/conformance/types/typeParameters/typeParameterLists/typeParametersAvailableInNestedScope3.ts new file mode 100644 index 0000000000000..bfc056c6749e3 --- /dev/null +++ b/tests/cases/conformance/types/typeParameters/typeParameterLists/typeParametersAvailableInNestedScope3.ts @@ -0,0 +1,14 @@ +// @declaration: true + +function foo(v: T) { + function a(a: T) { return a; } + function b(): T { return v; } + + function c(v: T) { + function a(a: T) { return a; } + function b(): T { return v; } + return { a, b }; + } + + return { a, b, c }; +}