Skip to content

Commit

Permalink
Cleanup generator package (#71)
Browse files Browse the repository at this point in the history
* Add new constant

* Update constant modifier definition

* Cleanup code

* Update string usages to increase readability

* Remove unused import
  • Loading branch information
theEvilReaper committed Aug 20, 2024
1 parent fd40028 commit 9179372
Show file tree
Hide file tree
Showing 8 changed files with 116 additions and 102 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,18 @@
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.squareup.javapoet.*;
import org.jetbrains.annotations.NotNull;
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.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Locale;

public class CodeGenerator {
public class CodeGenerator implements CodeExporter {
protected static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
private static final Logger LOGGER = LoggerFactory.getLogger(CodeGenerator.class);

Expand All @@ -29,7 +27,7 @@ public CodeGenerator(File 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);
LOGGER.error("Failed to find resource file for {}", typeName);
return;
}
ClassName typeClass = ClassName.get(packageName, typeName);
Expand Down Expand Up @@ -72,7 +70,7 @@ public void generate(InputStream resourceFile, String packageName, String typeNa

public void generateKeys(InputStream resourceFile, String packageName, String typeName, String generatedName) {
if (resourceFile == null) {
LOGGER.error("Failed to find resource file for " + typeName);
LOGGER.error("Failed to find resource file for {}", typeName);
return;
}

Expand Down Expand Up @@ -117,14 +115,4 @@ public void generateKeys(InputStream resourceFile, String packageName, String ty
.build()),
outputFolder);
}

private void writeFiles(@NotNull List<JavaFile> fileList, File outputFolder) {
for (JavaFile javaFile : fileList) {
try {
javaFile.writeTo(outputFolder);
} catch (IOException e) {
LOGGER.error("An error occured while writing source code to the file system.", e);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public void generate() {
writeFiles(
List.of(
JavaFile.builder("net.minestom.server", constantsInterface.build())
.indent(" ")
.indent(DEFAULT_INDENT)
.skipJavaLangImports(true)
.build()
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public abstract class MinestomCodeGenerator implements CodeExporter {
ClassName.get("net.minestom.server.registry", "Registries");
protected static final ClassName KEYORI_ADVENTURE_KEY =
ClassName.get("net.kyori.adventure.key", "Keyed");
protected static final Modifier[] CONSTANT_MODIFIERS = {Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL};
protected static final Modifier[] CONSTANT_MODIFIERS = {Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL};
protected static final Modifier[] PRIVATE_FINAL_MODIFIERS = {Modifier.PRIVATE, Modifier.FINAL};
protected static final String DEFAULT_INDENT = " ";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,16 @@
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.squareup.javapoet.*;
import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.ArrayTypeName;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.ParameterSpec;
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeName;
import com.squareup.javapoet.TypeSpec;
import net.minestom.codegen.MinestomCodeGenerator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
Expand All @@ -18,8 +27,16 @@
import java.util.List;
import java.util.stream.StreamSupport;

import static net.minestom.codegen.util.GenerationHelper.VARIABLE_GETTER;
import static net.minestom.codegen.util.GenerationHelper.VARIABLE_SETTER;

public class DyeColorGenerator extends MinestomCodeGenerator {
private static final Logger LOGGER = LoggerFactory.getLogger(DyeColorGenerator.class);
private static final String COLOR_PACKAGE = "net.minestom.server.color";
private static final String TEXTURE_DIFFUSE_COLOR = "textureDiffuseColor";
private static final String TEXT_COLOR = "textColor";
private static final String FIREWORK_COLOR = "fireworkColor";
private static final String MAP_COLOR_ID = "mapColorId";
private final InputStream dyeColorsFile;
private final File outputFolder;

Expand All @@ -40,10 +57,10 @@ public void generate() {
return;
}
// Important classes we use alot
ClassName colorCN = ClassName.get("net.minestom.server.color", "Color");
ClassName colorCN = ClassName.get(COLOR_PACKAGE, "Color");

JsonArray dyeColors = GSON.fromJson(new InputStreamReader(dyeColorsFile), JsonArray.class);
ClassName dyeColorCN = ClassName.get("net.minestom.server.color", "DyeColor");
ClassName dyeColorCN = ClassName.get(COLOR_PACKAGE, "DyeColor");
// Dye Color Enum
TypeSpec.Builder dyeColorEnum = TypeSpec.enumBuilder(dyeColorCN)
.addSuperinterface(ClassName.get("net.kyori.adventure.util", "RGBLike"))
Expand All @@ -57,100 +74,112 @@ public void generate() {
// Fields
dyeColorEnum.addFields(
List.of(
FieldSpec.builder(networkBufferTypeCN, "NETWORK_TYPE", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
FieldSpec.builder(networkBufferTypeCN, "NETWORK_TYPE", CONSTANT_MODIFIERS)
.initializer("$T.Enum($T.class)", networkBufferCN, dyeColorCN)
.build(),
FieldSpec.builder(binaryTagSerializerTypeCN, "NBT_TYPE", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
FieldSpec.builder(binaryTagSerializerTypeCN, "NBT_TYPE", CONSTANT_MODIFIERS)
.initializer("$T.fromEnumStringable($T.class)", binaryTagSerializerCN, dyeColorCN)
.build(),
FieldSpec.builder(colorCN, "textureDiffuseColor", Modifier.PRIVATE, Modifier.FINAL).build(),
FieldSpec.builder(colorCN, "textColor", Modifier.PRIVATE, Modifier.FINAL).build(),
FieldSpec.builder(colorCN, "fireworkColor", Modifier.PRIVATE, Modifier.FINAL).build(),
FieldSpec.builder(TypeName.INT, "mapColorId", Modifier.PRIVATE, Modifier.FINAL).build()
FieldSpec.builder(colorCN, TEXTURE_DIFFUSE_COLOR, PRIVATE_FINAL_MODIFIERS).build(),
FieldSpec.builder(colorCN, TEXT_COLOR, PRIVATE_FINAL_MODIFIERS).build(),
FieldSpec.builder(colorCN, FIREWORK_COLOR, PRIVATE_FINAL_MODIFIERS).build(),
FieldSpec.builder(TypeName.INT, MAP_COLOR_ID, PRIVATE_FINAL_MODIFIERS).build()
)
);

dyeColorEnum.addField(
FieldSpec.builder(ArrayTypeName.of(dyeColorCN), "VALUES")
.addModifiers(Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL)
.initializer("values()")
.build()
);

// Methods
dyeColorEnum.addMethods(
List.of(
// Constructor
MethodSpec.constructorBuilder()
.addParameters(
List.of(
ParameterSpec.builder(colorCN, "textureDiffuseColor").addAnnotation(NotNull.class).build(),
ParameterSpec.builder(colorCN, "textColor").addAnnotation(NotNull.class).build(),
ParameterSpec.builder(colorCN, "fireworkColor").addAnnotation(NotNull.class).build(),
ParameterSpec.builder(TypeName.INT, "mapColorId").build()
ParameterSpec.builder(colorCN, TEXTURE_DIFFUSE_COLOR).addAnnotation(NotNull.class).build(),
ParameterSpec.builder(colorCN, TEXT_COLOR).addAnnotation(NotNull.class).build(),
ParameterSpec.builder(colorCN, FIREWORK_COLOR).addAnnotation(NotNull.class).build(),
ParameterSpec.builder(TypeName.INT, MAP_COLOR_ID).build()
)
)
.addStatement("this.textureDiffuseColor = textureDiffuseColor")
.addStatement("this.textColor = textColor")
.addStatement("this.fireworkColor = fireworkColor")
.addStatement("this.mapColorId = mapColorId")
.addStatement(VARIABLE_SETTER, TEXTURE_DIFFUSE_COLOR)
.addStatement(VARIABLE_SETTER, TEXT_COLOR)
.addStatement(VARIABLE_SETTER, FIREWORK_COLOR)
.addStatement(VARIABLE_SETTER, MAP_COLOR_ID)
.build(),
MethodSpec.methodBuilder("color")
.addModifiers(Modifier.PUBLIC)
.returns(colorCN.annotated(AnnotationSpec.builder(NotNull.class).build()))
.addStatement("return this.textureDiffuseColor")
.addStatement(VARIABLE_GETTER, TEXTURE_DIFFUSE_COLOR)
.build(),
MethodSpec.methodBuilder("textColor")
MethodSpec.methodBuilder(TEXT_COLOR)
.addModifiers(Modifier.PUBLIC)
.returns(colorCN.annotated(AnnotationSpec.builder(NotNull.class).build()))
.addStatement("return this.textColor")
.addStatement(VARIABLE_GETTER, TEXT_COLOR)
.build(),
MethodSpec.methodBuilder("fireworkColor")
MethodSpec.methodBuilder(FIREWORK_COLOR)
.addModifiers(Modifier.PUBLIC)
.returns(colorCN.annotated(AnnotationSpec.builder(NotNull.class).build()))
.addStatement("return this.fireworkColor")
.addStatement(VARIABLE_GETTER, FIREWORK_COLOR)
.build(),
MethodSpec.methodBuilder("red")
.addModifiers(Modifier.PUBLIC)
.returns(TypeName.INT)
.addAnnotation(Override.class)
.addStatement("return this.textureDiffuseColor.red()")
.addStatement("return this.$L.red()", TEXTURE_DIFFUSE_COLOR)
.build(),
MethodSpec.methodBuilder("green")
.returns(TypeName.INT)
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.addStatement("return this.textureDiffuseColor.green()")
.addStatement("return this.$L.green()", TEXTURE_DIFFUSE_COLOR)
.build(),
MethodSpec.methodBuilder("blue")
.returns(TypeName.INT)
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.addStatement("return this.textureDiffuseColor.blue()")
.addStatement("return this.$L.blue()", TEXTURE_DIFFUSE_COLOR)
.build(),
MethodSpec.methodBuilder("mapColorId")
MethodSpec.methodBuilder(MAP_COLOR_ID)
.addModifiers(Modifier.PUBLIC)
.returns(TypeName.INT)
.addStatement("return this.mapColorId")
.addStatement(VARIABLE_GETTER, MAP_COLOR_ID)
.build()
)
);

dyeColorEnum.addMethod(
MethodSpec.methodBuilder("getValue")
.addParameter(ParameterSpec.builder(TypeName.INT, "id").build())
.returns(dyeColorCN.annotated(AnnotationSpec.builder(Nullable.class).build()))
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.addStatement("return $L", "VALUES[id]")
.build()
);

// Use data
for (JsonObject dyeColorObject : StreamSupport.stream(dyeColors.spliterator(), true).map(JsonElement::getAsJsonObject).sorted(Comparator.comparingInt(o -> o.get("id").getAsInt())).toList()) {
String dyeColorName = dyeColorObject.get("name").getAsString();
dyeColorEnum.addEnumConstant(toConstant(dyeColorName), TypeSpec.anonymousClassBuilder(
"new $T(0x$L), new $T(0x$L), new $T(0x$L), $L",
colorCN, Integer.toString(dyeColorObject.get("textureDiffuseColor").getAsInt(), 16),
colorCN, Integer.toString(dyeColorObject.get("textColor").getAsInt(), 16),
colorCN, Integer.toString(dyeColorObject.get("fireworkColor").getAsInt(), 16),
dyeColorObject.get("mapColorId").getAsInt()
colorCN, Integer.toString(dyeColorObject.get(TEXTURE_DIFFUSE_COLOR).getAsInt(), 16),
colorCN, Integer.toString(dyeColorObject.get(TEXT_COLOR).getAsInt(), 16),
colorCN, Integer.toString(dyeColorObject.get(FIREWORK_COLOR).getAsInt(), 16),
dyeColorObject.get(MAP_COLOR_ID).getAsInt()
).build()
);
}

// Write files to outputFolder
writeFiles(
List.of(
JavaFile.builder("net.minestom.server.color", dyeColorEnum.build())
.indent(" ")
.skipJavaLangImports(true)
.build()
),
outputFolder
);
final JavaFile javaFile = JavaFile.builder(COLOR_PACKAGE, dyeColorEnum.build())
.indent(DEFAULT_INDENT)
.skipJavaLangImports(true)
.build();
writeFile(javaFile, outputFolder);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;

import static net.minestom.codegen.util.GenerationHelper.VARIABLE_SETTER;

public final class FluidGenerator extends MinestomCodeGenerator {
private static final Logger LOGGER = LoggerFactory.getLogger(FluidGenerator.class);
Expand Down Expand Up @@ -49,7 +50,7 @@ public void generate() {

fluidClass.addField(
FieldSpec.builder(namespaceIDClassName, "id")
.addModifiers(Modifier.PRIVATE, Modifier.FINAL).addAnnotation(NotNull.class).build()
.addModifiers(PRIVATE_FINAL_MODIFIERS).addAnnotation(NotNull.class).build()
);
// static field
fluidClass.addField(
Expand All @@ -62,7 +63,7 @@ public void generate() {
fluidClass.addMethod(
MethodSpec.constructorBuilder()
.addParameter(ParameterSpec.builder(namespaceIDClassName, "id").addAnnotation(NotNull.class).build())
.addStatement("this.id = id")
.addStatement(VARIABLE_SETTER, "id")
.addStatement("$T.fluids.put(id, this)", registriesClassName)
.build()
);
Expand Down Expand Up @@ -131,14 +132,10 @@ public void generate() {
});

// Write files to outputFolder
writeFiles(
List.of(
JavaFile.builder("net.minestom.server.fluid", fluidClass.build())
.indent(" ")
.skipJavaLangImports(true)
.build()
),
outputFolder
);
final JavaFile javaFile = JavaFile.builder("net.minestom.server.fluid", fluidClass.build())
.indent(DEFAULT_INDENT)
.skipJavaLangImports(true)
.build();
writeFile(javaFile, outputFolder);
}
}
Loading

0 comments on commit 9179372

Please sign in to comment.