forked from Minestom/Minestom
-
-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathCodeGenerator.java
More file actions
122 lines (110 loc) · 5.14 KB
/
CodeGenerator.java
File metadata and controls
122 lines (110 loc) · 5.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package net.minestom.codegen;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.TypeSpec;
import net.kyori.adventure.key.Key;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Modifier;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Locale;
public class CodeGenerator implements CodeExporter {
protected static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
private static final Logger LOGGER = LoggerFactory.getLogger(CodeGenerator.class);
private final File outputFolder;
public CodeGenerator(File outputFolder) {
this.outputFolder = outputFolder;
}
public void generate(InputStream resourceFile, String packageName, String typeName, String loaderName, String generatedName) {
if (resourceFile == null) {
LOGGER.error("Failed to find resource file for {}", typeName);
return;
}
ClassName typeClass = ClassName.get(packageName, typeName);
ClassName loaderClass = ClassName.get(packageName, loaderName);
JsonObject json;
json = GSON.fromJson(new InputStreamReader(resourceFile), JsonObject.class);
ClassName materialsCN = ClassName.get(packageName, generatedName);
// BlockConstants class
TypeSpec.Builder blockConstantsClass = TypeSpec.interfaceBuilder(materialsCN)
// Add @SuppressWarnings("unused")
.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "$S", "unused").build())
.addJavadoc("Code autogenerated, do not edit!");
// Use data
json.keySet().forEach(namespace -> {
final String constantName = namespace
.replace("minecraft:", "")
.replace(".", "_")
.toUpperCase(Locale.ROOT);
blockConstantsClass.addField(
FieldSpec.builder(typeClass, constantName)
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
.initializer(
// TypeClass.STONE = MaterialLoader.fromNamespaceId("minecraft:stone")
"$T.get($S)",
loaderClass,
namespace
)
.build()
);
});
writeFiles(
List.of(JavaFile.builder(packageName, blockConstantsClass.build())
.indent(" ")
.skipJavaLangImports(true)
.build()),
outputFolder);
}
public void generateKeys(InputStream resourceFile, String packageName, String typeName, String generatedName) {
if (resourceFile == null) {
LOGGER.error("Failed to find resource file for {}", typeName);
return;
}
ClassName typeClass = ClassName.bestGuess(packageName + "." + typeName); // Use bestGuess to handle nested class
ClassName registryKeyClass = ClassName.get(Key.class);
JsonObject json;
json = GSON.fromJson(new InputStreamReader(resourceFile), JsonObject.class);
ClassName materialsCN = ClassName.get(packageName, generatedName);
// BlockConstants class
TypeSpec.Builder blockConstantsClass = TypeSpec.interfaceBuilder(materialsCN)
// Add @SuppressWarnings("unused")
.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "$S", "unused").build())
.addJavadoc("Code autogenerated, do not edit!");
// Use data
json.keySet().forEach(namespace -> {
String constantName = namespace
.replace("minecraft:", "")
.replace(".", "_")
.toUpperCase(Locale.ROOT);
if (!SourceVersion.isName(constantName)) {
constantName = "_" + constantName;
}
blockConstantsClass.addField(
FieldSpec.builder(registryKeyClass, constantName)
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
.initializer(
// TypeClass.STONE = Key.key("minecraft:stone")
"$T.key($S)",
registryKeyClass,
namespace
)
.build()
);
});
writeFiles(
List.of(JavaFile.builder(packageName, blockConstantsClass.build())
.indent(" ")
.skipJavaLangImports(true)
.build()),
outputFolder);
}
}