ref[lua]: refactor generate lua protocol

This commit is contained in:
godotg committed 2024-05-23 14:27:32 +08:00
1 parent 07d1b170d5
commit 7595ce584d
18 files changed
+428 -411

No files matched your search

@@ -23,7 +23,7 @@ import com.zfoo.protocol.serializer.es.GenerateEsUtils;
import com.zfoo.protocol.serializer.gdscript.GenerateGdUtils;
import com.zfoo.protocol.serializer.go.GenerateGoUtils;
import com.zfoo.protocol.serializer.javascript.GenerateJsUtils;
import com.zfoo.protocol.serializer.lua.GenerateLuaUtils;
import com.zfoo.protocol.serializer.lua.CodeGenerateLua;
import com.zfoo.protocol.serializer.python.GeneratePyUtils;
import com.zfoo.protocol.serializer.typescript.GenerateTsUtils;
import com.zfoo.protocol.util.FileUtils;
@@ -172,20 +172,6 @@ public abstract class GenerateProtocolFile {
GenerateTsUtils.createProtocolManager(generateProtocols);
}
// 生成Lua协议
if (generateLanguages.contains(CodeLanguage.Lua)) {
GenerateLuaUtils.init(generateOperation);
if (generateOperation.isMergeProtocol()) {
GenerateLuaUtils.createProtocolManagerInOneFile(generateProtocols);
GenerateLuaUtils.createLuaProtocolsInOneFile(generateProtocols);
} else {
GenerateLuaUtils.createProtocolManager(generateProtocols);
for (var protocolRegistration : generateProtocols) {
GenerateLuaUtils.createLuaProtocolFile((ProtocolRegistration) protocolRegistration);
}
}
}
// 生成GdScript协议
if (generateLanguages.contains(CodeLanguage.GdScript)) {
GenerateGdUtils.init(generateOperation);
@@ -25,8 +25,6 @@ import com.zfoo.protocol.util.StringUtils;
import java.util.*;
import static com.zfoo.protocol.util.StringUtils.TAB;
/**
* EN: When generating the protocol, the document comments and field comments of the protocol will use this class
* CN: 生成协议的时候,协议的文档注释和字段注释会使用这个类
@@ -88,6 +88,10 @@ public abstract class GenerateProtocolPath {
/**
* 获取协议生成的路径
*/
public static String protocolPath(short protocolId) {
return protocolPathMap.get(protocolId);
}
public static String getProtocolPath(short protocolId) {
AssertionUtils.notNull(protocolPathMap
, "[{}]The initialization has been completed. Get Protocol Path cannot be called after the initialization is completed."
@@ -134,7 +138,7 @@ public abstract class GenerateProtocolPath {
return builder.toString();
}
public static Map<String, Set<Short>> getOneProtocolPathMap() {
public static Map<String, Set<Short>> mergerProtocolPathMap() {
var oneProtocolMap = new HashMap<String, Set<Short>>();
for(var entry : protocolPathMap.entrySet()) {
var protocolId = entry.getKey();
@@ -29,7 +29,7 @@ import com.zfoo.protocol.serializer.cpp.GenerateCppUtils;
import com.zfoo.protocol.serializer.gdscript.GenerateGdUtils;
import com.zfoo.protocol.serializer.go.GenerateGoUtils;
import com.zfoo.protocol.serializer.javascript.GenerateJsUtils;
import com.zfoo.protocol.serializer.lua.GenerateLuaUtils;
import com.zfoo.protocol.serializer.lua.CodeGenerateLua;
import com.zfoo.protocol.serializer.python.GeneratePyUtils;
import com.zfoo.protocol.serializer.reflect.*;
import com.zfoo.protocol.serializer.typescript.GenerateTsUtils;
@@ -71,7 +71,7 @@ public class ProtocolAnalysis {
, "Boolean", "Byte", "Short", "Integer", "Long", "Float", "Double", "String", "Character", "Object"
, "Collections", "Iterator", "List", "ArrayList", "Map", "HashMap", "Set", "HashSet"
, "DecodedPacketInfo", "EncodedPacketInfo"
, "Protocols", "ProtocolBase", "ProtocolWriter", "ProtocolReader");
, "Protocols");
/**
* EN: Temp field, unsupported type
@@ -404,7 +404,6 @@ public class ProtocolAnalysis {
GenerateGoUtils.clear();
GenerateJsUtils.clear();
GenerateTsUtils.clear();
GenerateLuaUtils.clear();
GenerateGdUtils.clear();
GeneratePyUtils.clear();
}
@@ -13,6 +13,7 @@
package com.zfoo.protocol.serializer;
import com.zfoo.protocol.serializer.csharp.CodeGenerateCsharp;
import com.zfoo.protocol.serializer.lua.CodeGenerateLua;
/**
* @author godotg
@@ -34,7 +35,7 @@ public enum CodeLanguage {
TypeScript(1 << 5, null),
Lua(1 << 10, null),
Lua(1 << 10, CodeGenerateLua.class),
CSharp(1 << 11, CodeGenerateCsharp.class),
@@ -81,43 +81,43 @@ public class CodeGenerateCsharp implements ICodeGenerate {
@Override
public void mergerProtocol(List<IProtocolRegistration> registrations) throws IOException {
createProtocolManagerFile(registrations);
var oneProtocolPathMap = GenerateProtocolPath.getOneProtocolPathMap();
for (var entry : oneProtocolPathMap.entrySet()) {
var path = entry.getKey();
var mergerProtocolPathMap = GenerateProtocolPath.mergerProtocolPathMap();
for (var entry : mergerProtocolPathMap.entrySet()) {
var protocol_merger_name = StringUtils.capitalize(entry.getKey());
var protocolIds = entry.getValue().stream().sorted().toList();
var protocolBuilder = new StringBuilder();
var protocolRegistrationBuilder = new StringBuilder();
for (var protocolId : protocolIds) {
var protocol_class = new StringBuilder();
var protocol_registration = new StringBuilder();
for (var protocol_id : protocolIds) {
GenerateProtocolFile.index.set(0);
var registration = (ProtocolRegistration) ProtocolManager.getProtocol(protocolId);
var protocolClazzName = registration.protocolConstructor().getDeclaringClass().getSimpleName();
var registration = (ProtocolRegistration) ProtocolManager.getProtocol(protocol_id);
var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
// protocol
var protocolClassTemplate = ClassUtils.getFileFromClassPathToString("csharp/ProtocolClassTemplate.cs");
var placeholderMap = Map.of(
CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocolId, CodeLanguage.CSharp)
, CodeTemplatePlaceholder.protocol_name, protocolClazzName
, CodeTemplatePlaceholder.protocol_id, String.valueOf(protocolId)
CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.CSharp)
, CodeTemplatePlaceholder.protocol_name, protocol_class_name
, CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id)
, 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 formatProtocolClassTemplate = CodeTemplatePlaceholder.formatTemplate(protocolClassTemplate, placeholderMap);
protocolBuilder.append(formatProtocolClassTemplate).append(LS);
protocol_class.append(formatProtocolClassTemplate).append(LS);
// registration
var protocolRegistrationTemplate = ClassUtils.getFileFromClassPathToString("csharp/ProtocolRegistrationTemplate.cs");
var formatProtocolRegistrationTemplate = CodeTemplatePlaceholder.formatTemplate(protocolRegistrationTemplate, placeholderMap);
protocolRegistrationBuilder.append(formatProtocolRegistrationTemplate);
protocol_registration.append(formatProtocolRegistrationTemplate);
}
var protocolTemplate = ClassUtils.getFileFromClassPathToString("csharp/ProtocolTemplate.cs");
var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of(
CodeTemplatePlaceholder.protocol_class, protocolBuilder.toString()
, CodeTemplatePlaceholder.protocol_registration, protocolRegistrationBuilder.toString()
CodeTemplatePlaceholder.protocol_class, protocol_class.toString()
, CodeTemplatePlaceholder.protocol_registration, protocol_registration.toString()
));
var outputPath = StringUtils.format("{}/{}.cs", protocolOutputPath, StringUtils.capitalize(path));
var outputPath = StringUtils.format("{}/{}.cs", protocolOutputPath, protocol_merger_name);
var file = new File(outputPath);
FileUtils.writeStringToFile(file, formatProtocolTemplate, true);
logger.info("Generated C# protocol file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath());
@@ -131,7 +131,7 @@ public class CodeGenerateCsharp implements ICodeGenerate {
for (var registration : registrations) {
var protocolId = registration.protocolId();
var protocolClazzName = registration.protocolConstructor().getDeclaringClass().getSimpleName();
var formatProtocolTemplate = protocolTemplate((ProtocolRegistration) registration);
var formatProtocolTemplate = formatProtocolTemplate((ProtocolRegistration) registration);
var outputPath = StringUtils.format("{}/{}/{}.cs", protocolOutputPath, GenerateProtocolPath.getCapitalizeProtocolPath(protocolId), protocolClazzName);
var file = new File(outputPath);
FileUtils.writeStringToFile(file, formatProtocolTemplate, true);
@@ -144,9 +144,9 @@ public class CodeGenerateCsharp implements ICodeGenerate {
createProtocolManagerFile(registrations);
for (var registration : registrations) {
var protocolClazzName = registration.protocolConstructor().getDeclaringClass().getSimpleName();
var formatProtocolTemplate = protocolTemplate((ProtocolRegistration) registration);
var outputPath = StringUtils.format("{}/{}.cs", protocolOutputPath, protocolClazzName);
var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
var formatProtocolTemplate = formatProtocolTemplate((ProtocolRegistration) registration);
var outputPath = StringUtils.format("{}/{}.cs", protocolOutputPath, protocol_class_name);
var file = new File(outputPath);
FileUtils.writeStringToFile(file, formatProtocolTemplate, true);
logger.info("Generated C# protocol file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath());
@@ -165,29 +165,29 @@ public class CodeGenerateCsharp implements ICodeGenerate {
FileUtils.writeInputStreamToFile(createFile, fileInputStream);
}
var template = ClassUtils.getFileFromClassPathToString("csharp/ProtocolManagerTemplate.cs");
var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("csharp/ProtocolManagerTemplate.cs");
var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations(registrations));
var formatTemplate = CodeTemplatePlaceholder.formatTemplate(template, placeholderMap);
var formatProtocolManagerTemplate = CodeTemplatePlaceholder.formatTemplate(protocolManagerTemplate, placeholderMap);
var file = new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolManager.cs"));
FileUtils.writeStringToFile(file, formatTemplate, true);
FileUtils.writeStringToFile(file, formatProtocolManagerTemplate, true);
logger.info("Generated C# protocol manager file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath());
}
private String protocolTemplate(ProtocolRegistration registration) {
private String formatProtocolTemplate(ProtocolRegistration registration) {
GenerateProtocolFile.index.set(0);
var protocolId = registration.protocolId();
var protocolClazzName = registration.getConstructor().getDeclaringClass().getSimpleName();
var protocol_id = registration.protocolId();
var protocol_class_name = registration.getConstructor().getDeclaringClass().getSimpleName();
var protocolClassTemplate = ClassUtils.getFileFromClassPathToString("csharp/ProtocolClassTemplate.cs");
var protocolRegistrationTemplate = ClassUtils.getFileFromClassPathToString("csharp/ProtocolRegistrationTemplate.cs");
var protocolTemplate = ClassUtils.getFileFromClassPathToString("csharp/ProtocolTemplate.cs");
var placeholderMap = Map.of(
CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocolId, CodeLanguage.CSharp)
, CodeTemplatePlaceholder.protocol_name, protocolClazzName
, CodeTemplatePlaceholder.protocol_id, String.valueOf(protocolId)
CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.CSharp)
, CodeTemplatePlaceholder.protocol_name, protocol_class_name
, CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id)
, CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration)
, CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration)
, CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration)
@@ -0,0 +1,323 @@
/*
* 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.lua;
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.IProtocolRegistration;
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.csharp.CodeGenerateCsharp;
import com.zfoo.protocol.serializer.reflect.*;
import com.zfoo.protocol.util.ClassUtils;
import com.zfoo.protocol.util.FileUtils;
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 CodeGenerateLua implements ICodeGenerate {
private static final Logger logger = LoggerFactory.getLogger(CodeGenerateLua.class);
// custom configuration
public static String protocolOutputRootPath = "zfoolua";
private static String protocolOutputPath = StringUtils.EMPTY;
private static final Map<ISerializer, ILuaSerializer> luaSerializerMap = new HashMap<>();
public static ILuaSerializer luaSerializer(ISerializer serializer) {
return luaSerializerMap.get(serializer);
}
@Override
public void init(GenerateOperation generateOperation) {
protocolOutputPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath);
FileUtils.deleteFile(new File(protocolOutputPath));
luaSerializerMap.put(BooleanSerializer.INSTANCE, new LuaBooleanSerializer());
luaSerializerMap.put(ByteSerializer.INSTANCE, new LuaByteSerializer());
luaSerializerMap.put(ShortSerializer.INSTANCE, new LuaShortSerializer());
luaSerializerMap.put(IntSerializer.INSTANCE, new LuaIntSerializer());
luaSerializerMap.put(LongSerializer.INSTANCE, new LuaLongSerializer());
luaSerializerMap.put(FloatSerializer.INSTANCE, new LuaFloatSerializer());
luaSerializerMap.put(DoubleSerializer.INSTANCE, new LuaDoubleSerializer());
luaSerializerMap.put(StringSerializer.INSTANCE, new LuaStringSerializer());
luaSerializerMap.put(ArraySerializer.INSTANCE, new LuaArraySerializer());
luaSerializerMap.put(ListSerializer.INSTANCE, new LuaListSerializer());
luaSerializerMap.put(SetSerializer.INSTANCE, new LuaSetSerializer());
luaSerializerMap.put(MapSerializer.INSTANCE, new LuaMapSerializer());
luaSerializerMap.put(ObjectProtocolSerializer.INSTANCE, new LuaObjectProtocolSerializer());
}
@Override
public void mergerProtocol(List<IProtocolRegistration> registrations) throws IOException {
createTemplateFile();
var protocol_manager_registrations = new StringBuilder();
protocol_manager_registrations.append(StringUtils.format("local Protocols = require(\"{}.Protocols\")", protocolOutputRootPath)).append(LS);
for (var registration : registrations) {
var protocol_id = registration.protocolId();
var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
protocol_manager_registrations.append(StringUtils.format("protocols[{}] = Protocols.{}", protocol_id, protocol_class_name)).append(LS);
}
var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("lua/ProtocolManagerTemplate.lua");
var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
var formatProtocolManagerTemplate = CodeTemplatePlaceholder.formatTemplate(protocolManagerTemplate, placeholderMap);
var protocolManagerFile = new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolManager.lua"));
FileUtils.writeStringToFile(protocolManagerFile, formatProtocolManagerTemplate, true);
logger.info("Generated Lua protocol manager file:[{}] is in path:[{}]", protocolManagerFile.getName(), protocolManagerFile.getAbsolutePath());
var protocol_class = new StringBuilder();
var protocol_registration = new StringBuilder();
for (var registration : registrations) {
GenerateProtocolFile.index.set(0);
var protocol_id = registration.protocolId();
var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
// protocol
protocol_class.append(protocol_class((ProtocolRegistration) registration)).append(LS);
// registration
protocol_registration.append(protocol_registration((ProtocolRegistration) registration)).append(LS);
}
protocol_registration.append(LS);
for (var registration : registrations) {
var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
protocol_registration.append(StringUtils.format("Protocols.{} = {}", protocol_class_name, protocol_class_name)).append(LS);
}
var protocolTemplate = ClassUtils.getFileFromClassPathToString("lua/ProtocolsTemplate.lua");
var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of(
CodeTemplatePlaceholder.protocol_class, protocol_class.toString()
, CodeTemplatePlaceholder.protocol_registration, protocol_registration.toString()
));
var outputPath = StringUtils.format("{}/Protocols.lua", protocolOutputPath);
var file = new File(outputPath);
FileUtils.writeStringToFile(file, formatProtocolTemplate, true);
logger.info("Generated C# protocol file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath());
}
@Override
public void foldProtocol(List<IProtocolRegistration> registrations) throws IOException {
createTemplateFile();
var protocolManagerRequireBuilder = new StringBuilder();
var protocol_manager_registrations = new StringBuilder();
for (var registration : registrations) {
var protocol_id = registration.protocolId();
var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
var path = GenerateProtocolPath.protocolPath(protocol_id);
protocolManagerRequireBuilder.append(StringUtils.format("local {} = require(\"{}.{}.{}\")", protocol_class_name, protocolOutputRootPath, path.replace(StringUtils.SLASH, StringUtils.PERIOD), protocol_class_name)).append(LS);
protocol_manager_registrations.append(StringUtils.format("protocols[{}] = {}", protocol_id, protocol_class_name)).append(LS);
}
var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("lua/ProtocolManagerTemplate.lua");
var pmPlaceholderMap = Map.of(CodeTemplatePlaceholder.protocol_manager_registrations, protocolManagerRequireBuilder.toString() + protocol_manager_registrations);
var formatProtocolManagerTemplate = CodeTemplatePlaceholder.formatTemplate(protocolManagerTemplate, pmPlaceholderMap);
var protocolManagerFile = new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolManager.lua"));
FileUtils.writeStringToFile(protocolManagerFile, formatProtocolManagerTemplate, true);
logger.info("Generated Lua protocol manager file:[{}] is in path:[{}]", protocolManagerFile.getName(), protocolManagerFile.getAbsolutePath());
for (var registration : registrations) {
var protocol_id = registration.protocolId();
var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
var formatProtocolTemplate = formatProtocolTemplate((ProtocolRegistration) registration);
var outputPath = StringUtils.format("{}/{}/{}.lua", protocolOutputPath, GenerateProtocolPath.protocolPath(protocol_id), protocol_class_name);
var file = new File(outputPath);
FileUtils.writeStringToFile(file, formatProtocolTemplate, true);
logger.info("Generated Lua protocol file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath());
}
}
@Override
public void defaultProtocol(List<IProtocolRegistration> registrations) throws IOException {
createTemplateFile();
var protocolManagerRequireBuilder = new StringBuilder();
var protocol_manager_registrations = new StringBuilder();
for (var registration : registrations) {
var protocol_id = registration.protocolId();
var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
protocolManagerRequireBuilder.append(StringUtils.format("local {} = require(\"{}.{}\")", protocol_class_name, protocolOutputRootPath, protocol_class_name)).append(LS);
protocol_manager_registrations.append(StringUtils.format("protocols[{}] = {}", protocol_id, protocol_class_name)).append(LS);
}
var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("lua/ProtocolManagerTemplate.lua");
var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_manager_registrations, protocolManagerRequireBuilder.toString() + protocol_manager_registrations);
var formatProtocolManagerTemplate = CodeTemplatePlaceholder.formatTemplate(protocolManagerTemplate, placeholderMap);
var protocolManagerFile = new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolManager.lua"));
FileUtils.writeStringToFile(protocolManagerFile, formatProtocolManagerTemplate, true);
logger.info("Generated Lua protocol manager file:[{}] is in path:[{}]", protocolManagerFile.getName(), protocolManagerFile.getAbsolutePath());
for (var registration : registrations) {
var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
var formatProtocolTemplate = formatProtocolTemplate((ProtocolRegistration) registration);
var outputPath = StringUtils.format("{}/{}.lua", protocolOutputPath, protocol_class_name);
var file = new File(outputPath);
FileUtils.writeStringToFile(file, formatProtocolTemplate, true);
logger.info("Generated Lua protocol file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath());
}
}
private void createTemplateFile() throws IOException {
var list = List.of("lua/Long.lua");
for (var fileName : list) {
var fileInputStream = ClassUtils.getFileFromClassPath(fileName);
var createFile = new File(StringUtils.format("{}/{}", protocolOutputPath, StringUtils.substringAfterFirst(fileName, "lua/")));
FileUtils.writeInputStreamToFile(createFile, fileInputStream);
}
var byteBufferFileName = "lua/ByteBuffer.lua";
var byteBufferTemplate = ClassUtils.getFileFromClassPathToString(byteBufferFileName);
var byteBufferFile = new File(StringUtils.format("{}/{}", protocolOutputPath, StringUtils.substringAfterFirst(byteBufferFileName, "lua/")));
FileUtils.writeStringToFile(byteBufferFile, StringUtils.format(byteBufferTemplate, protocolOutputRootPath), false);
}
public String formatProtocolTemplate(ProtocolRegistration registration) {
// 初始化index
GenerateProtocolFile.index.set(0);
var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
var protocolTemplate = ClassUtils.getFileFromClassPathToString("lua/ProtocolTemplate.lua");
return CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of(
CodeTemplatePlaceholder.protocol_class, protocol_class(registration)
, CodeTemplatePlaceholder.protocol_registration, protocol_registration(registration)
, CodeTemplatePlaceholder.protocol_name, protocol_class_name
));
}
private String protocol_class(ProtocolRegistration registration) {
var protocol_id = registration.protocolId();
var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
var protocolClassTemplate = ClassUtils.getFileFromClassPathToString("lua/ProtocolClassTemplate.lua");
var placeholderMap = Map.of(
CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.Lua)
, CodeTemplatePlaceholder.protocol_name, protocol_class_name
, CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id)
, CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration)
, CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration)
, CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration)
);
return CodeTemplatePlaceholder.formatTemplate(protocolClassTemplate, placeholderMap);
}
private String protocol_registration(ProtocolRegistration registration) {
var protocol_id = registration.protocolId();
var protocol_class_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
var protocolRegistrationTemplate = ClassUtils.getFileFromClassPathToString("lua/ProtocolRegistrationTemplate.lua");
var placeholderMap = Map.of(
CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.Lua)
, CodeTemplatePlaceholder.protocol_name, protocol_class_name
, CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id)
, CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration)
, CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration)
, CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration)
);
return CodeTemplatePlaceholder.formatTemplate(protocolRegistrationTemplate, placeholderMap);
}
private String protocol_field_definition(ProtocolRegistration registration) {
var protocolId = registration.getId();
var fields = registration.getFields();
var fieldRegistrations = registration.getFieldRegistrations();
var luaBuilder = new StringBuilder();
for (var i = 0; i < fields.length; i++) {
var field = fields[i];
var fieldRegistration = fieldRegistrations[i];
var fieldName = field.getName();
// 生成注释
var fieldNotes = GenerateProtocolNote.fieldNotes(protocolId, fieldName, CodeLanguage.Lua);
for (var fieldNote : fieldNotes) {
luaBuilder.append(fieldNote).append(LS);
}
var fieldDefaultValue = luaSerializer(fieldRegistration.serializer()).fieldDefaultValue(field, fieldRegistration);
if (i == fields.length - 1) {
luaBuilder.append(StringUtils.format("{} = {}", fieldName, fieldDefaultValue));
} else {
luaBuilder.append(StringUtils.format("{} = {},", fieldName, fieldDefaultValue));
}
var typeNote = CodeGenerateCsharp.toCsClassName(field.getGenericType().getTypeName());
// 生成类型的注释
luaBuilder.append(" -- ").append(typeNote).append(LS);
}
return luaBuilder.toString();
}
private String protocol_write_serialization(ProtocolRegistration registration) {
var fields = registration.getFields();
var fieldRegistrations = registration.getFieldRegistrations();
var luaBuilder = new StringBuilder();
if (registration.isCompatible()) {
luaBuilder.append("local beforeWriteIndex = buffer:getWriteOffset()").append(LS);
luaBuilder.append(StringUtils.format("buffer:writeInt({})", registration.getPredictionLength())).append(LS);
} else {
luaBuilder.append("buffer:writeInt(-1)").append(LS);
}
for (var i = 0; i < fields.length; i++) {
var field = fields[i];
var fieldRegistration = fieldRegistrations[i];
luaSerializer(fieldRegistration.serializer()).writeObject(luaBuilder, "packet." + field.getName(), 0, field, fieldRegistration);
}
if (registration.isCompatible()) {
luaBuilder.append(StringUtils.format("buffer:adjustPadding({}, beforeWriteIndex)", registration.getPredictionLength())).append(LS);
}
return luaBuilder.toString();
}
private String protocol_read_deserialization(ProtocolRegistration registration) {
var fields = registration.getFields();
var fieldRegistrations = registration.getFieldRegistrations();
var luaBuilder = new StringBuilder();
for (int i = 0; i < fields.length; i++) {
var field = fields[i];
var fieldRegistration = fieldRegistrations[i];
if (field.isAnnotationPresent(Compatible.class)) {
luaBuilder.append("if buffer:compatibleRead(beforeReadIndex, length) then").append(LS);
var compatibleReadObject = luaSerializer(fieldRegistration.serializer()).readObject(luaBuilder, 1, field, fieldRegistration);
luaBuilder.append(TAB).append(StringUtils.format("packet.{} = {}", field.getName(), compatibleReadObject)).append(LS);
luaBuilder.append("end").append(LS);
continue;
}
var readObject = luaSerializer(fieldRegistration.serializer()).readObject(luaBuilder, 0, field, fieldRegistration);
luaBuilder.append(StringUtils.format("packet.{} = {}", field.getName(), readObject)).append(LS);
}
return luaBuilder.toString();
}
}
@@ -1,300 +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.lua;
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.IProtocolRegistration;
import com.zfoo.protocol.registration.ProtocolRegistration;
import com.zfoo.protocol.serializer.CodeLanguage;
import com.zfoo.protocol.serializer.csharp.CodeGenerateCsharp;
import com.zfoo.protocol.serializer.reflect.*;
import com.zfoo.protocol.util.ClassUtils;
import com.zfoo.protocol.util.FileUtils;
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 GenerateLuaUtils {
private static final Logger logger = LoggerFactory.getLogger(GenerateLuaUtils.class);
// custom configuration
public static String protocolOutputRootPath = "zfoolua";
private static String protocolOutputPath = StringUtils.EMPTY;
private static Map<ISerializer, ILuaSerializer> luaSerializerMap;
public static ILuaSerializer luaSerializer(ISerializer serializer) {
return luaSerializerMap.get(serializer);
}
public static void init(GenerateOperation generateOperation) {
protocolOutputPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath);
FileUtils.deleteFile(new File(protocolOutputPath));
luaSerializerMap = new HashMap<>();
luaSerializerMap.put(BooleanSerializer.INSTANCE, new LuaBooleanSerializer());
luaSerializerMap.put(ByteSerializer.INSTANCE, new LuaByteSerializer());
luaSerializerMap.put(ShortSerializer.INSTANCE, new LuaShortSerializer());
luaSerializerMap.put(IntSerializer.INSTANCE, new LuaIntSerializer());
luaSerializerMap.put(LongSerializer.INSTANCE, new LuaLongSerializer());
luaSerializerMap.put(FloatSerializer.INSTANCE, new LuaFloatSerializer());
luaSerializerMap.put(DoubleSerializer.INSTANCE, new LuaDoubleSerializer());
luaSerializerMap.put(StringSerializer.INSTANCE, new LuaStringSerializer());
luaSerializerMap.put(ArraySerializer.INSTANCE, new LuaArraySerializer());
luaSerializerMap.put(ListSerializer.INSTANCE, new LuaListSerializer());
luaSerializerMap.put(SetSerializer.INSTANCE, new LuaSetSerializer());
luaSerializerMap.put(MapSerializer.INSTANCE, new LuaMapSerializer());
luaSerializerMap.put(ObjectProtocolSerializer.INSTANCE, new LuaObjectProtocolSerializer());
}
public static void clear() {
luaSerializerMap = null;
protocolOutputRootPath = null;
protocolOutputPath = null;
}
// All protocol files are generated in a single protocol file.
public static void createProtocolManagerInOneFile(List<IProtocolRegistration> protocolList) throws IOException {
createTemplateFile();
// 生成Protocol.lua文件
var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("lua-one/ProtocolManagerTemplate.lua");
var builderImports = new StringBuilder();
builderImports.append(TAB).append(StringUtils.format("local Protocols = require(\"{}.Protocols\")", protocolOutputRootPath)).append(LS);
builderImports.append(TAB).append(StringUtils.format("local ProtocolBase = require(\"{}.ProtocolBase\")", protocolOutputRootPath)).append(LS);
builderImports.append(TAB).append(StringUtils.format("local ProtocolWriter = require(\"{}.ProtocolWriter\")", protocolOutputRootPath)).append(LS);
builderImports.append(TAB).append(StringUtils.format("local ProtocolReader = require(\"{}.ProtocolReader\")", protocolOutputRootPath)).append(LS);
var protocolBuilder = new StringBuilder();
for (var protocol : protocolList) {
var protocolId = protocol.protocolId();
var protocolName = protocol.protocolConstructor().getDeclaringClass().getSimpleName();
protocolBuilder.append(TAB).append(StringUtils.format("protocols[{}] = Protocols.{}", protocolId, protocolName)).append(LS);
}
protocolManagerTemplate = StringUtils.format(protocolManagerTemplate, StringUtils.EMPTY_JSON, StringUtils.EMPTY_JSON, builderImports.toString().trim(), protocolBuilder.toString().trim());
var file = new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolManager.lua"));
FileUtils.writeStringToFile(file, protocolManagerTemplate, true);
logger.info("Generated Lua protocol manager file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath());
}
public static void createLuaProtocolsInOneFile(List<IProtocolRegistration> registrations) {
var protocolTemplate = ClassUtils.getFileFromClassPathToString("lua-one/ProtocolTemplate.lua");
var protocolBaseTemplate = ClassUtils.getFileFromClassPathToString("lua-one/ProtocolBaseTemplate.lua");
var protocolWriterTemplate = ClassUtils.getFileFromClassPathToString("lua-one/ProtocolWriterTemplate.lua");
var protocolReaderTemplate = ClassUtils.getFileFromClassPathToString("lua-one/ProtocolReaderTemplate.lua");
var builderProtocol = new StringBuilder();
var builderProtocolBase = new StringBuilder();
var builderProtocolWriter = new StringBuilder();
var builderProtocolReader = new StringBuilder();
var requireProtocols = StringUtils.format("local Protocols = require(\"{}.Protocols\")", protocolOutputRootPath);
builderProtocolBase.append(requireProtocols).append(LS).append(LS);
builderProtocolWriter.append(requireProtocols).append(LS).append(LS);
builderProtocolReader.append(requireProtocols).append(LS).append(LS);
for (var protocolRegistration : registrations) {
var registration = (ProtocolRegistration) protocolRegistration;
var protocolId = registration.protocolId();
var registrationConstructor = registration.getConstructor();
var protocolClazzName = registrationConstructor.getDeclaringClass().getSimpleName();
GenerateProtocolFile.index.set(0);
var classNote = GenerateProtocolNote.classNote(protocolId, CodeLanguage.Lua, TAB, 0);
var valueOfMethod = valueOfMethod(registration);
var writePacket = writePacket(registration);
var readPacket = readPacket(registration);
var protocol = StringUtils.format(protocolTemplate, classNote, protocolClazzName, StringUtils.EMPTY_JSON, protocolClazzName, valueOfMethod.trim());
var protocolBase = StringUtils.format(protocolBaseTemplate, protocolClazzName, protocolId, protocolClazzName, protocolClazzName, protocolClazzName);
var protocolWriter = StringUtils.format(protocolWriterTemplate, protocolClazzName, writePacket.trim());
var protocolReader = StringUtils.format(protocolReaderTemplate, protocolClazzName, protocolClazzName, readPacket.trim());
builderProtocol.append(protocol).append(LS);
builderProtocolBase.append(protocolBase).append(LS).append(LS);
builderProtocolWriter.append(protocolWriter).append(LS).append(LS);
builderProtocolReader.append(protocolReader).append(LS).append(LS);
}
builderProtocol.append(LS).append("local Protocols = {}").append(LS);
for (var protocolRegistration : registrations) {
var registration = (ProtocolRegistration) protocolRegistration;
var registrationConstructor = registration.getConstructor();
var protocolClazzName = registrationConstructor.getDeclaringClass().getSimpleName();
builderProtocol.append(StringUtils.format("Protocols.{} = {}", protocolClazzName, protocolClazzName)).append(LS);
}
builderProtocol.append("return Protocols");
var protocolsFile = new File(StringUtils.format("{}/{}", protocolOutputPath, "Protocols.lua"));
var protocolBaseFile = new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolBase.lua"));
var protocolWriterFile = new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolWriter.lua"));
var protocolReaderFile = new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolReader.lua"));
FileUtils.writeStringToFile(protocolsFile, builderProtocol.toString(), true);
FileUtils.writeStringToFile(protocolBaseFile, builderProtocolBase.toString(), true);
FileUtils.writeStringToFile(protocolWriterFile, builderProtocolWriter.toString(), true);
FileUtils.writeStringToFile(protocolReaderFile, builderProtocolReader.toString(), true);
logger.info("Generated Lua protocols file:[{}] is in path:[{}]", protocolsFile.getName(), protocolsFile.getAbsolutePath());
logger.info("Generated Lua protocol base file:[{}] is in path:[{}]", protocolBaseFile.getName(), protocolBaseFile.getAbsolutePath());
logger.info("Generated Lua protocol writer file:[{}] is in path:[{}]", protocolWriterFile.getName(), protocolWriterFile.getAbsolutePath());
logger.info("Generated Lua protocol reader file:[{}] is in path:[{}]", protocolReaderFile.getName(), protocolReaderFile.getAbsolutePath());
}
public static void createProtocolManager(List<IProtocolRegistration> protocolList) throws IOException {
createTemplateFile();
// 生成Protocol.lua文件
var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("lua/ProtocolManagerTemplate.lua");
var fieldBuilder = new StringBuilder();
var protocolBuilder = new StringBuilder();
for (var protocol : protocolList) {
var protocolId = protocol.protocolId();
var protocolName = protocol.protocolConstructor().getDeclaringClass().getSimpleName();
var path = GenerateProtocolPath.getProtocolPath(protocolId);
if (StringUtils.isBlank(path)) {
fieldBuilder.append(TAB).append(StringUtils.format("local {} = require(\"{}.{}\")", protocolName, protocolOutputRootPath, protocolName)).append(LS);
} else {
fieldBuilder.append(TAB).append(StringUtils.format("local {} = require(\"{}.{}.{}\")"
, protocolName, protocolOutputRootPath, path.replaceAll(StringUtils.SLASH, StringUtils.PERIOD), protocolName)).append(LS);
}
protocolBuilder.append(TAB).append(StringUtils.format("protocols[{}] = {}", protocolId, protocolName)).append(LS);
}
protocolManagerTemplate = StringUtils.format(protocolManagerTemplate, StringUtils.EMPTY_JSON, StringUtils.EMPTY_JSON, fieldBuilder.toString().trim(), protocolBuilder.toString().trim());
var file = new File(StringUtils.format("{}/{}", protocolOutputPath, "ProtocolManager.lua"));
FileUtils.writeStringToFile(file, protocolManagerTemplate, true);
logger.info("Generated Lua protocol manager file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath());
}
private static void createTemplateFile() throws IOException {
var list = List.of("lua/Long.lua");
for (var fileName : list) {
var fileInputStream = ClassUtils.getFileFromClassPath(fileName);
var createFile = new File(StringUtils.format("{}/{}", protocolOutputPath, StringUtils.substringAfterFirst(fileName, "lua/")));
FileUtils.writeInputStreamToFile(createFile, fileInputStream);
}
var byteBufferFileName = "lua/ByteBuffer.lua";
var byteBufferTemplate = ClassUtils.getFileFromClassPathToString(byteBufferFileName);
var byteBufferFile = new File(StringUtils.format("{}/{}", protocolOutputPath, StringUtils.substringAfterFirst(byteBufferFileName, "lua/")));
FileUtils.writeStringToFile(byteBufferFile, StringUtils.format(byteBufferTemplate, protocolOutputRootPath), false);
}
public static void createLuaProtocolFile(ProtocolRegistration registration) {
// 初始化index
GenerateProtocolFile.index.set(0);
var protocolId = registration.protocolId();
var registrationConstructor = registration.getConstructor();
var protocolClazzName = registrationConstructor.getDeclaringClass().getSimpleName();
var protocolTemplate = ClassUtils.getFileFromClassPathToString("lua/ProtocolTemplate.lua");
var classNote = GenerateProtocolNote.classNote(protocolId, CodeLanguage.Lua, TAB, 0);
var valueOfMethod = valueOfMethod(registration);
var writePacket = writePacket(registration);
var readPacket = readPacket(registration);
protocolTemplate = StringUtils.format(protocolTemplate, classNote, protocolClazzName, StringUtils.EMPTY_JSON, protocolClazzName
, valueOfMethod.trim(), protocolClazzName, protocolId, protocolClazzName, protocolClazzName
, protocolClazzName, protocolClazzName, writePacket.trim(), protocolClazzName, protocolClazzName, readPacket.trim(), protocolClazzName);
var outputPath = StringUtils.format("{}/{}/{}.lua"
, protocolOutputPath, GenerateProtocolPath.getProtocolPath(protocolId), protocolClazzName);
var file = new File(outputPath);
FileUtils.writeStringToFile(file, protocolTemplate, true);
logger.info("Generated Lua protocol file:[{}] is in path:[{}]", file.getName(), file.getAbsolutePath());
}
private static String valueOfMethod(ProtocolRegistration registration) {
var protocolId = registration.getId();
var fields = registration.getFields();
var fieldRegistrations = registration.getFieldRegistrations();
var luaBuilder = new StringBuilder();
for (var i = 0; i < fields.length; i++) {
var field = fields[i];
var fieldRegistration = fieldRegistrations[i];
var fieldName = field.getName();
// 生成注释
var fieldNotes = GenerateProtocolNote.fieldNotes(protocolId, fieldName, CodeLanguage.Lua);
for(var fieldNote : fieldNotes) {
luaBuilder.append(TAB + TAB).append(fieldNote).append(LS);
}
var fieldDefaultValue = luaSerializer(fieldRegistration.serializer()).fieldDefaultValue(field, fieldRegistration);
if (i == fields.length - 1) {
luaBuilder.append(TAB + TAB).append(StringUtils.format("{} = {}", fieldName, fieldDefaultValue));
} else {
luaBuilder.append(TAB + TAB).append(StringUtils.format("{} = {},", fieldName, fieldDefaultValue));
}
var typeNote = CodeGenerateCsharp.toCsClassName(field.getGenericType().getTypeName());
// 生成类型的注释
luaBuilder.append(" -- ").append(typeNote).append(LS);
}
return luaBuilder.toString();
}
private static String writePacket(ProtocolRegistration registration) {
var fields = registration.getFields();
var fieldRegistrations = registration.getFieldRegistrations();
var luaBuilder = new StringBuilder();
if (registration.isCompatible()) {
luaBuilder.append("local beforeWriteIndex = buffer:getWriteOffset()").append(LS);
luaBuilder.append(TAB).append(StringUtils.format("buffer:writeInt({})", registration.getPredictionLength())).append(LS);
} else {
luaBuilder.append(TAB).append("buffer:writeInt(-1)").append(LS);
}
for (var i = 0; i < fields.length; i++) {
var field = fields[i];
var fieldRegistration = fieldRegistrations[i];
luaSerializer(fieldRegistration.serializer()).writeObject(luaBuilder, "packet." + field.getName(), 1, field, fieldRegistration);
}
if (registration.isCompatible()) {
luaBuilder.append(TAB).append(StringUtils.format("buffer:adjustPadding({}, beforeWriteIndex)", registration.getPredictionLength())).append(LS);
}
return luaBuilder.toString();
}
private static String readPacket(ProtocolRegistration registration) {
var fields = registration.getFields();
var fieldRegistrations = registration.getFieldRegistrations();
var luaBuilder = new StringBuilder();
for (int i = 0; i < fields.length; i++) {
var field = fields[i];
var fieldRegistration = fieldRegistrations[i];
if (field.isAnnotationPresent(Compatible.class)) {
luaBuilder.append(TAB).append("if buffer:compatibleRead(beforeReadIndex, length) then").append(LS);
var compatibleReadObject = luaSerializer(fieldRegistration.serializer()).readObject(luaBuilder, 2, field, fieldRegistration);
luaBuilder.append(TAB + TAB).append(StringUtils.format("packet.{} = {}", field.getName(), compatibleReadObject)).append(LS);
luaBuilder.append(TAB).append("end").append(LS);
continue;
}
var readObject = luaSerializer(fieldRegistration.serializer()).readObject(luaBuilder, 1, field, fieldRegistration);
luaBuilder.append(TAB).append(StringUtils.format("packet.{} = {}", field.getName(), readObject)).append(LS);
}
return luaBuilder.toString();
}
}
@@ -56,7 +56,7 @@ public class LuaArraySerializer implements ILuaSerializer {
String element = "element" + GenerateProtocolFile.index.getAndIncrement();
GenerateProtocolFile.addTab(builder, deep + 1);
builder.append(StringUtils.format("for {}, {} in pairs({}) do", index, element, objectStr)).append(LS);
GenerateLuaUtils.luaSerializer(arrayField.getArrayElementRegistration().serializer())
CodeGenerateLua.luaSerializer(arrayField.getArrayElementRegistration().serializer())
.writeObject(builder, element, deep + 2, field, arrayField.getArrayElementRegistration());
GenerateProtocolFile.addTab(builder, deep + 1);
builder.append("end").append(LS);
@@ -86,7 +86,7 @@ public class LuaArraySerializer implements ILuaSerializer {
builder.append(StringUtils.format("if {} > 0 then", size)).append(LS);
GenerateProtocolFile.addTab(builder, deep + 1);
builder.append(StringUtils.format("for {} = 1, {} do", i, size)).append(LS);
String readObject = GenerateLuaUtils.luaSerializer(arrayField.getArrayElementRegistration().serializer())
String readObject = CodeGenerateLua.luaSerializer(arrayField.getArrayElementRegistration().serializer())
.readObject(builder, deep + 2, field, arrayField.getArrayElementRegistration());
GenerateProtocolFile.addTab(builder, deep + 2);
builder.append(StringUtils.format("table.insert({}, {})", result, readObject)).append(LS);
@@ -55,7 +55,7 @@ public class LuaListSerializer implements ILuaSerializer {
String element = "element" + GenerateProtocolFile.index.getAndIncrement();
GenerateProtocolFile.addTab(builder, deep + 1);
builder.append(StringUtils.format("for {}, {} in pairs({}) do", index, element, objectStr)).append(LS);
GenerateLuaUtils.luaSerializer(listField.getListElementRegistration().serializer())
CodeGenerateLua.luaSerializer(listField.getListElementRegistration().serializer())
.writeObject(builder, element, deep + 2, field, listField.getListElementRegistration());
GenerateProtocolFile.addTab(builder, deep + 1);
builder.append("end").append(LS);
@@ -85,7 +85,7 @@ public class LuaListSerializer implements ILuaSerializer {
GenerateProtocolFile.addTab(builder, deep + 1);
String i = "index" + GenerateProtocolFile.index.getAndIncrement();
builder.append(StringUtils.format("for {} = 1, {} do", i, size)).append(LS);
String readObject = GenerateLuaUtils.luaSerializer(listField.getListElementRegistration().serializer())
String readObject = CodeGenerateLua.luaSerializer(listField.getListElementRegistration().serializer())
.readObject(builder, deep + 2, field, listField.getListElementRegistration());
GenerateProtocolFile.addTab(builder, deep + 2);
builder.append(StringUtils.format("table.insert({}, {})", result, readObject)).append(LS);
@@ -56,9 +56,9 @@ public class LuaMapSerializer implements ILuaSerializer {
GenerateProtocolFile.addTab(builder, deep + 1);
builder.append(StringUtils.format("for {}, {} in pairs({}) do", key, value, objectStr)).append(LS);
GenerateLuaUtils.luaSerializer(mapField.getMapKeyRegistration().serializer())
CodeGenerateLua.luaSerializer(mapField.getMapKeyRegistration().serializer())
.writeObject(builder, key, deep + 2, field, mapField.getMapKeyRegistration());
GenerateLuaUtils.luaSerializer(mapField.getMapValueRegistration().serializer())
CodeGenerateLua.luaSerializer(mapField.getMapValueRegistration().serializer())
.writeObject(builder, value, deep + 2, field, mapField.getMapValueRegistration());
GenerateProtocolFile.addTab(builder, deep + 1);
builder.append("end").append(LS);
@@ -89,11 +89,11 @@ public class LuaMapSerializer implements ILuaSerializer {
GenerateProtocolFile.addTab(builder, deep + 1);
builder.append(StringUtils.format("for {} = 1, {} do", i, size, i)).append(LS);
String keyObject = GenerateLuaUtils.luaSerializer(mapField.getMapKeyRegistration().serializer())
String keyObject = CodeGenerateLua.luaSerializer(mapField.getMapKeyRegistration().serializer())
.readObject(builder, deep + 2, field, mapField.getMapKeyRegistration());
String valueObject = GenerateLuaUtils.luaSerializer(mapField.getMapValueRegistration().serializer())
String valueObject = CodeGenerateLua.luaSerializer(mapField.getMapValueRegistration().serializer())
.readObject(builder, deep + 2, field, mapField.getMapValueRegistration());
GenerateProtocolFile.addTab(builder, deep + 2);
@@ -56,7 +56,7 @@ public class LuaSetSerializer implements ILuaSerializer {
String element = "element" + GenerateProtocolFile.index.getAndIncrement();
GenerateProtocolFile.addTab(builder, deep + 1);
builder.append(StringUtils.format("for {}, {} in pairs({}) do", index, element, objectStr)).append(LS);
GenerateLuaUtils.luaSerializer(setField.getSetElementRegistration().serializer())
CodeGenerateLua.luaSerializer(setField.getSetElementRegistration().serializer())
.writeObject(builder, element, deep + 2, field, setField.getSetElementRegistration());
GenerateProtocolFile.addTab(builder, deep + 1);
builder.append("end").append(LS);
@@ -86,7 +86,7 @@ public class LuaSetSerializer implements ILuaSerializer {
GenerateProtocolFile.addTab(builder, deep + 1);
String i = "index" + GenerateProtocolFile.index.getAndIncrement();
builder.append(StringUtils.format("for {} = 1, {} do", i, size)).append(LS);
String readObject = GenerateLuaUtils.luaSerializer(setField.getSetElementRegistration().serializer())
String readObject = CodeGenerateLua.luaSerializer(setField.getSetElementRegistration().serializer())
.readObject(builder, deep + 2, field, setField.getSetElementRegistration());
GenerateProtocolFile.addTab(builder, deep + 2);
builder.append(StringUtils.format("table.insert({}, {})", result, readObject)).append(LS);
@@ -0,0 +1,11 @@
${protocol_note}
local ${protocol_name} = {}
function ${protocol_name}:new()
local obj = {
${protocol_field_definition}
}
setmetatable(obj, self)
self.__index = self
return obj
end
@@ -32,10 +32,8 @@ function ProtocolManager.read(buffer)
return ProtocolManager.getProtocol(protocolId):read(buffer)
end
function initProtocol()
{}
{}
function ProtocolManager.initProtocol()
${protocol_manager_registrations}
end
ProtocolManager.initProtocol = initProtocol
return ProtocolManager
@@ -0,0 +1,33 @@
function ${protocol_name}:protocolId()
return ${protocol_id}
end
function ${protocol_name}:protocolName()
return "${protocol_name}"
end
function ${protocol_name}:__tostring()
return table.serializeTableToJson(self)
end
function ${protocol_name}:write(buffer, packet)
if packet == nil then
buffer:writeInt(0)
return
end
${protocol_write_serialization}
end
function ${protocol_name}:read(buffer)
local length = buffer:readInt()
if length == 0 then
return nil
end
local beforeReadIndex = buffer:getReadOffset()
local packet = ${protocol_name}:new()
${protocol_read_deserialization}
if length > 0 then
buffer:setReadOffset(beforeReadIndex + length)
end
return packet
end
@@ -1,47 +1,5 @@
{}
local {} = {}
${protocol_class}
function {}:new()
local obj = {
{}
}
setmetatable(obj, self)
self.__index = self
return obj
end
${protocol_registration}
function {}:protocolId()
return {}
end
function {}:protocolName()
return "{}"
end
function {}:__tostring()
return table.serializeTableToJson(self)
end
function {}:write(buffer, packet)
if packet == nil then
buffer:writeInt(0)
return
end
{}
end
function {}:read(buffer)
local length = buffer:readInt()
if length == 0 then
return nil
end
local beforeReadIndex = buffer:getReadOffset()
local packet = {}:new()
{}
if length > 0 then
buffer:setReadOffset(beforeReadIndex + length)
end
return packet
end
return {}
return ${protocol_name}
@@ -0,0 +1,7 @@
local Protocols = {}
${protocol_class}
${protocol_registration}
return Protocols
-1
View File
@@ -5,7 +5,6 @@ using System.IO;
using System.Text;
using UnityEngine;
using XLua;
using zfoocs;
public class Main : MonoBehaviour
{