From c4d4dcb9db6acebaadb32131db93c4affd70397d Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 13 Feb 2020 23:10:18 -0500 Subject: [PATCH] TypeIO resolution --- .../java/mindustry/annotations/entity/EntityIO.java | 13 ++++++++++--- .../mindustry/annotations/entity/EntityProcess.java | 8 ++++++-- .../mindustry/annotations/remote/RemoteProcess.java | 6 +++--- .../annotations/remote/RemoteReadGenerator.java | 2 +- .../annotations/remote/RemoteWriteGenerator.java | 2 +- .../{remote => util}/TypeIOResolver.java | 3 +-- core/src/mindustry/io/TypeIO.java | 2 +- 7 files changed, 23 insertions(+), 13 deletions(-) rename annotations/src/main/java/mindustry/annotations/{remote => util}/TypeIOResolver.java (96%) diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java b/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java index 997da6bd98..1d116cbb97 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java @@ -3,15 +3,18 @@ package mindustry.annotations.entity; import com.squareup.javapoet.*; import com.squareup.javapoet.MethodSpec.*; import mindustry.annotations.*; +import mindustry.annotations.util.TypeIOResolver.*; import static mindustry.annotations.BaseProcessor.instanceOf; public class EntityIO{ final MethodSpec.Builder builder; final boolean write; + final ClassSerializer serializer; - EntityIO(Builder builder, boolean write){ + EntityIO(Builder builder, boolean write, ClassSerializer serializer){ this.builder = builder; + this.serializer = serializer; this.write = write; } @@ -19,14 +22,18 @@ public class EntityIO{ if(type.isPrimitive()){ s(type == TypeName.BOOLEAN ? "bool" : type.toString().charAt(0) + "", field); - }else if(type.toString().equals("java.lang.String")){ - s("str", field); + //}else if(type.toString().equals("java.lang.String")){ + // s("str", field); }else if(instanceOf(type.toString(), "mindustry.ctype.Content")){ if(write){ s("s", field + ".id"); }else{ st(field + " = mindustry.Vars.content.getByID(mindustry.ctype.ContentType.$L, read.s())", BaseProcessor.simpleName(type.toString()).toLowerCase().replace("type", "")); } + }else if(serializer.writers.containsKey(type.toString()) && write){ + st("$L(write, $L)", serializer.writers.get(type.toString()), field); + }else if(serializer.readers.containsKey(type.toString()) && !write){ + st("$L = $L(read)", field, serializer.readers.get(type.toString())); } } diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java index ea4833a5d8..8a39f97804 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java @@ -12,6 +12,7 @@ import com.squareup.javapoet.TypeSpec.*; import com.sun.source.tree.*; import mindustry.annotations.Annotations.*; import mindustry.annotations.*; +import mindustry.annotations.util.TypeIOResolver.*; import mindustry.annotations.util.*; import javax.annotation.processing.*; @@ -23,7 +24,8 @@ import java.lang.annotation.*; "mindustry.annotations.Annotations.EntityDef", "mindustry.annotations.Annotations.GroupDef", "mindustry.annotations.Annotations.EntityInterface", -"mindustry.annotations.Annotations.BaseComponent" +"mindustry.annotations.Annotations.BaseComponent", +"mindustry.annotations.Annotations.TypeIOHandler" }) public class EntityProcess extends BaseProcessor{ Array definitions = new Array<>(); @@ -38,6 +40,7 @@ public class EntityProcess extends BaseProcessor{ Array allGroups = new Array<>(); Array allDefs = new Array<>(); Array allInterfaces = new Array<>(); + ClassSerializer serializer; { rounds = 3; @@ -51,6 +54,7 @@ public class EntityProcess extends BaseProcessor{ //round 1: generate component interfaces if(round == 1){ + serializer = TypeIOResolver.resolve(this); baseComponents = types(BaseComponent.class); Array allComponents = types(Component.class); @@ -330,7 +334,7 @@ public class EntityProcess extends BaseProcessor{ if((first.name().equals("read") || first.name().equals("write")) && ann.genio()){ Array fields = Array.with(builder.fieldSpecs).select(spec -> !spec.hasModifier(Modifier.TRANSIENT) && !spec.hasModifier(Modifier.STATIC) && !spec.hasModifier(Modifier.FINAL)); fields.sortComparing(f -> f.name); //sort to keep order - EntityIO writer = new EntityIO(mbuilder, first.name().equals("write")); + EntityIO writer = new EntityIO(mbuilder, first.name().equals("write"), serializer); //subclasses *have* to call this method mbuilder.addAnnotation(CallSuper.class); //write or read each non-transient field diff --git a/annotations/src/main/java/mindustry/annotations/remote/RemoteProcess.java b/annotations/src/main/java/mindustry/annotations/remote/RemoteProcess.java index 6a23ef45a7..9a00d12bfe 100644 --- a/annotations/src/main/java/mindustry/annotations/remote/RemoteProcess.java +++ b/annotations/src/main/java/mindustry/annotations/remote/RemoteProcess.java @@ -3,7 +3,8 @@ package mindustry.annotations.remote; import com.squareup.javapoet.*; import mindustry.annotations.*; import mindustry.annotations.Annotations.*; -import mindustry.annotations.remote.TypeIOResolver.*; +import mindustry.annotations.util.*; +import mindustry.annotations.util.TypeIOResolver.*; import javax.annotation.processing.*; import javax.lang.model.element.*; @@ -14,8 +15,7 @@ import java.util.stream.*; /** The annotation processor for generating remote method call code. */ @SupportedAnnotationTypes({ "mindustry.annotations.Annotations.Remote", -"mindustry.annotations.Annotations.WriteClass", -"mindustry.annotations.Annotations.ReadClass", +"mindustry.annotations.Annotations.TypeIOHandler" }) public class RemoteProcess extends BaseProcessor{ /** Maximum size of each event packet. */ diff --git a/annotations/src/main/java/mindustry/annotations/remote/RemoteReadGenerator.java b/annotations/src/main/java/mindustry/annotations/remote/RemoteReadGenerator.java index 9a7e2f8546..2c228e5a9e 100644 --- a/annotations/src/main/java/mindustry/annotations/remote/RemoteReadGenerator.java +++ b/annotations/src/main/java/mindustry/annotations/remote/RemoteReadGenerator.java @@ -3,7 +3,7 @@ package mindustry.annotations.remote; import arc.util.io.*; import com.squareup.javapoet.*; import mindustry.annotations.*; -import mindustry.annotations.remote.TypeIOResolver.*; +import mindustry.annotations.util.TypeIOResolver.*; import javax.lang.model.element.Modifier; import javax.lang.model.element.*; diff --git a/annotations/src/main/java/mindustry/annotations/remote/RemoteWriteGenerator.java b/annotations/src/main/java/mindustry/annotations/remote/RemoteWriteGenerator.java index b8a3509f63..df6e5afcdb 100644 --- a/annotations/src/main/java/mindustry/annotations/remote/RemoteWriteGenerator.java +++ b/annotations/src/main/java/mindustry/annotations/remote/RemoteWriteGenerator.java @@ -5,7 +5,7 @@ import arc.util.io.*; import com.squareup.javapoet.*; import mindustry.annotations.Annotations.*; import mindustry.annotations.*; -import mindustry.annotations.remote.TypeIOResolver.*; +import mindustry.annotations.util.TypeIOResolver.*; import javax.lang.model.element.*; import java.io.*; diff --git a/annotations/src/main/java/mindustry/annotations/remote/TypeIOResolver.java b/annotations/src/main/java/mindustry/annotations/util/TypeIOResolver.java similarity index 96% rename from annotations/src/main/java/mindustry/annotations/remote/TypeIOResolver.java rename to annotations/src/main/java/mindustry/annotations/util/TypeIOResolver.java index ffa98dae22..450409f689 100644 --- a/annotations/src/main/java/mindustry/annotations/remote/TypeIOResolver.java +++ b/annotations/src/main/java/mindustry/annotations/util/TypeIOResolver.java @@ -1,9 +1,8 @@ -package mindustry.annotations.remote; +package mindustry.annotations.util; import arc.struct.*; import mindustry.annotations.Annotations.*; import mindustry.annotations.*; -import mindustry.annotations.util.*; import javax.lang.model.element.*; diff --git a/core/src/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java index f41716a727..4001dffcfb 100644 --- a/core/src/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -114,7 +114,7 @@ public class TypeIO{ } public static void writeTeam(Writes write, Team reason){ - write.b((byte) (int)reason.id); + write.b(reason.id); } public static Team readTeam(Reads read){