mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-08-20 06:24:12 +00:00
perf[gdscript]: 优化gdscript的语法
This commit is contained in:
@@ -31,6 +31,22 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
||||
*/
|
||||
public class GdArraySerializer implements IGdSerializer {
|
||||
|
||||
public static String arrayType(String type) {
|
||||
if (type.startsWith("Array") || type.startsWith("Dictionary")) {
|
||||
return "Array";
|
||||
} else {
|
||||
return StringUtils.format("Array[{}]", type);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String fieldType(Field field, IFieldRegistration fieldRegistration) {
|
||||
var arrayField = (ArrayField) fieldRegistration;
|
||||
var registration = arrayField.getArrayElementRegistration();
|
||||
var type = GenerateGdUtils.gdSerializer(registration.serializer()).fieldType(field, registration);
|
||||
return arrayType(type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
|
||||
GenerateGdUtils.addTab(builder, deep);
|
||||
|
||||
@@ -28,6 +28,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
||||
*/
|
||||
public class GdBooleanSerializer implements IGdSerializer {
|
||||
|
||||
@Override
|
||||
public String fieldType(Field field, IFieldRegistration fieldRegistration) {
|
||||
return "bool";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
|
||||
GenerateGdUtils.addTab(builder, deep);
|
||||
|
||||
@@ -28,6 +28,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
||||
*/
|
||||
public class GdByteSerializer implements IGdSerializer {
|
||||
|
||||
@Override
|
||||
public String fieldType(Field field, IFieldRegistration fieldRegistration) {
|
||||
return "int";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
|
||||
GenerateGdUtils.addTab(builder, deep);
|
||||
|
||||
@@ -27,6 +27,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
||||
*/
|
||||
public class GdCharSerializer implements IGdSerializer {
|
||||
|
||||
@Override
|
||||
public String fieldType(Field field, IFieldRegistration fieldRegistration) {
|
||||
return "String";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
|
||||
GenerateGdUtils.addTab(builder, deep);
|
||||
|
||||
@@ -28,6 +28,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
||||
*/
|
||||
public class GdDoubleSerializer implements IGdSerializer {
|
||||
|
||||
@Override
|
||||
public String fieldType(Field field, IFieldRegistration fieldRegistration) {
|
||||
return "float";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
|
||||
GenerateGdUtils.addTab(builder, deep);
|
||||
|
||||
@@ -28,6 +28,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
||||
*/
|
||||
public class GdFloatSerializer implements IGdSerializer {
|
||||
|
||||
@Override
|
||||
public String fieldType(Field field, IFieldRegistration fieldRegistration) {
|
||||
return "float";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
|
||||
GenerateGdUtils.addTab(builder, deep);
|
||||
|
||||
@@ -27,6 +27,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
||||
*/
|
||||
public class GdIntSerializer implements IGdSerializer {
|
||||
|
||||
@Override
|
||||
public String fieldType(Field field, IFieldRegistration fieldRegistration) {
|
||||
return "int";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
|
||||
GenerateGdUtils.addTab(builder, deep);
|
||||
|
||||
@@ -30,6 +30,14 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
||||
*/
|
||||
public class GdListSerializer implements IGdSerializer {
|
||||
|
||||
@Override
|
||||
public String fieldType(Field field, IFieldRegistration fieldRegistration) {
|
||||
var listField = (ListField) fieldRegistration;
|
||||
var registration = listField.getListElementRegistration();
|
||||
var type = GenerateGdUtils.gdSerializer(registration.serializer()).fieldType(field, registration);
|
||||
return GdArraySerializer.arrayType(type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
|
||||
GenerateGdUtils.addTab(builder, deep);
|
||||
|
||||
@@ -27,6 +27,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
||||
*/
|
||||
public class GdLongSerializer implements IGdSerializer {
|
||||
|
||||
@Override
|
||||
public String fieldType(Field field, IFieldRegistration fieldRegistration) {
|
||||
return "int";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
|
||||
GenerateGdUtils.addTab(builder, deep);
|
||||
|
||||
@@ -30,6 +30,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
||||
*/
|
||||
public class GdMapSerializer implements IGdSerializer {
|
||||
|
||||
@Override
|
||||
public String fieldType(Field field, IFieldRegistration fieldRegistration) {
|
||||
return "Dictionary";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
|
||||
GenerateGdUtils.addTab(builder, deep);
|
||||
|
||||
+7
@@ -16,6 +16,7 @@ package com.zfoo.protocol.serializer.gdscript;
|
||||
import com.zfoo.protocol.generate.GenerateProtocolFile;
|
||||
import com.zfoo.protocol.registration.field.IFieldRegistration;
|
||||
import com.zfoo.protocol.registration.field.ObjectProtocolField;
|
||||
import com.zfoo.protocol.serializer.enhance.EnhanceObjectProtocolSerializer;
|
||||
import com.zfoo.protocol.util.StringUtils;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
@@ -28,6 +29,12 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
||||
*/
|
||||
public class GdObjectProtocolSerializer implements IGdSerializer {
|
||||
|
||||
@Override
|
||||
public String fieldType(Field field, IFieldRegistration fieldRegistration) {
|
||||
ObjectProtocolField objectProtocolField = (ObjectProtocolField) fieldRegistration;
|
||||
return EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(objectProtocolField.getProtocolId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
|
||||
ObjectProtocolField objectProtocolField = (ObjectProtocolField) fieldRegistration;
|
||||
|
||||
@@ -30,6 +30,14 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
||||
*/
|
||||
public class GdSetSerializer implements IGdSerializer {
|
||||
|
||||
@Override
|
||||
public String fieldType(Field field, IFieldRegistration fieldRegistration) {
|
||||
var listField = (SetField) fieldRegistration;
|
||||
var registration = listField.getSetElementRegistration();
|
||||
var type = GenerateGdUtils.gdSerializer(registration.serializer()).fieldType(field, registration);
|
||||
return GdArraySerializer.arrayType(type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
|
||||
GenerateGdUtils.addTab(builder, deep);
|
||||
|
||||
@@ -28,6 +28,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
||||
*/
|
||||
public class GdShortSerializer implements IGdSerializer {
|
||||
|
||||
@Override
|
||||
public String fieldType(Field field, IFieldRegistration fieldRegistration) {
|
||||
return "int";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
|
||||
GenerateGdUtils.addTab(builder, deep);
|
||||
|
||||
@@ -27,6 +27,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
||||
*/
|
||||
public class GdStringSerializer implements IGdSerializer {
|
||||
|
||||
@Override
|
||||
public String fieldType(Field field, IFieldRegistration fieldRegistration) {
|
||||
return "String";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
|
||||
GenerateGdUtils.addTab(builder, deep);
|
||||
|
||||
@@ -13,14 +13,18 @@
|
||||
|
||||
package com.zfoo.protocol.serializer.gdscript;
|
||||
|
||||
import com.zfoo.protocol.collection.CollectionUtils;
|
||||
import com.zfoo.protocol.generate.GenerateOperation;
|
||||
import com.zfoo.protocol.generate.GenerateProtocolFile;
|
||||
import com.zfoo.protocol.generate.GenerateProtocolNote;
|
||||
import com.zfoo.protocol.generate.GenerateProtocolPath;
|
||||
import com.zfoo.protocol.registration.IProtocolRegistration;
|
||||
import com.zfoo.protocol.registration.ProtocolAnalysis;
|
||||
import com.zfoo.protocol.registration.ProtocolRegistration;
|
||||
import com.zfoo.protocol.registration.anno.Compatible;
|
||||
import com.zfoo.protocol.registration.field.IFieldRegistration;
|
||||
import com.zfoo.protocol.serializer.CodeLanguage;
|
||||
import com.zfoo.protocol.serializer.enhance.EnhanceObjectProtocolSerializer;
|
||||
import com.zfoo.protocol.serializer.reflect.*;
|
||||
import com.zfoo.protocol.util.ClassUtils;
|
||||
import com.zfoo.protocol.util.FileUtils;
|
||||
@@ -29,6 +33,7 @@ import com.zfoo.protocol.util.StringUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@@ -44,6 +49,7 @@ import static com.zfoo.protocol.util.StringUtils.TAB_ASCII;
|
||||
public abstract class GenerateGdUtils {
|
||||
|
||||
private static String protocolOutputRootPath = "gdProtocol/";
|
||||
private static String protocolOutputPath = StringUtils.EMPTY;
|
||||
|
||||
private static Map<ISerializer, IGdSerializer> gdSerializerMap;
|
||||
|
||||
@@ -52,10 +58,10 @@ public abstract class GenerateGdUtils {
|
||||
}
|
||||
|
||||
public static void init(GenerateOperation generateOperation) {
|
||||
protocolOutputRootPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath);
|
||||
protocolOutputPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath);
|
||||
|
||||
FileUtils.deleteFile(new File(protocolOutputRootPath));
|
||||
FileUtils.createDirectory(protocolOutputRootPath);
|
||||
FileUtils.deleteFile(new File(protocolOutputPath));
|
||||
FileUtils.createDirectory(protocolOutputPath);
|
||||
|
||||
gdSerializerMap = new HashMap<>();
|
||||
gdSerializerMap.put(BooleanSerializer.INSTANCE, new GdBooleanSerializer());
|
||||
@@ -77,13 +83,14 @@ public abstract class GenerateGdUtils {
|
||||
public static void clear() {
|
||||
gdSerializerMap = null;
|
||||
protocolOutputRootPath = null;
|
||||
protocolOutputPath = null;
|
||||
}
|
||||
|
||||
public static void createProtocolManager(List<IProtocolRegistration> protocolList) throws IOException {
|
||||
var list = List.of("gdscript/buffer/ByteBuffer.gd");
|
||||
for (var fileName : list) {
|
||||
var fileInputStream = ClassUtils.getFileFromClassPath(fileName);
|
||||
var createFile = new File(StringUtils.format("{}/{}", protocolOutputRootPath, StringUtils.substringAfterFirst(fileName, "gdscript/")));
|
||||
var createFile = new File(StringUtils.format("{}/{}", protocolOutputPath, StringUtils.substringAfterFirst(fileName, "gdscript/")));
|
||||
FileUtils.writeInputStreamToFile(createFile, fileInputStream);
|
||||
}
|
||||
|
||||
@@ -100,7 +107,7 @@ public abstract class GenerateGdUtils {
|
||||
}
|
||||
var initProtocols = StringUtils.joinWith(StringUtils.COMMA + LS, initList.toArray());
|
||||
protocolManagerTemplate = StringUtils.format(protocolManagerTemplate, importBuilder.toString().trim(), initProtocols);
|
||||
FileUtils.writeStringToFile(new File(StringUtils.format("{}/{}", protocolOutputRootPath, "ProtocolManager.gd")), protocolManagerTemplate, true);
|
||||
FileUtils.writeStringToFile(new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolManager.gd")), protocolManagerTemplate, true);
|
||||
}
|
||||
|
||||
public static void createGdProtocolFile(ProtocolRegistration registration) throws IOException {
|
||||
@@ -111,31 +118,57 @@ public abstract class GenerateGdUtils {
|
||||
var registrationConstructor = registration.getConstructor();
|
||||
var protocolClazzName = registrationConstructor.getDeclaringClass().getSimpleName();
|
||||
|
||||
var includeSubProtocol = includeSubProtocol(registration);
|
||||
var classNote = GenerateProtocolNote.classNote(protocolId, CodeLanguage.GdScript);
|
||||
var fieldDefinition = fieldDefinition(registration);
|
||||
var writeObject = writeObject(registration);
|
||||
var readObject = readObject(registration);
|
||||
|
||||
var protocolTemplate = StringUtils.bytesToString(IOUtils.toByteArray(ClassUtils.getFileFromClassPath("gdscript/ProtocolTemplate.gd")));
|
||||
protocolTemplate = StringUtils.format(protocolTemplate, classNote, fieldDefinition.trim(), protocolId, writeObject.trim(), readObject.trim());
|
||||
protocolTemplate = StringUtils.format(protocolTemplate, includeSubProtocol, classNote, fieldDefinition.trim(), protocolId, writeObject.trim(), readObject.trim());
|
||||
|
||||
var protocolOutputPath = StringUtils.format("{}/{}/{}.gd", protocolOutputRootPath, GenerateProtocolPath.getProtocolPath(protocolId), protocolClazzName);
|
||||
FileUtils.writeStringToFile(new File(protocolOutputPath), protocolTemplate, true);
|
||||
var outputPath = StringUtils.format("{}/{}/{}.gd", protocolOutputPath, GenerateProtocolPath.getProtocolPath(protocolId), protocolClazzName);
|
||||
FileUtils.writeStringToFile(new File(outputPath), protocolTemplate, true);
|
||||
}
|
||||
|
||||
private static String includeSubProtocol(ProtocolRegistration registration) {
|
||||
var protocolId = registration.getId();
|
||||
var subProtocols = ProtocolAnalysis.getAllSubProtocolIds(protocolId);
|
||||
|
||||
if (CollectionUtils.isEmpty(subProtocols)) {
|
||||
return StringUtils.EMPTY;
|
||||
}
|
||||
var cppBuilder = new StringBuilder();
|
||||
for (var subProtocolId : subProtocols) {
|
||||
var protocolClassName = EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(subProtocolId);
|
||||
var subProtocolPath = StringUtils.format("{}/{}/{}.gd"
|
||||
, protocolOutputRootPath
|
||||
, GenerateProtocolPath.getCapitalizeProtocolPath(protocolId)
|
||||
, protocolClassName);
|
||||
subProtocolPath = subProtocolPath.replaceAll("//", StringUtils.SLASH);
|
||||
subProtocolPath = StringUtils.format("const {} = preload(\"res://{}\")", protocolClassName, subProtocolPath);
|
||||
cppBuilder.append(subProtocolPath).append(LS);
|
||||
}
|
||||
return cppBuilder.toString();
|
||||
}
|
||||
|
||||
private static String fieldDefinition(ProtocolRegistration registration) {
|
||||
var protocolId = registration.getId();
|
||||
var fields = registration.getFields();
|
||||
var fieldRegistrations = registration.getFieldRegistrations();
|
||||
var gdBuilder = new StringBuilder();
|
||||
for (var field : fields) {
|
||||
for (int i = 0; i < fields.length; i++) {
|
||||
Field field = fields[i];
|
||||
IFieldRegistration fieldRegistration = fieldRegistrations[i];
|
||||
var fieldName = field.getName();
|
||||
// 生成注释
|
||||
var fieldNote = GenerateProtocolNote.fieldNote(protocolId, fieldName, CodeLanguage.GdScript);
|
||||
if (StringUtils.isNotBlank(fieldNote)) {
|
||||
gdBuilder.append(fieldNote).append(LS);
|
||||
}
|
||||
var fieldType = gdSerializer(fieldRegistration.serializer()).fieldType(field, fieldRegistration);
|
||||
// 生成类型的注释
|
||||
gdBuilder.append(StringUtils.format("var {} # ", fieldName)).append(field.getGenericType().getTypeName()).append(LS);
|
||||
gdBuilder.append(StringUtils.format("var {}: {}", fieldName, fieldType)).append(LS);
|
||||
}
|
||||
return gdBuilder.toString();
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
|
||||
package com.zfoo.protocol.serializer.gdscript;
|
||||
|
||||
import com.zfoo.protocol.model.Pair;
|
||||
import com.zfoo.protocol.registration.field.IFieldRegistration;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
@@ -23,6 +24,8 @@ import java.lang.reflect.Field;
|
||||
*/
|
||||
public interface IGdSerializer {
|
||||
|
||||
String fieldType(Field field, IFieldRegistration fieldRegistration);
|
||||
|
||||
void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration);
|
||||
|
||||
String readObject(StringBuilder builder, int deep, Field field, IFieldRegistration fieldRegistration);
|
||||
|
||||
+1
-3
@@ -33,9 +33,7 @@ public class GoObjectProtocolSerializer implements IGoSerializer {
|
||||
@Override
|
||||
public String fieldType(Field field, IFieldRegistration fieldRegistration) {
|
||||
ObjectProtocolField objectProtocolField = (ObjectProtocolField) fieldRegistration;
|
||||
var protocolSimpleName = EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(objectProtocolField.getProtocolId());
|
||||
var type = StringUtils.format("{}", protocolSimpleName);
|
||||
return type;
|
||||
return EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(objectProtocolField.getProtocolId());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{}
|
||||
|
||||
{}
|
||||
{}
|
||||
|
||||
const PROTOCOL_ID = {}
|
||||
@@ -9,7 +9,6 @@ static func write(buffer, packet):
|
||||
return
|
||||
{}
|
||||
|
||||
|
||||
static func read(buffer):
|
||||
if (!buffer.readBool()):
|
||||
return null
|
||||
|
||||
Reference in New Issue
Block a user