Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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