From ca4ef16c8f75d305c21145aecd304a82471492e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Tue, 23 Jul 2024 01:00:16 +0200 Subject: [PATCH] Fixed crash in `classFields` transform related to broken bodyless constructors (#59280) Co-authored-by: Jake Bailey <5341706+jakebailey@users.noreply.github.com> --- src/compiler/transformers/classFields.ts | 4 ++-- ...ieldsBrokenConstructorEmitNoCrash1.errors.txt | 14 ++++++++++++++ .../classFieldsBrokenConstructorEmitNoCrash1.js | 16 ++++++++++++++++ ...ssFieldsBrokenConstructorEmitNoCrash1.symbols | 12 ++++++++++++ ...lassFieldsBrokenConstructorEmitNoCrash1.types | 16 ++++++++++++++++ .../classFieldsBrokenConstructorEmitNoCrash1.ts | 8 ++++++++ 6 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/classFieldsBrokenConstructorEmitNoCrash1.errors.txt create mode 100644 tests/baselines/reference/classFieldsBrokenConstructorEmitNoCrash1.js create mode 100644 tests/baselines/reference/classFieldsBrokenConstructorEmitNoCrash1.symbols create mode 100644 tests/baselines/reference/classFieldsBrokenConstructorEmitNoCrash1.types create mode 100644 tests/cases/compiler/classFieldsBrokenConstructorEmitNoCrash1.ts diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 7ddafb36f7e..5a1b4321792 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -2416,11 +2416,11 @@ export function transformClassFields(context: TransformationContext): (x: Source factory.createBlock( setTextRange( factory.createNodeArray(statements), - /*location*/ constructor ? constructor.body!.statements : node.members, + /*location*/ constructor?.body?.statements ?? node.members, ), multiLine, ), - /*location*/ constructor ? constructor.body : undefined, + /*location*/ constructor?.body, ); } diff --git a/tests/baselines/reference/classFieldsBrokenConstructorEmitNoCrash1.errors.txt b/tests/baselines/reference/classFieldsBrokenConstructorEmitNoCrash1.errors.txt new file mode 100644 index 00000000000..882569d85c1 --- /dev/null +++ b/tests/baselines/reference/classFieldsBrokenConstructorEmitNoCrash1.errors.txt @@ -0,0 +1,14 @@ +classFieldsBrokenConstructorEmitNoCrash1.ts(3,3): error TS2390: Constructor implementation is missing. +classFieldsBrokenConstructorEmitNoCrash1.ts(4,1): error TS1005: '(' expected. + + +==== classFieldsBrokenConstructorEmitNoCrash1.ts (2 errors) ==== + class Test { + prop = 42; + constructor + ~~~~~~~~~~~ +!!! error TS2390: Constructor implementation is missing. + } + ~ +!!! error TS1005: '(' expected. + \ No newline at end of file diff --git a/tests/baselines/reference/classFieldsBrokenConstructorEmitNoCrash1.js b/tests/baselines/reference/classFieldsBrokenConstructorEmitNoCrash1.js new file mode 100644 index 00000000000..4e12c57a8b2 --- /dev/null +++ b/tests/baselines/reference/classFieldsBrokenConstructorEmitNoCrash1.js @@ -0,0 +1,16 @@ +//// [tests/cases/compiler/classFieldsBrokenConstructorEmitNoCrash1.ts] //// + +//// [classFieldsBrokenConstructorEmitNoCrash1.ts] +class Test { + prop = 42; + constructor +} + + +//// [classFieldsBrokenConstructorEmitNoCrash1.js] +"use strict"; +class Test { + constructor() { + this.prop = 42; + } +} diff --git a/tests/baselines/reference/classFieldsBrokenConstructorEmitNoCrash1.symbols b/tests/baselines/reference/classFieldsBrokenConstructorEmitNoCrash1.symbols new file mode 100644 index 00000000000..4ea4711c805 --- /dev/null +++ b/tests/baselines/reference/classFieldsBrokenConstructorEmitNoCrash1.symbols @@ -0,0 +1,12 @@ +//// [tests/cases/compiler/classFieldsBrokenConstructorEmitNoCrash1.ts] //// + +=== classFieldsBrokenConstructorEmitNoCrash1.ts === +class Test { +>Test : Symbol(Test, Decl(classFieldsBrokenConstructorEmitNoCrash1.ts, 0, 0)) + + prop = 42; +>prop : Symbol(Test.prop, Decl(classFieldsBrokenConstructorEmitNoCrash1.ts, 0, 12)) + + constructor +} + diff --git a/tests/baselines/reference/classFieldsBrokenConstructorEmitNoCrash1.types b/tests/baselines/reference/classFieldsBrokenConstructorEmitNoCrash1.types new file mode 100644 index 00000000000..6619167936e --- /dev/null +++ b/tests/baselines/reference/classFieldsBrokenConstructorEmitNoCrash1.types @@ -0,0 +1,16 @@ +//// [tests/cases/compiler/classFieldsBrokenConstructorEmitNoCrash1.ts] //// + +=== classFieldsBrokenConstructorEmitNoCrash1.ts === +class Test { +>Test : Test +> : ^^^^ + + prop = 42; +>prop : number +> : ^^^^^^ +>42 : 42 +> : ^^ + + constructor +} + diff --git a/tests/cases/compiler/classFieldsBrokenConstructorEmitNoCrash1.ts b/tests/cases/compiler/classFieldsBrokenConstructorEmitNoCrash1.ts new file mode 100644 index 00000000000..f9a9e712ccd --- /dev/null +++ b/tests/cases/compiler/classFieldsBrokenConstructorEmitNoCrash1.ts @@ -0,0 +1,8 @@ +// @strict: true +// @useDefineForClassFields: false +// @target: es2021 + +class Test { + prop = 42; + constructor +}