From 38993f6a5f323858233be62b64ab966f2f170418 Mon Sep 17 00:00:00 2001 From: Subhajit Ghosh Date: Sun, 31 Mar 2024 10:44:55 +0530 Subject: [PATCH 1/6] Added toString method to enumdeclaration in javavisior Signed-off-by: Subhajit Ghosh --- lib/codegen/fromcto/java/javavisitor.js | 5 ++++ test/codegen/__snapshots__/codegen.js.snap | 32 ++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/lib/codegen/fromcto/java/javavisitor.js b/lib/codegen/fromcto/java/javavisitor.js index a3f296cf..98f99682 100644 --- a/lib/codegen/fromcto/java/javavisitor.js +++ b/lib/codegen/fromcto/java/javavisitor.js @@ -145,6 +145,11 @@ class JavaVisitor { property.accept(this, parameters); }); + parameters.fileWriter.writeLine(0, '@Override'); + parameters.fileWriter.writeLine(0, 'public String toString() {'); + parameters.fileWriter.writeLine(0, `return name();`); + parameters.fileWriter.writeLine(0, '}'); + parameters.fileWriter.writeLine(0, '}' ); this.endClassFile(enumDeclaration, parameters); diff --git a/test/codegen/__snapshots__/codegen.js.snap b/test/codegen/__snapshots__/codegen.js.snap index 91be777d..d070bc81 100644 --- a/test/codegen/__snapshots__/codegen.js.snap +++ b/test/codegen/__snapshots__/codegen.js.snap @@ -973,6 +973,10 @@ public enum State { WA, IL, CA, +@Override +public String toString() { +return name(); +} } ", } @@ -990,6 +994,10 @@ public enum TShirtSizeType { SMALL, MEDIUM, LARGE, +@Override +public String toString() { +return name(); +} } ", } @@ -1141,6 +1149,10 @@ public enum Department { HR, Engineering, Design, +@Override +public String toString() { +return name(); +} } ", } @@ -1196,6 +1208,10 @@ import com.fasterxml.jackson.annotation.*; public enum LaptopMake { Apple, Microsoft, +@Override +public String toString() { +return name(); +} } ", } @@ -7091,6 +7107,10 @@ public enum State { WA, IL, CA, +@Override +public String toString() { +return name(); +} } ", } @@ -7108,6 +7128,10 @@ public enum TShirtSizeType { SMALL, MEDIUM, LARGE, +@Override +public String toString() { +return name(); +} } ", } @@ -7259,6 +7283,10 @@ public enum Department { HR, Engineering, Design, +@Override +public String toString() { +return name(); +} } ", } @@ -7314,6 +7342,10 @@ import com.fasterxml.jackson.annotation.*; public enum LaptopMake { Apple, Microsoft, +@Override +public String toString() { +return name(); +} } ", } From 991afa087c03c71bfe6cdc16f72b0d19accf8124 Mon Sep 17 00:00:00 2001 From: Subhajit Ghosh Date: Sun, 31 Mar 2024 10:54:02 +0530 Subject: [PATCH 2/6] Added minor changes Signed-off-by: Subhajit Ghosh --- lib/codegen/fromcto/java/javavisitor.js | 8 +-- test/codegen/__snapshots__/codegen.js.snap | 64 +++++++++++----------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/lib/codegen/fromcto/java/javavisitor.js b/lib/codegen/fromcto/java/javavisitor.js index 98f99682..6d4f279d 100644 --- a/lib/codegen/fromcto/java/javavisitor.js +++ b/lib/codegen/fromcto/java/javavisitor.js @@ -145,10 +145,10 @@ class JavaVisitor { property.accept(this, parameters); }); - parameters.fileWriter.writeLine(0, '@Override'); - parameters.fileWriter.writeLine(0, 'public String toString() {'); - parameters.fileWriter.writeLine(0, `return name();`); - parameters.fileWriter.writeLine(0, '}'); + parameters.fileWriter.writeLine(1, '@Override'); + parameters.fileWriter.writeLine(1, 'public String toString() {'); + parameters.fileWriter.writeLine(1, 'return name();'); + parameters.fileWriter.writeLine(1, '}'); parameters.fileWriter.writeLine(0, '}' ); diff --git a/test/codegen/__snapshots__/codegen.js.snap b/test/codegen/__snapshots__/codegen.js.snap index d070bc81..ab6e4e8d 100644 --- a/test/codegen/__snapshots__/codegen.js.snap +++ b/test/codegen/__snapshots__/codegen.js.snap @@ -973,10 +973,10 @@ public enum State { WA, IL, CA, -@Override -public String toString() { -return name(); -} + @Override + public String toString() { + return name(); + } } ", } @@ -994,10 +994,10 @@ public enum TShirtSizeType { SMALL, MEDIUM, LARGE, -@Override -public String toString() { -return name(); -} + @Override + public String toString() { + return name(); + } } ", } @@ -1149,10 +1149,10 @@ public enum Department { HR, Engineering, Design, -@Override -public String toString() { -return name(); -} + @Override + public String toString() { + return name(); + } } ", } @@ -1208,10 +1208,10 @@ import com.fasterxml.jackson.annotation.*; public enum LaptopMake { Apple, Microsoft, -@Override -public String toString() { -return name(); -} + @Override + public String toString() { + return name(); + } } ", } @@ -7107,10 +7107,10 @@ public enum State { WA, IL, CA, -@Override -public String toString() { -return name(); -} + @Override + public String toString() { + return name(); + } } ", } @@ -7128,10 +7128,10 @@ public enum TShirtSizeType { SMALL, MEDIUM, LARGE, -@Override -public String toString() { -return name(); -} + @Override + public String toString() { + return name(); + } } ", } @@ -7283,10 +7283,10 @@ public enum Department { HR, Engineering, Design, -@Override -public String toString() { -return name(); -} + @Override + public String toString() { + return name(); + } } ", } @@ -7342,10 +7342,10 @@ import com.fasterxml.jackson.annotation.*; public enum LaptopMake { Apple, Microsoft, -@Override -public String toString() { -return name(); -} + @Override + public String toString() { + return name(); + } } ", } From 4a8bc8aade1bf2638a5b9b1def90dad14355285a Mon Sep 17 00:00:00 2001 From: Subhajit Ghosh Date: Sun, 31 Mar 2024 10:58:18 +0530 Subject: [PATCH 3/6] Added some space to the return statement Signed-off-by: Subhajit Ghosh --- lib/codegen/fromcto/java/javavisitor.js | 2 +- test/codegen/__snapshots__/codegen.js.snap | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/codegen/fromcto/java/javavisitor.js b/lib/codegen/fromcto/java/javavisitor.js index 6d4f279d..a7fb0d31 100644 --- a/lib/codegen/fromcto/java/javavisitor.js +++ b/lib/codegen/fromcto/java/javavisitor.js @@ -147,7 +147,7 @@ class JavaVisitor { parameters.fileWriter.writeLine(1, '@Override'); parameters.fileWriter.writeLine(1, 'public String toString() {'); - parameters.fileWriter.writeLine(1, 'return name();'); + parameters.fileWriter.writeLine(2, 'return name();'); parameters.fileWriter.writeLine(1, '}'); parameters.fileWriter.writeLine(0, '}' ); diff --git a/test/codegen/__snapshots__/codegen.js.snap b/test/codegen/__snapshots__/codegen.js.snap index ab6e4e8d..abb8a388 100644 --- a/test/codegen/__snapshots__/codegen.js.snap +++ b/test/codegen/__snapshots__/codegen.js.snap @@ -975,7 +975,7 @@ public enum State { CA, @Override public String toString() { - return name(); + return name(); } } ", @@ -996,7 +996,7 @@ public enum TShirtSizeType { LARGE, @Override public String toString() { - return name(); + return name(); } } ", @@ -1151,7 +1151,7 @@ public enum Department { Design, @Override public String toString() { - return name(); + return name(); } } ", @@ -1210,7 +1210,7 @@ public enum LaptopMake { Microsoft, @Override public String toString() { - return name(); + return name(); } } ", @@ -7109,7 +7109,7 @@ public enum State { CA, @Override public String toString() { - return name(); + return name(); } } ", @@ -7130,7 +7130,7 @@ public enum TShirtSizeType { LARGE, @Override public String toString() { - return name(); + return name(); } } ", @@ -7285,7 +7285,7 @@ public enum Department { Design, @Override public String toString() { - return name(); + return name(); } } ", @@ -7344,7 +7344,7 @@ public enum LaptopMake { Microsoft, @Override public String toString() { - return name(); + return name(); } } ", From 7c14d706387e371d22c36ccdb17fda08b4a2f1e7 Mon Sep 17 00:00:00 2001 From: Subhajit Ghosh Date: Sun, 31 Mar 2024 11:26:43 +0530 Subject: [PATCH 4/6] Added test Signed-off-by: Subhajit Ghosh --- test/codegen/fromcto/java/javavisitor.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/codegen/fromcto/java/javavisitor.js b/test/codegen/fromcto/java/javavisitor.js index 7ed6f004..f0d4d010 100644 --- a/test/codegen/fromcto/java/javavisitor.js +++ b/test/codegen/fromcto/java/javavisitor.js @@ -243,11 +243,16 @@ describe('JavaVisitor', function () { javaVisit.visitEnumDeclaration(mockEnumDeclaration, param); mockStartClassFile.withArgs(mockEnumDeclaration, param).calledOnce.should.be.ok; - param.fileWriter.writeLine.callCount.should.deep.equal(4); + param.fileWriter.writeLine.callCount.should.deep.equal(8); + param.fileWriter.writeLine.getCall(0).args.should.deep.equal([0, 'import com.fasterxml.jackson.annotation.*;']); param.fileWriter.writeLine.getCall(1).args.should.deep.equal([0, '@JsonIgnoreProperties({"$class"})']); param.fileWriter.writeLine.getCall(2).args.should.deep.equal([0, 'public enum Bob {']); - param.fileWriter.writeLine.getCall(3).args.should.deep.equal([0, '}']); + param.fileWriter.writeLine.getCall(3).args.should.deep.equal([1, '@Override']); + param.fileWriter.writeLine.getCall(4).args.should.deep.equal([1, 'public String toString() {']); + param.fileWriter.writeLine.getCall(5).args.should.deep.equal([2, 'return name();']); + param.fileWriter.writeLine.getCall(6).args.should.deep.equal([1, '}']); + param.fileWriter.writeLine.getCall(7).args.should.deep.equal([0, '}']); mockEndClassFile.withArgs(mockEnumDeclaration, param).calledOnce.should.be.ok; }); }); From 192674eac3080d549171ebccfb2e752c3c4206bd Mon Sep 17 00:00:00 2001 From: mttrbrts Date: Tue, 4 Aug 2026 13:15:08 +0100 Subject: [PATCH 5/6] fix: add semicolon after last enum constant before toString() method Java requires a semicolon terminating the enum constant list before any method bodies. Without it, javac errors with ' expected' on the @Override annotation. Signed-off-by: Matt Roberts --- lib/codegen/fromcto/java/javavisitor.js | 6 +++-- test/codegen/__snapshots__/codegen.js.snap | 8 +++---- test/codegen/fromcto/java/javavisitor.js | 26 ++++++++++------------ 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lib/codegen/fromcto/java/javavisitor.js b/lib/codegen/fromcto/java/javavisitor.js index 16cc6d5e..296eb59d 100644 --- a/lib/codegen/fromcto/java/javavisitor.js +++ b/lib/codegen/fromcto/java/javavisitor.js @@ -141,8 +141,10 @@ class JavaVisitor { this.plugin.addEnumAnnotations(enumDeclaration, parameters); parameters.fileWriter.writeLine(0, 'public enum ' + enumDeclaration.getName() + ' {' ); - enumDeclaration.getOwnProperties().forEach((property) => { - property.accept(this, parameters); + const properties = enumDeclaration.getOwnProperties(); + properties.forEach((property, index) => { + const suffix = index < properties.length - 1 ? ',' : ';'; + parameters.fileWriter.writeLine(1, property.getName() + suffix); }); parameters.fileWriter.writeLine(1, '@Override'); diff --git a/test/codegen/__snapshots__/codegen.js.snap b/test/codegen/__snapshots__/codegen.js.snap index f6573622..e120156c 100644 --- a/test/codegen/__snapshots__/codegen.js.snap +++ b/test/codegen/__snapshots__/codegen.js.snap @@ -1568,7 +1568,7 @@ public enum State { CO, WA, IL, - CA, + CA; @Override public String toString() { return name(); @@ -1589,7 +1589,7 @@ import com.fasterxml.jackson.annotation.*; public enum TShirtSizeType { SMALL, MEDIUM, - LARGE, + LARGE; @Override public String toString() { return name(); @@ -1845,7 +1845,7 @@ public enum Department { Finance, HR, Engineering, - Design, + Design; @Override public String toString() { return name(); @@ -1908,7 +1908,7 @@ import com.fasterxml.jackson.annotation.*; @JsonIgnoreProperties({"$class"}) public enum LaptopMake { Apple, - Microsoft, + Microsoft; @Override public String toString() { return name(); diff --git a/test/codegen/fromcto/java/javavisitor.js b/test/codegen/fromcto/java/javavisitor.js index 62a348f4..6be7119e 100644 --- a/test/codegen/fromcto/java/javavisitor.js +++ b/test/codegen/fromcto/java/javavisitor.js @@ -221,8 +221,6 @@ describe('JavaVisitor', function () { describe('visitEnumDeclaration', () => { it('should write an enum declaration and call accept on each property', () => { - let acceptSpy = sinon.spy(); - let param = { fileWriter: mockFileWriter }; @@ -230,12 +228,10 @@ describe('JavaVisitor', function () { let mockEnumDeclaration = sinon.createStubInstance(EnumDeclaration); mockEnumDeclaration.isEnum.returns(true); mockEnumDeclaration.getName.returns('Bob'); - mockEnumDeclaration.getOwnProperties.returns([{ - accept: acceptSpy - }, - { - accept: acceptSpy - }]); + mockEnumDeclaration.getOwnProperties.returns([ + { getName: () => 'VALUE_A' }, + { getName: () => 'VALUE_B' }, + ]); let mockStartClassFile = sinon.stub(javaVisit, 'startClassFile'); let mockEndClassFile = sinon.stub(javaVisit, 'endClassFile'); @@ -243,16 +239,18 @@ describe('JavaVisitor', function () { javaVisit.visitEnumDeclaration(mockEnumDeclaration, param); mockStartClassFile.withArgs(mockEnumDeclaration, param).calledOnce.should.be.ok; - param.fileWriter.writeLine.callCount.should.deep.equal(8); + param.fileWriter.writeLine.callCount.should.deep.equal(10); param.fileWriter.writeLine.getCall(0).args.should.deep.equal([0, 'import com.fasterxml.jackson.annotation.*;']); param.fileWriter.writeLine.getCall(1).args.should.deep.equal([0, '@JsonIgnoreProperties({"$class"})']); param.fileWriter.writeLine.getCall(2).args.should.deep.equal([0, 'public enum Bob {']); - param.fileWriter.writeLine.getCall(3).args.should.deep.equal([1, '@Override']); - param.fileWriter.writeLine.getCall(4).args.should.deep.equal([1, 'public String toString() {']); - param.fileWriter.writeLine.getCall(5).args.should.deep.equal([2, 'return name();']); - param.fileWriter.writeLine.getCall(6).args.should.deep.equal([1, '}']); - param.fileWriter.writeLine.getCall(7).args.should.deep.equal([0, '}']); + param.fileWriter.writeLine.getCall(3).args.should.deep.equal([1, 'VALUE_A,']); + param.fileWriter.writeLine.getCall(4).args.should.deep.equal([1, 'VALUE_B;']); + param.fileWriter.writeLine.getCall(5).args.should.deep.equal([1, '@Override']); + param.fileWriter.writeLine.getCall(6).args.should.deep.equal([1, 'public String toString() {']); + param.fileWriter.writeLine.getCall(7).args.should.deep.equal([2, 'return name();']); + param.fileWriter.writeLine.getCall(8).args.should.deep.equal([1, '}']); + param.fileWriter.writeLine.getCall(9).args.should.deep.equal([0, '}']); mockEndClassFile.withArgs(mockEnumDeclaration, param).calledOnce.should.be.ok; }); }); From 0bf0824333ac22dfecf30dcb70604324f0b11e53 Mon Sep 17 00:00:00 2001 From: mttrbrts Date: Tue, 4 Aug 2026 13:26:39 +0100 Subject: [PATCH 6/6] fix: handle empty enum constants in Java toString() generation Empty enums (zero constants) also need a semicolon before method declarations per the Java Language Specification (JLS 8.9.1). Signed-off-by: Matt Roberts --- lib/codegen/fromcto/java/javavisitor.js | 12 ++++++++---- test/codegen/__snapshots__/codegen.js.snap | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/codegen/fromcto/java/javavisitor.js b/lib/codegen/fromcto/java/javavisitor.js index 296eb59d..6d508071 100644 --- a/lib/codegen/fromcto/java/javavisitor.js +++ b/lib/codegen/fromcto/java/javavisitor.js @@ -142,10 +142,14 @@ class JavaVisitor { parameters.fileWriter.writeLine(0, 'public enum ' + enumDeclaration.getName() + ' {' ); const properties = enumDeclaration.getOwnProperties(); - properties.forEach((property, index) => { - const suffix = index < properties.length - 1 ? ',' : ';'; - parameters.fileWriter.writeLine(1, property.getName() + suffix); - }); + if (properties.length === 0) { + parameters.fileWriter.writeLine(1, ';'); + } else { + properties.forEach((property, index) => { + const suffix = index < properties.length - 1 ? ',' : ';'; + parameters.fileWriter.writeLine(1, property.getName() + suffix); + }); + } parameters.fileWriter.writeLine(1, '@Override'); parameters.fileWriter.writeLine(1, 'public String toString() {'); diff --git a/test/codegen/__snapshots__/codegen.js.snap b/test/codegen/__snapshots__/codegen.js.snap index e120156c..331b743d 100644 --- a/test/codegen/__snapshots__/codegen.js.snap +++ b/test/codegen/__snapshots__/codegen.js.snap @@ -1663,6 +1663,7 @@ package org.acme.hr.base; import com.fasterxml.jackson.annotation.*; @JsonIgnoreProperties({"$class"}) public enum Level { + ; @Override public String toString() { return name();