From 3a4674b76870aa42aac64d0a5a3aaafb92e246e1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 25 Sep 2025 18:44:16 +0000 Subject: [PATCH 1/7] Initial plan From 53d08bf6fd67220fbb020e178c1b06c83a97ac0e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 25 Sep 2025 18:53:14 +0000 Subject: [PATCH 2/7] Initial test case for definite assignment assertion issue Co-authored-by: jakebailey <5341706+jakebailey@users.noreply.github.com> --- ...efiniteAssignmentAssertionInDeclaration.js | 36 +++++++++++++++++++ ...teAssignmentAssertionInDeclaration.symbols | 9 +++++ ...niteAssignmentAssertionInDeclaration.types | 9 +++++ ...efiniteAssignmentAssertionInDeclaration.ts | 5 +++ 4 files changed, 59 insertions(+) create mode 100644 testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.js create mode 100644 testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.symbols create mode 100644 testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.types create mode 100644 testdata/tests/cases/compiler/definiteAssignmentAssertionInDeclaration.ts diff --git a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.js b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.js new file mode 100644 index 0000000000..caf713ae22 --- /dev/null +++ b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.js @@ -0,0 +1,36 @@ +//// [tests/cases/compiler/definiteAssignmentAssertionInDeclaration.ts] //// + +//// [definiteAssignmentAssertionInDeclaration.ts] +export class DbObject { + id!: string; +} + +//// [definiteAssignmentAssertionInDeclaration.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DbObject = void 0; +class DbObject { + id; +} +exports.DbObject = DbObject; + + +//// [definiteAssignmentAssertionInDeclaration.d.ts] +export declare class DbObject { + id!: string; +} + + +//// [DtsFileErrors] + + +definiteAssignmentAssertionInDeclaration.d.ts(2,7): error TS1255: A definite assignment assertion '!' is not permitted in this context. + + +==== definiteAssignmentAssertionInDeclaration.d.ts (1 errors) ==== + export declare class DbObject { + id!: string; + ~ +!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. + } + \ No newline at end of file diff --git a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.symbols b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.symbols new file mode 100644 index 0000000000..11a7b1358c --- /dev/null +++ b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.symbols @@ -0,0 +1,9 @@ +//// [tests/cases/compiler/definiteAssignmentAssertionInDeclaration.ts] //// + +=== definiteAssignmentAssertionInDeclaration.ts === +export class DbObject { +>DbObject : Symbol(DbObject, Decl(definiteAssignmentAssertionInDeclaration.ts, 0, 0)) + + id!: string; +>id : Symbol(DbObject.id, Decl(definiteAssignmentAssertionInDeclaration.ts, 0, 23)) +} diff --git a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.types b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.types new file mode 100644 index 0000000000..30467cca75 --- /dev/null +++ b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.types @@ -0,0 +1,9 @@ +//// [tests/cases/compiler/definiteAssignmentAssertionInDeclaration.ts] //// + +=== definiteAssignmentAssertionInDeclaration.ts === +export class DbObject { +>DbObject : DbObject + + id!: string; +>id : string +} diff --git a/testdata/tests/cases/compiler/definiteAssignmentAssertionInDeclaration.ts b/testdata/tests/cases/compiler/definiteAssignmentAssertionInDeclaration.ts new file mode 100644 index 0000000000..d9fc0ab149 --- /dev/null +++ b/testdata/tests/cases/compiler/definiteAssignmentAssertionInDeclaration.ts @@ -0,0 +1,5 @@ +// @declaration: true +// @strict: true +export class DbObject { + id!: string; +} \ No newline at end of file From 00255191323b7340d3dd2efaafbc0925dd0cc3fe Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 25 Sep 2025 19:00:36 +0000 Subject: [PATCH 3/7] Fix: Remove definite assignment assertions from declaration files Co-authored-by: jakebailey <5341706+jakebailey@users.noreply.github.com> --- .../transformers/declarations/transform.go | 18 +++++++- ...efiniteAssignmentAssertionInDeclaration.js | 17 +------ ...tAssertionInDeclarationExtended.errors.txt | 19 ++++++++ ...ssignmentAssertionInDeclarationExtended.js | 45 +++++++++++++++++++ ...mentAssertionInDeclarationExtended.symbols | 34 ++++++++++++++ ...gnmentAssertionInDeclarationExtended.types | 33 ++++++++++++++ .../declarationEmitTypeofThisInClass.js | 23 +--------- .../declarationEmitTypeofThisInClass.js.diff | 26 ++--------- .../initializerWithThisPropertyAccess.js | 2 +- .../initializerWithThisPropertyAccess.js.diff | 8 +--- .../definiteAssignmentAssertions.js | 16 +++---- .../definiteAssignmentAssertions.js.diff | 24 ++++------ .../conformance/importEqualsDeclaration.js | 2 +- .../importEqualsDeclaration.js.diff | 11 +---- ...ssignmentAssertionInDeclarationExtended.ts | 16 +++++++ 15 files changed, 190 insertions(+), 104 deletions(-) create mode 100644 testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.errors.txt create mode 100644 testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.js create mode 100644 testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.symbols create mode 100644 testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.types create mode 100644 testdata/tests/cases/compiler/definiteAssignmentAssertionInDeclarationExtended.ts diff --git a/internal/transformers/declarations/transform.go b/internal/transformers/declarations/transform.go index 07ff921521..76bcd31720 100644 --- a/internal/transformers/declarations/transform.go +++ b/internal/transformers/declarations/transform.go @@ -727,11 +727,18 @@ func (tx *DeclarationTransformer) transformPropertySignatureDeclaration(input *a if ast.IsPrivateIdentifier(input.Name()) { return nil } + // Remove definite assignment assertion (!) in declaration files + var postfixToken *ast.TokenNode + if input.PostfixToken != nil && input.PostfixToken.Kind == ast.KindExclamationToken { + postfixToken = nil + } else { + postfixToken = input.PostfixToken + } return tx.Factory().UpdatePropertySignatureDeclaration( input, tx.ensureModifiers(input.AsNode()), input.Name(), - input.PostfixToken, + postfixToken, tx.ensureType(input.AsNode(), false), tx.ensureNoInitializer(input.AsNode()), // TODO: possible strada bug (fixed here) - const property signatures never initialized ) @@ -741,11 +748,18 @@ func (tx *DeclarationTransformer) transformPropertyDeclaration(input *ast.Proper if ast.IsPrivateIdentifier(input.Name()) { return nil } + // Remove definite assignment assertion (!) in declaration files + var postfixToken *ast.TokenNode + if input.PostfixToken != nil && input.PostfixToken.Kind == ast.KindExclamationToken { + postfixToken = nil + } else { + postfixToken = input.PostfixToken + } return tx.Factory().UpdatePropertyDeclaration( input, tx.ensureModifiers(input.AsNode()), input.Name(), - input.PostfixToken, + postfixToken, tx.ensureType(input.AsNode(), false), tx.ensureNoInitializer(input.AsNode()), ) diff --git a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.js b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.js index caf713ae22..a841baf170 100644 --- a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.js +++ b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.js @@ -17,20 +17,5 @@ exports.DbObject = DbObject; //// [definiteAssignmentAssertionInDeclaration.d.ts] export declare class DbObject { - id!: string; + id: string; } - - -//// [DtsFileErrors] - - -definiteAssignmentAssertionInDeclaration.d.ts(2,7): error TS1255: A definite assignment assertion '!' is not permitted in this context. - - -==== definiteAssignmentAssertionInDeclaration.d.ts (1 errors) ==== - export declare class DbObject { - id!: string; - ~ -!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. - } - \ No newline at end of file diff --git a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.errors.txt b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.errors.txt new file mode 100644 index 0000000000..f27d07a902 --- /dev/null +++ b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.errors.txt @@ -0,0 +1,19 @@ +definiteAssignmentAssertionInDeclarationExtended.ts(7,18): error TS1255: A definite assignment assertion '!' is not permitted in this context. + + +==== definiteAssignmentAssertionInDeclarationExtended.ts (1 errors) ==== + export class DbObject { + id!: string; + name?: string; + count: number = 0; + private secret!: string; + protected value!: number; + static config!: boolean; + ~ +!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. + } + + export interface IConfig { + setting?: boolean; + optionalSetting?: string; + } \ No newline at end of file diff --git a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.js b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.js new file mode 100644 index 0000000000..448a09005c --- /dev/null +++ b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.js @@ -0,0 +1,45 @@ +//// [tests/cases/compiler/definiteAssignmentAssertionInDeclarationExtended.ts] //// + +//// [definiteAssignmentAssertionInDeclarationExtended.ts] +export class DbObject { + id!: string; + name?: string; + count: number = 0; + private secret!: string; + protected value!: number; + static config!: boolean; +} + +export interface IConfig { + setting?: boolean; + optionalSetting?: string; +} + +//// [definiteAssignmentAssertionInDeclarationExtended.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DbObject = void 0; +class DbObject { + id; + name; + count = 0; + secret; + value; + static config; +} +exports.DbObject = DbObject; + + +//// [definiteAssignmentAssertionInDeclarationExtended.d.ts] +export declare class DbObject { + id: string; + name?: string; + count: number; + private secret; + protected value: number; + static config: boolean; +} +export interface IConfig { + setting?: boolean; + optionalSetting?: string; +} diff --git a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.symbols b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.symbols new file mode 100644 index 0000000000..5f5b3b26f8 --- /dev/null +++ b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.symbols @@ -0,0 +1,34 @@ +//// [tests/cases/compiler/definiteAssignmentAssertionInDeclarationExtended.ts] //// + +=== definiteAssignmentAssertionInDeclarationExtended.ts === +export class DbObject { +>DbObject : Symbol(DbObject, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 0, 0)) + + id!: string; +>id : Symbol(DbObject.id, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 0, 23)) + + name?: string; +>name : Symbol(DbObject.name, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 1, 16)) + + count: number = 0; +>count : Symbol(DbObject.count, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 2, 18)) + + private secret!: string; +>secret : Symbol(DbObject.secret, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 3, 22)) + + protected value!: number; +>value : Symbol(DbObject.value, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 4, 28)) + + static config!: boolean; +>config : Symbol(DbObject.config, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 5, 29)) +} + +export interface IConfig { +>IConfig : Symbol(IConfig, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 7, 1)) + + setting?: boolean; +>setting : Symbol(IConfig.setting, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 9, 26)) + + optionalSetting?: string; +>optionalSetting : Symbol(IConfig.optionalSetting, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 10, 22)) +} diff --git a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.types b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.types new file mode 100644 index 0000000000..31945fc6f5 --- /dev/null +++ b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.types @@ -0,0 +1,33 @@ +//// [tests/cases/compiler/definiteAssignmentAssertionInDeclarationExtended.ts] //// + +=== definiteAssignmentAssertionInDeclarationExtended.ts === +export class DbObject { +>DbObject : DbObject + + id!: string; +>id : string + + name?: string; +>name : string | undefined + + count: number = 0; +>count : number +>0 : 0 + + private secret!: string; +>secret : string + + protected value!: number; +>value : number + + static config!: boolean; +>config : boolean +} + +export interface IConfig { + setting?: boolean; +>setting : boolean | undefined + + optionalSetting?: string; +>optionalSetting : string | undefined +} diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitTypeofThisInClass.js b/testdata/baselines/reference/submodule/compiler/declarationEmitTypeofThisInClass.js index 513675497e..35209340b0 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitTypeofThisInClass.js +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitTypeofThisInClass.js @@ -15,25 +15,6 @@ class Foo { //// [declarationEmitTypeofThisInClass.d.ts] declare class Foo { - foo!: string; - bar!: typeof this.foo; //Public property 'bar' of exported class has or is using private name 'this'.(4031) + foo: string; + bar: typeof this.foo; //Public property 'bar' of exported class has or is using private name 'this'.(4031) } - - -//// [DtsFileErrors] - - -declarationEmitTypeofThisInClass.d.ts(2,8): error TS1255: A definite assignment assertion '!' is not permitted in this context. -declarationEmitTypeofThisInClass.d.ts(3,8): error TS1255: A definite assignment assertion '!' is not permitted in this context. - - -==== declarationEmitTypeofThisInClass.d.ts (2 errors) ==== - declare class Foo { - foo!: string; - ~ -!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. - bar!: typeof this.foo; //Public property 'bar' of exported class has or is using private name 'this'.(4031) - ~ -!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. - } - \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitTypeofThisInClass.js.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitTypeofThisInClass.js.diff index fd7f466383..4986e2b51c 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitTypeofThisInClass.js.diff +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitTypeofThisInClass.js.diff @@ -13,27 +13,7 @@ //// [declarationEmitTypeofThisInClass.d.ts] declare class Foo { -- foo: string; + foo: string; - bar: typeof this.foo; -+ foo!: string; -+ bar!: typeof this.foo; //Public property 'bar' of exported class has or is using private name 'this'.(4031) - } -+ -+ -+//// [DtsFileErrors] -+ -+ -+declarationEmitTypeofThisInClass.d.ts(2,8): error TS1255: A definite assignment assertion '!' is not permitted in this context. -+declarationEmitTypeofThisInClass.d.ts(3,8): error TS1255: A definite assignment assertion '!' is not permitted in this context. -+ -+ -+==== declarationEmitTypeofThisInClass.d.ts (2 errors) ==== -+ declare class Foo { -+ foo!: string; -+ ~ -+!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. -+ bar!: typeof this.foo; //Public property 'bar' of exported class has or is using private name 'this'.(4031) -+ ~ -+!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. -+ } -+ \ No newline at end of file ++ bar: typeof this.foo; //Public property 'bar' of exported class has or is using private name 'this'.(4031) + } \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/initializerWithThisPropertyAccess.js b/testdata/baselines/reference/submodule/compiler/initializerWithThisPropertyAccess.js index 708b5b22f8..99824f7bfa 100644 --- a/testdata/baselines/reference/submodule/compiler/initializerWithThisPropertyAccess.js +++ b/testdata/baselines/reference/submodule/compiler/initializerWithThisPropertyAccess.js @@ -77,7 +77,7 @@ declare class B extends A { x: number; } declare class C { - a!: number; + a: number; b: number; } // Repro from #37979 diff --git a/testdata/baselines/reference/submodule/compiler/initializerWithThisPropertyAccess.js.diff b/testdata/baselines/reference/submodule/compiler/initializerWithThisPropertyAccess.js.diff index deddbe076d..3815821550 100644 --- a/testdata/baselines/reference/submodule/compiler/initializerWithThisPropertyAccess.js.diff +++ b/testdata/baselines/reference/submodule/compiler/initializerWithThisPropertyAccess.js.diff @@ -56,12 +56,8 @@ c: () => number; d: number; constructor(); -@@= skipped -46, +41 lines =@@ - x: number; - } - declare class C { -- a: number; -+ a!: number; +@@= skipped -49, +44 lines =@@ + a: number; b: number; } +// Repro from #37979 diff --git a/testdata/baselines/reference/submodule/conformance/definiteAssignmentAssertions.js b/testdata/baselines/reference/submodule/conformance/definiteAssignmentAssertions.js index 6693863b4c..13029babed 100644 --- a/testdata/baselines/reference/submodule/conformance/definiteAssignmentAssertions.js +++ b/testdata/baselines/reference/submodule/conformance/definiteAssignmentAssertions.js @@ -143,28 +143,28 @@ function f4() { //// [definiteAssignmentAssertions.d.ts] // Suppress strict property initialization check declare class C1 { - a!: number; + a: number; b: string; // Error } // Suppress definite assignment check in constructor declare class C2 { - a!: number; + a: number; constructor(); } // Definite assignment assertion requires type annotation, no initializer, no static modifier declare class C3 { - a!: number; - b!: number; - static c!: number; - d!: any; + a: number; + b: number; + static c: number; + d: any; } // Definite assignment assertion not permitted in ambient context declare class C4 { - a!: number; + a: number; } // Definite assignment assertion not permitted on abstract property declare abstract class C5 { - abstract a!: number; + abstract a: number; } // Suppress definite assignment check for variable declare function f1(): void; diff --git a/testdata/baselines/reference/submodule/conformance/definiteAssignmentAssertions.js.diff b/testdata/baselines/reference/submodule/conformance/definiteAssignmentAssertions.js.diff index fe69e1efc0..ad6b1a8640 100644 --- a/testdata/baselines/reference/submodule/conformance/definiteAssignmentAssertions.js.diff +++ b/testdata/baselines/reference/submodule/conformance/definiteAssignmentAssertions.js.diff @@ -40,37 +40,29 @@ //// [definiteAssignmentAssertions.d.ts] +// Suppress strict property initialization check declare class C1 { -- a: number; + a: number; - b: string; -+ a!: number; + b: string; // Error } +// Suppress definite assignment check in constructor declare class C2 { -- a: number; -+ a!: number; + a: number; constructor(); } +// Definite assignment assertion requires type annotation, no initializer, no static modifier declare class C3 { -- a: number; -- b: number; -- static c: number; -- d: any; -+ a!: number; -+ b!: number; -+ static c!: number; -+ d!: any; + a: number; + b: number; + static c: number; + d: any; } +// Definite assignment assertion not permitted in ambient context declare class C4 { -- a: number; -+ a!: number; + a: number; } +// Definite assignment assertion not permitted on abstract property declare abstract class C5 { -- abstract a: number; -+ abstract a!: number; + abstract a: number; } +// Suppress definite assignment check for variable declare function f1(): void; diff --git a/testdata/baselines/reference/submodule/conformance/importEqualsDeclaration.js b/testdata/baselines/reference/submodule/conformance/importEqualsDeclaration.js index 99a3a5b35c..cc1037f80e 100644 --- a/testdata/baselines/reference/submodule/conformance/importEqualsDeclaration.js +++ b/testdata/baselines/reference/submodule/conformance/importEqualsDeclaration.js @@ -40,7 +40,7 @@ void type; // Ok //// [a.d.ts] declare class A { - a!: string; + a: string; } export = A; //// [b.d.ts] diff --git a/testdata/baselines/reference/submodule/conformance/importEqualsDeclaration.js.diff b/testdata/baselines/reference/submodule/conformance/importEqualsDeclaration.js.diff index bd64ec0e30..639e20e004 100644 --- a/testdata/baselines/reference/submodule/conformance/importEqualsDeclaration.js.diff +++ b/testdata/baselines/reference/submodule/conformance/importEqualsDeclaration.js.diff @@ -17,16 +17,7 @@ A.prototype; // Error const a = { a: 'a' }; // Ok void type; // Ok -@@= skipped -8, +8 lines =@@ - - //// [a.d.ts] - declare class A { -- a: string; -+ a!: string; - } - export = A; - //// [b.d.ts] -@@= skipped -8, +8 lines =@@ +@@= skipped -16, +16 lines =@@ } export = SomeClass; //// [c.d.ts] diff --git a/testdata/tests/cases/compiler/definiteAssignmentAssertionInDeclarationExtended.ts b/testdata/tests/cases/compiler/definiteAssignmentAssertionInDeclarationExtended.ts new file mode 100644 index 0000000000..3846bd4a39 --- /dev/null +++ b/testdata/tests/cases/compiler/definiteAssignmentAssertionInDeclarationExtended.ts @@ -0,0 +1,16 @@ +// @declaration: true +// @strict: true + +export class DbObject { + id!: string; + name?: string; + count: number = 0; + private secret!: string; + protected value!: number; + static config!: boolean; +} + +export interface IConfig { + setting?: boolean; + optionalSetting?: string; +} \ No newline at end of file From d8d07812bd7d6ebb500e15aa48d1cc48f2e59f17 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 25 Sep 2025 19:46:41 +0000 Subject: [PATCH 4/7] Simplify definite assignment assertion removal logic Co-authored-by: jakebailey <5341706+jakebailey@users.noreply.github.com> --- internal/transformers/declarations/transform.go | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/internal/transformers/declarations/transform.go b/internal/transformers/declarations/transform.go index 76bcd31720..70e5595cf6 100644 --- a/internal/transformers/declarations/transform.go +++ b/internal/transformers/declarations/transform.go @@ -727,12 +727,10 @@ func (tx *DeclarationTransformer) transformPropertySignatureDeclaration(input *a if ast.IsPrivateIdentifier(input.Name()) { return nil } - // Remove definite assignment assertion (!) in declaration files - var postfixToken *ast.TokenNode - if input.PostfixToken != nil && input.PostfixToken.Kind == ast.KindExclamationToken { + // Remove definite assignment assertion (!) from declaration files + postfixToken := input.PostfixToken + if postfixToken != nil && postfixToken.Kind == ast.KindExclamationToken { postfixToken = nil - } else { - postfixToken = input.PostfixToken } return tx.Factory().UpdatePropertySignatureDeclaration( input, @@ -748,12 +746,10 @@ func (tx *DeclarationTransformer) transformPropertyDeclaration(input *ast.Proper if ast.IsPrivateIdentifier(input.Name()) { return nil } - // Remove definite assignment assertion (!) in declaration files - var postfixToken *ast.TokenNode - if input.PostfixToken != nil && input.PostfixToken.Kind == ast.KindExclamationToken { + // Remove definite assignment assertion (!) from declaration files + postfixToken := input.PostfixToken + if postfixToken != nil && postfixToken.Kind == ast.KindExclamationToken { postfixToken = nil - } else { - postfixToken = input.PostfixToken } return tx.Factory().UpdatePropertyDeclaration( input, From 7e59ec3c243975836f865606f3f5c90b93e80619 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 25 Sep 2025 19:59:56 +0000 Subject: [PATCH 5/7] Refactor: Extract helper function to remove code duplication Co-authored-by: jakebailey <5341706+jakebailey@users.noreply.github.com> --- .../transformers/declarations/transform.go | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/internal/transformers/declarations/transform.go b/internal/transformers/declarations/transform.go index 70e5595cf6..d6779506ee 100644 --- a/internal/transformers/declarations/transform.go +++ b/internal/transformers/declarations/transform.go @@ -723,20 +723,24 @@ func (tx *DeclarationTransformer) transformCallSignatureDeclaration(input *ast.C ) } +// removeExclamationTokenFromPostfix removes definite assignment assertion (!) tokens from declaration files +// while preserving other postfix tokens like optional (?) tokens +func (tx *DeclarationTransformer) removeExclamationTokenFromPostfix(postfixToken *ast.TokenNode) *ast.TokenNode { + if postfixToken != nil && postfixToken.Kind == ast.KindExclamationToken { + return nil + } + return postfixToken +} + func (tx *DeclarationTransformer) transformPropertySignatureDeclaration(input *ast.PropertySignatureDeclaration) *ast.Node { if ast.IsPrivateIdentifier(input.Name()) { return nil } - // Remove definite assignment assertion (!) from declaration files - postfixToken := input.PostfixToken - if postfixToken != nil && postfixToken.Kind == ast.KindExclamationToken { - postfixToken = nil - } return tx.Factory().UpdatePropertySignatureDeclaration( input, tx.ensureModifiers(input.AsNode()), input.Name(), - postfixToken, + tx.removeExclamationTokenFromPostfix(input.PostfixToken), tx.ensureType(input.AsNode(), false), tx.ensureNoInitializer(input.AsNode()), // TODO: possible strada bug (fixed here) - const property signatures never initialized ) @@ -746,16 +750,11 @@ func (tx *DeclarationTransformer) transformPropertyDeclaration(input *ast.Proper if ast.IsPrivateIdentifier(input.Name()) { return nil } - // Remove definite assignment assertion (!) from declaration files - postfixToken := input.PostfixToken - if postfixToken != nil && postfixToken.Kind == ast.KindExclamationToken { - postfixToken = nil - } return tx.Factory().UpdatePropertyDeclaration( input, tx.ensureModifiers(input.AsNode()), input.Name(), - postfixToken, + tx.removeExclamationTokenFromPostfix(input.PostfixToken), tx.ensureType(input.AsNode(), false), tx.ensureNoInitializer(input.AsNode()), ) From cd2565ab4d707dfb02d38437867e092154515d67 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 25 Sep 2025 20:13:44 +0000 Subject: [PATCH 6/7] Remove newly added tests - existing tests already cover the functionality Co-authored-by: jakebailey <5341706+jakebailey@users.noreply.github.com> --- ...efiniteAssignmentAssertionInDeclaration.js | 21 --------- ...teAssignmentAssertionInDeclaration.symbols | 9 ---- ...niteAssignmentAssertionInDeclaration.types | 9 ---- ...tAssertionInDeclarationExtended.errors.txt | 19 -------- ...ssignmentAssertionInDeclarationExtended.js | 45 ------------------- ...mentAssertionInDeclarationExtended.symbols | 34 -------------- ...gnmentAssertionInDeclarationExtended.types | 33 -------------- ...efiniteAssignmentAssertionInDeclaration.ts | 5 --- ...ssignmentAssertionInDeclarationExtended.ts | 16 ------- 9 files changed, 191 deletions(-) delete mode 100644 testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.js delete mode 100644 testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.symbols delete mode 100644 testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.types delete mode 100644 testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.errors.txt delete mode 100644 testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.js delete mode 100644 testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.symbols delete mode 100644 testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.types delete mode 100644 testdata/tests/cases/compiler/definiteAssignmentAssertionInDeclaration.ts delete mode 100644 testdata/tests/cases/compiler/definiteAssignmentAssertionInDeclarationExtended.ts diff --git a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.js b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.js deleted file mode 100644 index a841baf170..0000000000 --- a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.js +++ /dev/null @@ -1,21 +0,0 @@ -//// [tests/cases/compiler/definiteAssignmentAssertionInDeclaration.ts] //// - -//// [definiteAssignmentAssertionInDeclaration.ts] -export class DbObject { - id!: string; -} - -//// [definiteAssignmentAssertionInDeclaration.js] -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DbObject = void 0; -class DbObject { - id; -} -exports.DbObject = DbObject; - - -//// [definiteAssignmentAssertionInDeclaration.d.ts] -export declare class DbObject { - id: string; -} diff --git a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.symbols b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.symbols deleted file mode 100644 index 11a7b1358c..0000000000 --- a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.symbols +++ /dev/null @@ -1,9 +0,0 @@ -//// [tests/cases/compiler/definiteAssignmentAssertionInDeclaration.ts] //// - -=== definiteAssignmentAssertionInDeclaration.ts === -export class DbObject { ->DbObject : Symbol(DbObject, Decl(definiteAssignmentAssertionInDeclaration.ts, 0, 0)) - - id!: string; ->id : Symbol(DbObject.id, Decl(definiteAssignmentAssertionInDeclaration.ts, 0, 23)) -} diff --git a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.types b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.types deleted file mode 100644 index 30467cca75..0000000000 --- a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclaration.types +++ /dev/null @@ -1,9 +0,0 @@ -//// [tests/cases/compiler/definiteAssignmentAssertionInDeclaration.ts] //// - -=== definiteAssignmentAssertionInDeclaration.ts === -export class DbObject { ->DbObject : DbObject - - id!: string; ->id : string -} diff --git a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.errors.txt b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.errors.txt deleted file mode 100644 index f27d07a902..0000000000 --- a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.errors.txt +++ /dev/null @@ -1,19 +0,0 @@ -definiteAssignmentAssertionInDeclarationExtended.ts(7,18): error TS1255: A definite assignment assertion '!' is not permitted in this context. - - -==== definiteAssignmentAssertionInDeclarationExtended.ts (1 errors) ==== - export class DbObject { - id!: string; - name?: string; - count: number = 0; - private secret!: string; - protected value!: number; - static config!: boolean; - ~ -!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. - } - - export interface IConfig { - setting?: boolean; - optionalSetting?: string; - } \ No newline at end of file diff --git a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.js b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.js deleted file mode 100644 index 448a09005c..0000000000 --- a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.js +++ /dev/null @@ -1,45 +0,0 @@ -//// [tests/cases/compiler/definiteAssignmentAssertionInDeclarationExtended.ts] //// - -//// [definiteAssignmentAssertionInDeclarationExtended.ts] -export class DbObject { - id!: string; - name?: string; - count: number = 0; - private secret!: string; - protected value!: number; - static config!: boolean; -} - -export interface IConfig { - setting?: boolean; - optionalSetting?: string; -} - -//// [definiteAssignmentAssertionInDeclarationExtended.js] -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DbObject = void 0; -class DbObject { - id; - name; - count = 0; - secret; - value; - static config; -} -exports.DbObject = DbObject; - - -//// [definiteAssignmentAssertionInDeclarationExtended.d.ts] -export declare class DbObject { - id: string; - name?: string; - count: number; - private secret; - protected value: number; - static config: boolean; -} -export interface IConfig { - setting?: boolean; - optionalSetting?: string; -} diff --git a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.symbols b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.symbols deleted file mode 100644 index 5f5b3b26f8..0000000000 --- a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.symbols +++ /dev/null @@ -1,34 +0,0 @@ -//// [tests/cases/compiler/definiteAssignmentAssertionInDeclarationExtended.ts] //// - -=== definiteAssignmentAssertionInDeclarationExtended.ts === -export class DbObject { ->DbObject : Symbol(DbObject, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 0, 0)) - - id!: string; ->id : Symbol(DbObject.id, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 0, 23)) - - name?: string; ->name : Symbol(DbObject.name, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 1, 16)) - - count: number = 0; ->count : Symbol(DbObject.count, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 2, 18)) - - private secret!: string; ->secret : Symbol(DbObject.secret, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 3, 22)) - - protected value!: number; ->value : Symbol(DbObject.value, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 4, 28)) - - static config!: boolean; ->config : Symbol(DbObject.config, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 5, 29)) -} - -export interface IConfig { ->IConfig : Symbol(IConfig, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 7, 1)) - - setting?: boolean; ->setting : Symbol(IConfig.setting, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 9, 26)) - - optionalSetting?: string; ->optionalSetting : Symbol(IConfig.optionalSetting, Decl(definiteAssignmentAssertionInDeclarationExtended.ts, 10, 22)) -} diff --git a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.types b/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.types deleted file mode 100644 index 31945fc6f5..0000000000 --- a/testdata/baselines/reference/compiler/definiteAssignmentAssertionInDeclarationExtended.types +++ /dev/null @@ -1,33 +0,0 @@ -//// [tests/cases/compiler/definiteAssignmentAssertionInDeclarationExtended.ts] //// - -=== definiteAssignmentAssertionInDeclarationExtended.ts === -export class DbObject { ->DbObject : DbObject - - id!: string; ->id : string - - name?: string; ->name : string | undefined - - count: number = 0; ->count : number ->0 : 0 - - private secret!: string; ->secret : string - - protected value!: number; ->value : number - - static config!: boolean; ->config : boolean -} - -export interface IConfig { - setting?: boolean; ->setting : boolean | undefined - - optionalSetting?: string; ->optionalSetting : string | undefined -} diff --git a/testdata/tests/cases/compiler/definiteAssignmentAssertionInDeclaration.ts b/testdata/tests/cases/compiler/definiteAssignmentAssertionInDeclaration.ts deleted file mode 100644 index d9fc0ab149..0000000000 --- a/testdata/tests/cases/compiler/definiteAssignmentAssertionInDeclaration.ts +++ /dev/null @@ -1,5 +0,0 @@ -// @declaration: true -// @strict: true -export class DbObject { - id!: string; -} \ No newline at end of file diff --git a/testdata/tests/cases/compiler/definiteAssignmentAssertionInDeclarationExtended.ts b/testdata/tests/cases/compiler/definiteAssignmentAssertionInDeclarationExtended.ts deleted file mode 100644 index 3846bd4a39..0000000000 --- a/testdata/tests/cases/compiler/definiteAssignmentAssertionInDeclarationExtended.ts +++ /dev/null @@ -1,16 +0,0 @@ -// @declaration: true -// @strict: true - -export class DbObject { - id!: string; - name?: string; - count: number = 0; - private secret!: string; - protected value!: number; - static config!: boolean; -} - -export interface IConfig { - setting?: boolean; - optionalSetting?: string; -} \ No newline at end of file From cce82fde7aa0547f4420abff5eb70b4d53ea8adc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 25 Sep 2025 20:54:59 +0000 Subject: [PATCH 7/7] Remove helper function call for property signatures - they can't have exclamation tokens Co-authored-by: jakebailey <5341706+jakebailey@users.noreply.github.com> --- .../transformers/declarations/transform.go | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/internal/transformers/declarations/transform.go b/internal/transformers/declarations/transform.go index d6779506ee..02bb0d9d41 100644 --- a/internal/transformers/declarations/transform.go +++ b/internal/transformers/declarations/transform.go @@ -723,15 +723,6 @@ func (tx *DeclarationTransformer) transformCallSignatureDeclaration(input *ast.C ) } -// removeExclamationTokenFromPostfix removes definite assignment assertion (!) tokens from declaration files -// while preserving other postfix tokens like optional (?) tokens -func (tx *DeclarationTransformer) removeExclamationTokenFromPostfix(postfixToken *ast.TokenNode) *ast.TokenNode { - if postfixToken != nil && postfixToken.Kind == ast.KindExclamationToken { - return nil - } - return postfixToken -} - func (tx *DeclarationTransformer) transformPropertySignatureDeclaration(input *ast.PropertySignatureDeclaration) *ast.Node { if ast.IsPrivateIdentifier(input.Name()) { return nil @@ -740,7 +731,7 @@ func (tx *DeclarationTransformer) transformPropertySignatureDeclaration(input *a input, tx.ensureModifiers(input.AsNode()), input.Name(), - tx.removeExclamationTokenFromPostfix(input.PostfixToken), + input.PostfixToken, tx.ensureType(input.AsNode(), false), tx.ensureNoInitializer(input.AsNode()), // TODO: possible strada bug (fixed here) - const property signatures never initialized ) @@ -750,11 +741,16 @@ func (tx *DeclarationTransformer) transformPropertyDeclaration(input *ast.Proper if ast.IsPrivateIdentifier(input.Name()) { return nil } + // Remove definite assignment assertion (!) from declaration files + postfixToken := input.PostfixToken + if postfixToken != nil && postfixToken.Kind == ast.KindExclamationToken { + postfixToken = nil + } return tx.Factory().UpdatePropertyDeclaration( input, tx.ensureModifiers(input.AsNode()), input.Name(), - tx.removeExclamationTokenFromPostfix(input.PostfixToken), + postfixToken, tx.ensureType(input.AsNode(), false), tx.ensureNoInitializer(input.AsNode()), )