From 8b496ed34cd8d555395019d276601dead578fbcf Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Fri, 2 Jul 2021 18:37:23 -0700 Subject: [PATCH] Fix class name reference in class expr (#44877) --- src/compiler/checker.ts | 2 +- .../baselines/reference/classStaticBlock27.js | 41 +++++++++++++ .../reference/classStaticBlock27.symbols | 52 ++++++++++++++++ .../reference/classStaticBlock27.types | 61 +++++++++++++++++++ .../classStaticBlock/classStaticBlock27.ts | 17 ++++++ 5 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/classStaticBlock27.js create mode 100644 tests/baselines/reference/classStaticBlock27.symbols create mode 100644 tests/baselines/reference/classStaticBlock27.types create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock27.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 22470405b6a..d8d282086fd 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -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; } diff --git a/tests/baselines/reference/classStaticBlock27.js b/tests/baselines/reference/classStaticBlock27.js new file mode 100644 index 00000000000..7e281767dcd --- /dev/null +++ b/tests/baselines/reference/classStaticBlock27.js @@ -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); diff --git a/tests/baselines/reference/classStaticBlock27.symbols b/tests/baselines/reference/classStaticBlock27.symbols new file mode 100644 index 00000000000..a5c6ef843bf --- /dev/null +++ b/tests/baselines/reference/classStaticBlock27.symbols @@ -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)) + } +} diff --git a/tests/baselines/reference/classStaticBlock27.types b/tests/baselines/reference/classStaticBlock27.types new file mode 100644 index 00000000000..9b086620da8 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock27.types @@ -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 + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock27.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock27.ts new file mode 100644 index 00000000000..eca2c326d23 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock27.ts @@ -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++; + } +} \ No newline at end of file