Skip to content

Commit e517297

Browse files
Number-based enums with Jackson2 (fixes #66)
1 parent 10a64d9 commit e517297

File tree

19 files changed

+366
-61
lines changed

19 files changed

+366
-61
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
package cz.habarta.typescript.generator.compiler;
3+
4+
5+
public final class EnumKind<T> {
6+
7+
public static final EnumKind<String> StringBased = new EnumKind<>();
8+
public static final EnumKind<Number> NumberBased = new EnumKind<>();
9+
10+
private EnumKind() {
11+
}
12+
13+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
2+
package cz.habarta.typescript.generator.compiler;
3+
4+
import java.util.List;
5+
6+
7+
public class EnumMemberModel<T> {
8+
9+
private final String propertyName;
10+
private final T enumValue;
11+
private final List<String> comments;
12+
13+
public EnumMemberModel(String propertyName, T enumValue, List<String> comments) {
14+
this.propertyName = propertyName;
15+
this.enumValue = enumValue;
16+
this.comments = comments;
17+
}
18+
19+
public String getPropertyName() {
20+
return propertyName;
21+
}
22+
23+
public T getEnumValue() {
24+
return enumValue;
25+
}
26+
27+
public List<String> getComments() {
28+
return comments;
29+
}
30+
31+
public EnumMemberModel<T> withComments(List<String> comments) {
32+
return new EnumMemberModel<>(propertyName, enumValue, comments);
33+
}
34+
35+
}

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/compiler/ModelCompiler.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public TsModel javaToTypeScript(Model model) {
5252

5353
public TsType javaToTypeScript(Type type) {
5454
final BeanModel beanModel = new BeanModel(Object.class, Object.class, Collections.<Type>emptyList(), Collections.singletonList(new PropertyModel("property", type, false, null, null)));
55-
final Model model = new Model(Collections.singletonList(beanModel), Collections.<EnumModel>emptyList());
55+
final Model model = new Model(Collections.singletonList(beanModel), Collections.<EnumModel<?>>emptyList());
5656
final TsModel tsModel = javaToTypeScript(model);
5757
return tsModel.getBeans().get(0).getProperties().get(0).getTsType();
5858
}
@@ -62,8 +62,8 @@ private TsModel processModel(SymbolTable symbolTable, Model model) {
6262
for (BeanModel bean : model.getBeans()) {
6363
beans.add(processBean(symbolTable, bean));
6464
}
65-
final List<TsEnumModel> enums = new ArrayList<>();
66-
for (EnumModel enumModel : model.getEnums()) {
65+
final List<TsEnumModel<?>> enums = new ArrayList<>();
66+
for (EnumModel<?> enumModel : model.getEnums()) {
6767
enums.add(processEnum(symbolTable, enumModel));
6868
}
6969
final List<TsAliasModel> typeAliases = new ArrayList<>();
@@ -96,9 +96,9 @@ private TsPropertyModel processProperty(SymbolTable symbolTable, BeanModel bean,
9696
return new TsPropertyModel(property.getName(), tsType, property.getComments());
9797
}
9898

99-
private TsEnumModel processEnum(SymbolTable symbolTable, EnumModel enumModel) {
99+
private TsEnumModel<?> processEnum(SymbolTable symbolTable, EnumModel<?> enumModel) {
100100
final TsType enumType = typeFromJava(symbolTable, enumModel.getOrigin());
101-
return new TsEnumModel(enumModel.getOrigin(), enumType, enumModel.getComments(), new ArrayList<>(enumModel.getValues()));
101+
return TsEnumModel.fromEnumModel(enumType, enumModel);
102102
}
103103

104104
private TsType typeFromJava(SymbolTable symbolTable, Type javaType) {
@@ -149,10 +149,10 @@ public TsType transform(TsType type) {
149149

150150
private TsModel transformEnums(TsModel tsModel) {
151151
final LinkedHashSet<TsAliasModel> typeAliases = new LinkedHashSet<>(tsModel.getTypeAliases());
152-
for (TsEnumModel enumModel : tsModel.getEnums()) {
152+
for (TsEnumModel<String> enumModel : tsModel.getEnums(EnumKind.StringBased)) {
153153
final List<TsType> values = new ArrayList<>();
154-
for (String value : enumModel.getValues()) {
155-
values.add(new TsType.StringLiteralType(value));
154+
for (EnumMemberModel<String> member : enumModel.getMembers()) {
155+
values.add(new TsType.StringLiteralType(member.getEnumValue()));
156156
}
157157
final TsType union = new TsType.UnionType(values);
158158
typeAliases.add(new TsAliasModel(enumModel.getOrigin(), enumModel.getName(), union, enumModel.getComments()));

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/emitter/Emitter.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
package cz.habarta.typescript.generator.emitter;
33

44
import cz.habarta.typescript.generator.*;
5+
import cz.habarta.typescript.generator.compiler.EnumKind;
6+
import cz.habarta.typescript.generator.compiler.EnumMemberModel;
57
import java.io.*;
68
import java.text.*;
79
import java.util.*;
@@ -86,20 +88,22 @@ private void emitNamespace(TsModel model) {
8688
writeIndentedLine(prefix + "namespace " + settings.namespace + " {");
8789
indent++;
8890
final boolean exportElements = settings.outputFileType == TypeScriptFileType.implementationFile;
89-
emitElements(model, exportElements);
91+
emitElements(model, exportElements, false);
9092
indent--;
9193
writeNewLine();
9294
writeIndentedLine("}");
9395
} else {
9496
final boolean exportElements = settings.outputKind == TypeScriptOutputKind.module;
95-
emitElements(model, exportElements);
97+
final boolean declareElements = settings.outputKind == TypeScriptOutputKind.global;
98+
emitElements(model, exportElements, declareElements);
9699
}
97100
}
98101

99-
private void emitElements(TsModel model, boolean exportKeyword) {
102+
private void emitElements(TsModel model, boolean exportKeyword, boolean declareKeyword) {
100103
exportKeyword = exportKeyword || forceExportKeyword;
101104
emitInterfaces(model, exportKeyword);
102105
emitTypeAliases(model, exportKeyword);
106+
emitNumberEnums(model, exportKeyword, declareKeyword);
103107
for (EmitterExtension emitterExtension : settings.extensions) {
104108
emitterExtension.emitElements(new EmitterExtension.Writer() {
105109
@Override
@@ -175,6 +179,25 @@ private void emitTypeAliases(TsModel model, boolean exportKeyword) {
175179
}
176180
}
177181

182+
private void emitNumberEnums(TsModel model, boolean exportKeyword, boolean declareKeyword) {
183+
final ArrayList<TsEnumModel<Number>> enums = new ArrayList<>(model.getEnums(EnumKind.NumberBased));
184+
if (settings.sortDeclarations || settings.sortTypeDeclarations) {
185+
Collections.sort(enums);
186+
}
187+
for (TsEnumModel<Number> enumModel : enums) {
188+
writeNewLine();
189+
emitComments(enumModel.getComments());
190+
writeIndentedLine(exportKeyword, (declareKeyword ? "declare " : "") + "const enum " + enumModel.getName() + " {");
191+
indent++;
192+
for (EnumMemberModel<Number> member : enumModel.getMembers()) {
193+
emitComments(member.getComments());
194+
writeIndentedLine(member.getPropertyName() + " = " + member.getEnumValue() + ",");
195+
}
196+
indent--;
197+
writeIndentedLine("}");
198+
}
199+
}
200+
178201
private void emitComments(List<String> comments) {
179202
if (comments != null) {
180203
writeIndentedLine("/**");

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/emitter/TsEnumModel.java

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,34 @@
22
package cz.habarta.typescript.generator.emitter;
33

44
import cz.habarta.typescript.generator.TsType;
5+
import cz.habarta.typescript.generator.compiler.EnumKind;
6+
import cz.habarta.typescript.generator.compiler.EnumMemberModel;
7+
import cz.habarta.typescript.generator.parser.EnumModel;
58
import java.util.List;
69

710

8-
public class TsEnumModel extends TsDeclarationModel {
11+
// T extends String | Number
12+
public class TsEnumModel<T> extends TsDeclarationModel {
913

10-
private final List<String> values;
14+
private final EnumKind<T> kind;
15+
private final List<EnumMemberModel<T>> members;
1116

12-
public TsEnumModel(TsType name, List<String> comments, List<String> values) {
13-
super(name, comments);
14-
this.values = values;
17+
public TsEnumModel(Class<?> origin, TsType name, EnumKind<T> kind, List<EnumMemberModel<T>> members, List<String> comments) {
18+
super(origin, name, comments);
19+
this.kind = kind;
20+
this.members = members;
1521
}
1622

17-
public TsEnumModel(Class<?> origin, TsType name, List<String> comments, List<String> values) {
18-
super(origin, name, comments);
19-
this.values = values;
23+
public static <T> TsEnumModel<T> fromEnumModel(TsType name, EnumModel<T> enumModel) {
24+
return new TsEnumModel<>(enumModel.getOrigin(), name, enumModel.getKind(), enumModel.getMembers(), enumModel.getComments());
25+
}
26+
27+
public EnumKind<T> getKind() {
28+
return kind;
2029
}
2130

22-
public List<String> getValues() {
23-
return values;
31+
public List<EnumMemberModel<T>> getMembers() {
32+
return members;
2433
}
2534

2635
}

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/emitter/TsModel.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11

22
package cz.habarta.typescript.generator.emitter;
33

4+
import cz.habarta.typescript.generator.compiler.EnumKind;
45
import java.util.*;
56

67

78
public class TsModel {
89

910
private final List<TsBeanModel> beans;
10-
private final List<TsEnumModel> enums;
11+
private final List<TsEnumModel<?>> enums;
1112
private final List<TsAliasModel> typeAliases;
1213

1314
public TsModel() {
14-
this (new ArrayList<TsBeanModel>(), new ArrayList<TsEnumModel>(), new ArrayList<TsAliasModel>());
15+
this (new ArrayList<TsBeanModel>(), new ArrayList<TsEnumModel<?>>(), new ArrayList<TsAliasModel>());
1516
}
1617

17-
public TsModel(List<TsBeanModel> beans, List<TsEnumModel> enums, List<TsAliasModel> typeAliases) {
18+
public TsModel(List<TsBeanModel> beans, List<TsEnumModel<?>> enums, List<TsAliasModel> typeAliases) {
1819
if (beans == null) throw new NullPointerException();
1920
if (enums == null) throw new NullPointerException();
2021
if (typeAliases == null) throw new NullPointerException();
@@ -31,11 +32,22 @@ public TsModel setBeans(List<TsBeanModel> beans) {
3132
return new TsModel(beans, enums, typeAliases);
3233
}
3334

34-
public List<TsEnumModel> getEnums() {
35+
public List<TsEnumModel<?>> getEnums() {
3536
return enums;
3637
}
3738

38-
public TsModel setEnums(List<TsEnumModel> enums) {
39+
@SuppressWarnings("unchecked")
40+
public <T> List<TsEnumModel<T>> getEnums(EnumKind<T> enumKind) {
41+
final List<TsEnumModel<T>> result = new ArrayList<>();
42+
for (TsEnumModel<?> enumModel : enums) {
43+
if (enumModel.getKind() == enumKind) {
44+
result.add((TsEnumModel<T>) enumModel);
45+
}
46+
}
47+
return result;
48+
}
49+
50+
public TsModel setEnums(List<TsEnumModel<?>> enums) {
3951
return new TsModel(beans, enums, typeAliases);
4052
}
4153

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/ext/EnumConstantsExtension.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import java.util.List;
66

77
import cz.habarta.typescript.generator.Settings;
8+
import cz.habarta.typescript.generator.compiler.EnumKind;
9+
import cz.habarta.typescript.generator.compiler.EnumMemberModel;
810
import cz.habarta.typescript.generator.emitter.EmitterExtension;
911
import cz.habarta.typescript.generator.emitter.TsEnumModel;
1012
import cz.habarta.typescript.generator.emitter.TsModel;
@@ -20,13 +22,13 @@ public boolean generatesRuntimeCode() {
2022
@Override
2123
public void emitElements(Writer writer, Settings settings, boolean exportKeyword, TsModel model) {
2224
String exportString = exportKeyword ? "export " : "";
23-
List<TsEnumModel> enums = model.getEnums();
25+
List<TsEnumModel<String>> enums = model.getEnums(EnumKind.StringBased);
2426
Collections.sort(enums);
25-
for (TsEnumModel tsEnum : enums) {
27+
for (TsEnumModel<String> tsEnum : enums) {
2628
writer.writeIndentedLine("");
2729
writer.writeIndentedLine(exportString + "const " + tsEnum.getName() + " = {");
28-
for (String value : tsEnum.getValues()) {
29-
writer.writeIndentedLine(settings.indentString + value + ": " + "<" + tsEnum.getName() + ">\"" + value + "\",");
30+
for (EnumMemberModel<String> member : tsEnum.getMembers()) {
31+
writer.writeIndentedLine(settings.indentString + member.getPropertyName() + ": " + "<" + tsEnum.getName() + ">\"" + member.getEnumValue() + "\",");
3032
}
3133
writer.writeIndentedLine("}");
3234
}

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/parser/BeanModel.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@ public List<PropertyModel> getProperties() {
3434
return properties;
3535
}
3636

37+
public BeanModel withProperties(List<PropertyModel> properties) {
38+
return new BeanModel(origin, parent, interfaces, properties, comments);
39+
}
40+
41+
@Override
42+
public BeanModel withComments(List<String> comments) {
43+
return new BeanModel(origin, parent, interfaces, properties, comments);
44+
}
45+
3746
@Override
3847
public String toString() {
3948
return "BeanModel{" + "origin=" + getOrigin() + ", properties=" + properties + '}';

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/parser/DeclarationModel.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
import java.util.List;
55

66

7-
public class DeclarationModel {
7+
public abstract class DeclarationModel {
88

9-
private final Class<?> origin;
10-
private final List<String> comments;
9+
protected final Class<?> origin;
10+
protected final List<String> comments;
1111

1212
public DeclarationModel(Class<?> origin, List<String> comments) {
1313
this.origin = origin;
@@ -22,4 +22,6 @@ public List<String> getComments() {
2222
return comments;
2323
}
2424

25+
public abstract DeclarationModel withComments(List<String> comments);
26+
2527
}
Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,38 @@
11

22
package cz.habarta.typescript.generator.parser;
33

4+
import cz.habarta.typescript.generator.compiler.EnumMemberModel;
5+
import cz.habarta.typescript.generator.compiler.EnumKind;
46
import java.util.*;
57

68

7-
public class EnumModel extends DeclarationModel {
8-
9-
private final List<String> values;
9+
// T extends String | Number
10+
public class EnumModel<T> extends DeclarationModel {
1011

11-
public EnumModel(Class<?> origin, List<String> values, List<String> comments) {
12+
private final EnumKind<T> kind;
13+
private final List<EnumMemberModel<T>> members;
14+
15+
public EnumModel(Class<?> origin, EnumKind<T> kind, List<EnumMemberModel<T>> members, List<String> comments) {
1216
super (origin, comments);
13-
this.values = values;
17+
this.kind = kind;
18+
this.members = members;
19+
}
20+
21+
public EnumKind<T> getKind() {
22+
return kind;
23+
}
24+
25+
public List<EnumMemberModel<T>> getMembers() {
26+
return members;
27+
}
28+
29+
public EnumModel<T> withMembers(List<EnumMemberModel<T>> members) {
30+
return new EnumModel<>(origin, kind, members, comments);
1431
}
1532

16-
public List<String> getValues() {
17-
return values;
33+
@Override
34+
public EnumModel<T> withComments(List<String> comments) {
35+
return new EnumModel<>(origin, kind, members, comments);
1836
}
1937

2038
}

0 commit comments

Comments
 (0)