From 6ea291a14267f8d3b12a01b4f950dfe66e975bf9 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Tue, 21 Apr 2020 12:58:37 -0700 Subject: [PATCH] Remove superCallShouldBeFirst error (#37947) * Remove superCallShouldBeFirst error It seems redundant since TS gives an error on any use of `this` before super, and non-`this` uses before `super` should be fine. Fixes #37371 * Revert "Remove superCallShouldBeFirst error" This reverts commit 3c09153c8ad00d73d60e7000a0e6263a6028615a. * error except for target:"esnext" && useDefineForClassFields --- src/compiler/checker.ts | 5 +++-- ...vateNameBadSuperUseDefineForClassFields.js | 22 +++++++++++++++++++ ...ameBadSuperUseDefineForClassFields.symbols | 18 +++++++++++++++ ...eNameBadSuperUseDefineForClassFields.types | 22 +++++++++++++++++++ ...vateNameBadSuperUseDefineForClassFields.ts | 10 +++++++++ 5 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/privateNameBadSuperUseDefineForClassFields.js create mode 100644 tests/baselines/reference/privateNameBadSuperUseDefineForClassFields.symbols create mode 100644 tests/baselines/reference/privateNameBadSuperUseDefineForClassFields.types create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameBadSuperUseDefineForClassFields.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9b5013e314..b65eca1f8a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -29677,8 +29677,9 @@ namespace ts { // - The constructor declares parameter properties // or the containing class declares instance member variables with initializers. const superCallShouldBeFirst = - some((node.parent).members, isInstancePropertyWithInitializerOrPrivateIdentifierProperty) || - some(node.parameters, p => hasModifier(p, ModifierFlags.ParameterPropertyModifier)); + (compilerOptions.target !== ScriptTarget.ESNext || !compilerOptions.useDefineForClassFields) && + (some((node.parent).members, isInstancePropertyWithInitializerOrPrivateIdentifierProperty) || + some(node.parameters, p => hasModifier(p, ModifierFlags.ParameterPropertyModifier))); // Skip past any prologue directives to find the first statement // to ensure that it was a super call. diff --git a/tests/baselines/reference/privateNameBadSuperUseDefineForClassFields.js b/tests/baselines/reference/privateNameBadSuperUseDefineForClassFields.js new file mode 100644 index 0000000000..018c1eaaec --- /dev/null +++ b/tests/baselines/reference/privateNameBadSuperUseDefineForClassFields.js @@ -0,0 +1,22 @@ +//// [privateNameBadSuperUseDefineForClassFields.ts] +class B {}; +class A extends B { + #x; + constructor() { + void 0; // Error: 'super' call must come first + super(); + } +} + + +//// [privateNameBadSuperUseDefineForClassFields.js] +class B { +} +; +class A extends B { + #x; + constructor() { + void 0; // Error: 'super' call must come first + super(); + } +} diff --git a/tests/baselines/reference/privateNameBadSuperUseDefineForClassFields.symbols b/tests/baselines/reference/privateNameBadSuperUseDefineForClassFields.symbols new file mode 100644 index 0000000000..5e5115d741 --- /dev/null +++ b/tests/baselines/reference/privateNameBadSuperUseDefineForClassFields.symbols @@ -0,0 +1,18 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameBadSuperUseDefineForClassFields.ts === +class B {}; +>B : Symbol(B, Decl(privateNameBadSuperUseDefineForClassFields.ts, 0, 0)) + +class A extends B { +>A : Symbol(A, Decl(privateNameBadSuperUseDefineForClassFields.ts, 0, 11)) +>B : Symbol(B, Decl(privateNameBadSuperUseDefineForClassFields.ts, 0, 0)) + + #x; +>#x : Symbol(A.#x, Decl(privateNameBadSuperUseDefineForClassFields.ts, 1, 19)) + + constructor() { + void 0; // Error: 'super' call must come first + super(); +>super : Symbol(B, Decl(privateNameBadSuperUseDefineForClassFields.ts, 0, 0)) + } +} + diff --git a/tests/baselines/reference/privateNameBadSuperUseDefineForClassFields.types b/tests/baselines/reference/privateNameBadSuperUseDefineForClassFields.types new file mode 100644 index 0000000000..55432691ae --- /dev/null +++ b/tests/baselines/reference/privateNameBadSuperUseDefineForClassFields.types @@ -0,0 +1,22 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameBadSuperUseDefineForClassFields.ts === +class B {}; +>B : B + +class A extends B { +>A : A +>B : B + + #x; +>#x : any + + constructor() { + void 0; // Error: 'super' call must come first +>void 0 : undefined +>0 : 0 + + super(); +>super() : void +>super : typeof B + } +} + diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameBadSuperUseDefineForClassFields.ts b/tests/cases/conformance/classes/members/privateNames/privateNameBadSuperUseDefineForClassFields.ts new file mode 100644 index 0000000000..984b65a569 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameBadSuperUseDefineForClassFields.ts @@ -0,0 +1,10 @@ +// @target: esnext +// @useDefineForClassFields: true +class B {}; +class A extends B { + #x; + constructor() { + void 0; // Error: 'super' call must come first + super(); + } +}