diff --git a/code-generators/src/main/java/net/minestom/codegen/CodeGenerator.java b/code-generators/src/main/java/net/minestom/codegen/CodeGenerator.java index 8aa876ec201..72da0b8e567 100644 --- a/code-generators/src/main/java/net/minestom/codegen/CodeGenerator.java +++ b/code-generators/src/main/java/net/minestom/codegen/CodeGenerator.java @@ -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); @@ -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); @@ -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; } @@ -117,14 +115,4 @@ public void generateKeys(InputStream resourceFile, String packageName, String ty .build()), outputFolder); } - - private void writeFiles(@NotNull List 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); - } - } - } } diff --git a/code-generators/src/main/java/net/minestom/codegen/ConstantsGenerator.java b/code-generators/src/main/java/net/minestom/codegen/ConstantsGenerator.java index 0ce81d41a30..1189cd9bc9e 100644 --- a/code-generators/src/main/java/net/minestom/codegen/ConstantsGenerator.java +++ b/code-generators/src/main/java/net/minestom/codegen/ConstantsGenerator.java @@ -71,7 +71,7 @@ public void generate() { writeFiles( List.of( JavaFile.builder("net.minestom.server", constantsInterface.build()) - .indent(" ") + .indent(DEFAULT_INDENT) .skipJavaLangImports(true) .build() ), diff --git a/code-generators/src/main/java/net/minestom/codegen/MinestomCodeGenerator.java b/code-generators/src/main/java/net/minestom/codegen/MinestomCodeGenerator.java index 63b26f97d26..eeb0c887e90 100644 --- a/code-generators/src/main/java/net/minestom/codegen/MinestomCodeGenerator.java +++ b/code-generators/src/main/java/net/minestom/codegen/MinestomCodeGenerator.java @@ -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 = " "; diff --git a/code-generators/src/main/java/net/minestom/codegen/color/DyeColorGenerator.java b/code-generators/src/main/java/net/minestom/codegen/color/DyeColorGenerator.java index da85a1d66e5..ce556888e71 100644 --- a/code-generators/src/main/java/net/minestom/codegen/color/DyeColorGenerator.java +++ b/code-generators/src/main/java/net/minestom/codegen/color/DyeColorGenerator.java @@ -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; @@ -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; @@ -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")) @@ -57,19 +74,26 @@ 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( @@ -77,80 +101,85 @@ public void generate() { 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); } } diff --git a/code-generators/src/main/java/net/minestom/codegen/fluid/FluidGenerator.java b/code-generators/src/main/java/net/minestom/codegen/fluid/FluidGenerator.java index 642489970cf..070a89138fb 100644 --- a/code-generators/src/main/java/net/minestom/codegen/fluid/FluidGenerator.java +++ b/code-generators/src/main/java/net/minestom/codegen/fluid/FluidGenerator.java @@ -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); @@ -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( @@ -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() ); @@ -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); } } diff --git a/code-generators/src/main/java/net/minestom/codegen/particle/ParticleGenerator.java b/code-generators/src/main/java/net/minestom/codegen/particle/ParticleGenerator.java index 14b13e3e0a4..d0ca3f1f328 100644 --- a/code-generators/src/main/java/net/minestom/codegen/particle/ParticleGenerator.java +++ b/code-generators/src/main/java/net/minestom/codegen/particle/ParticleGenerator.java @@ -12,7 +12,6 @@ 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; @@ -23,7 +22,8 @@ public class ParticleGenerator extends MinestomCodeGenerator { private static final Logger LOGGER = LoggerFactory.getLogger(ParticleGenerator.class); - + private static final String PARTICLE_PACKAGE = "net.minestom.server.particle"; + private static final Pattern PASCAL_PATTERN = Pattern.compile("_([a-z])"); private final InputStream particlesFile; private final File outputFolder; @@ -45,8 +45,8 @@ public void generate() { } // Important classes we use alot - ClassName particleCN = ClassName.get("net.minestom.server.particle", "Particle"); - ClassName particleImplCN = ClassName.get("net.minestom.server.particle", "ParticleImpl"); + ClassName particleCN = ClassName.get(PARTICLE_PACKAGE, "Particle"); + ClassName particleImplCN = ClassName.get(PARTICLE_PACKAGE, "ParticleImpl"); JsonObject particleObject = GSON.fromJson(new InputStreamReader(particlesFile), JsonObject.class); List> orderedParticleIdObjectEntries = particleObject.entrySet().stream() @@ -54,7 +54,7 @@ public void generate() { // Start code gen - ClassName particlesCN = ClassName.get("net.minestom.server.particle", "Particles"); + ClassName particlesCN = ClassName.get(PARTICLE_PACKAGE, "Particles"); TypeSpec.Builder particlesInterface = TypeSpec.interfaceBuilder(particlesCN) .addJavadoc("AUTOGENERATED by " + getClass().getSimpleName()); @@ -65,7 +65,7 @@ public void generate() { ClassName fieldCN = particleCN; if (value.get("hasData").getAsBoolean()) { // This particle has data, use the particle implementation class - fieldCN = ClassName.get("net.minestom.server.particle", "Particle", + fieldCN = ClassName.get(PARTICLE_PACKAGE, "Particle", toPascalCase(key.replace("minecraft:", ""))); } @@ -78,20 +78,19 @@ public void generate() { String fieldName = key.replace("minecraft:", "").toUpperCase(); particlesInterface.addField(FieldSpec.builder(fieldCN, fieldName) - .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL) + .addModifiers(CONSTANT_MODIFIERS) .initializer("$L$T.get($S)", cast, particleImplCN, key).build()); } - writeFiles( - List.of(JavaFile.builder("net.minestom.server.particle", particlesInterface.build()) - .indent(" ") - .skipJavaLangImports(true) - .build()), - outputFolder); + final JavaFile javaFile = JavaFile.builder(PARTICLE_PACKAGE, particlesInterface.build()) + .indent(DEFAULT_INDENT) + .skipJavaLangImports(true) + .build(); + writeFile(javaFile, outputFolder); } - private static String toPascalCase(@NotNull String input) { - String camelCase = Pattern.compile("_([a-z])") + private static @NotNull String toPascalCase(@NotNull String input) { + String camelCase = PASCAL_PATTERN .matcher(input) .replaceAll(m -> m.group(1).toUpperCase()); return camelCase.substring(0, 1).toUpperCase() + camelCase.substring(1); diff --git a/code-generators/src/main/java/net/minestom/codegen/recipe/RecipeTypeGenerator.java b/code-generators/src/main/java/net/minestom/codegen/recipe/RecipeTypeGenerator.java index 749dfc091aa..ca7f3a440f8 100644 --- a/code-generators/src/main/java/net/minestom/codegen/recipe/RecipeTypeGenerator.java +++ b/code-generators/src/main/java/net/minestom/codegen/recipe/RecipeTypeGenerator.java @@ -5,6 +5,7 @@ import com.google.gson.JsonObject; import com.squareup.javapoet.*; import net.minestom.codegen.MinestomCodeGenerator; +import net.minestom.codegen.util.GenerationHelper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; @@ -18,8 +19,11 @@ import java.util.List; import java.util.stream.StreamSupport; +import static net.minestom.codegen.util.GenerationHelper.VARIABLE_GETTER; + public class RecipeTypeGenerator extends MinestomCodeGenerator { private static final Logger LOGGER = LoggerFactory.getLogger(RecipeTypeGenerator.class); + private static final String NAMESPACE = "namespace"; private final InputStream recipeTypesFile; private final File outputFolder; @@ -54,10 +58,10 @@ public void generate() { // Fields recipeTypeEnum.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, recipeTypeCN) .build(), - FieldSpec.builder(namespaceIdCN, "namespace", Modifier.PRIVATE, Modifier.FINAL).build() + FieldSpec.builder(namespaceIdCN, NAMESPACE, PRIVATE_FINAL_MODIFIERS).build() ) ); @@ -66,21 +70,21 @@ public void generate() { List.of( // Constructor MethodSpec.constructorBuilder() - .addParameter(ParameterSpec.builder(namespaceIdCN, "namespace").addAnnotation(NotNull.class).build()) - .addStatement("this.namespace = namespace") + .addParameter(ParameterSpec.builder(namespaceIdCN, NAMESPACE).addAnnotation(NotNull.class).build()) + .addStatement(GenerationHelper.VARIABLE_SETTER, NAMESPACE) .build(), - MethodSpec.methodBuilder("namespace") + MethodSpec.methodBuilder(NAMESPACE) .addModifiers(Modifier.PUBLIC) .addAnnotation(NotNull.class) .addAnnotation(Override.class) .returns(namespaceIdCN) - .addStatement("return this.namespace") + .addStatement(VARIABLE_GETTER, NAMESPACE) .build(), MethodSpec.methodBuilder("id") .addModifiers(Modifier.PUBLIC) .returns(TypeName.INT) .addAnnotation(Override.class) - .addStatement("return this.ordinal()") + .addStatement(VARIABLE_GETTER, "ordinal()") .build() ) ); @@ -96,15 +100,11 @@ public void generate() { } // Write files to outputFolder - writeFiles( - List.of( - JavaFile.builder("net.minestom.server.recipe", recipeTypeEnum.build()) - .indent(" ") - .skipJavaLangImports(true) - .build() - ), - outputFolder - ); + final JavaFile javaFile = JavaFile.builder("net.minestom.server.recipe", recipeTypeEnum.build()) + .indent(DEFAULT_INDENT) + .skipJavaLangImports(true) + .build(); + writeFile(javaFile, outputFolder); } private static @NotNull String recipeTypeConstantName(@NotNull String name) { diff --git a/code-generators/src/main/java/net/minestom/codegen/util/GenerationHelper.java b/code-generators/src/main/java/net/minestom/codegen/util/GenerationHelper.java index f56116180a4..08f8eb7a9da 100644 --- a/code-generators/src/main/java/net/minestom/codegen/util/GenerationHelper.java +++ b/code-generators/src/main/java/net/minestom/codegen/util/GenerationHelper.java @@ -18,19 +18,20 @@ public final class GenerationHelper { public static final MethodSpec ADVENTURE_KEY_METHOD; public static final MethodSpec TO_STRING; public static final String VARIABLE_SETTER = "this.$1L = $1L"; + public static final String VARIABLE_GETTER = "return this.$1L"; static { ID_GETTER = MethodSpec.methodBuilder("getId") .returns(NAMESPACE_ID_CLASS) .addAnnotation(NotNull.class) - .addStatement("return this.id") + .addStatement(VARIABLE_GETTER, "id") .addModifiers(Modifier.PUBLIC) .build(); ADVENTURE_KEY_METHOD = MethodSpec.methodBuilder("key") .returns(ADVENTURE_KEY) .addAnnotation(Override.class) .addAnnotation(NotNull.class) - .addStatement("return this.id") + .addStatement(VARIABLE_GETTER, "id") .addModifiers(Modifier.PUBLIC) .build(); TO_STRING = MethodSpec.methodBuilder("toString")