mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-03-09 20:29:06 +07:00
JSON read/write generation
This commit is contained in:
parent
75946b9d14
commit
6de4af727b
@ -50,8 +50,21 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
||||
classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning);
|
||||
MethodSpec.Builder method = MethodSpec.methodBuilder("init").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||
|
||||
TypeName jsonType = ClassName.bestGuess("io.anuke.arc.util.serialization.Json");
|
||||
TypeName jsonValueType = ClassName.bestGuess("io.anuke.arc.util.serialization.JsonValue");
|
||||
TypeName ubJsonWriterType = ClassName.bestGuess("io.anuke.arc.util.serialization.UBJsonWriter");
|
||||
TypeName ubJsonReaderType = ClassName.bestGuess("io.anuke.arc.util.serialization.UBJsonReader");
|
||||
|
||||
classBuilder.addField(jsonType, "bjson", Modifier.STATIC, Modifier.PRIVATE);
|
||||
classBuilder.addField(ubJsonReaderType, "bjsonReader", Modifier.STATIC, Modifier.PRIVATE);
|
||||
classBuilder.addStaticBlock(CodeBlock.builder()
|
||||
.addStatement("bjson = new " + jsonType + "()")
|
||||
.addStatement("bjsonReader = new " + ubJsonReaderType + "()")
|
||||
.build());
|
||||
|
||||
for(TypeElement elem : elements){
|
||||
TypeName type = TypeName.get(elem.asType());
|
||||
String simpleTypeName = type.toString().substring(type.toString().lastIndexOf('.') + 1);
|
||||
|
||||
TypeSpec.Builder serializer = TypeSpec.anonymousClassBuilder("")
|
||||
.addSuperinterface(ParameterizedTypeName.get(
|
||||
@ -70,7 +83,19 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
||||
.addException(IOException.class)
|
||||
.addModifiers(Modifier.PUBLIC);
|
||||
|
||||
MethodSpec.Builder jsonWriteMethod = MethodSpec.methodBuilder("write" + simpleTypeName + "Json")
|
||||
.returns(void.class)
|
||||
.addParameter(jsonType, "json")
|
||||
.addParameter(type, "object")
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||
|
||||
MethodSpec.Builder jsonReadMethod = MethodSpec.methodBuilder("read" + simpleTypeName + "Json")
|
||||
.returns(type)
|
||||
.addParameter(jsonValueType, "value")
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||
|
||||
readMethod.addStatement("$L object = new $L()", type, type);
|
||||
jsonReadMethod.addStatement("$L object = new $L()", type, type);
|
||||
|
||||
List<VariableElement> fields = ElementFilter.fieldsIn(Utils.elementUtils.getAllMembers(elem));
|
||||
for(VariableElement field : fields){
|
||||
@ -83,6 +108,9 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
||||
if(field.asType().getKind().isPrimitive()){
|
||||
writeMethod.addStatement("stream.write" + capName + "(object." + name + ")");
|
||||
readMethod.addStatement("object." + name + "= stream.read" + capName + "()");
|
||||
|
||||
jsonWriteMethod.addStatement("json.writeValue(\"" + name + "\", object." + name +")");
|
||||
jsonReadMethod.addStatement("if(value.has(\"" + name + "\")) object." + name + "= value.get" + capName + "(\"" + name + "\")");
|
||||
}else{
|
||||
writeMethod.addStatement("io.anuke.arc.Core.settings.getSerializer(" + typeName+ ".class).write(stream, object." + name + ")");
|
||||
readMethod.addStatement("object." + name + " = (" +typeName+")io.anuke.arc.Core.settings.getSerializer(" + typeName+ ".class).read(stream)");
|
||||
@ -90,22 +118,47 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
||||
}
|
||||
|
||||
readMethod.addStatement("return object");
|
||||
jsonReadMethod.addStatement("return object");
|
||||
|
||||
serializer.addMethod(writeMethod.build());
|
||||
serializer.addMethod(readMethod.build());
|
||||
|
||||
method.addStatement("io.anuke.arc.Core.settings.setSerializer($N, $L)", Utils.elementUtils.getBinaryName(elem).toString().replace('$', '.') + ".class", serializer.build());
|
||||
|
||||
String sname = type.toString().substring(type.toString().lastIndexOf('.') + 1);
|
||||
|
||||
name(writeMethod, "write" + sname);
|
||||
name(readMethod, "read" + sname);
|
||||
name(writeMethod, "write" + simpleTypeName);
|
||||
name(readMethod, "read" + simpleTypeName);
|
||||
|
||||
writeMethod.addModifiers(Modifier.STATIC);
|
||||
readMethod.addModifiers(Modifier.STATIC);
|
||||
|
||||
classBuilder.addMethod(writeMethod.build());
|
||||
classBuilder.addMethod(readMethod.build());
|
||||
|
||||
classBuilder.addMethod(jsonWriteMethod.build());
|
||||
classBuilder.addMethod(jsonReadMethod.build());
|
||||
|
||||
MethodSpec.Builder binaryJsonWriteMethod = MethodSpec.methodBuilder("write" + simpleTypeName + "StreamJson")
|
||||
.returns(void.class)
|
||||
.addParameter(DataOutput.class, "stream")
|
||||
.addParameter(type, "object")
|
||||
.addException(IOException.class)
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.addStatement("java.io.StringWriter output = new java.io.StringWriter()")
|
||||
.addStatement("bjson.setWriter(output)")
|
||||
.addStatement("bjson.writeObjectStart(" + type + ".class, " + type + ".class)")
|
||||
.addStatement("write" + simpleTypeName + "Json(bjson, object)")
|
||||
.addStatement("bjson.writeObjectEnd()")
|
||||
.addStatement("stream.writeUTF(output.toString())");
|
||||
|
||||
MethodSpec.Builder binaryJsonReadMethod = MethodSpec.methodBuilder("read" + simpleTypeName + "StreamJson")
|
||||
.returns(type)
|
||||
.addParameter(DataInput.class, "stream")
|
||||
.addException(IOException.class)
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.addStatement("return read" + simpleTypeName + "Json(bjson.fromJson(null, stream.readUTF()))");
|
||||
|
||||
classBuilder.addMethod(binaryJsonWriteMethod.build());
|
||||
classBuilder.addMethod(binaryJsonReadMethod.build());
|
||||
}
|
||||
|
||||
classBuilder.addMethod(method.build());
|
||||
|
@ -730,7 +730,7 @@ public class Bullets implements ContentList{
|
||||
lifetime = 23f;
|
||||
speed = 1f;
|
||||
splashDamageRadius = 50f;
|
||||
splashDamage = 20f;
|
||||
splashDamage = 28f;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -36,7 +36,7 @@ public abstract class SaveFileVersion{
|
||||
long playtime = stream.readLong();
|
||||
int build = stream.readInt();
|
||||
|
||||
Rules rules = Serialization.readRules(stream);
|
||||
Rules rules = Serialization.readRulesStreamJson(stream);
|
||||
String map = stream.readUTF();
|
||||
int wave = stream.readInt();
|
||||
return new SaveMeta(version, time, playtime, build, map, wave, rules);
|
||||
|
@ -26,7 +26,7 @@ public class Save16 extends SaveFileVersion{
|
||||
stream.readInt(); //build
|
||||
|
||||
//general state
|
||||
state.rules = Serialization.readRules(stream);
|
||||
state.rules = Serialization.readRulesStreamJson(stream);
|
||||
String mapname = stream.readUTF();
|
||||
Map map = world.maps.all().find(m -> m.name().equals(mapname));
|
||||
if(map == null) map = new Map(customMapDirectory.child(mapname), 1, 1, new ObjectMap<>(), true);
|
||||
@ -56,7 +56,7 @@ public class Save16 extends SaveFileVersion{
|
||||
stream.writeInt(Version.build); //build
|
||||
|
||||
//--GENERAL STATE--
|
||||
Serialization.writeRules(stream, state.rules);
|
||||
Serialization.writeRulesStreamJson(stream, state.rules);
|
||||
stream.writeUTF(world.getMap().name()); //map name
|
||||
|
||||
stream.writeInt(state.wave); //wave
|
||||
|
Loading…
Reference in New Issue
Block a user