Minestom/code-generators/src/main/java/net/minestom/codegen/blocks/BlockGenerator.java

71 lines
2.8 KiB
Java

package net.minestom.codegen.blocks;
import com.google.gson.JsonObject;
import com.squareup.javapoet.*;
import net.minestom.codegen.MinestomCodeGenerator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
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.List;
import java.util.Locale;
public final class BlockGenerator extends MinestomCodeGenerator {
private static final Logger LOGGER = LoggerFactory.getLogger(BlockGenerator.class);
private final InputStream blocksFile;
private final File outputFolder;
public BlockGenerator(@Nullable InputStream blocksFile, @NotNull File outputFolder) {
this.blocksFile = blocksFile;
this.outputFolder = outputFolder;
}
@Override
public void generate() {
if (blocksFile == null) {
LOGGER.error("Failed to find blocks.json.");
LOGGER.error("Stopped code generation for blocks.");
return;
}
ClassName blockCN = ClassName.get("net.minestom.server.instance.block", "Block");
JsonObject blocks;
blocks = GSON.fromJson(new InputStreamReader(blocksFile), JsonObject.class);
ClassName blocksCN = ClassName.get("net.minestom.server.instance.block", "BlockConstants");
// BlockConstants class
TypeSpec.Builder blockConstantsClass = TypeSpec.interfaceBuilder(blocksCN)
// Add @SuppressWarnings("unused")
.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "$S", "unused").build())
.addJavadoc("AUTOGENERATED by " + getClass().getSimpleName());
// Use data
blocks.keySet().forEach(namespace -> {
final String constantName = namespace.replace("minecraft:", "").toUpperCase(Locale.ROOT);
blockConstantsClass.addField(
FieldSpec.builder(blockCN, constantName)
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
.initializer(
// Block.STONE = Block.fromNamespaceId("minecraft:stone")
"$T.fromNamespaceId($S)",
blockCN,
namespace
)
.build()
);
});
writeFiles(
List.of(
JavaFile.builder("net.minestom.server.instance.block", blockConstantsClass.build())
.indent(" ")
.skipJavaLangImports(true)
.build()
),
outputFolder
);
}
}