Skip to content

Commit 3215d45

Browse files
authored
Resolve aliases in resolveEntityName until we find the given meaning (#4043)
1 parent c54ff7c commit 3215d45

4 files changed

Lines changed: 100 additions & 2 deletions

File tree

internal/checker/checker.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15691,8 +15691,9 @@ func (c *Checker) resolveEntityName(name *ast.Node, meaning ast.SymbolFlags, ign
1569115691
(symbol.Flags&ast.SymbolFlagsAlias != 0 || name.Parent != nil && name.Parent.Kind == ast.KindExportAssignment) {
1569215692
c.markSymbolOfAliasDeclarationIfTypeOnly(getAliasDeclarationFromName(name), nil)
1569315693
}
15694-
if symbol.Flags&meaning == 0 && !dontResolveAlias && symbol.Flags&ast.SymbolFlagsAlias != 0 {
15695-
return c.resolveAlias(symbol)
15694+
// We know a symbol with the given meaning exists along the alias chain, so resolve until we find it.
15695+
for symbol.Flags&meaning == 0 && !dontResolveAlias && symbol.Flags&ast.SymbolFlagsAlias != 0 {
15696+
symbol = c.resolveAlias(symbol)
1569615697
}
1569715698
}
1569815699
return symbol
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//// [tests/cases/compiler/cjsExportGenericTypes.ts] ////
2+
3+
=== index.js ===
4+
const Set = require("./set");
5+
>Set : Symbol(Set, Decl(index.js, 0, 5))
6+
>require : Symbol(require)
7+
>"./set" : Symbol("./set", Decl(set.js, 0, 0))
8+
9+
/** @typedef {Set<string>} MyDefinedType */
10+
11+
=== set.js ===
12+
/**
13+
* @template D
14+
* @typedef {(a: D, b: D) => number} SomeUnrelatedGeneric
15+
*/
16+
17+
/**
18+
* @template T
19+
*/
20+
class SomeGenericClass {
21+
>SomeGenericClass : Symbol(SomeGenericClass, Decl(set.js, 0, 0))
22+
23+
/**
24+
* @param {Set<T>} param
25+
*/
26+
constructor(param) {}
27+
>param : Symbol(param, Decl(set.js, 12, 14))
28+
}
29+
30+
module.exports = SomeGenericClass;
31+
>module.exports : Symbol(exports, Decl(set.js, 0, 0))
32+
>module : Symbol(module, Decl(set.js, 0, 0))
33+
>exports : Symbol(exports, Decl(set.js, 0, 0))
34+
>SomeGenericClass : Symbol(SomeGenericClass, Decl(set.js, 0, 0))
35+
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//// [tests/cases/compiler/cjsExportGenericTypes.ts] ////
2+
3+
=== index.js ===
4+
const Set = require("./set");
5+
>Set : typeof SomeGenericClass
6+
>require("./set") : typeof SomeGenericClass
7+
>require : any
8+
>"./set" : "./set"
9+
10+
/** @typedef {Set<string>} MyDefinedType */
11+
12+
=== set.js ===
13+
/**
14+
* @template D
15+
* @typedef {(a: D, b: D) => number} SomeUnrelatedGeneric
16+
*/
17+
18+
/**
19+
* @template T
20+
*/
21+
class SomeGenericClass {
22+
>SomeGenericClass : SomeGenericClass<T>
23+
24+
/**
25+
* @param {Set<T>} param
26+
*/
27+
constructor(param) {}
28+
>param : Set<T>
29+
}
30+
31+
module.exports = SomeGenericClass;
32+
>module.exports = SomeGenericClass : typeof SomeGenericClass
33+
>module.exports : typeof SomeGenericClass
34+
>module : { exports: typeof SomeGenericClass; }
35+
>exports : typeof SomeGenericClass
36+
>SomeGenericClass : typeof SomeGenericClass
37+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// @checkJs: true
2+
// @noEmit: true
3+
4+
// @filename: set.js
5+
/**
6+
* @template D
7+
* @typedef {(a: D, b: D) => number} SomeUnrelatedGeneric
8+
*/
9+
10+
/**
11+
* @template T
12+
*/
13+
class SomeGenericClass {
14+
/**
15+
* @param {Set<T>} param
16+
*/
17+
constructor(param) {}
18+
}
19+
20+
module.exports = SomeGenericClass;
21+
22+
// @filename: index.js
23+
const Set = require("./set");
24+
25+
/** @typedef {Set<string>} MyDefinedType */

0 commit comments

Comments
 (0)