mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-10-13 16:15:27 +00:00
ref[TypeScript]: refactor generate TypeScript protocol
This commit is contained in:
1 parent
8ed1d2288b
commit
73592cdcdf
25 files changed
+541
-411
No files matched your search
@@ -22,7 +22,7 @@ import com.zfoo.protocol.serializer.CodeLanguage;
|
|||||||
import com.zfoo.protocol.serializer.gdscript.GenerateGdUtils;
|
import com.zfoo.protocol.serializer.gdscript.GenerateGdUtils;
|
||||||
import com.zfoo.protocol.serializer.go.GenerateGoUtils;
|
import com.zfoo.protocol.serializer.go.GenerateGoUtils;
|
||||||
import com.zfoo.protocol.serializer.python.GeneratePyUtils;
|
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.FileUtils;
|
||||||
import com.zfoo.protocol.util.ReflectionUtils;
|
import com.zfoo.protocol.util.ReflectionUtils;
|
||||||
import com.zfoo.protocol.util.StringUtils;
|
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协议
|
// 生成GdScript协议
|
||||||
if (generateLanguages.contains(CodeLanguage.GdScript)) {
|
if (generateLanguages.contains(CodeLanguage.GdScript)) {
|
||||||
GenerateGdUtils.init(generateOperation);
|
GenerateGdUtils.init(generateOperation);
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ import com.zfoo.protocol.serializer.gdscript.GenerateGdUtils;
|
|||||||
import com.zfoo.protocol.serializer.go.GenerateGoUtils;
|
import com.zfoo.protocol.serializer.go.GenerateGoUtils;
|
||||||
import com.zfoo.protocol.serializer.python.GeneratePyUtils;
|
import com.zfoo.protocol.serializer.python.GeneratePyUtils;
|
||||||
import com.zfoo.protocol.serializer.reflect.*;
|
import com.zfoo.protocol.serializer.reflect.*;
|
||||||
import com.zfoo.protocol.serializer.typescript.GenerateTsUtils;
|
|
||||||
import com.zfoo.protocol.util.*;
|
import com.zfoo.protocol.util.*;
|
||||||
import com.zfoo.protocol.xml.XmlProtocols;
|
import com.zfoo.protocol.xml.XmlProtocols;
|
||||||
import javassist.CannotCompileException;
|
import javassist.CannotCompileException;
|
||||||
@@ -397,7 +396,6 @@ public class ProtocolAnalysis {
|
|||||||
GenerateProtocolNote.clear();
|
GenerateProtocolNote.clear();
|
||||||
GenerateProtocolPath.clear();
|
GenerateProtocolPath.clear();
|
||||||
GenerateGoUtils.clear();
|
GenerateGoUtils.clear();
|
||||||
GenerateTsUtils.clear();
|
|
||||||
GenerateGdUtils.clear();
|
GenerateGdUtils.clear();
|
||||||
GeneratePyUtils.clear();
|
GeneratePyUtils.clear();
|
||||||
}
|
}
|
||||||
@@ -630,7 +628,7 @@ public class ProtocolAnalysis {
|
|||||||
* CN: 此方法仅在生成协议的时候调用,一旦运行,不能调用
|
* CN: 此方法仅在生成协议的时候调用,一旦运行,不能调用
|
||||||
*/
|
*/
|
||||||
public static Set<Short> getFirstSubProtocolIds(short protocolId) {
|
public static Set<Short> getFirstSubProtocolIds(short protocolId) {
|
||||||
return subProtocolIdMap.get(protocolId);
|
return subProtocolIdMap.getOrDefault(protocolId, Collections.emptySet());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import com.zfoo.protocol.serializer.csharp.CodeGenerateCsharp;
|
|||||||
import com.zfoo.protocol.serializer.ecmascript.CodeGenerateEcmaScript;
|
import com.zfoo.protocol.serializer.ecmascript.CodeGenerateEcmaScript;
|
||||||
import com.zfoo.protocol.serializer.javascript.CodeGenerateJavaScript;
|
import com.zfoo.protocol.serializer.javascript.CodeGenerateJavaScript;
|
||||||
import com.zfoo.protocol.serializer.lua.CodeGenerateLua;
|
import com.zfoo.protocol.serializer.lua.CodeGenerateLua;
|
||||||
|
import com.zfoo.protocol.serializer.typescript.CodeGenerateTypeScript;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author godotg
|
* @author godotg
|
||||||
@@ -36,7 +37,7 @@ public enum CodeLanguage {
|
|||||||
|
|
||||||
EcmaScript(1 << 4, CodeGenerateEcmaScript.class),
|
EcmaScript(1 << 4, CodeGenerateEcmaScript.class),
|
||||||
|
|
||||||
TypeScript(1 << 5, null),
|
TypeScript(1 << 5, CodeGenerateTypeScript.class),
|
||||||
|
|
||||||
Lua(1 << 10, CodeGenerateLua.class),
|
Lua(1 << 10, CodeGenerateLua.class),
|
||||||
|
|
||||||
|
|||||||
@@ -89,8 +89,8 @@ public class CodeGenerateCpp implements ICodeGenerate {
|
|||||||
protocol_imports.append(StringUtils.format("#include \"{}/Protocols.h\"", protocolOutputRootPath)).append(LS);
|
protocol_imports.append(StringUtils.format("#include \"{}/Protocols.h\"", protocolOutputRootPath)).append(LS);
|
||||||
for (var registration : registrations) {
|
for (var registration : registrations) {
|
||||||
var protocol_id = registration.protocolId();
|
var protocol_id = registration.protocolId();
|
||||||
var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
|
var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
|
||||||
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()
|
var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString()
|
||||||
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
||||||
@@ -133,9 +133,9 @@ public class CodeGenerateCpp implements ICodeGenerate {
|
|||||||
var protocol_manager_registrations = new StringBuilder();
|
var protocol_manager_registrations = new StringBuilder();
|
||||||
for (var registration : registrations) {
|
for (var registration : registrations) {
|
||||||
var protocol_id = registration.protocolId();
|
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_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()
|
var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString()
|
||||||
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
||||||
@@ -174,9 +174,9 @@ public class CodeGenerateCpp implements ICodeGenerate {
|
|||||||
var protocol_manager_registrations = new StringBuilder();
|
var protocol_manager_registrations = new StringBuilder();
|
||||||
for (var registration : registrations) {
|
for (var registration : registrations) {
|
||||||
var protocol_id = registration.protocolId();
|
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, protocol_class_name)).append(LS);
|
protocol_imports.append(StringUtils.format("#include \"{}/{}.h\"", protocolOutputRootPath, protocol_name)).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()
|
var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString()
|
||||||
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
||||||
@@ -217,12 +217,12 @@ public class CodeGenerateCpp implements ICodeGenerate {
|
|||||||
|
|
||||||
private String protocol_class(ProtocolRegistration registration) {
|
private String protocol_class(ProtocolRegistration registration) {
|
||||||
var protocol_id = registration.protocolId();
|
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 protocolClassTemplate = ClassUtils.getFileFromClassPathToString("cpp/ProtocolClassTemplate.h");
|
||||||
var placeholderMap = Map.of(
|
var placeholderMap = Map.of(
|
||||||
CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.Cpp)
|
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_id, String.valueOf(protocol_id)
|
||||||
, CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration)
|
, CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration)
|
||||||
);
|
);
|
||||||
@@ -231,11 +231,11 @@ public class CodeGenerateCpp implements ICodeGenerate {
|
|||||||
|
|
||||||
private String protocol_registration(ProtocolRegistration registration) {
|
private String protocol_registration(ProtocolRegistration registration) {
|
||||||
var protocol_id = registration.protocolId();
|
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 protocolRegistrationTemplate = ClassUtils.getFileFromClassPathToString("cpp/ProtocolRegistrationTemplate.h");
|
||||||
var placeholderMap = Map.of(
|
var placeholderMap = Map.of(
|
||||||
CodeTemplatePlaceholder.protocol_name, protocol_class_name
|
CodeTemplatePlaceholder.protocol_name, protocol_name
|
||||||
, CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id)
|
, CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id)
|
||||||
, CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration)
|
, CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration)
|
||||||
, CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration)
|
, CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration)
|
||||||
|
|||||||
+10
-13
@@ -85,8 +85,8 @@ public class CodeGenerateEcmaScript implements ICodeGenerate {
|
|||||||
protocol_imports.append("import Protocols from './Protocols.mjs';").append(LS);
|
protocol_imports.append("import Protocols from './Protocols.mjs';").append(LS);
|
||||||
for (var registration : registrations) {
|
for (var registration : registrations) {
|
||||||
var protocol_id = registration.protocolId();
|
var protocol_id = registration.protocolId();
|
||||||
var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
|
var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
|
||||||
protocol_manager_registrations.append(StringUtils.format("protocols.set({}, Protocols.{});", protocol_id, protocol_class_name)).append(LS);
|
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()
|
var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString()
|
||||||
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
||||||
@@ -99,13 +99,10 @@ public class CodeGenerateEcmaScript implements ICodeGenerate {
|
|||||||
var protocol_registration = new StringBuilder();
|
var protocol_registration = new StringBuilder();
|
||||||
for (var registration : registrations) {
|
for (var registration : registrations) {
|
||||||
var protocol_id = registration.protocolId();
|
var protocol_id = registration.protocolId();
|
||||||
|
var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
|
||||||
|
|
||||||
// protocol
|
// protocol
|
||||||
protocol_class.append(formatProtocolClassTemplate(registration)).append(LS);
|
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);
|
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();
|
var protocol_manager_registrations = new StringBuilder();
|
||||||
for (var protocol : registrations) {
|
for (var protocol : registrations) {
|
||||||
var protocol_id = protocol.protocolId();
|
var protocol_id = protocol.protocolId();
|
||||||
var protocol_class_name = protocol.protocolConstructor().getDeclaringClass().getSimpleName();
|
var protocol_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_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_class_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()
|
var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString()
|
||||||
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
||||||
@@ -162,9 +159,9 @@ public class CodeGenerateEcmaScript implements ICodeGenerate {
|
|||||||
var protocol_manager_registrations = new StringBuilder();
|
var protocol_manager_registrations = new StringBuilder();
|
||||||
for (var protocol : registrations) {
|
for (var protocol : registrations) {
|
||||||
var protocol_id = protocol.protocolId();
|
var protocol_id = protocol.protocolId();
|
||||||
var protocol_class_name = protocol.protocolConstructor().getDeclaringClass().getSimpleName();
|
var protocol_name = protocol.protocolConstructor().getDeclaringClass().getSimpleName();
|
||||||
protocol_imports.append(StringUtils.format("import {} from './{}.mjs';", protocol_class_name, protocol_class_name)).append(LS);
|
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_class_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()
|
var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString()
|
||||||
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
||||||
|
|||||||
+2
-2
@@ -19,7 +19,7 @@ import com.zfoo.protocol.registration.field.ArrayField;
|
|||||||
import com.zfoo.protocol.registration.field.IFieldRegistration;
|
import com.zfoo.protocol.registration.field.IFieldRegistration;
|
||||||
import com.zfoo.protocol.serializer.CodeLanguage;
|
import com.zfoo.protocol.serializer.CodeLanguage;
|
||||||
import com.zfoo.protocol.serializer.CutDownArraySerializer;
|
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 com.zfoo.protocol.util.StringUtils;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@@ -32,7 +32,7 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
|||||||
public class EsArraySerializer implements IEsSerializer {
|
public class EsArraySerializer implements IEsSerializer {
|
||||||
@Override
|
@Override
|
||||||
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
|
public Triple<String, String, String> 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(), "[]");
|
return new Triple<>(type, field.getName(), "[]");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -19,7 +19,7 @@ import com.zfoo.protocol.registration.field.IFieldRegistration;
|
|||||||
import com.zfoo.protocol.registration.field.ListField;
|
import com.zfoo.protocol.registration.field.ListField;
|
||||||
import com.zfoo.protocol.serializer.CodeLanguage;
|
import com.zfoo.protocol.serializer.CodeLanguage;
|
||||||
import com.zfoo.protocol.serializer.CutDownListSerializer;
|
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 com.zfoo.protocol.util.StringUtils;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@@ -32,7 +32,7 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
|||||||
public class EsListSerializer implements IEsSerializer {
|
public class EsListSerializer implements IEsSerializer {
|
||||||
@Override
|
@Override
|
||||||
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
|
public Triple<String, String, String> 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
|
@Override
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import com.zfoo.protocol.registration.field.IFieldRegistration;
|
|||||||
import com.zfoo.protocol.registration.field.MapField;
|
import com.zfoo.protocol.registration.field.MapField;
|
||||||
import com.zfoo.protocol.serializer.CodeLanguage;
|
import com.zfoo.protocol.serializer.CodeLanguage;
|
||||||
import com.zfoo.protocol.serializer.CutDownMapSerializer;
|
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 com.zfoo.protocol.util.StringUtils;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@@ -32,7 +32,7 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
|||||||
public class EsMapSerializer implements IEsSerializer {
|
public class EsMapSerializer implements IEsSerializer {
|
||||||
@Override
|
@Override
|
||||||
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
|
public Triple<String, String, String> 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
|
@Override
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import com.zfoo.protocol.registration.field.IFieldRegistration;
|
|||||||
import com.zfoo.protocol.registration.field.SetField;
|
import com.zfoo.protocol.registration.field.SetField;
|
||||||
import com.zfoo.protocol.serializer.CodeLanguage;
|
import com.zfoo.protocol.serializer.CodeLanguage;
|
||||||
import com.zfoo.protocol.serializer.CutDownSetSerializer;
|
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 com.zfoo.protocol.util.StringUtils;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@@ -32,7 +32,7 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
|||||||
public class EsSetSerializer implements IEsSerializer {
|
public class EsSetSerializer implements IEsSerializer {
|
||||||
@Override
|
@Override
|
||||||
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
|
public Triple<String, String, String> 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
|
@Override
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import com.zfoo.protocol.registration.field.IFieldRegistration;
|
|||||||
import com.zfoo.protocol.serializer.CodeLanguage;
|
import com.zfoo.protocol.serializer.CodeLanguage;
|
||||||
import com.zfoo.protocol.serializer.enhance.EnhanceObjectProtocolSerializer;
|
import com.zfoo.protocol.serializer.enhance.EnhanceObjectProtocolSerializer;
|
||||||
import com.zfoo.protocol.serializer.reflect.*;
|
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.ClassUtils;
|
||||||
import com.zfoo.protocol.util.FileUtils;
|
import com.zfoo.protocol.util.FileUtils;
|
||||||
import com.zfoo.protocol.util.ReflectionUtils;
|
import com.zfoo.protocol.util.ReflectionUtils;
|
||||||
@@ -166,7 +166,7 @@ public abstract class GenerateGdUtils {
|
|||||||
// 生成类型的注释
|
// 生成类型的注释
|
||||||
gdBuilder.append(StringUtils.format("var {}: {}", fieldName, fieldType));
|
gdBuilder.append(StringUtils.format("var {}: {}", fieldName, fieldType));
|
||||||
if (fieldType.equals("Dictionary") || fieldType.equals("Array")) {
|
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(StringUtils.format(TAB_ASCII + "# {}", typeNote));
|
||||||
}
|
}
|
||||||
gdBuilder.append(LS);
|
gdBuilder.append(LS);
|
||||||
|
|||||||
+12
-12
@@ -85,8 +85,8 @@ public class CodeGenerateJavaScript implements ICodeGenerate {
|
|||||||
protocol_imports.append("import Protocols from './Protocols.js';").append(LS);
|
protocol_imports.append("import Protocols from './Protocols.js';").append(LS);
|
||||||
for (var registration : registrations) {
|
for (var registration : registrations) {
|
||||||
var protocol_id = registration.protocolId();
|
var protocol_id = registration.protocolId();
|
||||||
var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
|
var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
|
||||||
protocol_manager_registrations.append(StringUtils.format("protocols.set({}, Protocols.{});", protocol_id, protocol_class_name)).append(LS);
|
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()
|
var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString()
|
||||||
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
||||||
@@ -134,9 +134,9 @@ public class CodeGenerateJavaScript implements ICodeGenerate {
|
|||||||
var protocol_manager_registrations = new StringBuilder();
|
var protocol_manager_registrations = new StringBuilder();
|
||||||
for (var registration : registrations) {
|
for (var registration : registrations) {
|
||||||
var protocol_id = registration.protocolId();
|
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("import {} from './{}.js';", protocol_class_name, GenerateProtocolPath.protocolAbsolutePath(registration.protocolId(), CodeLanguage.JavaScript))).append(LS);
|
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_class_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()
|
var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString()
|
||||||
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
||||||
@@ -173,9 +173,9 @@ public class CodeGenerateJavaScript implements ICodeGenerate {
|
|||||||
var protocol_manager_registrations = new StringBuilder();
|
var protocol_manager_registrations = new StringBuilder();
|
||||||
for (var registration : registrations) {
|
for (var registration : registrations) {
|
||||||
var protocol_id = registration.protocolId();
|
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("import {} from './{}.js';", protocol_class_name, protocol_class_name)).append(LS);
|
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_class_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()
|
var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString()
|
||||||
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
|
||||||
@@ -215,12 +215,12 @@ public class CodeGenerateJavaScript implements ICodeGenerate {
|
|||||||
|
|
||||||
private String protocol_class(ProtocolRegistration registration) {
|
private String protocol_class(ProtocolRegistration registration) {
|
||||||
var protocol_id = registration.protocolId();
|
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 protocolClassTemplate = ClassUtils.getFileFromClassPathToString("javascript/ProtocolClassTemplate.js");
|
||||||
var placeholderMap = Map.of(
|
var placeholderMap = Map.of(
|
||||||
CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.JavaScript)
|
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)
|
, CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration)
|
||||||
);
|
);
|
||||||
return CodeTemplatePlaceholder.formatTemplate(protocolClassTemplate, placeholderMap);
|
return CodeTemplatePlaceholder.formatTemplate(protocolClassTemplate, placeholderMap);
|
||||||
@@ -228,11 +228,11 @@ public class CodeGenerateJavaScript implements ICodeGenerate {
|
|||||||
|
|
||||||
private String protocol_registration(ProtocolRegistration registration) {
|
private String protocol_registration(ProtocolRegistration registration) {
|
||||||
var protocol_id = registration.protocolId();
|
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 protocolRegistrationTemplate = ClassUtils.getFileFromClassPathToString("javascript/ProtocolRegistrationTemplate.js");
|
||||||
var placeholderMap = Map.of(
|
var placeholderMap = Map.of(
|
||||||
CodeTemplatePlaceholder.protocol_name, protocol_class_name
|
CodeTemplatePlaceholder.protocol_name, protocol_name
|
||||||
, CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id)
|
, CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id)
|
||||||
, CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration)
|
, CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration)
|
||||||
, CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration)
|
, CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration)
|
||||||
|
|||||||
+2
-2
@@ -19,7 +19,7 @@ import com.zfoo.protocol.registration.field.ArrayField;
|
|||||||
import com.zfoo.protocol.registration.field.IFieldRegistration;
|
import com.zfoo.protocol.registration.field.IFieldRegistration;
|
||||||
import com.zfoo.protocol.serializer.CodeLanguage;
|
import com.zfoo.protocol.serializer.CodeLanguage;
|
||||||
import com.zfoo.protocol.serializer.CutDownArraySerializer;
|
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 com.zfoo.protocol.util.StringUtils;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@@ -32,7 +32,7 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
|||||||
public class JsArraySerializer implements IJsSerializer {
|
public class JsArraySerializer implements IJsSerializer {
|
||||||
@Override
|
@Override
|
||||||
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
|
public Triple<String, String, String> 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(), "[]");
|
return new Triple<>(type, field.getName(), "[]");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -19,7 +19,7 @@ import com.zfoo.protocol.registration.field.IFieldRegistration;
|
|||||||
import com.zfoo.protocol.registration.field.ListField;
|
import com.zfoo.protocol.registration.field.ListField;
|
||||||
import com.zfoo.protocol.serializer.CodeLanguage;
|
import com.zfoo.protocol.serializer.CodeLanguage;
|
||||||
import com.zfoo.protocol.serializer.CutDownListSerializer;
|
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 com.zfoo.protocol.util.StringUtils;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@@ -32,7 +32,7 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
|||||||
public class JsListSerializer implements IJsSerializer {
|
public class JsListSerializer implements IJsSerializer {
|
||||||
@Override
|
@Override
|
||||||
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
|
public Triple<String, String, String> 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
|
@Override
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import com.zfoo.protocol.registration.field.IFieldRegistration;
|
|||||||
import com.zfoo.protocol.registration.field.MapField;
|
import com.zfoo.protocol.registration.field.MapField;
|
||||||
import com.zfoo.protocol.serializer.CodeLanguage;
|
import com.zfoo.protocol.serializer.CodeLanguage;
|
||||||
import com.zfoo.protocol.serializer.CutDownMapSerializer;
|
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 com.zfoo.protocol.util.StringUtils;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@@ -32,7 +32,7 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
|||||||
public class JsMapSerializer implements IJsSerializer {
|
public class JsMapSerializer implements IJsSerializer {
|
||||||
@Override
|
@Override
|
||||||
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
|
public Triple<String, String, String> 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
|
@Override
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import com.zfoo.protocol.registration.field.IFieldRegistration;
|
|||||||
import com.zfoo.protocol.registration.field.SetField;
|
import com.zfoo.protocol.registration.field.SetField;
|
||||||
import com.zfoo.protocol.serializer.CodeLanguage;
|
import com.zfoo.protocol.serializer.CodeLanguage;
|
||||||
import com.zfoo.protocol.serializer.CutDownSetSerializer;
|
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 com.zfoo.protocol.util.StringUtils;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@@ -32,7 +32,7 @@ import static com.zfoo.protocol.util.FileUtils.LS;
|
|||||||
public class JsSetSerializer implements IJsSerializer {
|
public class JsSetSerializer implements IJsSerializer {
|
||||||
@Override
|
@Override
|
||||||
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
|
public Triple<String, String, String> 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
|
@Override
|
||||||
|
|||||||
+413
@@ -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<ISerializer, ITsSerializer> 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<ProtocolRegistration> 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<ProtocolRegistration> 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<ProtocolRegistration> 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", "<boolean");
|
||||||
|
typeName = typeName.replace("Boolean>", "boolean>");
|
||||||
|
|
||||||
|
// 将Byte转为byte
|
||||||
|
typeName = typeName.replace("Byte[", "number");
|
||||||
|
typeName = typeName.replace("Byte>", "number>");
|
||||||
|
typeName = typeName.replace("<Byte", "<number");
|
||||||
|
|
||||||
|
// 将Short转为short
|
||||||
|
typeName = typeName.replace("Short[", "number");
|
||||||
|
typeName = typeName.replace("Short>", "number>");
|
||||||
|
typeName = typeName.replace("<Short", "<number");
|
||||||
|
|
||||||
|
// 将Integer转为int
|
||||||
|
typeName = typeName.replace("Integer[", "number");
|
||||||
|
typeName = typeName.replace("Integer>", "number>");
|
||||||
|
typeName = typeName.replace("<Integer", "<number");
|
||||||
|
|
||||||
|
|
||||||
|
// 将Long转为long
|
||||||
|
typeName = typeName.replace("Long[", "number");
|
||||||
|
typeName = typeName.replace("Long>", "number>");
|
||||||
|
typeName = typeName.replace("<Long", "<number");
|
||||||
|
|
||||||
|
// 将Float转为float
|
||||||
|
typeName = typeName.replace("Float[", "number");
|
||||||
|
typeName = typeName.replace("Float>", "number>");
|
||||||
|
typeName = typeName.replace("<Float", "<number");
|
||||||
|
|
||||||
|
// 将Double转为double
|
||||||
|
typeName = typeName.replace("Double[", "number");
|
||||||
|
typeName = typeName.replace("Double>", "number>");
|
||||||
|
typeName = typeName.replace("<Double", "<number");
|
||||||
|
|
||||||
|
// 将Character转为Char
|
||||||
|
typeName = typeName.replace("Character[", "string");
|
||||||
|
typeName = typeName.replace("Character>", "string>");
|
||||||
|
typeName = typeName.replace("<Character", "<string");
|
||||||
|
|
||||||
|
// 将String转为string
|
||||||
|
typeName = typeName.replace("String[", "string");
|
||||||
|
typeName = typeName.replace("String>", "string>");
|
||||||
|
typeName = typeName.replace("<String", "<string");
|
||||||
|
|
||||||
|
typeName = typeName.replace("Map<", "Map<");
|
||||||
|
typeName = typeName.replace("Set<", "Set<");
|
||||||
|
typeName = typeName.replace("List<", "Array<");
|
||||||
|
|
||||||
|
return typeName;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,309 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.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.ProtocolAnalysis;
|
|
||||||
import com.zfoo.protocol.registration.ProtocolRegistration;
|
|
||||||
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;
|
|
||||||
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 abstract class GenerateTsUtils {
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(GenerateTsUtils.class);
|
|
||||||
|
|
||||||
// custom configuration
|
|
||||||
public static String protocolOutputRootPath = "zfoots";
|
|
||||||
private static String protocolOutputPath = StringUtils.EMPTY;
|
|
||||||
|
|
||||||
private static Map<ISerializer, ITsSerializer> 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<ProtocolRegistration> 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", "<boolean");
|
|
||||||
typeName = typeName.replace("Boolean>", "boolean>");
|
|
||||||
|
|
||||||
// 将Byte转为byte
|
|
||||||
typeName = typeName.replace("Byte[", "number");
|
|
||||||
typeName = typeName.replace("Byte>", "number>");
|
|
||||||
typeName = typeName.replace("<Byte", "<number");
|
|
||||||
|
|
||||||
// 将Short转为short
|
|
||||||
typeName = typeName.replace("Short[", "number");
|
|
||||||
typeName = typeName.replace("Short>", "number>");
|
|
||||||
typeName = typeName.replace("<Short", "<number");
|
|
||||||
|
|
||||||
// 将Integer转为int
|
|
||||||
typeName = typeName.replace("Integer[", "number");
|
|
||||||
typeName = typeName.replace("Integer>", "number>");
|
|
||||||
typeName = typeName.replace("<Integer", "<number");
|
|
||||||
|
|
||||||
|
|
||||||
// 将Long转为long
|
|
||||||
typeName = typeName.replace("Long[", "number");
|
|
||||||
typeName = typeName.replace("Long>", "number>");
|
|
||||||
typeName = typeName.replace("<Long", "<number");
|
|
||||||
|
|
||||||
// 将Float转为float
|
|
||||||
typeName = typeName.replace("Float[", "number");
|
|
||||||
typeName = typeName.replace("Float>", "number>");
|
|
||||||
typeName = typeName.replace("<Float", "<number");
|
|
||||||
|
|
||||||
// 将Double转为double
|
|
||||||
typeName = typeName.replace("Double[", "number");
|
|
||||||
typeName = typeName.replace("Double>", "number>");
|
|
||||||
typeName = typeName.replace("<Double", "<number");
|
|
||||||
|
|
||||||
// 将Character转为Char
|
|
||||||
typeName = typeName.replace("Character[", "string");
|
|
||||||
typeName = typeName.replace("Character>", "string>");
|
|
||||||
typeName = typeName.replace("<Character", "<string");
|
|
||||||
|
|
||||||
// 将String转为string
|
|
||||||
typeName = typeName.replace("String[", "string");
|
|
||||||
typeName = typeName.replace("String>", "string>");
|
|
||||||
typeName = typeName.replace("<String", "<string");
|
|
||||||
|
|
||||||
typeName = typeName.replace("Map<", "Map<");
|
|
||||||
typeName = typeName.replace("Set<", "Set<");
|
|
||||||
typeName = typeName.replace("List<", "Array<");
|
|
||||||
|
|
||||||
return typeName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+4
-4
@@ -32,7 +32,7 @@ public class TsArraySerializer implements ITsSerializer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
|
public Triple<String, String, String> 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(), "[]");
|
return new Triple<>(type, field.getName(), "[]");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ public class TsArraySerializer implements ITsSerializer {
|
|||||||
String element = "element" + GenerateProtocolFile.localVariableId++;
|
String element = "element" + GenerateProtocolFile.localVariableId++;
|
||||||
GenerateProtocolFile.addTab(builder, deep + 1);
|
GenerateProtocolFile.addTab(builder, deep + 1);
|
||||||
builder.append(StringUtils.format("{}.forEach({} => {", objectStr, element)).append(LS);
|
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());
|
.writeObject(builder, element, deep + 2, field, arrayField.getArrayElementRegistration());
|
||||||
GenerateProtocolFile.addTab(builder, deep + 1);
|
GenerateProtocolFile.addTab(builder, deep + 1);
|
||||||
builder.append("});").append(LS);
|
builder.append("});").append(LS);
|
||||||
@@ -75,7 +75,7 @@ public class TsArraySerializer implements ITsSerializer {
|
|||||||
|
|
||||||
ArrayField arrayField = (ArrayField) fieldRegistration;
|
ArrayField arrayField = (ArrayField) fieldRegistration;
|
||||||
String result = "result" + GenerateProtocolFile.localVariableId++;
|
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);
|
builder.append(StringUtils.format("const {} = new {};", result, typeName)).append(LS);
|
||||||
|
|
||||||
String i = "index" + GenerateProtocolFile.localVariableId++;
|
String i = "index" + GenerateProtocolFile.localVariableId++;
|
||||||
@@ -88,7 +88,7 @@ public class TsArraySerializer implements ITsSerializer {
|
|||||||
builder.append(StringUtils.format("if ({} > 0) {", size)).append(LS);
|
builder.append(StringUtils.format("if ({} > 0) {", size)).append(LS);
|
||||||
GenerateProtocolFile.addTab(builder, deep + 1);
|
GenerateProtocolFile.addTab(builder, deep + 1);
|
||||||
builder.append(StringUtils.format("for (let {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS);
|
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());
|
.readObject(builder, deep + 2, field, arrayField.getArrayElementRegistration());
|
||||||
GenerateProtocolFile.addTab(builder, deep + 2);
|
GenerateProtocolFile.addTab(builder, deep + 2);
|
||||||
builder.append(StringUtils.format("{}.push({});", result, readObject)).append(LS);
|
builder.append(StringUtils.format("{}.push({});", result, readObject)).append(LS);
|
||||||
|
|||||||
+4
-4
@@ -32,7 +32,7 @@ public class TsListSerializer implements ITsSerializer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
|
public Triple<String, String, String> 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(), "[]");
|
return new Triple<>(type, field.getName(), "[]");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ public class TsListSerializer implements ITsSerializer {
|
|||||||
String element = "element" + GenerateProtocolFile.localVariableId++;
|
String element = "element" + GenerateProtocolFile.localVariableId++;
|
||||||
GenerateProtocolFile.addTab(builder, deep + 1);
|
GenerateProtocolFile.addTab(builder, deep + 1);
|
||||||
builder.append(StringUtils.format("{}.forEach({} => {", objectStr, element)).append(LS);
|
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());
|
.writeObject(builder, element, deep + 2, field, listField.getListElementRegistration());
|
||||||
GenerateProtocolFile.addTab(builder, deep + 1);
|
GenerateProtocolFile.addTab(builder, deep + 1);
|
||||||
builder.append("});").append(LS);
|
builder.append("});").append(LS);
|
||||||
@@ -75,7 +75,7 @@ public class TsListSerializer implements ITsSerializer {
|
|||||||
|
|
||||||
ListField listField = (ListField) fieldRegistration;
|
ListField listField = (ListField) fieldRegistration;
|
||||||
String result = "result" + GenerateProtocolFile.localVariableId++;
|
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);
|
builder.append(StringUtils.format("const {} = new {}();", result, typeName)).append(LS);
|
||||||
|
|
||||||
GenerateProtocolFile.addTab(builder, deep);
|
GenerateProtocolFile.addTab(builder, deep);
|
||||||
@@ -88,7 +88,7 @@ public class TsListSerializer implements ITsSerializer {
|
|||||||
GenerateProtocolFile.addTab(builder, deep + 1);
|
GenerateProtocolFile.addTab(builder, deep + 1);
|
||||||
String i = "index" + GenerateProtocolFile.localVariableId++;
|
String i = "index" + GenerateProtocolFile.localVariableId++;
|
||||||
builder.append(StringUtils.format("for (let {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS);
|
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());
|
.readObject(builder, deep + 2, field, listField.getListElementRegistration());
|
||||||
GenerateProtocolFile.addTab(builder, deep + 2);
|
GenerateProtocolFile.addTab(builder, deep + 2);
|
||||||
builder.append(StringUtils.format("{}.push({});", result, readObject)).append(LS);
|
builder.append(StringUtils.format("{}.push({});", result, readObject)).append(LS);
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ public class TsMapSerializer implements ITsSerializer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
|
public Triple<String, String, String> 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()");
|
return new Triple<>(type, field.getName(), "new Map()");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,9 +59,9 @@ public class TsMapSerializer implements ITsSerializer {
|
|||||||
|
|
||||||
GenerateProtocolFile.addTab(builder, deep + 1);
|
GenerateProtocolFile.addTab(builder, deep + 1);
|
||||||
builder.append(StringUtils.format("{}.forEach(({}, {}) => {", objectStr, value, key)).append(LS);
|
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());
|
.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());
|
.writeObject(builder, value, deep + 2, field, mapField.getMapValueRegistration());
|
||||||
GenerateProtocolFile.addTab(builder, deep + 1);
|
GenerateProtocolFile.addTab(builder, deep + 1);
|
||||||
builder.append("});").append(LS);
|
builder.append("});").append(LS);
|
||||||
@@ -79,7 +79,7 @@ public class TsMapSerializer implements ITsSerializer {
|
|||||||
|
|
||||||
MapField mapField = (MapField) fieldRegistration;
|
MapField mapField = (MapField) fieldRegistration;
|
||||||
String result = "result" + GenerateProtocolFile.localVariableId++;
|
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);
|
builder.append(StringUtils.format("const {} = new {}();", result, typeName)).append(LS);
|
||||||
|
|
||||||
GenerateProtocolFile.addTab(builder, deep);
|
GenerateProtocolFile.addTab(builder, deep);
|
||||||
@@ -93,11 +93,11 @@ public class TsMapSerializer implements ITsSerializer {
|
|||||||
GenerateProtocolFile.addTab(builder, deep + 1);
|
GenerateProtocolFile.addTab(builder, deep + 1);
|
||||||
builder.append(StringUtils.format("for (let {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS);
|
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());
|
.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());
|
.readObject(builder, deep + 2, field, mapField.getMapValueRegistration());
|
||||||
GenerateProtocolFile.addTab(builder, deep + 2);
|
GenerateProtocolFile.addTab(builder, deep + 2);
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ public class TsSetSerializer implements ITsSerializer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
|
public Triple<String, String, String> 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()");
|
return new Triple<>(type, field.getName(), "new Set()");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ public class TsSetSerializer implements ITsSerializer {
|
|||||||
String element = "element" + GenerateProtocolFile.localVariableId++;
|
String element = "element" + GenerateProtocolFile.localVariableId++;
|
||||||
GenerateProtocolFile.addTab(builder, deep + 1);
|
GenerateProtocolFile.addTab(builder, deep + 1);
|
||||||
builder.append(StringUtils.format("{}.forEach({} => {", objectStr, element)).append(LS);
|
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());
|
.writeObject(builder, element, deep + 2, field, setField.getSetElementRegistration());
|
||||||
GenerateProtocolFile.addTab(builder, deep + 1);
|
GenerateProtocolFile.addTab(builder, deep + 1);
|
||||||
builder.append("});").append(LS);
|
builder.append("});").append(LS);
|
||||||
@@ -76,7 +76,7 @@ public class TsSetSerializer implements ITsSerializer {
|
|||||||
|
|
||||||
SetField setField = (SetField) fieldRegistration;
|
SetField setField = (SetField) fieldRegistration;
|
||||||
String result = "result" + GenerateProtocolFile.localVariableId++;
|
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);
|
builder.append(StringUtils.format("const {} = new {}();", result, typeName)).append(LS);
|
||||||
|
|
||||||
GenerateProtocolFile.addTab(builder, deep);
|
GenerateProtocolFile.addTab(builder, deep);
|
||||||
@@ -89,7 +89,7 @@ public class TsSetSerializer implements ITsSerializer {
|
|||||||
GenerateProtocolFile.addTab(builder, deep + 1);
|
GenerateProtocolFile.addTab(builder, deep + 1);
|
||||||
String i = "index" + GenerateProtocolFile.localVariableId++;
|
String i = "index" + GenerateProtocolFile.localVariableId++;
|
||||||
builder.append(StringUtils.format("for (let {} = 0; {} < {}; {}++) {", i, i, size, i)).append(LS);
|
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());
|
.readObject(builder, deep + 2, field, setField.getSetElementRegistration());
|
||||||
GenerateProtocolFile.addTab(builder, deep + 2);
|
GenerateProtocolFile.addTab(builder, deep + 2);
|
||||||
builder.append(StringUtils.format("{}.add({});", result, readObject)).append(LS);
|
builder.append(StringUtils.format("{}.add({});", result, readObject)).append(LS);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,10 @@
|
|||||||
{
|
${protocol_imports}
|
||||||
}
|
|
||||||
import IByteBuffer from "./IByteBuffer";
|
import IByteBuffer from "./IByteBuffer";
|
||||||
|
|
||||||
const protocols = new Map<number, any>();
|
const protocols = new Map<number, any>();
|
||||||
|
|
||||||
// initProtocol
|
// initProtocol
|
||||||
{}
|
${protocol_manager_registrations}
|
||||||
|
|
||||||
class ProtocolManager {
|
class ProtocolManager {
|
||||||
static getProtocol(protocolId: number): any {
|
static getProtocol(protocolId: number): any {
|
||||||
|
|||||||
@@ -1,31 +1,30 @@
|
|||||||
{}
|
${protocol_imports}
|
||||||
{}
|
${protocol_note}
|
||||||
class {} {
|
class ${protocol_name} {
|
||||||
|
${protocol_field_definition}
|
||||||
|
|
||||||
{}
|
static PROTOCOL_ID: number = ${protocol_id};
|
||||||
|
|
||||||
static PROTOCOL_ID: number = {};
|
|
||||||
|
|
||||||
protocolId(): number {
|
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) {
|
if (packet === null) {
|
||||||
buffer.writeInt(0);
|
buffer.writeInt(0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
{}
|
${protocol_write_serialization}
|
||||||
}
|
}
|
||||||
|
|
||||||
static read(buffer: IByteBuffer): {} | null {
|
static read(buffer: IByteBuffer): ${protocol_name} | null {
|
||||||
const length = buffer.readInt();
|
const length = buffer.readInt();
|
||||||
if (length === 0) {
|
if (length === 0) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
const beforeReadIndex = buffer.getReadOffset();
|
const beforeReadIndex = buffer.getReadOffset();
|
||||||
const packet = new {}();
|
const packet = new ${protocol_name}();
|
||||||
{}
|
${protocol_read_deserialization}
|
||||||
if (length > 0) {
|
if (length > 0) {
|
||||||
buffer.setReadOffset(beforeReadIndex + length);
|
buffer.setReadOffset(beforeReadIndex + length);
|
||||||
}
|
}
|
||||||
@@ -33,4 +32,4 @@ class {} {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {};
|
export default ${protocol_name};
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
${protocol_imports}
|
||||||
|
|
||||||
|
${protocol_class}
|
||||||
|
|
||||||
|
class Protocols {
|
||||||
|
${protocol_registration}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Protocols;
|
||||||
Reference in new issue
Block a user