mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-07-17 03:08:17 +07:00
the refactoring continues
This commit is contained in:
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user