Skip to content

Commit 3206df8

Browse files
authored
fix(47561): use parameter name from enclosing declaration (#47609)
1 parent d56d621 commit 3206df8

File tree

5 files changed

+141
-1
lines changed

5 files changed

+141
-1
lines changed

src/compiler/checker.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -6397,7 +6397,8 @@ namespace ts {
63976397
includePrivateSymbol?.(sym);
63986398
}
63996399
if (isIdentifier(node)) {
6400-
const name = sym.flags & SymbolFlags.TypeParameter ? typeParameterToName(getDeclaredTypeOfSymbol(sym), context) : factory.cloneNode(node);
6400+
const type = getDeclaredTypeOfSymbol(sym);
6401+
const name = sym.flags & SymbolFlags.TypeParameter && !isTypeSymbolAccessible(type.symbol, context.enclosingDeclaration) ? typeParameterToName(type, context) : factory.cloneNode(node);
64016402
name.symbol = sym; // for quickinfo, which uses identifier symbol information
64026403
return { introducesError, node: setEmitFlags(setOriginalNode(name, node), EmitFlags.NoAsciiEscaping) };
64036404
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//// [typeParametersAvailableInNestedScope3.ts]
2+
function foo<T>(v: T) {
3+
function a<T>(a: T) { return a; }
4+
function b(): T { return v; }
5+
6+
function c<T>(v: T) {
7+
function a<T>(a: T) { return a; }
8+
function b(): T { return v; }
9+
return { a, b };
10+
}
11+
12+
return { a, b, c };
13+
}
14+
15+
16+
//// [typeParametersAvailableInNestedScope3.js]
17+
function foo(v) {
18+
function a(a) { return a; }
19+
function b() { return v; }
20+
function c(v) {
21+
function a(a) { return a; }
22+
function b() { return v; }
23+
return { a: a, b: b };
24+
}
25+
return { a: a, b: b, c: c };
26+
}
27+
28+
29+
//// [typeParametersAvailableInNestedScope3.d.ts]
30+
declare function foo<T>(v: T): {
31+
a: <T_1>(a: T_1) => T_1;
32+
b: () => T;
33+
c: <T_2>(v: T_2) => {
34+
a: <T_3>(a: T_3) => T_3;
35+
b: () => T_2;
36+
};
37+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
=== tests/cases/conformance/types/typeParameters/typeParameterLists/typeParametersAvailableInNestedScope3.ts ===
2+
function foo<T>(v: T) {
3+
>foo : Symbol(foo, Decl(typeParametersAvailableInNestedScope3.ts, 0, 0))
4+
>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 0, 13))
5+
>v : Symbol(v, Decl(typeParametersAvailableInNestedScope3.ts, 0, 16))
6+
>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 0, 13))
7+
8+
function a<T>(a: T) { return a; }
9+
>a : Symbol(a, Decl(typeParametersAvailableInNestedScope3.ts, 0, 23))
10+
>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 1, 15))
11+
>a : Symbol(a, Decl(typeParametersAvailableInNestedScope3.ts, 1, 18))
12+
>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 1, 15))
13+
>a : Symbol(a, Decl(typeParametersAvailableInNestedScope3.ts, 1, 18))
14+
15+
function b(): T { return v; }
16+
>b : Symbol(b, Decl(typeParametersAvailableInNestedScope3.ts, 1, 37))
17+
>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 0, 13))
18+
>v : Symbol(v, Decl(typeParametersAvailableInNestedScope3.ts, 0, 16))
19+
20+
function c<T>(v: T) {
21+
>c : Symbol(c, Decl(typeParametersAvailableInNestedScope3.ts, 2, 33))
22+
>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 4, 15))
23+
>v : Symbol(v, Decl(typeParametersAvailableInNestedScope3.ts, 4, 18))
24+
>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 4, 15))
25+
26+
function a<T>(a: T) { return a; }
27+
>a : Symbol(a, Decl(typeParametersAvailableInNestedScope3.ts, 4, 25))
28+
>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 5, 19))
29+
>a : Symbol(a, Decl(typeParametersAvailableInNestedScope3.ts, 5, 22))
30+
>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 5, 19))
31+
>a : Symbol(a, Decl(typeParametersAvailableInNestedScope3.ts, 5, 22))
32+
33+
function b(): T { return v; }
34+
>b : Symbol(b, Decl(typeParametersAvailableInNestedScope3.ts, 5, 41))
35+
>T : Symbol(T, Decl(typeParametersAvailableInNestedScope3.ts, 4, 15))
36+
>v : Symbol(v, Decl(typeParametersAvailableInNestedScope3.ts, 4, 18))
37+
38+
return { a, b };
39+
>a : Symbol(a, Decl(typeParametersAvailableInNestedScope3.ts, 7, 16))
40+
>b : Symbol(b, Decl(typeParametersAvailableInNestedScope3.ts, 7, 19))
41+
}
42+
43+
return { a, b, c };
44+
>a : Symbol(a, Decl(typeParametersAvailableInNestedScope3.ts, 10, 12))
45+
>b : Symbol(b, Decl(typeParametersAvailableInNestedScope3.ts, 10, 15))
46+
>c : Symbol(c, Decl(typeParametersAvailableInNestedScope3.ts, 10, 18))
47+
}
48+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
=== tests/cases/conformance/types/typeParameters/typeParameterLists/typeParametersAvailableInNestedScope3.ts ===
2+
function foo<T>(v: T) {
3+
>foo : <T>(v: T) => { a: <T>(a: T) => T; b: () => T; c: <T>(v: T) => { a: <T>(a: T) => T; b: () => T; }; }
4+
>v : T
5+
6+
function a<T>(a: T) { return a; }
7+
>a : <T>(a: T) => T
8+
>a : T
9+
>a : T
10+
11+
function b(): T { return v; }
12+
>b : () => T
13+
>v : T
14+
15+
function c<T>(v: T) {
16+
>c : <T>(v: T) => { a: <T>(a: T) => T; b: () => T; }
17+
>v : T
18+
19+
function a<T>(a: T) { return a; }
20+
>a : <T>(a: T) => T
21+
>a : T
22+
>a : T
23+
24+
function b(): T { return v; }
25+
>b : () => T
26+
>v : T
27+
28+
return { a, b };
29+
>{ a, b } : { a: <T>(a: T) => T; b: () => T; }
30+
>a : <T>(a: T) => T
31+
>b : () => T
32+
}
33+
34+
return { a, b, c };
35+
>{ a, b, c } : { a: <T>(a: T) => T; b: () => T; c: <T>(v: T) => { a: <T>(a: T) => T; b: () => T; }; }
36+
>a : <T>(a: T) => T
37+
>b : () => T
38+
>c : <T>(v: T) => { a: <T>(a: T) => T; b: () => T; }
39+
}
40+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// @declaration: true
2+
3+
function foo<T>(v: T) {
4+
function a<T>(a: T) { return a; }
5+
function b(): T { return v; }
6+
7+
function c<T>(v: T) {
8+
function a<T>(a: T) { return a; }
9+
function b(): T { return v; }
10+
return { a, b };
11+
}
12+
13+
return { a, b, c };
14+
}

0 commit comments

Comments
 (0)