Avoid circularly resolving names when looking up type members using resolveName (#26924)

* Avoid circularly resolving names when looking up type members using resolveName

* Add comment
This commit is contained in:
Wesley Wigham 2018-09-12 17:16:34 -07:00 committed by GitHub
parent 614423b287
commit d3463ce356
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 37 additions and 1 deletions

View File

@ -1312,7 +1312,10 @@ namespace ts {
case SyntaxKind.ClassDeclaration:
case SyntaxKind.ClassExpression:
case SyntaxKind.InterfaceDeclaration:
if (result = lookup(getMembersOfSymbol(getSymbolOfNode(location as ClassLikeDeclaration | InterfaceDeclaration)), name, meaning & SymbolFlags.Type)) {
// The below is used to lookup type parameters within a class or interface, as they are added to the class/interface locals
// These can never be latebound, so the symbol's raw members are sufficient. `getMembersOfNode` cannot be used, as it would
// trigger resolving late-bound names, which we may already be in the process of doing while we're here!
if (result = lookup(getSymbolOfNode(location as ClassLikeDeclaration | InterfaceDeclaration).members || emptySymbols, name, meaning & SymbolFlags.Type)) {
if (!isTypeParameterSymbolDeclaredInContainer(result, location)) {
// ignore type parameters not declared in this container
result = undefined;

View File

@ -0,0 +1,14 @@
=== tests/cases/compiler/index.d.ts ===
export class C extends Object {
>C : Symbol(C, Decl(index.d.ts, 0, 0))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
static readonly p: unique symbol;
>p : Symbol(C.p, Decl(index.d.ts, 0, 31))
[C.p](): void;
>[C.p] : Symbol(C[C.p], Decl(index.d.ts, 1, 37))
>C.p : Symbol(C.p, Decl(index.d.ts, 0, 31))
>C : Symbol(C, Decl(index.d.ts, 0, 0))
>p : Symbol(C.p, Decl(index.d.ts, 0, 31))
}

View File

@ -0,0 +1,14 @@
=== tests/cases/compiler/index.d.ts ===
export class C extends Object {
>C : C
>Object : Object
static readonly p: unique symbol;
>p : unique symbol
[C.p](): void;
>[C.p] : () => void
>C.p : unique symbol
>C : typeof C
>p : unique symbol
}

View File

@ -0,0 +1,5 @@
// @filename: index.d.ts
export class C extends Object {
static readonly p: unique symbol;
[C.p](): void;
}