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
78 lines (70 loc) · 3.19 KB
/
CodeGenerator.java
File metadata and controls
78 lines (70 loc) · 3.19 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
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 org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.lang.model.element.Modifier;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import static net.minestom.codegen.MinestomCodeGenerator.DEFAULT_INDENT;
import static net.minestom.codegen.MinestomCodeGenerator.extractNamespaces;
@ApiStatus.Internal
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(@NotNull 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 = 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!");
Map<String, String> replacementOptions = new HashMap<>();
replacementOptions.put("minecraft:", "");
replacementOptions.put(".", "_");
replacementOptions.put("/", "_");
// Use data
json.keySet().forEach(namespace -> {
final String constantName = extractNamespaces(namespace, replacementOptions);
blockConstantsClass.addField(
FieldSpec.builder(typeClass, constantName)
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
.initializer(
"$T.get($S)",
loaderClass,
namespace
)
.build()
);
});
writeFile(
JavaFile.builder(packageName, blockConstantsClass.build())
.indent(DEFAULT_INDENT)
.skipJavaLangImports(true)
.build(),
outputFolder
);
}
}