From 936d39b452de17c3e5d502a970f461b9adfc9c46 Mon Sep 17 00:00:00 2001 From: Perryvw Date: Sun, 11 Jun 2023 15:38:12 +0200 Subject: [PATCH] Change class initialization order --- src/transformation/visitors/class/index.ts | 15 +++++++++++---- test/unit/classes/classes.spec.ts | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/transformation/visitors/class/index.ts b/src/transformation/visitors/class/index.ts index 51be1fe5a..9574d1efc 100644 --- a/src/transformation/visitors/class/index.ts +++ b/src/transformation/visitors/class/index.ts @@ -160,6 +160,17 @@ function transformClassLikeDeclaration( } // Transform class members + + // First transform the methods, in case the static properties call them + for (const member of classDeclaration.members) { + if (ts.isMethodDeclaration(member)) { + // Methods + const statements = transformMethodDeclaration(context, member, localClassName); + result.push(...statements); + } + } + + // Then transform the rest for (const member of classDeclaration.members) { if (ts.isAccessor(member)) { // Accessors @@ -170,10 +181,6 @@ function transformClassLikeDeclaration( if (accessorsResult) { result.push(accessorsResult); } - } else if (ts.isMethodDeclaration(member)) { - // Methods - const statements = transformMethodDeclaration(context, member, localClassName); - result.push(...statements); } else if (ts.isPropertyDeclaration(member)) { // Properties if (isStaticNode(member)) { diff --git a/test/unit/classes/classes.spec.ts b/test/unit/classes/classes.spec.ts index a2079d360..93c7640cf 100644 --- a/test/unit/classes/classes.spec.ts +++ b/test/unit/classes/classes.spec.ts @@ -818,3 +818,18 @@ test("static initialization block (#1447)", () => { export const result2 = A.staticProperty3; `.expectToMatchJsResult(); }); + +// https://github.com/TypeScriptToLua/TypeScriptToLua/issues/1457 +test("static member definition order (#1457)", () => { + util.testFunction` + class A { + static a = A.foo() + + static foo(): number { + return 5 + } + } + + return A.a; + `.expectToMatchJsResult(); +});