Fix class name reference in class expr (#44877)

This commit is contained in:
Ron Buckton 2021-07-02 18:37:23 -07:00 committed by GitHub
parent 62f9155a9d
commit 8b496ed34c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 172 additions and 1 deletions

View File

@ -24354,7 +24354,7 @@ namespace ts {
let container = getThisContainer(node, /*includeArrowFunctions*/ false);
while (container.kind !== SyntaxKind.SourceFile) {
if (container.parent === declaration) {
if (container.kind === SyntaxKind.PropertyDeclaration && isStatic(container)) {
if (isPropertyDeclaration(container) && isStatic(container) || isClassStaticBlockDeclaration(container)) {
getNodeLinks(declaration).flags |= NodeCheckFlags.ClassWithConstructorReference;
getNodeLinks(node).flags |= NodeCheckFlags.ConstructorReferenceInClass;
}

View File

@ -0,0 +1,41 @@
//// [classStaticBlock27.ts]
// https://github.com/microsoft/TypeScript/issues/44872
void class Foo {
static prop = 1
static {
console.log(Foo.prop);
Foo.prop++;
}
static {
console.log(Foo.prop);
Foo.prop++;
}
static {
console.log(Foo.prop);
Foo.prop++;
}
}
//// [classStaticBlock27.js]
// https://github.com/microsoft/TypeScript/issues/44872
var _a;
void (_a = /** @class */ (function () {
function Foo() {
}
return Foo;
}()),
_a.prop = 1,
(function () {
console.log(_a.prop);
_a.prop++;
})(),
(function () {
console.log(_a.prop);
_a.prop++;
})(),
(function () {
console.log(_a.prop);
_a.prop++;
})(),
_a);

View File

@ -0,0 +1,52 @@
=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock27.ts ===
// https://github.com/microsoft/TypeScript/issues/44872
void class Foo {
>Foo : Symbol(Foo, Decl(classStaticBlock27.ts, 2, 4))
static prop = 1
>prop : Symbol(Foo.prop, Decl(classStaticBlock27.ts, 2, 16))
static {
console.log(Foo.prop);
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
>Foo.prop : Symbol(Foo.prop, Decl(classStaticBlock27.ts, 2, 16))
>Foo : Symbol(Foo, Decl(classStaticBlock27.ts, 2, 4))
>prop : Symbol(Foo.prop, Decl(classStaticBlock27.ts, 2, 16))
Foo.prop++;
>Foo.prop : Symbol(Foo.prop, Decl(classStaticBlock27.ts, 2, 16))
>Foo : Symbol(Foo, Decl(classStaticBlock27.ts, 2, 4))
>prop : Symbol(Foo.prop, Decl(classStaticBlock27.ts, 2, 16))
}
static {
console.log(Foo.prop);
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
>Foo.prop : Symbol(Foo.prop, Decl(classStaticBlock27.ts, 2, 16))
>Foo : Symbol(Foo, Decl(classStaticBlock27.ts, 2, 4))
>prop : Symbol(Foo.prop, Decl(classStaticBlock27.ts, 2, 16))
Foo.prop++;
>Foo.prop : Symbol(Foo.prop, Decl(classStaticBlock27.ts, 2, 16))
>Foo : Symbol(Foo, Decl(classStaticBlock27.ts, 2, 4))
>prop : Symbol(Foo.prop, Decl(classStaticBlock27.ts, 2, 16))
}
static {
console.log(Foo.prop);
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
>Foo.prop : Symbol(Foo.prop, Decl(classStaticBlock27.ts, 2, 16))
>Foo : Symbol(Foo, Decl(classStaticBlock27.ts, 2, 4))
>prop : Symbol(Foo.prop, Decl(classStaticBlock27.ts, 2, 16))
Foo.prop++;
>Foo.prop : Symbol(Foo.prop, Decl(classStaticBlock27.ts, 2, 16))
>Foo : Symbol(Foo, Decl(classStaticBlock27.ts, 2, 4))
>prop : Symbol(Foo.prop, Decl(classStaticBlock27.ts, 2, 16))
}
}

View File

@ -0,0 +1,61 @@
=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock27.ts ===
// https://github.com/microsoft/TypeScript/issues/44872
void class Foo {
>void class Foo { static prop = 1 static { console.log(Foo.prop); Foo.prop++; } static { console.log(Foo.prop); Foo.prop++; } static { console.log(Foo.prop); Foo.prop++; }} : undefined
>class Foo { static prop = 1 static { console.log(Foo.prop); Foo.prop++; } static { console.log(Foo.prop); Foo.prop++; } static { console.log(Foo.prop); Foo.prop++; }} : typeof Foo
>Foo : typeof Foo
static prop = 1
>prop : number
>1 : 1
static {
console.log(Foo.prop);
>console.log(Foo.prop) : void
>console.log : (...data: any[]) => void
>console : Console
>log : (...data: any[]) => void
>Foo.prop : number
>Foo : typeof Foo
>prop : number
Foo.prop++;
>Foo.prop++ : number
>Foo.prop : number
>Foo : typeof Foo
>prop : number
}
static {
console.log(Foo.prop);
>console.log(Foo.prop) : void
>console.log : (...data: any[]) => void
>console : Console
>log : (...data: any[]) => void
>Foo.prop : number
>Foo : typeof Foo
>prop : number
Foo.prop++;
>Foo.prop++ : number
>Foo.prop : number
>Foo : typeof Foo
>prop : number
}
static {
console.log(Foo.prop);
>console.log(Foo.prop) : void
>console.log : (...data: any[]) => void
>console : Console
>log : (...data: any[]) => void
>Foo.prop : number
>Foo : typeof Foo
>prop : number
Foo.prop++;
>Foo.prop++ : number
>Foo.prop : number
>Foo : typeof Foo
>prop : number
}
}

View File

@ -0,0 +1,17 @@
// https://github.com/microsoft/TypeScript/issues/44872
void class Foo {
static prop = 1
static {
console.log(Foo.prop);
Foo.prop++;
}
static {
console.log(Foo.prop);
Foo.prop++;
}
static {
console.log(Foo.prop);
Foo.prop++;
}
}