From b8725f44087de587b89a7212096ce022c62b793e Mon Sep 17 00:00:00 2001 From: jaysunxiao Date: Mon, 21 Apr 2025 21:18:35 +0800 Subject: [PATCH] ref[protocol]: refactor GdScript generation --- .../serializer/CodeTemplatePlaceholder.java | 4 -- .../gdscript/CodeGenerateGdScript.java | 49 ------------------- .../src/main/resources/gdscript/ByteBuffer.gd | 41 ++++++++++++++++ .../gdscript/ProtocolClassDefaultTemplate.gd | 11 +---- .../gdscript/ProtocolClassTemplate.gd | 10 +--- .../gdscript/ProtocolManagerTemplate.gd | 2 +- .../resources/gdscript/ProtocolTemplate.gd | 1 - 7 files changed, 46 insertions(+), 72 deletions(-) diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/CodeTemplatePlaceholder.java b/protocol/src/main/java/com/zfoo/protocol/serializer/CodeTemplatePlaceholder.java index 31efb00b..137e899f 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/CodeTemplatePlaceholder.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/CodeTemplatePlaceholder.java @@ -50,10 +50,6 @@ public enum CodeTemplatePlaceholder { // ----------------------------------------------------------------------------------------------------------------- protocol_field_accessor("${protocol_field_accessor}"), - protocol_json("${protocol_json}"), - - protocol_to_string("${protocol_to_string}"), - ; public final String placeholder; diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/gdscript/CodeGenerateGdScript.java b/protocol/src/main/java/com/zfoo/protocol/serializer/gdscript/CodeGenerateGdScript.java index 87b51e66..7e71e298 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/gdscript/CodeGenerateGdScript.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/gdscript/CodeGenerateGdScript.java @@ -190,8 +190,6 @@ public class CodeGenerateGdScript implements ICodeGenerate { , CodeTemplatePlaceholder.protocol_name, protocol_name , CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id) , CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration) - , CodeTemplatePlaceholder.protocol_json, protocol_json(registration) - , CodeTemplatePlaceholder.protocol_to_string, protocol_to_string(registration) , CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration) , CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration) )); @@ -207,8 +205,6 @@ public class CodeGenerateGdScript implements ICodeGenerate { , CodeTemplatePlaceholder.protocol_name, protocol_name , CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id) , CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration) - , CodeTemplatePlaceholder.protocol_json, protocol_json(registration) - , CodeTemplatePlaceholder.protocol_to_string, protocol_to_string(registration) )); return formatProtocolTemplate; } @@ -226,51 +222,6 @@ public class CodeGenerateGdScript implements ICodeGenerate { return formatProtocolTemplate; } - - private String protocol_json(ProtocolRegistration registration) { - var fields = registration.getFields(); - var fieldRegistrations = registration.getFieldRegistrations(); - var gdBuilder = new StringBuilder(); - gdBuilder.append("{"); - // when generate source code fields, use origin fields sort - var sequencedFields = ReflectionUtils.notStaticAndTransientFields(registration.getConstructor().getDeclaringClass()); - var params = new ArrayList(); - for (var field : sequencedFields) { - var fieldRegistration = fieldRegistrations[GenerateProtocolFile.indexOf(fields, field)]; - var fieldName = field.getName(); - var fieldType = gdSerializer(fieldRegistration.serializer()).fieldType(field, fieldRegistration); - if (fieldType.equals("String")) { - params.add(StringUtils.format("{}:'{}'", fieldName)); - } else { - params.add(StringUtils.format("{}:{}", fieldName)); - } - } - gdBuilder.append(StringUtils.joinWith(", ", params.toArray())); - gdBuilder.append("}"); - return gdBuilder.toString(); - } - - private String protocol_to_string(ProtocolRegistration registration) { - var fields = registration.getFields(); - var fieldRegistrations = registration.getFieldRegistrations(); - var gdBuilder = new StringBuilder(); - // when generate source code fields, use origin fields sort - var sequencedFields = ReflectionUtils.notStaticAndTransientFields(registration.getConstructor().getDeclaringClass()); - var params = new ArrayList(); - for (var field : sequencedFields) { - var fieldRegistration = fieldRegistrations[GenerateProtocolFile.indexOf(fields, field)]; - var fieldName = field.getName(); - var fieldType = gdSerializer(fieldRegistration.serializer()).fieldType(field, fieldRegistration); - if (fieldType.equals("Dictionary") || fieldType.startsWith("Array")) { - params.add(StringUtils.format("JSON.stringify(self.{})", field.getName())); - } else { - params.add(StringUtils.format("self.{}", field.getName())); - } - } - gdBuilder.append(StringUtils.joinWith(", ", params.toArray())); - return gdBuilder.toString(); - } - private String protocol_field_definition(ProtocolRegistration registration) { var protocolId = registration.getId(); var fields = registration.getFields(); diff --git a/protocol/src/main/resources/gdscript/ByteBuffer.gd b/protocol/src/main/resources/gdscript/ByteBuffer.gd index 16fbc2d7..96a1affd 100644 --- a/protocol/src/main/resources/gdscript/ByteBuffer.gd +++ b/protocol/src/main/resources/gdscript/ByteBuffer.gd @@ -39,6 +39,47 @@ func adjustPadding(predictionLength: int, beforeWriteIndex: int): func compatibleRead(beforeReadIndex: int, length: int) -> bool: return length != -1 && getReadOffset() < length + beforeReadIndex +static func object_to_json(obj) -> String: + var type = typeof(obj) + match type: + TYPE_NIL: + return "null" + TYPE_BOOL: + return str(obj) + TYPE_INT: + return str(obj) + TYPE_FLOAT: + return str(obj) + TYPE_STRING: + return "\"" + obj as String + "\"" + TYPE_ARRAY: + var array: PackedStringArray = PackedStringArray() + for element in obj: + array.push_back(object_to_json(element)) + return "[" + ",".join(array) + "]" + TYPE_DICTIONARY: + var array: PackedStringArray = PackedStringArray() + for key in obj: + var value = obj.get(key) + array.push_back("\"" + object_to_json(key) + "\":" + object_to_json(value)) + return "{" + ",".join(array) + "}" + TYPE_OBJECT: + var properties = obj.get_property_list() + var array: PackedStringArray = PackedStringArray() + for property in properties: + var propertyType = property.type + var propertyName = property.name + if propertyType == TYPE_NIL: + continue + if propertyName == "script": + continue + var value = obj.get(propertyName) + array.push_back("\"" + propertyName + "\":" + object_to_json(value)) + return "{" + ",".join(array) + "}" + _: + printerr("unknow type " + type) + return "" + # -------------------------------------------------get/set------------------------------------------------- func getBuffer() -> StreamPeerBuffer: return buffer diff --git a/protocol/src/main/resources/gdscript/ProtocolClassDefaultTemplate.gd b/protocol/src/main/resources/gdscript/ProtocolClassDefaultTemplate.gd index 5b93623b..176c3ac9 100644 --- a/protocol/src/main/resources/gdscript/ProtocolClassDefaultTemplate.gd +++ b/protocol/src/main/resources/gdscript/ProtocolClassDefaultTemplate.gd @@ -1,10 +1,3 @@ +const PROTOCOL_ID: int = ${protocol_id} ${protocol_note} -${protocol_field_definition} - -func protocolId() -> int: - return ${protocol_id} - -func _to_string() -> String: - const jsonTemplate = "${protocol_json}" - var params = [${protocol_to_string}] - return jsonTemplate.format(params, "{}") \ No newline at end of file +${protocol_field_definition} \ No newline at end of file diff --git a/protocol/src/main/resources/gdscript/ProtocolClassTemplate.gd b/protocol/src/main/resources/gdscript/ProtocolClassTemplate.gd index a220bfd7..2d23f0cb 100644 --- a/protocol/src/main/resources/gdscript/ProtocolClassTemplate.gd +++ b/protocol/src/main/resources/gdscript/ProtocolClassTemplate.gd @@ -1,15 +1,9 @@ ${protocol_note} class ${protocol_name}: + const PROTOCOL_ID: int = ${protocol_id} + ${protocol_field_definition} - func protocolId() -> int: - return ${protocol_id} - - func _to_string() -> String: - const jsonTemplate = "${protocol_json}" - var params = [${protocol_to_string}] - return jsonTemplate.format(params, "{}") - static func write(buffer: ByteBuffer, packet: ${protocol_name}): if (packet == null): buffer.writeInt(0) diff --git a/protocol/src/main/resources/gdscript/ProtocolManagerTemplate.gd b/protocol/src/main/resources/gdscript/ProtocolManagerTemplate.gd index eeb4d7ea..9b2bc28e 100644 --- a/protocol/src/main/resources/gdscript/ProtocolManagerTemplate.gd +++ b/protocol/src/main/resources/gdscript/ProtocolManagerTemplate.gd @@ -3,7 +3,7 @@ ${protocol_manager_registrations} } static func write(buffer: ByteBuffer, packet: Object) -> void: - var protocolId: int = packet.protocolId() + var protocolId: int = packet.PROTOCOL_ID buffer.writeShort(protocolId) packet.write(buffer, packet) pass diff --git a/protocol/src/main/resources/gdscript/ProtocolTemplate.gd b/protocol/src/main/resources/gdscript/ProtocolTemplate.gd index 6e434877..c1e9e7ee 100644 --- a/protocol/src/main/resources/gdscript/ProtocolTemplate.gd +++ b/protocol/src/main/resources/gdscript/ProtocolTemplate.gd @@ -1,5 +1,4 @@ class_name ${protocol_name} - ${protocol_class} ${protocol_registration} \ No newline at end of file