Skip to content

Commit 38b8bcf

Browse files
author
Toplak, Jeramy
committed
add setting classEnumPattern and feature to transform java class enums
1 parent 7facc49 commit 38b8bcf

File tree

11 files changed

+149
-20
lines changed

11 files changed

+149
-20
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<groupId>cz.habarta.typescript-generator</groupId>
66
<artifactId>typescript-generator</artifactId>
77
<packaging>pom</packaging>
8-
<version>1.29-SNAPSHOT</version>
8+
<version>1.30-SNAPSHOT</version>
99
<name>typescript-generator</name>
1010
<description>Generates TypeScript declaration file from specified java classes.</description>
1111
<url>https://github.com/vojtechhabarta/typescript-generator</url>

typescript-generator-core/pom.xml

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>cz.habarta.typescript-generator</groupId>
77
<artifactId>typescript-generator</artifactId>
8-
<version>1.29-SNAPSHOT</version>
8+
<version>1.30-SNAPSHOT</version>
99
</parent>
1010

1111
<artifactId>typescript-generator-core</artifactId>
@@ -94,6 +94,28 @@
9494
<version>${jackson2.version}</version>
9595
<scope>test</scope>
9696
</dependency>-->
97+
<dependency>
98+
<groupId>org.projectlombok</groupId>
99+
<artifactId>lombok</artifactId>
100+
<version>1.16.16</version>
101+
<scope>provided</scope>
102+
</dependency>
103+
<dependency>
104+
<groupId>org.slf4j</groupId>
105+
<artifactId>slf4j-api</artifactId>
106+
<version>1.7.22</version>
107+
</dependency>
108+
109+
<dependency>
110+
<groupId>org.slf4j</groupId>
111+
<artifactId>slf4j-simple</artifactId>
112+
<version>1.7.22</version>
113+
</dependency>
114+
<dependency>
115+
<groupId>org.javassist</groupId>
116+
<artifactId>javassist</artifactId>
117+
<version>3.21.0-GA</version>
118+
</dependency>
97119
</dependencies>
98120

99121
<build>
@@ -140,6 +162,14 @@
140162
</execution>
141163
</executions>
142164
</plugin>
165+
<plugin>
166+
<groupId>org.apache.maven.plugins</groupId>
167+
<artifactId>maven-compiler-plugin</artifactId>
168+
<configuration>
169+
<source>1.8</source>
170+
<target>1.8</target>
171+
</configuration>
172+
</plugin>
143173
</plugins>
144174
</build>
145175

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/Settings.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public class Settings {
7676
public boolean jackson2ModuleDiscovery = false;
7777
public List<Class<? extends Module>> jackson2Modules = new ArrayList<>();
7878
public ClassLoader classLoader = null;
79+
public String classEnumPattern = null;
7980

8081
private boolean defaultStringEnumsOverriddenByExtension = false;
8182

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

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1-
21
package cz.habarta.typescript.generator.compiler;
32

43
import cz.habarta.typescript.generator.*;
54
import cz.habarta.typescript.generator.emitter.*;
65
import cz.habarta.typescript.generator.parser.*;
76
import cz.habarta.typescript.generator.util.Utils;
7+
88
import java.lang.annotation.Annotation;
9-
import java.lang.reflect.*;
9+
import java.lang.reflect.Field;
10+
import java.lang.reflect.ParameterizedType;
11+
import java.lang.reflect.Type;
12+
import java.lang.reflect.TypeVariable;
1013
import java.util.*;
11-
14+
import java.util.stream.Collectors;
1215

1316
/**
1417
* Compiles Java model to TypeScript model.
@@ -68,6 +71,11 @@ public TsModel javaToTypeScript(Model model) {
6871
// dates
6972
tsModel = transformDates(symbolTable, tsModel);
7073

74+
// class enums
75+
if (settings.classEnumPattern != null && !Objects.equals(settings.classEnumPattern, "")) {
76+
tsModel = transformClassToEnum(tsModel);
77+
}
78+
7179
// enums
7280
if (!settings.areDefaultStringEnumsOverriddenByExtension()) {
7381
if (settings.mapEnum == null || settings.mapEnum == EnumMapping.asUnion || settings.mapEnum == EnumMapping.asInlineUnion) {
@@ -91,6 +99,33 @@ public TsModel javaToTypeScript(Model model) {
9199
return tsModel;
92100
}
93101

102+
private TsModel transformClassToEnum(TsModel tsModel) {
103+
final List<TsBeanModel> classEnums = tsModel.getBeans()
104+
.stream()
105+
.filter(tsBeanModel -> tsBeanModel.getName().getSimpleName().contains(settings.classEnumPattern))
106+
.collect(Collectors.toList());
107+
108+
List<TsEnumModel> stringEnums = new ArrayList<>();
109+
for (TsBeanModel tsBeanModel : classEnums) {
110+
List<EnumMemberModel> members = new ArrayList<>();
111+
for (Field declaredField : tsBeanModel.getOrigin().getDeclaredFields()) {
112+
if (declaredField.getType().getName().equals(tsBeanModel.getOrigin().getName())) {
113+
members.add(new EnumMemberModel(declaredField.getName(), declaredField.getName(), null));
114+
}
115+
}
116+
TsEnumModel temp = new TsEnumModel(
117+
tsBeanModel.getOrigin(),
118+
tsBeanModel.getName(),
119+
EnumKind.StringBased,
120+
members,
121+
null
122+
);
123+
stringEnums.add(temp);
124+
}
125+
126+
return tsModel.withEnums(stringEnums).withoutBeans(classEnums);
127+
}
128+
94129
public TsType javaToTypeScript(Type type) {
95130
final BeanModel beanModel = new BeanModel(Object.class, Object.class, null, null, null, Collections.<Type>emptyList(),
96131
Collections.singletonList(new PropertyModel("property", type, false, null, null, null)), null);

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ public TsModel withBeans(List<TsBeanModel> beans) {
4848
return new TsModel(beans, enums, originalStringEnums, typeAliases, helpers);
4949
}
5050

51+
public TsModel withoutBeans(List<TsBeanModel> beans) {
52+
return new TsModel(Utils.removeAll(this.beans, beans), enums, originalStringEnums, typeAliases, helpers);
53+
}
54+
5155
public List<TsEnumModel> getEnums() {
5256
return enums;
5357
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package cz.habarta.typescript.generator;
2+
3+
import com.fasterxml.jackson.annotation.JsonCreator;
4+
import com.fasterxml.jackson.annotation.JsonValue;
5+
import lombok.EqualsAndHashCode;
6+
7+
import java.util.Objects;
8+
9+
@EqualsAndHashCode
10+
public class DummyClassEnum {
11+
12+
public static final DummyClassEnum ATYPE = new DummyClassEnum("ATYPE");
13+
public static final DummyClassEnum BTYPE = new DummyClassEnum("BTYPE");
14+
public static final DummyClassEnum CTYPE = new DummyClassEnum("CTYPE");
15+
16+
private final String value;
17+
18+
@JsonCreator
19+
public DummyClassEnum(String value) {
20+
this.value = Objects.requireNonNull(value);
21+
}
22+
23+
@JsonValue
24+
public String getValue() { return value; }
25+
26+
@Override
27+
public String toString() { return value; }
28+
29+
}

typescript-generator-core/src/test/java/cz/habarta/typescript/generator/EnumTest.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@
44
import com.fasterxml.jackson.annotation.JsonFormat;
55
import com.fasterxml.jackson.annotation.JsonProperty;
66
import com.fasterxml.jackson.annotation.JsonValue;
7-
import com.fasterxml.jackson.core.JsonProcessingException;
8-
import com.fasterxml.jackson.databind.ObjectMapper;
9-
import java.util.*;
10-
import static org.junit.Assert.*;
117
import org.junit.Test;
128

9+
import java.util.Arrays;
10+
import java.util.List;
11+
import java.util.Map;
12+
13+
import static org.junit.Assert.assertEquals;
14+
import static org.junit.Assert.assertTrue;
15+
1316

1417
public class EnumTest {
1518

@@ -95,6 +98,23 @@ public void testEnumAsEnum() {
9598
assertEquals(expected.trim(), output.trim());
9699
}
97100

101+
@Test
102+
public void testClassAsEnum() {
103+
final Settings settings = TestUtils.settings();
104+
settings.mapEnum = EnumMapping.asEnum;
105+
settings.jsonLibrary = JsonLibrary.jaxb;
106+
settings.classEnumPattern = "ClassEnum"; // test custom class parse setting
107+
final String output = new TypeScriptGenerator(settings).generateTypeScript(Input.from(DummyClassEnum.class));
108+
final String expected = (
109+
"\ndeclare const enum DummyClassEnum {\n" +
110+
" ATYPE = 'ATYPE',\n" +
111+
" BTYPE = 'BTYPE',\n" +
112+
" CTYPE = 'CTYPE',\n" +
113+
"}\n"
114+
).replace("'", "\"");
115+
assertEquals(expected.trim(), output.trim());
116+
}
117+
98118
@Test
99119
public void testEnumWithJsonPropertyAnnotations() {
100120
final Settings settings = TestUtils.settings();

typescript-generator-gradle-plugin/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>cz.habarta.typescript-generator</groupId>
77
<artifactId>typescript-generator</artifactId>
8-
<version>1.29-SNAPSHOT</version>
8+
<version>1.30-SNAPSHOT</version>
99
</parent>
1010

1111
<artifactId>typescript-generator-gradle-plugin</artifactId>
@@ -42,7 +42,7 @@
4242
<dependency>
4343
<groupId>cz.habarta.typescript-generator</groupId>
4444
<artifactId>typescript-generator-core</artifactId>
45-
<version>1.29-SNAPSHOT</version>
45+
<version>1.30-SNAPSHOT</version>
4646
</dependency>
4747
</dependencies>
4848

typescript-generator-gradle-plugin/src/main/java/cz/habarta/typescript/generator/gradle/GenerateTask.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
21
package cz.habarta.typescript.generator.gradle;
32

43
import cz.habarta.typescript.generator.*;
5-
import cz.habarta.typescript.generator.Input;
6-
import java.io.*;
7-
import java.net.*;
8-
import java.util.*;
9-
import org.gradle.api.*;
10-
import org.gradle.api.tasks.*;
4+
import org.gradle.api.DefaultTask;
5+
import org.gradle.api.Task;
6+
import org.gradle.api.tasks.TaskAction;
117

8+
import java.io.File;
9+
import java.net.URL;
10+
import java.net.URLClassLoader;
11+
import java.util.ArrayList;
12+
import java.util.List;
1213

1314
public class GenerateTask extends DefaultTask {
1415

@@ -68,6 +69,7 @@ public class GenerateTask extends DefaultTask {
6869
public boolean jackson2ModuleDiscovery;
6970
public List<String> jackson2Modules;
7071
public boolean debug;
72+
public String classEnumPattern;
7173

7274
@TaskAction
7375
public void generate() throws Exception {
@@ -150,6 +152,7 @@ public void generate() throws Exception {
150152
? getProject().file(outputFile)
151153
: new File(new File(getProject().getBuildDir(), "typescript-generator"), getProject().getName() + settings.getExtension());
152154
settings.validateFileName(output);
155+
settings.classEnumPattern = classEnumPattern;
153156

154157
// TypeScriptGenerator
155158
new TypeScriptGenerator(settings).generateTypeScript(

typescript-generator-maven-plugin/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>cz.habarta.typescript-generator</groupId>
77
<artifactId>typescript-generator</artifactId>
8-
<version>1.29-SNAPSHOT</version>
8+
<version>1.30-SNAPSHOT</version>
99
</parent>
1010

1111
<artifactId>typescript-generator-maven-plugin</artifactId>
@@ -27,7 +27,7 @@
2727
<dependency>
2828
<groupId>cz.habarta.typescript-generator</groupId>
2929
<artifactId>typescript-generator-core</artifactId>
30-
<version>1.29-SNAPSHOT</version>
30+
<version>1.30-SNAPSHOT</version>
3131
</dependency>
3232
</dependencies>
3333

0 commit comments

Comments
 (0)