feat[js]: javascript support compatible field

This commit is contained in:
sun
2023-09-27 18:19:23 +08:00
parent 563d9099a1
commit 1891702ae5
19 changed files with 113 additions and 61 deletions
@@ -18,9 +18,9 @@ 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.model.Pair;
import com.zfoo.protocol.registration.IProtocolRegistration;
import com.zfoo.protocol.registration.ProtocolRegistration;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.serializer.CodeLanguage;
import com.zfoo.protocol.serializer.reflect.*;
import com.zfoo.protocol.util.ClassUtils;
@@ -114,38 +114,39 @@ public abstract class GenerateJsUtils {
var protocolTemplate = ClassUtils.getFileFromClassPathToString("javascript/ProtocolTemplate.js");
var classNote = GenerateProtocolNote.classNote(protocolId, CodeLanguage.JavaScript);
var valueOfMethod = valueOfMethod(registration);
var fieldDefinition = fieldDefinition(registration);
var writeObject = writeObject(registration);
var readObject = readObject(registration);
protocolTemplate = StringUtils.format(protocolTemplate, classNote, protocolClazzName
, valueOfMethod.getKey().trim(), valueOfMethod.getValue().trim(), protocolClazzName, protocolId, protocolClazzName
, fieldDefinition.trim(), protocolClazzName, protocolId, protocolClazzName
, writeObject.trim(), protocolClazzName, protocolClazzName, readObject.trim(), protocolClazzName);
var protocolOutputPath = StringUtils.format("{}/{}/{}.js", protocolOutputRootPath
, GenerateProtocolPath.getProtocolPath(protocolId), protocolClazzName);
FileUtils.writeStringToFile(new File(protocolOutputPath), protocolTemplate, true);
}
private static Pair<String, String> valueOfMethod(ProtocolRegistration registration) {
private static String fieldDefinition(ProtocolRegistration registration) {
var protocolId = registration.getId();
var fields = registration.getFields();
var fieldValueOf = StringUtils.joinWith(", ", Arrays.stream(fields).map(it -> it.getName()).toList().toArray());
var fieldRegistrations = registration.getFieldRegistrations();
var fieldDefinitionBuilder = new StringBuilder();
for (var field : fields) {
for (int i = 0; i < fields.length; i++) {
var field = fields[i];
IFieldRegistration fieldRegistration = fieldRegistrations[i];
var fieldName = field.getName();
// 生成注释
var fileNote = GenerateProtocolNote.fieldNote(protocolId, fieldName, CodeLanguage.JavaScript);
if (StringUtils.isNotBlank(fileNote)) {
fieldDefinitionBuilder.append(TAB).append(fileNote).append(LS);
var fieldNote = GenerateProtocolNote.fieldNote(protocolId, fieldName, CodeLanguage.JavaScript);
if (StringUtils.isNotBlank(fieldNote)) {
fieldDefinitionBuilder.append(TAB).append(fieldNote).append(LS);
}
var triple = jsSerializer(fieldRegistration.serializer()).field(field, fieldRegistration);
fieldDefinitionBuilder.append(TAB)
.append(StringUtils.format("this.{} = {};", fieldName, fieldName))
.append(" // ").append(field.getGenericType().getTypeName())// 生成类型的注释
.append(StringUtils.format("this.{} = {}; // {}", fieldName, triple.getRight(), triple.getLeft()))
.append(LS);
}
return new Pair<>(fieldValueOf, fieldDefinitionBuilder.toString());
return fieldDefinitionBuilder.toString();
}
private static String writeObject(ProtocolRegistration registration) {
@@ -13,6 +13,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.model.Triple;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import java.lang.reflect.Field;
@@ -22,6 +23,11 @@ import java.lang.reflect.Field;
*/
public interface IJsSerializer {
/**
* 获取属性的类型,名称,默认值
*/
Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration);
void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration);
String readObject(StringBuilder builder, int deep, Field field, IFieldRegistration fieldRegistration);
@@ -14,10 +14,12 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Triple;
import com.zfoo.protocol.registration.field.ArrayField;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.serializer.CodeLanguage;
import com.zfoo.protocol.serializer.CutDownArraySerializer;
import com.zfoo.protocol.serializer.typescript.GenerateTsUtils;
import com.zfoo.protocol.util.StringUtils;
import java.lang.reflect.Field;
@@ -28,6 +30,12 @@ import static com.zfoo.protocol.util.FileUtils.LS;
* @author godotg
*/
public class JsArraySerializer implements IJsSerializer {
@Override
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
var type = StringUtils.format("Array<{}>", GenerateTsUtils.toTsClassName(field.getType().getComponentType().getSimpleName()));
return new Triple<>(type, field.getName(), "[]");
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Triple;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -25,6 +26,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
* @author godotg
*/
public class JsBooleanSerializer implements IJsSerializer {
@Override
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Triple<>("boolean", field.getName(), "false");
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Triple;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -25,6 +26,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
* @author godotg
*/
public class JsByteSerializer implements IJsSerializer {
@Override
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Triple<>("number", field.getName(), "0");
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -1,41 +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.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
import java.lang.reflect.Field;
import static com.zfoo.protocol.util.FileUtils.LS;
/**
* @author godotg
*/
public class JsCharSerializer implements IJsSerializer {
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
builder.append(StringUtils.format("buffer.writeChar({});", objectStr)).append(LS);
}
@Override
public String readObject(StringBuilder builder, int deep, Field field, IFieldRegistration fieldRegistration) {
String result = "result" + GenerateProtocolFile.index.getAndIncrement();
GenerateProtocolFile.addTab(builder, deep);
builder.append(StringUtils.format("const {} = buffer.readChar();", result)).append(LS);
return result;
}
}
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Triple;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -25,6 +26,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
* @author godotg
*/
public class JsDoubleSerializer implements IJsSerializer {
@Override
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Triple<>("number", field.getName(), "0");
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Triple;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -25,6 +26,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
* @author godotg
*/
public class JsFloatSerializer implements IJsSerializer {
@Override
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Triple<>("number", field.getName(), "0");
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Triple;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -25,6 +26,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
* @author godotg
*/
public class JsIntSerializer implements IJsSerializer {
@Override
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Triple<>("number", field.getName(), "0");
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,10 +14,12 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Triple;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.registration.field.ListField;
import com.zfoo.protocol.serializer.CodeLanguage;
import com.zfoo.protocol.serializer.CutDownListSerializer;
import com.zfoo.protocol.serializer.typescript.GenerateTsUtils;
import com.zfoo.protocol.util.StringUtils;
import java.lang.reflect.Field;
@@ -28,6 +30,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
* @author godotg
*/
public class JsListSerializer implements IJsSerializer {
@Override
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Triple<>(GenerateTsUtils.toTsClassName(field.getGenericType().toString()), field.getName(), "[]");
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Triple;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -25,6 +26,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
* @author godotg
*/
public class JsLongSerializer implements IJsSerializer {
@Override
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Triple<>("number", field.getName(), "0");
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,10 +14,12 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Triple;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.registration.field.MapField;
import com.zfoo.protocol.serializer.CodeLanguage;
import com.zfoo.protocol.serializer.CutDownMapSerializer;
import com.zfoo.protocol.serializer.typescript.GenerateTsUtils;
import com.zfoo.protocol.util.StringUtils;
import java.lang.reflect.Field;
@@ -28,6 +30,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
* @author godotg
*/
public class JsMapSerializer implements IJsSerializer {
@Override
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Triple<>(GenerateTsUtils.toTsClassName(field.getGenericType().toString()), field.getName(), "new Map()");
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,8 +14,10 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Triple;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.registration.field.ObjectProtocolField;
import com.zfoo.protocol.serializer.enhance.EnhanceObjectProtocolSerializer;
import com.zfoo.protocol.util.StringUtils;
import java.lang.reflect.Field;
@@ -26,6 +28,14 @@ import static com.zfoo.protocol.util.FileUtils.LS;
* @author godotg
*/
public class JsObjectProtocolSerializer implements IJsSerializer {
@Override
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
ObjectProtocolField objectProtocolField = (ObjectProtocolField) fieldRegistration;
var protocolSimpleName = EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(objectProtocolField.getProtocolId());
var type = StringUtils.format("{} | null", protocolSimpleName);
return new Triple<>(type, field.getName(), "null");
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
ObjectProtocolField objectProtocolField = (ObjectProtocolField) fieldRegistration;
@@ -14,10 +14,12 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Triple;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.registration.field.SetField;
import com.zfoo.protocol.serializer.CodeLanguage;
import com.zfoo.protocol.serializer.CutDownSetSerializer;
import com.zfoo.protocol.serializer.typescript.GenerateTsUtils;
import com.zfoo.protocol.util.StringUtils;
import java.lang.reflect.Field;
@@ -28,6 +30,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
* @author godotg
*/
public class JsSetSerializer implements IJsSerializer {
@Override
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Triple<>(GenerateTsUtils.toTsClassName(field.getGenericType().toString()), field.getName(), "new Set()");
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Triple;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -25,6 +26,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
* @author godotg
*/
public class JsShortSerializer implements IJsSerializer {
@Override
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Triple<>("number", field.getName(), "0");
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Triple;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -25,6 +26,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
* @author godotg
*/
public class JsStringSerializer implements IJsSerializer {
@Override
public Triple<String, String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Triple<>("string", field.getName(), "\"\"");
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -160,10 +160,9 @@ public abstract class GenerateTsUtils {
var fields = registration.getFields();
var fieldRegistrations = registration.getFieldRegistrations();
var fieldDefinitionBuilder = new StringBuilder();
var sequencedFields = ReflectionUtils.notStaticAndTransientFields(registration.getConstructor().getDeclaringClass());
for (int i = 0; i < sequencedFields.size(); i++) {
var field = sequencedFields.get(i);
IFieldRegistration fieldRegistration = fieldRegistrations[GenerateProtocolFile.indexOf(fields, field)];
for (int i = 0; i < fields.length; i++) {
var field = fields[i];
IFieldRegistration fieldRegistration = fieldRegistrations[i];
var fieldName = field.getName();
// 生成注释
var fieldNote = GenerateProtocolNote.fieldNote(protocolId, fieldName, CodeLanguage.TypeScript);
@@ -1,5 +1,5 @@
{}
const {} = function({}) {
const {} = function() {
{}
};
@@ -321,7 +321,7 @@ const ByteBuffer = function() {
}
}
}
return readInt64(new Uint8Array(buffer.slice(0, count))).toString();
return readInt64(new Uint8Array(buffer.slice(0, count)));
};
this.writeFloat = function(value) {