the refactoring continues

This commit is contained in:
Anuken
2022-02-22 13:33:55 -05:00
parent 370191407d
commit d4aff92fda
84 changed files with 337 additions and 268 deletions

View File

@ -89,7 +89,7 @@ public class EntityIO{
st("write.s($L)", revisions.peek().version);
//write uses most recent revision
for(RevisionField field : revisions.peek().fields){
io(field.type, "this." + field.name);
io(field.type, "this." + field.name, false);
}
}else{
//read revision
@ -107,7 +107,7 @@ public class EntityIO{
//add code for reading revision
for(RevisionField field : rev.fields){
//if the field doesn't exist, the result will be an empty string, it won't get assigned
io(field.type, presentFields.contains(field.name) ? "this." + field.name + " = " : "");
io(field.type, presentFields.contains(field.name) ? "this." + field.name + " = " : "", false);
}
}
@ -125,7 +125,7 @@ public class EntityIO{
if(write){
//write uses most recent revision
for(RevisionField field : revisions.peek().fields){
io(field.type, "this." + field.name);
io(field.type, "this." + field.name, true);
}
}else{
Revision rev = revisions.peek();
@ -147,12 +147,12 @@ public class EntityIO{
st(field.name + lastSuf + " = this." + field.name);
}
io(field.type, "this." + (sf ? field.name + targetSuf : field.name) + " = ");
io(field.type, "this." + (sf ? field.name + targetSuf : field.name) + " = ", true);
if(sl){
ncont("else" );
io(field.type, "");
io(field.type, "", true);
//just assign the two values so jumping does not occur on de-possession
if(sf){
@ -217,7 +217,7 @@ public class EntityIO{
econt();
}
private void io(String type, String field) throws Exception{
private void io(String type, String field, boolean network) throws Exception{
type = type.replace("mindustry.gen.", "");
type = replacements.get(type, type);
@ -229,8 +229,8 @@ public class EntityIO{
}else{
st(field + "mindustry.Vars.content.getByID(mindustry.ctype.ContentType.$L, read.s())", BaseProcessor.simpleName(type).toLowerCase().replace("type", ""));
}
}else if(serializer.writers.containsKey(type) && write){
st("$L(write, $L)", serializer.writers.get(type), field);
}else if((serializer.writers.containsKey(type) || (network && serializer.netWriters.containsKey(type))) && write){
st("$L(write, $L)", network ? serializer.getNetWriter(type, null) : serializer.writers.get(type), field);
}else if(serializer.mutatorReaders.containsKey(type) && !write && !field.replace(" = ", "").contains(" ") && !field.isEmpty()){
st("$L$L(read, $L)", field, serializer.mutatorReaders.get(type), field.replace(" = ", ""));
}else if(serializer.readers.containsKey(type) && !write){
@ -241,7 +241,7 @@ public class EntityIO{
if(write){
s("i", field + ".length");
cont("for(int INDEX = 0; INDEX < $L.length; INDEX ++)", field);
io(rawType, field + "[INDEX]");
io(rawType, field + "[INDEX]", network);
}else{
String fieldName = field.replace(" = ", "").replace("this.", "");
String lenf = fieldName + "_LENGTH";
@ -250,7 +250,7 @@ public class EntityIO{
st("$Lnew $L[$L]", field, type.replace("[]", ""), lenf);
}
cont("for(int INDEX = 0; INDEX < $L; INDEX ++)", lenf);
io(rawType, field.replace(" = ", "[INDEX] = "));
io(rawType, field.replace(" = ", "[INDEX] = "), network);
}
econt();
@ -262,7 +262,7 @@ public class EntityIO{
if(write){
s("i", field + ".size");
cont("for(int INDEX = 0; INDEX < $L.size; INDEX ++)", field);
io(generic, field + ".get(INDEX)");
io(generic, field + ".get(INDEX)", network);
}else{
String fieldName = field.replace(" = ", "").replace("this.", "");
String lenf = fieldName + "_LENGTH";
@ -271,7 +271,7 @@ public class EntityIO{
st("$L.clear()", field.replace(" = ", ""));
}
cont("for(int INDEX = 0; INDEX < $L; INDEX ++)", lenf);
io(generic, field.replace(" = ", "_ITEM = ").replace("this.", generic + " "));
io(generic, field.replace(" = ", "_ITEM = ").replace("this.", generic + " "), network);
if(!field.isEmpty()){
String temp = field.replace(" = ", "_ITEM").replace("this.", "");
st("if($L != null) $L.add($L)", temp, field.replace(" = ", ""), temp);

View File

@ -120,7 +120,7 @@ public class CallGenerator{
builder.addStatement("WRITE.$L($L)", typeName.equals("boolean") ? "bool" : typeName.charAt(0) + "", varName);
}else{
//else, try and find a serializer
String ser = serializer.writers.get(typeName.replace("mindustry.gen.", ""), SerializerResolver.locate(ent.element.e, var.mirror(), true));
String ser = serializer.getNetWriter(typeName.replace("mindustry.gen.", ""), SerializerResolver.locate(ent.element.e, var.mirror(), true));
if(ser == null){ //make sure a serializer exists!
BaseProcessor.err("No method to write class type: '" + typeName + "'", var);

View File

@ -16,7 +16,7 @@ public class TypeIOResolver{
* Maps fully qualified class names to their serializers.
*/
public static ClassSerializer resolve(BaseProcessor processor){
ClassSerializer out = new ClassSerializer(new ObjectMap<>(), new ObjectMap<>(), new ObjectMap<>());
ClassSerializer out = new ClassSerializer(new ObjectMap<>(), new ObjectMap<>(), new ObjectMap<>(), new ObjectMap<>());
for(Stype type : processor.types(TypeIOHandler.class)){
//look at all TypeIOHandler methods
Seq<Smethod> methods = type.methods();
@ -25,7 +25,10 @@ public class TypeIOResolver{
Seq<Svar> params = meth.params();
//2 params, second one is type, first is writer
if(params.size == 2 && params.first().tname().toString().equals("arc.util.io.Writes")){
out.writers.put(fix(params.get(1).tname().toString()), type.fullName() + "." + meth.name());
//Net suffix indicates that this should only be used for sync operations
ObjectMap<String, String> targetMap = meth.name().endsWith("Net") ? out.netWriters : out.writers;
targetMap.put(fix(params.get(1).tname().toString()), type.fullName() + "." + meth.name());
}else if(params.size == 1 && params.first().tname().toString().equals("arc.util.io.Reads") && !meth.isVoid()){
//1 param, one is reader, returns type
out.readers.put(fix(meth.retn().toString()), type.fullName() + "." + meth.name());
@ -47,12 +50,17 @@ public class TypeIOResolver{
/** Information about read/write methods for class types. */
public static class ClassSerializer{
public final ObjectMap<String, String> writers, readers, mutatorReaders;
public final ObjectMap<String, String> writers, readers, mutatorReaders, netWriters;
public ClassSerializer(ObjectMap<String, String> writers, ObjectMap<String, String> readers, ObjectMap<String, String> mutatorReaders){
public ClassSerializer(ObjectMap<String, String> writers, ObjectMap<String, String> readers, ObjectMap<String, String> mutatorReaders, ObjectMap<String, String> netWriters){
this.writers = writers;
this.readers = readers;
this.mutatorReaders = mutatorReaders;
this.netWriters = netWriters;
}
public String getNetWriter(String type, String fallback){
return netWriters.get(type, writers.get(type, fallback));
}
}
}