diff --git a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolFile.java b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolFile.java index 2318e067..d2dbb34e 100644 --- a/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolFile.java +++ b/protocol/src/main/java/com/zfoo/protocol/generate/GenerateProtocolFile.java @@ -22,7 +22,7 @@ import com.zfoo.protocol.serializer.CodeLanguage; import com.zfoo.protocol.serializer.gdscript.GenerateGdUtils; import com.zfoo.protocol.serializer.go.GenerateGoUtils; import com.zfoo.protocol.serializer.python.GeneratePyUtils; -import com.zfoo.protocol.serializer.typescript.GenerateTsUtils; +import com.zfoo.protocol.serializer.typescript.CodeGenerateTypeScript; import com.zfoo.protocol.util.FileUtils; import com.zfoo.protocol.util.ReflectionUtils; import com.zfoo.protocol.util.StringUtils; @@ -127,15 +127,6 @@ public abstract class GenerateProtocolFile { } } - // 生成TypeScript协议 - if (generateLanguages.contains(CodeLanguage.TypeScript)) { - GenerateTsUtils.init(generateOperation); - for (var protocolRegistration : generateProtocols) { - GenerateTsUtils.createTsProtocolFile((ProtocolRegistration) protocolRegistration); - } - GenerateTsUtils.createProtocolManager(generateProtocols); - } - // 生成GdScript协议 if (generateLanguages.contains(CodeLanguage.GdScript)) { GenerateGdUtils.init(generateOperation); diff --git a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java index 4d6f0ee6..a87000d3 100644 --- a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java +++ b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java @@ -29,7 +29,6 @@ import com.zfoo.protocol.serializer.gdscript.GenerateGdUtils; import com.zfoo.protocol.serializer.go.GenerateGoUtils; import com.zfoo.protocol.serializer.python.GeneratePyUtils; import com.zfoo.protocol.serializer.reflect.*; -import com.zfoo.protocol.serializer.typescript.GenerateTsUtils; import com.zfoo.protocol.util.*; import com.zfoo.protocol.xml.XmlProtocols; import javassist.CannotCompileException; @@ -397,7 +396,6 @@ public class ProtocolAnalysis { GenerateProtocolNote.clear(); GenerateProtocolPath.clear(); GenerateGoUtils.clear(); - GenerateTsUtils.clear(); GenerateGdUtils.clear(); GeneratePyUtils.clear(); } @@ -630,7 +628,7 @@ public class ProtocolAnalysis { * CN: 此方法仅在生成协议的时候调用,一旦运行,不能调用 */ public static Set getFirstSubProtocolIds(short protocolId) { - return subProtocolIdMap.get(protocolId); + return subProtocolIdMap.getOrDefault(protocolId, Collections.emptySet()); } /** diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/CodeLanguage.java b/protocol/src/main/java/com/zfoo/protocol/serializer/CodeLanguage.java index de315066..b90d1f84 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/CodeLanguage.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/CodeLanguage.java @@ -17,6 +17,7 @@ import com.zfoo.protocol.serializer.csharp.CodeGenerateCsharp; import com.zfoo.protocol.serializer.ecmascript.CodeGenerateEcmaScript; import com.zfoo.protocol.serializer.javascript.CodeGenerateJavaScript; import com.zfoo.protocol.serializer.lua.CodeGenerateLua; +import com.zfoo.protocol.serializer.typescript.CodeGenerateTypeScript; /** * @author godotg @@ -36,7 +37,7 @@ public enum CodeLanguage { EcmaScript(1 << 4, CodeGenerateEcmaScript.class), - TypeScript(1 << 5, null), + TypeScript(1 << 5, CodeGenerateTypeScript.class), Lua(1 << 10, CodeGenerateLua.class), diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/cpp/CodeGenerateCpp.java b/protocol/src/main/java/com/zfoo/protocol/serializer/cpp/CodeGenerateCpp.java index 3e6fed80..fdb66b93 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/cpp/CodeGenerateCpp.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/cpp/CodeGenerateCpp.java @@ -89,8 +89,8 @@ public class CodeGenerateCpp implements ICodeGenerate { protocol_imports.append(StringUtils.format("#include \"{}/Protocols.h\"", protocolOutputRootPath)).append(LS); for (var registration : registrations) { var protocol_id = registration.protocolId(); - var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); - protocol_manager_registrations.append(StringUtils.format("protocols[{}] = new {}Registration();", protocol_id, protocol_class_name)).append(LS); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + protocol_manager_registrations.append(StringUtils.format("protocols[{}] = new {}Registration();", protocol_id, protocol_name)).append(LS); } var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); @@ -133,9 +133,9 @@ public class CodeGenerateCpp implements ICodeGenerate { var protocol_manager_registrations = new StringBuilder(); for (var registration : registrations) { var protocol_id = registration.protocolId(); - var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); protocol_imports.append(StringUtils.format("#include \"{}/{}.h\"", protocolOutputRootPath, GenerateProtocolPath.protocolAbsolutePath(protocol_id, CodeLanguage.Cpp))).append(LS); - protocol_manager_registrations.append(StringUtils.format("protocols[{}] = new {}Registration();", protocol_id, protocol_class_name)).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocols[{}] = new {}Registration();", protocol_id, protocol_name)).append(LS); } var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); @@ -174,9 +174,9 @@ public class CodeGenerateCpp implements ICodeGenerate { var protocol_manager_registrations = new StringBuilder(); for (var registration : registrations) { var protocol_id = registration.protocolId(); - var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); - protocol_imports.append(StringUtils.format("#include \"{}/{}.h\"", protocolOutputRootPath, protocol_class_name)).append(LS); - protocol_manager_registrations.append(StringUtils.format("protocols[{}] = new {}Registration();", protocol_id, protocol_class_name)).append(LS); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + protocol_imports.append(StringUtils.format("#include \"{}/{}.h\"", protocolOutputRootPath, protocol_name)).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocols[{}] = new {}Registration();", protocol_id, protocol_name)).append(LS); } var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); @@ -217,12 +217,12 @@ public class CodeGenerateCpp implements ICodeGenerate { private String protocol_class(ProtocolRegistration registration) { var protocol_id = registration.protocolId(); - var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); var protocolClassTemplate = ClassUtils.getFileFromClassPathToString("cpp/ProtocolClassTemplate.h"); var placeholderMap = Map.of( CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.Cpp) - , CodeTemplatePlaceholder.protocol_name, protocol_class_name + , CodeTemplatePlaceholder.protocol_name, protocol_name , CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id) , CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration) ); @@ -231,11 +231,11 @@ public class CodeGenerateCpp implements ICodeGenerate { private String protocol_registration(ProtocolRegistration registration) { var protocol_id = registration.protocolId(); - var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); var protocolRegistrationTemplate = ClassUtils.getFileFromClassPathToString("cpp/ProtocolRegistrationTemplate.h"); var placeholderMap = Map.of( - CodeTemplatePlaceholder.protocol_name, protocol_class_name + CodeTemplatePlaceholder.protocol_name, protocol_name , CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id) , CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration) , CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration) diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/CodeGenerateEcmaScript.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/CodeGenerateEcmaScript.java index 8b9918b8..caee03de 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/CodeGenerateEcmaScript.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/CodeGenerateEcmaScript.java @@ -85,8 +85,8 @@ public class CodeGenerateEcmaScript implements ICodeGenerate { protocol_imports.append("import Protocols from './Protocols.mjs';").append(LS); for (var registration : registrations) { var protocol_id = registration.protocolId(); - var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); - protocol_manager_registrations.append(StringUtils.format("protocols.set({}, Protocols.{});", protocol_id, protocol_class_name)).append(LS); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + protocol_manager_registrations.append(StringUtils.format("protocols.set({}, Protocols.{});", protocol_id, protocol_name)).append(LS); } var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); @@ -99,13 +99,10 @@ public class CodeGenerateEcmaScript implements ICodeGenerate { var protocol_registration = new StringBuilder(); for (var registration : registrations) { var protocol_id = registration.protocolId(); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + // protocol protocol_class.append(formatProtocolClassTemplate(registration)).append(LS); - } - - protocol_registration.append(LS); - for (var registration : registrations) { - var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); protocol_registration.append(StringUtils.format("Protocols.{} = {}", protocol_name, protocol_name)).append(LS); } @@ -130,9 +127,9 @@ public class CodeGenerateEcmaScript implements ICodeGenerate { var protocol_manager_registrations = new StringBuilder(); for (var protocol : registrations) { var protocol_id = protocol.protocolId(); - var protocol_class_name = protocol.protocolConstructor().getDeclaringClass().getSimpleName(); - protocol_imports.append(StringUtils.format("import {} from './{}.mjs';", protocol_class_name, GenerateProtocolPath.protocolAbsolutePath(protocol.protocolId(), CodeLanguage.EcmaScript))).append(LS); - protocol_manager_registrations.append(StringUtils.format("protocols.set({}, {});", protocol_id, protocol_class_name)).append(LS); + var protocol_name = protocol.protocolConstructor().getDeclaringClass().getSimpleName(); + protocol_imports.append(StringUtils.format("import {} from './{}.mjs';", protocol_name, GenerateProtocolPath.protocolAbsolutePath(protocol.protocolId(), CodeLanguage.EcmaScript))).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocols.set({}, {});", protocol_id, protocol_name)).append(LS); } var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); @@ -162,9 +159,9 @@ public class CodeGenerateEcmaScript implements ICodeGenerate { var protocol_manager_registrations = new StringBuilder(); for (var protocol : registrations) { var protocol_id = protocol.protocolId(); - var protocol_class_name = protocol.protocolConstructor().getDeclaringClass().getSimpleName(); - protocol_imports.append(StringUtils.format("import {} from './{}.mjs';", protocol_class_name, protocol_class_name)).append(LS); - protocol_manager_registrations.append(StringUtils.format("protocols.set({}, {});", protocol_id, protocol_class_name)).append(LS); + var protocol_name = protocol.protocolConstructor().getDeclaringClass().getSimpleName(); + protocol_imports.append(StringUtils.format("import {} from './{}.mjs';", protocol_name, protocol_name)).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocols.set({}, {});", protocol_id, protocol_name)).append(LS); } var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsArraySerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsArraySerializer.java index 6399ed7b..97acfa8f 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsArraySerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsArraySerializer.java @@ -19,7 +19,7 @@ import com.zfoo.protocol.registration.field.ArrayField; import com.zfoo.protocol.registration.field.IFieldRegistration; import com.zfoo.protocol.serializer.CodeLanguage; import com.zfoo.protocol.serializer.CutDownArraySerializer; -import com.zfoo.protocol.serializer.typescript.GenerateTsUtils; +import com.zfoo.protocol.serializer.typescript.CodeGenerateTypeScript; import com.zfoo.protocol.util.StringUtils; import java.lang.reflect.Field; @@ -32,7 +32,7 @@ import static com.zfoo.protocol.util.FileUtils.LS; public class EsArraySerializer implements IEsSerializer { @Override public Triple field(Field field, IFieldRegistration fieldRegistration) { - var type = StringUtils.format("Array<{}>", GenerateTsUtils.toTsClassName(field.getType().getComponentType().getSimpleName())); + var type = StringUtils.format("Array<{}>", CodeGenerateTypeScript.toTsClassName(field.getType().getComponentType().getSimpleName())); return new Triple<>(type, field.getName(), "[]"); } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsListSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsListSerializer.java index 042cda8c..b41945b2 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsListSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsListSerializer.java @@ -19,7 +19,7 @@ import com.zfoo.protocol.registration.field.IFieldRegistration; import com.zfoo.protocol.registration.field.ListField; import com.zfoo.protocol.serializer.CodeLanguage; import com.zfoo.protocol.serializer.CutDownListSerializer; -import com.zfoo.protocol.serializer.typescript.GenerateTsUtils; +import com.zfoo.protocol.serializer.typescript.CodeGenerateTypeScript; import com.zfoo.protocol.util.StringUtils; import java.lang.reflect.Field; @@ -32,7 +32,7 @@ import static com.zfoo.protocol.util.FileUtils.LS; public class EsListSerializer implements IEsSerializer { @Override public Triple field(Field field, IFieldRegistration fieldRegistration) { - return new Triple<>(GenerateTsUtils.toTsClassName(field.getGenericType().toString()), field.getName(), "[]"); + return new Triple<>(CodeGenerateTypeScript.toTsClassName(field.getGenericType().toString()), field.getName(), "[]"); } @Override diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsMapSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsMapSerializer.java index fe8406cb..975d78bd 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsMapSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsMapSerializer.java @@ -19,7 +19,7 @@ import com.zfoo.protocol.registration.field.IFieldRegistration; import com.zfoo.protocol.registration.field.MapField; import com.zfoo.protocol.serializer.CodeLanguage; import com.zfoo.protocol.serializer.CutDownMapSerializer; -import com.zfoo.protocol.serializer.typescript.GenerateTsUtils; +import com.zfoo.protocol.serializer.typescript.CodeGenerateTypeScript; import com.zfoo.protocol.util.StringUtils; import java.lang.reflect.Field; @@ -32,7 +32,7 @@ import static com.zfoo.protocol.util.FileUtils.LS; public class EsMapSerializer implements IEsSerializer { @Override public Triple field(Field field, IFieldRegistration fieldRegistration) { - return new Triple<>(GenerateTsUtils.toTsClassName(field.getGenericType().toString()), field.getName(), "new Map()"); + return new Triple<>(CodeGenerateTypeScript.toTsClassName(field.getGenericType().toString()), field.getName(), "new Map()"); } @Override diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsSetSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsSetSerializer.java index 07dc3c95..7f98962f 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsSetSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ecmascript/EsSetSerializer.java @@ -19,7 +19,7 @@ import com.zfoo.protocol.registration.field.IFieldRegistration; import com.zfoo.protocol.registration.field.SetField; import com.zfoo.protocol.serializer.CodeLanguage; import com.zfoo.protocol.serializer.CutDownSetSerializer; -import com.zfoo.protocol.serializer.typescript.GenerateTsUtils; +import com.zfoo.protocol.serializer.typescript.CodeGenerateTypeScript; import com.zfoo.protocol.util.StringUtils; import java.lang.reflect.Field; @@ -32,7 +32,7 @@ import static com.zfoo.protocol.util.FileUtils.LS; public class EsSetSerializer implements IEsSerializer { @Override public Triple field(Field field, IFieldRegistration fieldRegistration) { - return new Triple<>(GenerateTsUtils.toTsClassName(field.getGenericType().toString()), field.getName(), "new Set()"); + return new Triple<>(CodeGenerateTypeScript.toTsClassName(field.getGenericType().toString()), field.getName(), "new Set()"); } @Override diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/gdscript/GenerateGdUtils.java b/protocol/src/main/java/com/zfoo/protocol/serializer/gdscript/GenerateGdUtils.java index 25eeda06..06f3c776 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/gdscript/GenerateGdUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/gdscript/GenerateGdUtils.java @@ -25,7 +25,7 @@ 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.serializer.typescript.GenerateTsUtils; +import com.zfoo.protocol.serializer.typescript.CodeGenerateTypeScript; import com.zfoo.protocol.util.ClassUtils; import com.zfoo.protocol.util.FileUtils; import com.zfoo.protocol.util.ReflectionUtils; @@ -166,7 +166,7 @@ public abstract class GenerateGdUtils { // 生成类型的注释 gdBuilder.append(StringUtils.format("var {}: {}", fieldName, fieldType)); if (fieldType.equals("Dictionary") || fieldType.equals("Array")) { - var typeNote = GenerateTsUtils.toTsClassName(field.getGenericType().toString()); + var typeNote = CodeGenerateTypeScript.toTsClassName(field.getGenericType().toString()); gdBuilder.append(StringUtils.format(TAB_ASCII + "# {}", typeNote)); } gdBuilder.append(LS); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/CodeGenerateJavaScript.java b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/CodeGenerateJavaScript.java index 989fa0ba..e2dd319c 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/CodeGenerateJavaScript.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/CodeGenerateJavaScript.java @@ -85,8 +85,8 @@ public class CodeGenerateJavaScript implements ICodeGenerate { protocol_imports.append("import Protocols from './Protocols.js';").append(LS); for (var registration : registrations) { var protocol_id = registration.protocolId(); - var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); - protocol_manager_registrations.append(StringUtils.format("protocols.set({}, Protocols.{});", protocol_id, protocol_class_name)).append(LS); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + protocol_manager_registrations.append(StringUtils.format("protocols.set({}, Protocols.{});", protocol_id, protocol_name)).append(LS); } var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); @@ -134,9 +134,9 @@ public class CodeGenerateJavaScript implements ICodeGenerate { var protocol_manager_registrations = new StringBuilder(); for (var registration : registrations) { var protocol_id = registration.protocolId(); - var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); - protocol_imports.append(StringUtils.format("import {} from './{}.js';", protocol_class_name, GenerateProtocolPath.protocolAbsolutePath(registration.protocolId(), CodeLanguage.JavaScript))).append(LS); - protocol_manager_registrations.append(StringUtils.format("protocols.set({}, {});", protocol_id, protocol_class_name)).append(LS); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + protocol_imports.append(StringUtils.format("import {} from './{}.js';", protocol_name, GenerateProtocolPath.protocolAbsolutePath(registration.protocolId(), CodeLanguage.JavaScript))).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocols.set({}, {});", protocol_id, protocol_name)).append(LS); } var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); @@ -173,9 +173,9 @@ public class CodeGenerateJavaScript implements ICodeGenerate { var protocol_manager_registrations = new StringBuilder(); for (var registration : registrations) { var protocol_id = registration.protocolId(); - var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); - protocol_imports.append(StringUtils.format("import {} from './{}.js';", protocol_class_name, protocol_class_name)).append(LS); - protocol_manager_registrations.append(StringUtils.format("protocols.set({}, {});", protocol_id, protocol_class_name)).append(LS); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + protocol_imports.append(StringUtils.format("import {} from './{}.js';", protocol_name, protocol_name)).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocols.set({}, {});", protocol_id, protocol_name)).append(LS); } var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); @@ -215,12 +215,12 @@ public class CodeGenerateJavaScript implements ICodeGenerate { private String protocol_class(ProtocolRegistration registration) { var protocol_id = registration.protocolId(); - var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); var protocolClassTemplate = ClassUtils.getFileFromClassPathToString("javascript/ProtocolClassTemplate.js"); var placeholderMap = Map.of( CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.JavaScript) - , CodeTemplatePlaceholder.protocol_name, protocol_class_name + , CodeTemplatePlaceholder.protocol_name, protocol_name , CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration) ); return CodeTemplatePlaceholder.formatTemplate(protocolClassTemplate, placeholderMap); @@ -228,11 +228,11 @@ public class CodeGenerateJavaScript implements ICodeGenerate { private String protocol_registration(ProtocolRegistration registration) { var protocol_id = registration.protocolId(); - var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); var protocolRegistrationTemplate = ClassUtils.getFileFromClassPathToString("javascript/ProtocolRegistrationTemplate.js"); var placeholderMap = Map.of( - CodeTemplatePlaceholder.protocol_name, protocol_class_name + CodeTemplatePlaceholder.protocol_name, protocol_name , CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id) , CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration) , CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration) diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsArraySerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsArraySerializer.java index 2d7b6d94..323093e7 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsArraySerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsArraySerializer.java @@ -19,7 +19,7 @@ import com.zfoo.protocol.registration.field.ArrayField; import com.zfoo.protocol.registration.field.IFieldRegistration; import com.zfoo.protocol.serializer.CodeLanguage; import com.zfoo.protocol.serializer.CutDownArraySerializer; -import com.zfoo.protocol.serializer.typescript.GenerateTsUtils; +import com.zfoo.protocol.serializer.typescript.CodeGenerateTypeScript; import com.zfoo.protocol.util.StringUtils; import java.lang.reflect.Field; @@ -32,7 +32,7 @@ import static com.zfoo.protocol.util.FileUtils.LS; public class JsArraySerializer implements IJsSerializer { @Override public Triple field(Field field, IFieldRegistration fieldRegistration) { - var type = StringUtils.format("Array<{}>", GenerateTsUtils.toTsClassName(field.getType().getComponentType().getSimpleName())); + var type = StringUtils.format("Array<{}>", CodeGenerateTypeScript.toTsClassName(field.getType().getComponentType().getSimpleName())); return new Triple<>(type, field.getName(), "[]"); } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsListSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsListSerializer.java index 7c67bfa6..d8d8f0eb 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsListSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsListSerializer.java @@ -19,7 +19,7 @@ import com.zfoo.protocol.registration.field.IFieldRegistration; import com.zfoo.protocol.registration.field.ListField; import com.zfoo.protocol.serializer.CodeLanguage; import com.zfoo.protocol.serializer.CutDownListSerializer; -import com.zfoo.protocol.serializer.typescript.GenerateTsUtils; +import com.zfoo.protocol.serializer.typescript.CodeGenerateTypeScript; import com.zfoo.protocol.util.StringUtils; import java.lang.reflect.Field; @@ -32,7 +32,7 @@ import static com.zfoo.protocol.util.FileUtils.LS; public class JsListSerializer implements IJsSerializer { @Override public Triple field(Field field, IFieldRegistration fieldRegistration) { - return new Triple<>(GenerateTsUtils.toTsClassName(field.getGenericType().toString()), field.getName(), "[]"); + return new Triple<>(CodeGenerateTypeScript.toTsClassName(field.getGenericType().toString()), field.getName(), "[]"); } @Override diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsMapSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsMapSerializer.java index 10048ff8..2ed479d1 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsMapSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsMapSerializer.java @@ -19,7 +19,7 @@ import com.zfoo.protocol.registration.field.IFieldRegistration; import com.zfoo.protocol.registration.field.MapField; import com.zfoo.protocol.serializer.CodeLanguage; import com.zfoo.protocol.serializer.CutDownMapSerializer; -import com.zfoo.protocol.serializer.typescript.GenerateTsUtils; +import com.zfoo.protocol.serializer.typescript.CodeGenerateTypeScript; import com.zfoo.protocol.util.StringUtils; import java.lang.reflect.Field; @@ -32,7 +32,7 @@ import static com.zfoo.protocol.util.FileUtils.LS; public class JsMapSerializer implements IJsSerializer { @Override public Triple field(Field field, IFieldRegistration fieldRegistration) { - return new Triple<>(GenerateTsUtils.toTsClassName(field.getGenericType().toString()), field.getName(), "new Map()"); + return new Triple<>(CodeGenerateTypeScript.toTsClassName(field.getGenericType().toString()), field.getName(), "new Map()"); } @Override diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsSetSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsSetSerializer.java index 5603922a..e7430e87 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsSetSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/javascript/JsSetSerializer.java @@ -19,7 +19,7 @@ import com.zfoo.protocol.registration.field.IFieldRegistration; import com.zfoo.protocol.registration.field.SetField; import com.zfoo.protocol.serializer.CodeLanguage; import com.zfoo.protocol.serializer.CutDownSetSerializer; -import com.zfoo.protocol.serializer.typescript.GenerateTsUtils; +import com.zfoo.protocol.serializer.typescript.CodeGenerateTypeScript; import com.zfoo.protocol.util.StringUtils; import java.lang.reflect.Field; @@ -32,7 +32,7 @@ import static com.zfoo.protocol.util.FileUtils.LS; public class JsSetSerializer implements IJsSerializer { @Override public Triple field(Field field, IFieldRegistration fieldRegistration) { - return new Triple<>(GenerateTsUtils.toTsClassName(field.getGenericType().toString()), field.getName(), "new Set()"); + return new Triple<>(CodeGenerateTypeScript.toTsClassName(field.getGenericType().toString()), field.getName(), "new Set()"); } @Override diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/CodeGenerateTypeScript.java b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/CodeGenerateTypeScript.java new file mode 100644 index 00000000..dd374c32 --- /dev/null +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/CodeGenerateTypeScript.java @@ -0,0 +1,413 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package com.zfoo.protocol.serializer.typescript; + +import com.zfoo.protocol.anno.Compatible; +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.ProtocolAnalysis; +import com.zfoo.protocol.registration.ProtocolRegistration; +import com.zfoo.protocol.serializer.CodeLanguage; +import com.zfoo.protocol.serializer.CodeTemplatePlaceholder; +import com.zfoo.protocol.serializer.ICodeGenerate; +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; +import com.zfoo.protocol.util.ReflectionUtils; +import com.zfoo.protocol.util.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.zfoo.protocol.util.FileUtils.LS; +import static com.zfoo.protocol.util.StringUtils.TAB; + +/** + * @author godotg + */ +public class CodeGenerateTypeScript implements ICodeGenerate { + private static final Logger logger = LoggerFactory.getLogger(CodeGenerateTypeScript.class); + + // custom configuration + public static String protocolOutputRootPath = "zfoots"; + private static String protocolOutputPath = StringUtils.EMPTY; + + private static final Map tsSerializerMap = new HashMap<>(); + + public static ITsSerializer tsSerializer(ISerializer serializer) { + return tsSerializerMap.get(serializer); + } + + @Override + public void init(GenerateOperation generateOperation) { + protocolOutputPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath); + FileUtils.deleteFile(new File(protocolOutputPath)); + + tsSerializerMap.put(BooleanSerializer.INSTANCE, new TsBooleanSerializer()); + tsSerializerMap.put(ByteSerializer.INSTANCE, new TsByteSerializer()); + tsSerializerMap.put(ShortSerializer.INSTANCE, new TsShortSerializer()); + tsSerializerMap.put(IntSerializer.INSTANCE, new TsIntSerializer()); + tsSerializerMap.put(LongSerializer.INSTANCE, new TsLongSerializer()); + tsSerializerMap.put(FloatSerializer.INSTANCE, new TsFloatSerializer()); + tsSerializerMap.put(DoubleSerializer.INSTANCE, new TsDoubleSerializer()); + tsSerializerMap.put(StringSerializer.INSTANCE, new TsStringSerializer()); + tsSerializerMap.put(ArraySerializer.INSTANCE, new TsArraySerializer()); + tsSerializerMap.put(ListSerializer.INSTANCE, new TsListSerializer()); + tsSerializerMap.put(SetSerializer.INSTANCE, new TsSetSerializer()); + tsSerializerMap.put(MapSerializer.INSTANCE, new TsMapSerializer()); + tsSerializerMap.put(ObjectProtocolSerializer.INSTANCE, new TsObjectProtocolSerializer()); + } + + @Override + public void mergerProtocol(List registrations) throws IOException { + createTemplateFile(); + + // 生成ProtocolManager.ts文件 + var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("typescript/ProtocolManagerTemplate.ts"); + + var protocol_imports_manager = new StringBuilder(); + var protocol_manager_registrations = new StringBuilder(); + protocol_imports_manager.append("import Protocols from './Protocols';").append(LS); + for (var registration : registrations) { + var protocol_id = registration.protocolId(); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + protocol_manager_registrations.append(StringUtils.format("protocols.set({}, Protocols.{});", protocol_id, protocol_name)).append(LS); + } + var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports_manager.toString() + , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); + var formatProtocolManagerTemplate = CodeTemplatePlaceholder.formatTemplate(protocolManagerTemplate, placeholderMap); + var protocolManagerFile = new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolManager.ts")); + FileUtils.writeStringToFile(protocolManagerFile, formatProtocolManagerTemplate, true); + logger.info("Generated TypeScript protocol manager file:[{}] is in path:[{}]", protocolManagerFile.getName(), protocolManagerFile.getAbsolutePath()); + + + var protocol_imports_protocols = new StringBuilder(); + protocol_imports_protocols.append("import IByteBuffer from './IByteBuffer';").append(LS); + var protocol_class = new StringBuilder(); + var protocol_registration = new StringBuilder(); + for (var registration : registrations) { + var protocol_id = registration.protocolId(); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + var protocolTemplate = ClassUtils.getFileFromClassPathToString("typescript/ProtocolClassTemplate.ts"); + var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of( + CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id) + , CodeTemplatePlaceholder.protocol_name, protocol_name + , CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.TypeScript) + , CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration) + , CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration) + , CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration) + )); + protocol_class.append(formatProtocolTemplate).append(LS); + protocol_registration.append(StringUtils.format("static {} = {}", protocol_name, protocol_name)).append(LS); + } + + var protocolTemplate = ClassUtils.getFileFromClassPathToString("typescript/ProtocolsTemplate.ts"); + var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of( + CodeTemplatePlaceholder.protocol_imports, protocol_imports_protocols.toString() + ,CodeTemplatePlaceholder.protocol_class, protocol_class.toString() + , CodeTemplatePlaceholder.protocol_registration, protocol_registration.toString() + )); + var outputPath = StringUtils.format("{}/Protocols.ts", protocolOutputPath); + var file = new File(outputPath); + FileUtils.writeStringToFile(file, formatProtocolTemplate, true); + logger.info("Generated TypeScript protocol file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath()); + } + + @Override + public void foldProtocol(List registrations) throws IOException { + createTemplateFile(); + + // 生成ProtocolManager.ts文件 + var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("typescript/ProtocolManagerTemplate.ts"); + + var protocol_imports = new StringBuilder(); + var protocol_manager_registrations = new StringBuilder(); + for (var registration : registrations) { + var protocol_id = registration.protocolId(); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + protocol_imports.append(StringUtils.format("import {} from './{}';", protocol_name, GenerateProtocolPath.protocolAbsolutePath(protocol_id, CodeLanguage.TypeScript))).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocols.set({}, {});", protocol_id, protocol_name)).append(LS); + } + var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() + , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); + var formatProtocolManagerTemplate = CodeTemplatePlaceholder.formatTemplate(protocolManagerTemplate, placeholderMap); + var protocolManagerFile = new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolManager.ts")); + FileUtils.writeStringToFile(protocolManagerFile, formatProtocolManagerTemplate, true); + logger.info("Generated TypeScript protocol manager file:[{}] is in path:[{}]", protocolManagerFile.getName(), protocolManagerFile.getAbsolutePath()); + + for (var registration : registrations) { + var protocol_id = registration.protocolId(); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + var protocolTemplate = ClassUtils.getFileFromClassPathToString("typescript/ProtocolTemplate.ts"); + + var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of( + CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id) + , CodeTemplatePlaceholder.protocol_name, protocol_name + , CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.TypeScript) + , CodeTemplatePlaceholder.protocol_imports, protocol_imports_fold(registration) + , CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration) + , CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration) + , CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration) + )); + + var outputPath = StringUtils.format("{}/{}/{}.ts", protocolOutputPath, GenerateProtocolPath.getProtocolPath(protocol_id), protocol_name); + var file = new File(outputPath); + FileUtils.writeStringToFile(file, formatProtocolTemplate, true); + logger.info("Generated TypeScript protocol file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath()); + } + } + + @Override + public void defaultProtocol(List registrations) throws IOException { + createTemplateFile(); + + // 生成ProtocolManager.ts文件 + var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("typescript/ProtocolManagerTemplate.ts"); + + var protocol_imports = new StringBuilder(); + var protocol_manager_registrations = new StringBuilder(); + for (var registration : registrations) { + var protocol_id = registration.protocolId(); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + protocol_imports.append(StringUtils.format("import {} from './{}';", protocol_name, protocol_name)).append(LS); + protocol_manager_registrations.append(StringUtils.format("protocols.set({}, {});", protocol_id, protocol_name)).append(LS); + } + + var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString() + , CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString()); + var formatProtocolManagerTemplate = CodeTemplatePlaceholder.formatTemplate(protocolManagerTemplate, placeholderMap); + var protocolManagerFile = new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolManager.ts")); + FileUtils.writeStringToFile(protocolManagerFile, formatProtocolManagerTemplate, true); + logger.info("Generated TypeScript protocol manager file:[{}] is in path:[{}]", protocolManagerFile.getName(), protocolManagerFile.getAbsolutePath()); + + for (var registration : registrations) { + var protocol_id = registration.protocolId(); + var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName(); + var protocolTemplate = ClassUtils.getFileFromClassPathToString("typescript/ProtocolTemplate.ts"); + + var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of( + CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id) + , CodeTemplatePlaceholder.protocol_name, protocol_name + , CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.TypeScript) + , CodeTemplatePlaceholder.protocol_imports, protocol_imports_default(registration) + , CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration) + , CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration) + , CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration) + )); + + var outputPath = StringUtils.format("{}/{}.ts", protocolOutputPath, protocol_name); + var file = new File(outputPath); + FileUtils.writeStringToFile(file, formatProtocolTemplate, true); + logger.info("Generated TypeScript protocol file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath()); + } + } + + private void createTemplateFile() throws IOException { + var list = List.of("typescript/IByteBuffer.ts", "typescript/buffer/ByteBuffer.ts", "typescript/buffer/Long.ts", "typescript/buffer/Longbits.ts"); + for (var fileName : list) { + var fileInputStream = ClassUtils.getFileFromClassPath(fileName); + var createFile = new File(StringUtils.format("{}/{}", protocolOutputPath, StringUtils.substringAfterFirst(fileName, "typescript/"))); + FileUtils.writeInputStreamToFile(createFile, fileInputStream); + } + } + + private String protocol_imports_fold(ProtocolRegistration registration) { + // import IByteBuffer first + var protocolId = registration.getId(); + var importBuilder = new StringBuilder(); + var protocolPath = GenerateProtocolPath.getProtocolPath(protocolId); + var splits = protocolPath.split(StringUtils.PERIOD_REGEX); + importBuilder.append(StringUtils.format("import IByteBuffer from '{}IByteBuffer';", "../".repeat(splits.length))).append(LS); + + var subProtocols = ProtocolAnalysis.getFirstSubProtocolIds(protocolId); + // import other sub protocols + for (var subProtocolId : subProtocols) { + var protocolClassName = EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(subProtocolId); + var path = GenerateProtocolPath.getRelativePath(protocolId, subProtocolId); + importBuilder.append(StringUtils.format("import {} from '{}/{}';", protocolClassName, path, protocolClassName)).append(LS); + } + return importBuilder.toString(); + } + + private String protocol_imports_default(ProtocolRegistration registration) { + // import IByteBuffer first + var protocolId = registration.getId(); + var importBuilder = new StringBuilder(); + importBuilder.append(StringUtils.format("import IByteBuffer from './IByteBuffer';")).append(LS); + + // import other sub protocols + var subProtocols = ProtocolAnalysis.getFirstSubProtocolIds(protocolId); + for (var subProtocolId : subProtocols) { + var protocolClassName = EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(subProtocolId); + importBuilder.append(StringUtils.format("import {} from './{}';", protocolClassName, protocolClassName)).append(LS); + } + return importBuilder.toString(); + } + + private String protocol_field_definition(ProtocolRegistration registration) { + var protocolId = registration.protocolId(); + var fields = registration.getFields(); + var fieldRegistrations = registration.getFieldRegistrations(); + // when generate source code fields, use origin fields sort + var sequencedFields = ReflectionUtils.notStaticAndTransientFields(registration.getConstructor().getDeclaringClass()); + var fieldDefinitionBuilder = new StringBuilder(); + for (var field : sequencedFields) { + var fieldRegistration = fieldRegistrations[GenerateProtocolFile.indexOf(fields, field)]; + var fieldName = field.getName(); + // 生成注释 + var fieldNotes = GenerateProtocolNote.fieldNotes(protocolId, fieldName, CodeLanguage.TypeScript); + for (var fieldNote : fieldNotes) { + fieldDefinitionBuilder.append(fieldNote).append(LS); + } + var triple = tsSerializer(fieldRegistration.serializer()).field(field, fieldRegistration); + fieldDefinitionBuilder.append(StringUtils.format("{}{} = {};", triple.getMiddle(), triple.getLeft(), triple.getRight())).append(LS); + } + return fieldDefinitionBuilder.toString(); + } + + private String protocol_write_serialization(ProtocolRegistration registration) { + GenerateProtocolFile.localVariableId = 0; + var fields = registration.getFields(); + var fieldRegistrations = registration.getFieldRegistrations(); + var tsBuilder = new StringBuilder(); + if (registration.isCompatible()) { + tsBuilder.append("const beforeWriteIndex = buffer.getWriteOffset();").append(LS); + tsBuilder.append(StringUtils.format("buffer.writeInt({});", registration.getPredictionLength())).append(LS); + } else { + tsBuilder.append("buffer.writeInt(-1);").append(LS); + } + for (var i = 0; i < fields.length; i++) { + var field = fields[i]; + var fieldRegistration = fieldRegistrations[i]; + tsSerializer(fieldRegistration.serializer()).writeObject(tsBuilder, "packet." + field.getName(), 0, field, fieldRegistration); + } + if (registration.isCompatible()) { + tsBuilder.append(StringUtils.format("buffer.adjustPadding({}, beforeWriteIndex);", registration.getPredictionLength())).append(LS); + } + return tsBuilder.toString(); + } + + private String protocol_read_deserialization(ProtocolRegistration registration) { + GenerateProtocolFile.localVariableId = 0; + var fields = registration.getFields(); + var fieldRegistrations = registration.getFieldRegistrations(); + var tsBuilder = new StringBuilder(); + for (var i = 0; i < fields.length; i++) { + var field = fields[i]; + var fieldRegistration = fieldRegistrations[i]; + if (field.isAnnotationPresent(Compatible.class)) { + tsBuilder.append("if (buffer.compatibleRead(beforeReadIndex, length)) {").append(LS); + var compatibleReadObject = tsSerializer(fieldRegistration.serializer()).readObject(tsBuilder, 1, field, fieldRegistration); + tsBuilder.append(TAB).append(StringUtils.format("packet.{} = {};", field.getName(), compatibleReadObject)).append(LS); + tsBuilder.append("}").append(LS); + continue; + } + var readObject = tsSerializer(fieldRegistration.serializer()).readObject(tsBuilder, 0, field, fieldRegistration); + tsBuilder.append(StringUtils.format("packet.{} = {};", field.getName(), readObject)).append(LS); + } + return tsBuilder.toString(); + } + + public static String toTsClassName(String typeName) { + typeName = typeName.replaceAll("java.util.|java.lang.", StringUtils.EMPTY); + typeName = typeName.replaceAll("[a-zA-Z0-9_.]*\\.", StringUtils.EMPTY); + + switch (typeName) { + case "boolean": + case "Boolean": + typeName = "boolean"; + return typeName; + case "byte": + case "Byte": + case "short": + case "Short": + case "int": + case "Integer": + case "long": + case "Long": + case "float": + case "Float": + case "double": + case "Double": + typeName = "number"; + return typeName; + case "char": + case "Character": + case "String": + typeName = "string"; + return typeName; + default: + } + + // 将boolean转为bool + typeName = typeName.replaceAll("[B|b]oolean\\[", "boolean"); + typeName = typeName.replace("", "boolean>"); + + // 将Byte转为byte + typeName = typeName.replace("Byte[", "number"); + typeName = typeName.replace("Byte>", "number>"); + typeName = typeName.replace("", "number>"); + typeName = typeName.replace("", "number>"); + typeName = typeName.replace("", "number>"); + typeName = typeName.replace("", "number>"); + typeName = typeName.replace("", "number>"); + typeName = typeName.replace("", "string>"); + typeName = typeName.replace("", "string>"); + typeName = typeName.replace(" tsSerializerMap; - - public static ITsSerializer tsSerializer(ISerializer serializer) { - return tsSerializerMap.get(serializer); - } - - public static void init(GenerateOperation generateOperation) { - protocolOutputPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath); - FileUtils.deleteFile(new File(protocolOutputPath)); - - tsSerializerMap = new HashMap<>(); - tsSerializerMap.put(BooleanSerializer.INSTANCE, new TsBooleanSerializer()); - tsSerializerMap.put(ByteSerializer.INSTANCE, new TsByteSerializer()); - tsSerializerMap.put(ShortSerializer.INSTANCE, new TsShortSerializer()); - tsSerializerMap.put(IntSerializer.INSTANCE, new TsIntSerializer()); - tsSerializerMap.put(LongSerializer.INSTANCE, new TsLongSerializer()); - tsSerializerMap.put(FloatSerializer.INSTANCE, new TsFloatSerializer()); - tsSerializerMap.put(DoubleSerializer.INSTANCE, new TsDoubleSerializer()); - tsSerializerMap.put(StringSerializer.INSTANCE, new TsStringSerializer()); - tsSerializerMap.put(ArraySerializer.INSTANCE, new TsArraySerializer()); - tsSerializerMap.put(ListSerializer.INSTANCE, new TsListSerializer()); - tsSerializerMap.put(SetSerializer.INSTANCE, new TsSetSerializer()); - tsSerializerMap.put(MapSerializer.INSTANCE, new TsMapSerializer()); - tsSerializerMap.put(ObjectProtocolSerializer.INSTANCE, new TsObjectProtocolSerializer()); - } - - public static void clear() { - protocolOutputRootPath = null; - protocolOutputPath = null; - tsSerializerMap = null; - } - - public static void createProtocolManager(List protocolList) throws IOException { - var list = List.of("typescript/IByteBuffer.ts", "typescript/buffer/ByteBuffer.ts", "typescript/buffer/Long.ts", "typescript/buffer/Longbits.ts"); - for (var fileName : list) { - var fileInputStream = ClassUtils.getFileFromClassPath(fileName); - var createFile = new File(StringUtils.format("{}/{}", protocolOutputPath, StringUtils.substringAfterFirst(fileName, "typescript/"))); - FileUtils.writeInputStreamToFile(createFile, fileInputStream); - } - - // 生成ProtocolManager.ts文件 - var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("typescript/ProtocolManagerTemplate.ts"); - - var importBuilder = new StringBuilder(); - var initProtocolBuilder = new StringBuilder(); - for (var protocol : protocolList) { - var protocolId = protocol.protocolId(); - var protocolName = protocol.protocolConstructor().getDeclaringClass().getSimpleName(); - var path = GenerateProtocolPath.protocolAbsolutePath(protocolId, CodeLanguage.TypeScript); - importBuilder.append(StringUtils.format("import {} from './{}';", protocolName, path)).append(LS); - initProtocolBuilder.append(StringUtils.format("protocols.set({}, {});", protocolId, protocolName)).append(LS); - } - - protocolManagerTemplate = StringUtils.format(protocolManagerTemplate, importBuilder.toString().trim(), initProtocolBuilder.toString().trim()); - var outputPath = StringUtils.format("{}/{}", protocolOutputPath, "ProtocolManager.ts"); - var file = new File(outputPath); - FileUtils.writeStringToFile(file, protocolManagerTemplate, true); - logger.info("Generated TypeScript protocol manager file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath()); - } - - public static void createTsProtocolFile(ProtocolRegistration registration) { - var protocolId = registration.protocolId(); - var registrationConstructor = registration.getConstructor(); - var protocolClazzName = registrationConstructor.getDeclaringClass().getSimpleName(); - - var protocolTemplate = ClassUtils.getFileFromClassPathToString("typescript/ProtocolTemplate.ts"); - - var importSubProtocol = importSubProtocol(registration); - var classNote = GenerateProtocolNote.classNote(protocolId, CodeLanguage.TypeScript, TAB, 0); - var fieldDefinition = fieldDefinition(registration); - var writeObject = writeObject(registration); - var readObject = readObject(registration); - - protocolTemplate = StringUtils.format(protocolTemplate, importSubProtocol, classNote, protocolClazzName, fieldDefinition.trim() - , protocolId, protocolClazzName, protocolClazzName, writeObject.trim(), protocolClazzName, protocolClazzName, readObject.trim(), protocolClazzName); - var outputPath = StringUtils.format("{}/{}/{}.ts", protocolOutputPath, GenerateProtocolPath.getProtocolPath(protocolId), protocolClazzName); - var file = new File(outputPath); - FileUtils.writeStringToFile(file, protocolTemplate, true); - logger.info("Generated TypeScript protocol file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath()); - } - - private static String importSubProtocol(ProtocolRegistration registration) { - var protocolId = registration.getId(); - var subProtocols = ProtocolAnalysis.getFirstSubProtocolIds(protocolId); - // import IByteBuffer first - var importBuilder = new StringBuilder(); - var protocolPath = GenerateProtocolPath.getProtocolPath(protocolId); - if (StringUtils.isEmpty(protocolPath)) { - importBuilder.append(StringUtils.format("import IByteBuffer from './IByteBuffer';")).append(LS); - } else { - var splits = protocolPath.split(StringUtils.PERIOD_REGEX); - importBuilder.append(StringUtils.format("import IByteBuffer from '{}IByteBuffer';", "../".repeat(splits.length))).append(LS); - } - if (CollectionUtils.isEmpty(subProtocols)) { - return importBuilder.toString(); - } - // import other sub protocols - for (var subProtocolId : subProtocols) { - var protocolClassName = EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(subProtocolId); - var path = GenerateProtocolPath.getRelativePath(protocolId, subProtocolId); - if (StringUtils.isBlank(path)) { - importBuilder.append(StringUtils.format("import {} from './{}';", protocolClassName, protocolClassName)).append(LS); - } else { - importBuilder.append(StringUtils.format("import {} from '{}/{}';", protocolClassName, path, protocolClassName)).append(LS); - } - } - return importBuilder.toString(); - } - - private static String fieldDefinition(ProtocolRegistration registration) { - var protocolId = registration.protocolId(); - var fields = registration.getFields(); - var fieldRegistrations = registration.getFieldRegistrations(); - // when generate source code fields, use origin fields sort - var sequencedFields = ReflectionUtils.notStaticAndTransientFields(registration.getConstructor().getDeclaringClass()); - var fieldDefinitionBuilder = new StringBuilder(); - for (var field : sequencedFields) { - var fieldRegistration = fieldRegistrations[GenerateProtocolFile.indexOf(fields, field)]; - var fieldName = field.getName(); - // 生成注释 - var fieldNotes = GenerateProtocolNote.fieldNotes(protocolId, fieldName, CodeLanguage.TypeScript); - for (var fieldNote : fieldNotes) { - fieldDefinitionBuilder.append(TAB).append(fieldNote).append(LS); - } - var triple = tsSerializer(fieldRegistration.serializer()).field(field, fieldRegistration); - fieldDefinitionBuilder.append(TAB).append(StringUtils.format("{}{} = {};", triple.getMiddle(), triple.getLeft(), triple.getRight())).append(LS); - } - return fieldDefinitionBuilder.toString(); - } - - private static String writeObject(ProtocolRegistration registration) { - GenerateProtocolFile.localVariableId = 0; - var fields = registration.getFields(); - var fieldRegistrations = registration.getFieldRegistrations(); - var tsBuilder = new StringBuilder(); - if (registration.isCompatible()) { - tsBuilder.append("const beforeWriteIndex = buffer.getWriteOffset();").append(LS); - tsBuilder.append(TAB + TAB).append(StringUtils.format("buffer.writeInt({});", registration.getPredictionLength())).append(LS); - } else { - tsBuilder.append(TAB + TAB).append("buffer.writeInt(-1);").append(LS); - } - for (var i = 0; i < fields.length; i++) { - var field = fields[i]; - var fieldRegistration = fieldRegistrations[i]; - tsSerializer(fieldRegistration.serializer()).writeObject(tsBuilder, "packet." + field.getName(), 2, field, fieldRegistration); - } - if (registration.isCompatible()) { - tsBuilder.append(TAB + TAB).append(StringUtils.format("buffer.adjustPadding({}, beforeWriteIndex);", registration.getPredictionLength())).append(LS); - } - return tsBuilder.toString(); - } - - private static String readObject(ProtocolRegistration registration) { - GenerateProtocolFile.localVariableId = 0; - var fields = registration.getFields(); - var fieldRegistrations = registration.getFieldRegistrations(); - var tsBuilder = new StringBuilder(); - for (var i = 0; i < fields.length; i++) { - var field = fields[i]; - var fieldRegistration = fieldRegistrations[i]; - if (field.isAnnotationPresent(Compatible.class)) { - tsBuilder.append(TAB + TAB).append("if (buffer.compatibleRead(beforeReadIndex, length)) {").append(LS); - var compatibleReadObject = tsSerializer(fieldRegistration.serializer()).readObject(tsBuilder, 3, field, fieldRegistration); - tsBuilder.append(TAB + TAB + TAB).append(StringUtils.format("packet.{} = {};", field.getName(), compatibleReadObject)).append(LS); - tsBuilder.append(TAB + TAB).append("}").append(LS); - continue; - } - var readObject = tsSerializer(fieldRegistration.serializer()).readObject(tsBuilder, 2, field, fieldRegistration); - tsBuilder.append(TAB + TAB).append(StringUtils.format("packet.{} = {};", field.getName(), readObject)).append(LS); - } - return tsBuilder.toString(); - } - - public static String toTsClassName(String typeName) { - typeName = typeName.replaceAll("java.util.|java.lang.", StringUtils.EMPTY); - typeName = typeName.replaceAll("[a-zA-Z0-9_.]*\\.", StringUtils.EMPTY); - - switch (typeName) { - case "boolean": - case "Boolean": - typeName = "boolean"; - return typeName; - case "byte": - case "Byte": - case "short": - case "Short": - case "int": - case "Integer": - case "long": - case "Long": - case "float": - case "Float": - case "double": - case "Double": - typeName = "number"; - return typeName; - case "char": - case "Character": - case "String": - typeName = "string"; - return typeName; - default: - } - - // 将boolean转为bool - typeName = typeName.replaceAll("[B|b]oolean\\[", "boolean"); - typeName = typeName.replace("", "boolean>"); - - // 将Byte转为byte - typeName = typeName.replace("Byte[", "number"); - typeName = typeName.replace("Byte>", "number>"); - typeName = typeName.replace("", "number>"); - typeName = typeName.replace("", "number>"); - typeName = typeName.replace("", "number>"); - typeName = typeName.replace("", "number>"); - typeName = typeName.replace("", "number>"); - typeName = typeName.replace("", "string>"); - typeName = typeName.replace("", "string>"); - typeName = typeName.replace(" field(Field field, IFieldRegistration fieldRegistration) { - var type = StringUtils.format(": Array<{}>", GenerateTsUtils.toTsClassName(field.getType().getComponentType().getSimpleName())); + var type = StringUtils.format(": Array<{}>", CodeGenerateTypeScript.toTsClassName(field.getType().getComponentType().getSimpleName())); return new Triple<>(type, field.getName(), "[]"); } @@ -57,7 +57,7 @@ public class TsArraySerializer implements ITsSerializer { String element = "element" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("{}.forEach({} => {", objectStr, element)).append(LS); - GenerateTsUtils.tsSerializer(arrayField.getArrayElementRegistration().serializer()) + CodeGenerateTypeScript.tsSerializer(arrayField.getArrayElementRegistration().serializer()) .writeObject(builder, element, deep + 2, field, arrayField.getArrayElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 1); builder.append("});").append(LS); @@ -75,7 +75,7 @@ public class TsArraySerializer implements ITsSerializer { ArrayField arrayField = (ArrayField) fieldRegistration; String result = "result" + GenerateProtocolFile.localVariableId++; - var typeName = StringUtils.format("Array<{}>", GenerateTsUtils.toTsClassName(arrayField.getType().getSimpleName())); + var typeName = StringUtils.format("Array<{}>", CodeGenerateTypeScript.toTsClassName(arrayField.getType().getSimpleName())); builder.append(StringUtils.format("const {} = new {};", result, typeName)).append(LS); String i = "index" + GenerateProtocolFile.localVariableId++; @@ -88,7 +88,7 @@ public class TsArraySerializer implements ITsSerializer { builder.append(StringUtils.format("if ({} > 0) {", size)).append(LS); GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("for (let {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS); - String readObject = GenerateTsUtils.tsSerializer(arrayField.getArrayElementRegistration().serializer()) + String readObject = CodeGenerateTypeScript.tsSerializer(arrayField.getArrayElementRegistration().serializer()) .readObject(builder, deep + 2, field, arrayField.getArrayElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 2); builder.append(StringUtils.format("{}.push({});", result, readObject)).append(LS); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsListSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsListSerializer.java index c4f0ed61..72fd7509 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsListSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsListSerializer.java @@ -32,7 +32,7 @@ public class TsListSerializer implements ITsSerializer { @Override public Triple field(Field field, IFieldRegistration fieldRegistration) { - var type = StringUtils.format(": {}", GenerateTsUtils.toTsClassName(field.getGenericType().toString())); + var type = StringUtils.format(": {}", CodeGenerateTypeScript.toTsClassName(field.getGenericType().toString())); return new Triple<>(type, field.getName(), "[]"); } @@ -57,7 +57,7 @@ public class TsListSerializer implements ITsSerializer { String element = "element" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("{}.forEach({} => {", objectStr, element)).append(LS); - GenerateTsUtils.tsSerializer(listField.getListElementRegistration().serializer()) + CodeGenerateTypeScript.tsSerializer(listField.getListElementRegistration().serializer()) .writeObject(builder, element, deep + 2, field, listField.getListElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 1); builder.append("});").append(LS); @@ -75,7 +75,7 @@ public class TsListSerializer implements ITsSerializer { ListField listField = (ListField) fieldRegistration; String result = "result" + GenerateProtocolFile.localVariableId++; - var typeName = GenerateTsUtils.toTsClassName(listField.getType().toString()); + var typeName = CodeGenerateTypeScript.toTsClassName(listField.getType().toString()); builder.append(StringUtils.format("const {} = new {}();", result, typeName)).append(LS); GenerateProtocolFile.addTab(builder, deep); @@ -88,7 +88,7 @@ public class TsListSerializer implements ITsSerializer { GenerateProtocolFile.addTab(builder, deep + 1); String i = "index" + GenerateProtocolFile.localVariableId++; builder.append(StringUtils.format("for (let {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS); - String readObject = GenerateTsUtils.tsSerializer(listField.getListElementRegistration().serializer()) + String readObject = CodeGenerateTypeScript.tsSerializer(listField.getListElementRegistration().serializer()) .readObject(builder, deep + 2, field, listField.getListElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 2); builder.append(StringUtils.format("{}.push({});", result, readObject)).append(LS); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsMapSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsMapSerializer.java index cc40862f..d7568475 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsMapSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsMapSerializer.java @@ -32,7 +32,7 @@ public class TsMapSerializer implements ITsSerializer { @Override public Triple field(Field field, IFieldRegistration fieldRegistration) { - var type = StringUtils.format(": {}", GenerateTsUtils.toTsClassName(field.getGenericType().toString())); + var type = StringUtils.format(": {}", CodeGenerateTypeScript.toTsClassName(field.getGenericType().toString())); return new Triple<>(type, field.getName(), "new Map()"); } @@ -59,9 +59,9 @@ public class TsMapSerializer implements ITsSerializer { GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("{}.forEach(({}, {}) => {", objectStr, value, key)).append(LS); - GenerateTsUtils.tsSerializer(mapField.getMapKeyRegistration().serializer()) + CodeGenerateTypeScript.tsSerializer(mapField.getMapKeyRegistration().serializer()) .writeObject(builder, key, deep + 2, field, mapField.getMapKeyRegistration()); - GenerateTsUtils.tsSerializer(mapField.getMapValueRegistration().serializer()) + CodeGenerateTypeScript.tsSerializer(mapField.getMapValueRegistration().serializer()) .writeObject(builder, value, deep + 2, field, mapField.getMapValueRegistration()); GenerateProtocolFile.addTab(builder, deep + 1); builder.append("});").append(LS); @@ -79,7 +79,7 @@ public class TsMapSerializer implements ITsSerializer { MapField mapField = (MapField) fieldRegistration; String result = "result" + GenerateProtocolFile.localVariableId++; - var typeName = GenerateTsUtils.toTsClassName(mapField.getType().toString()); + var typeName = CodeGenerateTypeScript.toTsClassName(mapField.getType().toString()); builder.append(StringUtils.format("const {} = new {}();", result, typeName)).append(LS); GenerateProtocolFile.addTab(builder, deep); @@ -93,11 +93,11 @@ public class TsMapSerializer implements ITsSerializer { GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("for (let {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS); - String keyObject = GenerateTsUtils.tsSerializer(mapField.getMapKeyRegistration().serializer()) + String keyObject = CodeGenerateTypeScript.tsSerializer(mapField.getMapKeyRegistration().serializer()) .readObject(builder, deep + 2, field, mapField.getMapKeyRegistration()); - String valueObject = GenerateTsUtils.tsSerializer(mapField.getMapValueRegistration().serializer()) + String valueObject = CodeGenerateTypeScript.tsSerializer(mapField.getMapValueRegistration().serializer()) .readObject(builder, deep + 2, field, mapField.getMapValueRegistration()); GenerateProtocolFile.addTab(builder, deep + 2); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsSetSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsSetSerializer.java index 158c946f..8050679f 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsSetSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsSetSerializer.java @@ -32,7 +32,7 @@ public class TsSetSerializer implements ITsSerializer { @Override public Triple field(Field field, IFieldRegistration fieldRegistration) { - var type = StringUtils.format(": {}", GenerateTsUtils.toTsClassName(field.getGenericType().toString())); + var type = StringUtils.format(": {}", CodeGenerateTypeScript.toTsClassName(field.getGenericType().toString())); return new Triple<>(type, field.getName(), "new Set()"); } @@ -58,7 +58,7 @@ public class TsSetSerializer implements ITsSerializer { String element = "element" + GenerateProtocolFile.localVariableId++; GenerateProtocolFile.addTab(builder, deep + 1); builder.append(StringUtils.format("{}.forEach({} => {", objectStr, element)).append(LS); - GenerateTsUtils.tsSerializer(setField.getSetElementRegistration().serializer()) + CodeGenerateTypeScript.tsSerializer(setField.getSetElementRegistration().serializer()) .writeObject(builder, element, deep + 2, field, setField.getSetElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 1); builder.append("});").append(LS); @@ -76,7 +76,7 @@ public class TsSetSerializer implements ITsSerializer { SetField setField = (SetField) fieldRegistration; String result = "result" + GenerateProtocolFile.localVariableId++; - var typeName = GenerateTsUtils.toTsClassName(setField.getType().toString()); + var typeName = CodeGenerateTypeScript.toTsClassName(setField.getType().toString()); builder.append(StringUtils.format("const {} = new {}();", result, typeName)).append(LS); GenerateProtocolFile.addTab(builder, deep); @@ -89,7 +89,7 @@ public class TsSetSerializer implements ITsSerializer { GenerateProtocolFile.addTab(builder, deep + 1); String i = "index" + GenerateProtocolFile.localVariableId++; builder.append(StringUtils.format("for (let {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS); - String readObject = GenerateTsUtils.tsSerializer(setField.getSetElementRegistration().serializer()) + String readObject = CodeGenerateTypeScript.tsSerializer(setField.getSetElementRegistration().serializer()) .readObject(builder, deep + 2, field, setField.getSetElementRegistration()); GenerateProtocolFile.addTab(builder, deep + 2); builder.append(StringUtils.format("{}.add({});", result, readObject)).append(LS); diff --git a/protocol/src/main/resources/typescript/ProtocolClassTemplate.ts b/protocol/src/main/resources/typescript/ProtocolClassTemplate.ts new file mode 100644 index 00000000..3ca38047 --- /dev/null +++ b/protocol/src/main/resources/typescript/ProtocolClassTemplate.ts @@ -0,0 +1,32 @@ +${protocol_note} +class ${protocol_name} { + ${protocol_field_definition} + + static PROTOCOL_ID: number = ${protocol_id}; + + protocolId(): number { + return ${protocol_name}.PROTOCOL_ID; + } + + static write(buffer: IByteBuffer, packet: ${protocol_name} | null) { + if (packet === null) { + buffer.writeInt(0); + return; + } + ${protocol_write_serialization} + } + + static read(buffer: IByteBuffer): ${protocol_name} | null { + const length = buffer.readInt(); + if (length === 0) { + return null; + } + const beforeReadIndex = buffer.getReadOffset(); + const packet = new ${protocol_name}(); + ${protocol_read_deserialization} + if (length > 0) { + buffer.setReadOffset(beforeReadIndex + length); + } + return packet; + } +} \ No newline at end of file diff --git a/protocol/src/main/resources/typescript/ProtocolManagerTemplate.ts b/protocol/src/main/resources/typescript/ProtocolManagerTemplate.ts index e616134f..ccbca950 100644 --- a/protocol/src/main/resources/typescript/ProtocolManagerTemplate.ts +++ b/protocol/src/main/resources/typescript/ProtocolManagerTemplate.ts @@ -1,11 +1,10 @@ -{ -} +${protocol_imports} import IByteBuffer from "./IByteBuffer"; const protocols = new Map(); // initProtocol -{} +${protocol_manager_registrations} class ProtocolManager { static getProtocol(protocolId: number): any { diff --git a/protocol/src/main/resources/typescript/ProtocolTemplate.ts b/protocol/src/main/resources/typescript/ProtocolTemplate.ts index d227593e..52362b7a 100644 --- a/protocol/src/main/resources/typescript/ProtocolTemplate.ts +++ b/protocol/src/main/resources/typescript/ProtocolTemplate.ts @@ -1,31 +1,30 @@ -{} -{} -class {} { +${protocol_imports} +${protocol_note} +class ${protocol_name} { + ${protocol_field_definition} - {} - - static PROTOCOL_ID: number = {}; + static PROTOCOL_ID: number = ${protocol_id}; protocolId(): number { - return {}.PROTOCOL_ID; + return ${protocol_name}.PROTOCOL_ID; } - static write(buffer: IByteBuffer, packet: {} | null) { + static write(buffer: IByteBuffer, packet: ${protocol_name} | null) { if (packet === null) { buffer.writeInt(0); return; } - {} + ${protocol_write_serialization} } - static read(buffer: IByteBuffer): {} | null { + static read(buffer: IByteBuffer): ${protocol_name} | null { const length = buffer.readInt(); if (length === 0) { return null; } const beforeReadIndex = buffer.getReadOffset(); - const packet = new {}(); - {} + const packet = new ${protocol_name}(); + ${protocol_read_deserialization} if (length > 0) { buffer.setReadOffset(beforeReadIndex + length); } @@ -33,4 +32,4 @@ class {} { } } -export default {}; +export default ${protocol_name}; \ No newline at end of file diff --git a/protocol/src/main/resources/typescript/ProtocolsTemplate.ts b/protocol/src/main/resources/typescript/ProtocolsTemplate.ts new file mode 100644 index 00000000..4b89921a --- /dev/null +++ b/protocol/src/main/resources/typescript/ProtocolsTemplate.ts @@ -0,0 +1,9 @@ +${protocol_imports} + +${protocol_class} + +class Protocols { + ${protocol_registration} +} + +export default Protocols;