TypeIO resolution

This commit is contained in:
Anuken 2020-02-13 23:10:18 -05:00
parent c4464e67fd
commit c4d4dcb9db
7 changed files with 23 additions and 13 deletions

View file

@ -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()));
}
}

View file

@ -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<EntityDefinition> definitions = new Array<>();
@ -38,6 +40,7 @@ public class EntityProcess extends BaseProcessor{
Array<Selement> allGroups = new Array<>();
Array<Selement> allDefs = new Array<>();
Array<Stype> 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<Stype> 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<FieldSpec> 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

View file

@ -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. */

View file

@ -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.*;

View file

@ -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.*;

View file

@ -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.*;

View file

@ -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){