@colyseus/schema 1.1.0-alpha.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -4
- package/build/cjs/index.js +1194 -1001
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.mjs +350 -311
- package/build/esm/index.mjs.map +1 -1
- package/build/umd/index.js +371 -335
- package/lib/Reflection.d.ts +21 -0
- package/lib/Reflection.js +198 -0
- package/lib/Reflection.js.map +1 -0
- package/lib/Schema.d.ts +66 -0
- package/lib/Schema.js +853 -0
- package/lib/Schema.js.map +1 -0
- package/lib/annotations.d.ts +96 -0
- package/lib/annotations.js +316 -0
- package/lib/annotations.js.map +1 -0
- package/lib/changes/ChangeTree.d.ts +53 -0
- package/lib/changes/ChangeTree.js +209 -0
- package/lib/changes/ChangeTree.js.map +1 -0
- package/lib/changes/ReferenceTracker.d.ts +14 -0
- package/lib/changes/ReferenceTracker.js +77 -0
- package/lib/changes/ReferenceTracker.js.map +1 -0
- package/lib/codegen/api.d.ts +7 -0
- package/lib/codegen/api.js +36 -0
- package/lib/codegen/api.js.map +1 -0
- package/lib/codegen/argv.d.ts +6 -0
- package/lib/codegen/argv.js +41 -0
- package/lib/codegen/argv.js.map +1 -0
- package/lib/codegen/cli.d.ts +1 -0
- package/lib/codegen/cli.js +49 -0
- package/lib/codegen/cli.js.map +1 -0
- package/lib/codegen/languages/cpp.d.ts +3 -0
- package/lib/codegen/languages/cpp.js +213 -0
- package/lib/codegen/languages/cpp.js.map +1 -0
- package/lib/codegen/languages/csharp.d.ts +4 -0
- package/lib/codegen/languages/csharp.js +130 -0
- package/lib/codegen/languages/csharp.js.map +1 -0
- package/lib/codegen/languages/haxe.d.ts +3 -0
- package/lib/codegen/languages/haxe.js +93 -0
- package/lib/codegen/languages/haxe.js.map +1 -0
- package/lib/codegen/languages/java.d.ts +6 -0
- package/lib/codegen/languages/java.js +92 -0
- package/lib/codegen/languages/java.js.map +1 -0
- package/lib/codegen/languages/js.d.ts +3 -0
- package/lib/codegen/languages/js.js +89 -0
- package/lib/codegen/languages/js.js.map +1 -0
- package/lib/codegen/languages/lua.d.ts +3 -0
- package/lib/codegen/languages/lua.js +97 -0
- package/lib/codegen/languages/lua.js.map +1 -0
- package/lib/codegen/languages/ts.d.ts +3 -0
- package/lib/codegen/languages/ts.js +125 -0
- package/lib/codegen/languages/ts.js.map +1 -0
- package/lib/codegen/parser.d.ts +5 -0
- package/lib/codegen/parser.js +196 -0
- package/lib/codegen/parser.js.map +1 -0
- package/lib/codegen/types.d.ts +44 -0
- package/lib/codegen/types.js +122 -0
- package/lib/codegen/types.js.map +1 -0
- package/lib/encoding/decode.d.ts +48 -0
- package/lib/encoding/decode.js +267 -0
- package/lib/encoding/decode.js.map +1 -0
- package/lib/encoding/encode.d.ts +38 -0
- package/lib/encoding/encode.js +281 -0
- package/lib/encoding/encode.js.map +1 -0
- package/lib/events/EventEmitter.d.ts +13 -0
- package/lib/events/EventEmitter.js +62 -0
- package/lib/events/EventEmitter.js.map +1 -0
- package/lib/filters/index.d.ts +8 -0
- package/lib/filters/index.js +25 -0
- package/lib/filters/index.js.map +1 -0
- package/lib/index.d.ts +19 -0
- package/lib/index.js +46 -0
- package/lib/index.js.map +1 -0
- package/lib/spec.d.ts +13 -0
- package/lib/spec.js +42 -0
- package/lib/spec.js.map +1 -0
- package/lib/types/ArraySchema.d.ts +230 -0
- package/lib/types/ArraySchema.js +559 -0
- package/lib/types/ArraySchema.js.map +1 -0
- package/lib/types/CollectionSchema.d.ts +35 -0
- package/lib/types/CollectionSchema.js +158 -0
- package/lib/types/CollectionSchema.js.map +1 -0
- package/lib/types/HelperTypes.d.ts +28 -0
- package/lib/types/HelperTypes.js +3 -0
- package/lib/types/HelperTypes.js.map +1 -0
- package/lib/types/MapSchema.d.ts +37 -0
- package/lib/types/MapSchema.js +214 -0
- package/lib/types/MapSchema.js.map +1 -0
- package/lib/types/SetSchema.d.ts +32 -0
- package/lib/types/SetSchema.js +171 -0
- package/lib/types/SetSchema.js.map +1 -0
- package/lib/types/index.d.ts +6 -0
- package/lib/types/index.js +13 -0
- package/lib/types/index.js.map +1 -0
- package/lib/types/typeRegistry.d.ts +5 -0
- package/lib/types/typeRegistry.js +13 -0
- package/lib/types/typeRegistry.js.map +1 -0
- package/lib/types/utils.d.ts +9 -0
- package/lib/types/utils.js +50 -0
- package/lib/types/utils.js.map +1 -0
- package/lib/utils.d.ts +2 -0
- package/lib/utils.js +26 -0
- package/lib/utils.js.map +1 -0
- package/package.json +4 -8
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generate = void 0;
|
|
4
|
+
var types_1 = require("../types");
|
|
5
|
+
var typeMaps = {
|
|
6
|
+
"string": "string",
|
|
7
|
+
"number": "varint_t",
|
|
8
|
+
"boolean": "bool",
|
|
9
|
+
"int8": "int8_t",
|
|
10
|
+
"uint8": "uint8_t",
|
|
11
|
+
"int16": "int16_t",
|
|
12
|
+
"uint16": "uint16_t",
|
|
13
|
+
"int32": "int32_t",
|
|
14
|
+
"uint32": "uint32_t",
|
|
15
|
+
"int64": "int64_t",
|
|
16
|
+
"uint64": "uint64_t",
|
|
17
|
+
"float32": "float32_t",
|
|
18
|
+
"float64": "float64_t",
|
|
19
|
+
};
|
|
20
|
+
var typeInitializer = {
|
|
21
|
+
"string": '""',
|
|
22
|
+
"number": "0",
|
|
23
|
+
"boolean": "false",
|
|
24
|
+
"int8": "0",
|
|
25
|
+
"uint8": "0",
|
|
26
|
+
"int16": "0",
|
|
27
|
+
"uint16": "0",
|
|
28
|
+
"int32": "0",
|
|
29
|
+
"uint32": "0",
|
|
30
|
+
"int64": "0",
|
|
31
|
+
"uint64": "0",
|
|
32
|
+
"float32": "0",
|
|
33
|
+
"float64": "0",
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* C++ Code Generator
|
|
37
|
+
*/
|
|
38
|
+
var capitalize = function (s) {
|
|
39
|
+
if (typeof s !== 'string')
|
|
40
|
+
return '';
|
|
41
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
42
|
+
};
|
|
43
|
+
var distinct = function (value, index, self) { return self.indexOf(value) === index; };
|
|
44
|
+
function generate(context, options) {
|
|
45
|
+
return context.classes.map(function (klass) { return ({
|
|
46
|
+
name: klass.name + ".hpp",
|
|
47
|
+
content: generateClass(klass, options.namespace, context.classes)
|
|
48
|
+
}); });
|
|
49
|
+
}
|
|
50
|
+
exports.generate = generate;
|
|
51
|
+
function generateClass(klass, namespace, allClasses) {
|
|
52
|
+
var propertiesPerType = {};
|
|
53
|
+
var allRefs = [];
|
|
54
|
+
klass.properties.forEach(function (property) {
|
|
55
|
+
var type = property.type;
|
|
56
|
+
if (!propertiesPerType[type]) {
|
|
57
|
+
propertiesPerType[type] = [];
|
|
58
|
+
}
|
|
59
|
+
propertiesPerType[type].push(property);
|
|
60
|
+
// keep all refs list
|
|
61
|
+
if ((type === "ref" || type === "array" || type === "map")) {
|
|
62
|
+
allRefs.push(property);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
var allProperties = getAllProperties(klass, allClasses);
|
|
66
|
+
var createInstanceMethod = (allRefs.length === 0) ? "" :
|
|
67
|
+
"\tinline Schema* createInstance(std::type_index type) {\n\t\t" + generateFieldIfElseChain(allRefs, function (property) { return "type == typeid(" + property.childType + ")"; }, function (property) { return "return new " + property.childType + "();"; }, function (property) { return typeMaps[property.childType] === undefined; }) + "\n\t\treturn " + klass.extends + "::createInstance(type);\n\t}";
|
|
68
|
+
return types_1.getCommentHeader() + "\n#ifndef __SCHEMA_CODEGEN_" + klass.name.toUpperCase() + "_H__\n#define __SCHEMA_CODEGEN_" + klass.name.toUpperCase() + "_H__ 1\n\n#include \"schema.h\"\n#include <typeinfo>\n#include <typeindex>\n\n" + allRefs.
|
|
69
|
+
filter(function (ref) { return ref.childType && typeMaps[ref.childType] === undefined; }).
|
|
70
|
+
map(function (ref) { return ref.childType; }).
|
|
71
|
+
concat(types_1.getInheritanceTree(klass, allClasses, false).map(function (klass) { return klass.name; })).
|
|
72
|
+
filter(distinct).
|
|
73
|
+
map(function (childType) { return "#include \"" + childType + ".hpp\""; }).
|
|
74
|
+
join("\n") + "\n\nusing namespace colyseus::schema;\n\n" + (namespace ? "namespace " + namespace + " {" : "") + "\nclass " + klass.name + " : public " + klass.extends + " {\npublic:\n" + klass.properties.map(function (prop) { return generateProperty(prop); }).join("\n") + "\n\n\t" + klass.name + "() {\n\t\tthis->_indexes = " + generateAllIndexes(allProperties) + ";\n\t\tthis->_types = " + generateAllTypes(allProperties) + ";\n\t\tthis->_childPrimitiveTypes = " + generateAllChildPrimitiveTypes(allProperties) + ";\n\t\tthis->_childSchemaTypes = " + generateAllChildSchemaTypes(allProperties) + ";\n\t}\n\n\tvirtual ~" + klass.name + "() {\n\t\t" + generateDestructors(allProperties).join("\n\t\t") + "\n\t}\n\nprotected:\n" + Object.keys(propertiesPerType).map(function (type) {
|
|
75
|
+
return generateGettersAndSetters(klass, type, propertiesPerType[type]);
|
|
76
|
+
}).
|
|
77
|
+
join("\n") + "\n\n" + createInstanceMethod + "\n};\n" + (namespace ? "}" : "") + "\n\n#endif\n";
|
|
78
|
+
}
|
|
79
|
+
function generateProperty(prop) {
|
|
80
|
+
var property = "";
|
|
81
|
+
var langType;
|
|
82
|
+
var initializer = "";
|
|
83
|
+
var isPropPointer = "";
|
|
84
|
+
if (prop.childType) {
|
|
85
|
+
var isUpcaseFirst = prop.childType.match(/^[A-Z]/);
|
|
86
|
+
if (prop.type === "ref") {
|
|
87
|
+
langType = "" + prop.childType;
|
|
88
|
+
initializer = "new " + prop.childType + "()";
|
|
89
|
+
}
|
|
90
|
+
else if (prop.type === "array") {
|
|
91
|
+
langType = (isUpcaseFirst)
|
|
92
|
+
? "ArraySchema<" + prop.childType + "*>"
|
|
93
|
+
: "ArraySchema<" + typeMaps[prop.childType] + ">";
|
|
94
|
+
initializer = "new " + langType + "()";
|
|
95
|
+
}
|
|
96
|
+
else if (prop.type === "map") {
|
|
97
|
+
langType = (isUpcaseFirst)
|
|
98
|
+
? "MapSchema<" + prop.childType + "*>"
|
|
99
|
+
: "MapSchema<" + typeMaps[prop.childType] + ">";
|
|
100
|
+
initializer = "new " + langType + "()";
|
|
101
|
+
}
|
|
102
|
+
isPropPointer = "*";
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
langType = typeMaps[prop.type];
|
|
106
|
+
initializer = typeInitializer[prop.type];
|
|
107
|
+
}
|
|
108
|
+
property += " " + langType + " " + isPropPointer + prop.name;
|
|
109
|
+
return "\t" + property + " = " + initializer + ";";
|
|
110
|
+
}
|
|
111
|
+
function generateGettersAndSetters(klass, type, properties) {
|
|
112
|
+
var langType = typeMaps[type];
|
|
113
|
+
var typeCast = "";
|
|
114
|
+
var getMethodName = "get" + capitalize(type);
|
|
115
|
+
var setMethodName = "set" + capitalize(type);
|
|
116
|
+
if (type === "ref") {
|
|
117
|
+
langType = "Schema*";
|
|
118
|
+
}
|
|
119
|
+
else if (type === "array") {
|
|
120
|
+
langType = "ArraySchema<char*> *";
|
|
121
|
+
typeCast = "(ArraySchema<char*> *)";
|
|
122
|
+
}
|
|
123
|
+
else if (type === "map") {
|
|
124
|
+
langType = "MapSchema<char*> *";
|
|
125
|
+
typeCast = "(MapSchema<char*> *)";
|
|
126
|
+
}
|
|
127
|
+
return "\tinline " + langType + " " + getMethodName + "(const string &field)\n\t{\n\t\t" + generateFieldIfElseChain(properties, function (property) { return "field == \"" + property.name + "\""; }, function (property) { return "return " + typeCast + "this->" + property.name + ";"; }) + "\n\t\treturn " + klass.extends + "::" + getMethodName + "(field);\n\t}\n\n\tinline void " + setMethodName + "(const string &field, " + langType + " value)\n\t{\n\t\t" + generateFieldIfElseChain(properties, function (property) { return "field == \"" + property.name + "\""; }, function (property) {
|
|
128
|
+
var isSchemaType = (typeMaps[property.childType] === undefined);
|
|
129
|
+
if (type === "ref") {
|
|
130
|
+
langType = property.childType + "*";
|
|
131
|
+
typeCast = (isSchemaType)
|
|
132
|
+
? "(" + property.childType + "*)"
|
|
133
|
+
: "/* bug? */";
|
|
134
|
+
}
|
|
135
|
+
else if (type === "array") {
|
|
136
|
+
typeCast = (isSchemaType)
|
|
137
|
+
? "(ArraySchema<" + property.childType + "*> *)"
|
|
138
|
+
: "(ArraySchema<" + typeMaps[property.childType] + "> *)";
|
|
139
|
+
}
|
|
140
|
+
else if (type === "map") {
|
|
141
|
+
typeCast = (isSchemaType)
|
|
142
|
+
? "(MapSchema<" + property.childType + "*> *)"
|
|
143
|
+
: "(MapSchema<" + typeMaps[property.childType] + "> *)";
|
|
144
|
+
}
|
|
145
|
+
return "this->" + property.name + " = " + typeCast + "value;\n\t\t\treturn;";
|
|
146
|
+
}) + "\n\t\treturn " + klass.extends + "::" + setMethodName + "(field, value);\n\t}";
|
|
147
|
+
}
|
|
148
|
+
function generateFieldIfElseChain(properties, ifCallback, callback, filter) {
|
|
149
|
+
if (filter === void 0) { filter = function (_) { return true; }; }
|
|
150
|
+
var chain = "";
|
|
151
|
+
var uniqueChecks = [];
|
|
152
|
+
properties.filter(filter).forEach(function (property, i) {
|
|
153
|
+
var check = ifCallback(property);
|
|
154
|
+
if (uniqueChecks.indexOf(check) === -1) {
|
|
155
|
+
uniqueChecks.push(check);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (i === 0) {
|
|
161
|
+
chain += "if ";
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
chain += " else if ";
|
|
165
|
+
}
|
|
166
|
+
chain += "(" + check + ")\n\t\t{\n\t\t\t" + callback(property) + "\n\n\t\t}";
|
|
167
|
+
});
|
|
168
|
+
return chain;
|
|
169
|
+
}
|
|
170
|
+
function generateAllIndexes(properties) {
|
|
171
|
+
return "{" + properties.map(function (property, i) { return "{" + i + ", \"" + property.name + "\"}"; }).join(", ") + "}";
|
|
172
|
+
}
|
|
173
|
+
function generateAllTypes(properties) {
|
|
174
|
+
return "{" + properties.map(function (property, i) { return "{" + i + ", \"" + property.type + "\"}"; }).join(", ") + "}";
|
|
175
|
+
}
|
|
176
|
+
function generateAllChildSchemaTypes(properties) {
|
|
177
|
+
return "{" + properties.map(function (property, i) {
|
|
178
|
+
if (property.childType && typeMaps[property.childType] === undefined) {
|
|
179
|
+
return "{" + i + ", typeid(" + property.childType + ")}";
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
}).filter(function (r) { return r !== null; }).join(", ") + "}";
|
|
185
|
+
}
|
|
186
|
+
function generateAllChildPrimitiveTypes(properties) {
|
|
187
|
+
return "{" + properties.map(function (property, i) {
|
|
188
|
+
if (typeMaps[property.childType] !== undefined) {
|
|
189
|
+
return "{" + i + ", \"" + property.childType + "\"}";
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
}).filter(function (r) { return r !== null; }).join(", ") + "}";
|
|
195
|
+
}
|
|
196
|
+
function generateDestructors(properties) {
|
|
197
|
+
return properties.map(function (property, i) {
|
|
198
|
+
if (property.childType) {
|
|
199
|
+
return "delete this->" + property.name + ";";
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
}).filter(function (r) { return r !== null; });
|
|
205
|
+
}
|
|
206
|
+
function getAllProperties(klass, allClasses) {
|
|
207
|
+
var properties = [];
|
|
208
|
+
types_1.getInheritanceTree(klass, allClasses).reverse().forEach(function (klass) {
|
|
209
|
+
properties = properties.concat(klass.properties);
|
|
210
|
+
});
|
|
211
|
+
return properties;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=cpp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cpp.js","sourceRoot":"","sources":["../../../src/codegen/languages/cpp.ts"],"names":[],"mappings":"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","sourcesContent":["import { Class, Property, File, getCommentHeader, getInheritanceTree, Context } from \"../types\";\nimport { GenerateOptions } from \"../api\";\n\nconst typeMaps = {\n \"string\": \"string\",\n \"number\": \"varint_t\",\n \"boolean\": \"bool\",\n \"int8\": \"int8_t\",\n \"uint8\": \"uint8_t\",\n \"int16\": \"int16_t\",\n \"uint16\": \"uint16_t\",\n \"int32\": \"int32_t\",\n \"uint32\": \"uint32_t\",\n \"int64\": \"int64_t\",\n \"uint64\": \"uint64_t\",\n \"float32\": \"float32_t\",\n \"float64\": \"float64_t\",\n}\n\nconst typeInitializer = {\n \"string\": '\"\"',\n \"number\": \"0\",\n \"boolean\": \"false\",\n \"int8\": \"0\",\n \"uint8\": \"0\",\n \"int16\": \"0\",\n \"uint16\": \"0\",\n \"int32\": \"0\",\n \"uint32\": \"0\",\n \"int64\": \"0\",\n \"uint64\": \"0\",\n \"float32\": \"0\",\n \"float64\": \"0\",\n}\n\n/**\n * C++ Code Generator\n */\n\nconst capitalize = (s) => {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\nconst distinct = (value, index, self) => self.indexOf(value) === index;\n\nexport function generate (context: Context, options: GenerateOptions): File[] {\n return context.classes.map(klass => ({\n name: klass.name + \".hpp\",\n content: generateClass(klass, options.namespace, context.classes)\n }));\n}\n\nfunction generateClass(klass: Class, namespace: string, allClasses: Class[]) {\n const propertiesPerType: {[type: string]: Property[]} = {};\n const allRefs: Property[] = [];\n klass.properties.forEach(property => {\n let type = property.type;\n\n if (!propertiesPerType[type]) {\n propertiesPerType[type] = [];\n }\n\n propertiesPerType[type].push(property);\n\n // keep all refs list\n if ((type === \"ref\" || type === \"array\" || type === \"map\")) {\n allRefs.push(property);\n }\n });\n\n const allProperties = getAllProperties(klass, allClasses);\n const createInstanceMethod = (allRefs.length === 0) ? \"\" :\n `\\tinline Schema* createInstance(std::type_index type) {\n\\t\\t${generateFieldIfElseChain(allRefs,\n (property) => `type == typeid(${property.childType})`,\n (property) => `return new ${property.childType}();`,\n (property) => typeMaps[property.childType] === undefined)}\n\\t\\treturn ${klass.extends}::createInstance(type);\n\\t}`;\n\n return `${getCommentHeader()}\n#ifndef __SCHEMA_CODEGEN_${klass.name.toUpperCase()}_H__\n#define __SCHEMA_CODEGEN_${klass.name.toUpperCase()}_H__ 1\n\n#include \"schema.h\"\n#include <typeinfo>\n#include <typeindex>\n\n${allRefs.\n filter(ref => ref.childType && typeMaps[ref.childType] === undefined).\n map(ref => ref.childType).\n concat(getInheritanceTree(klass, allClasses, false).map(klass => klass.name)).\n filter(distinct).\n map(childType => `#include \"${childType}.hpp\"`).\n join(\"\\n\")}\n\nusing namespace colyseus::schema;\n\n${namespace ? `namespace ${namespace} {` : \"\"}\nclass ${klass.name} : public ${klass.extends} {\npublic:\n${klass.properties.map(prop => generateProperty(prop)).join(\"\\n\")}\n\n\\t${klass.name}() {\n\\t\\tthis->_indexes = ${generateAllIndexes(allProperties)};\n\\t\\tthis->_types = ${generateAllTypes(allProperties)};\n\\t\\tthis->_childPrimitiveTypes = ${generateAllChildPrimitiveTypes(allProperties)};\n\\t\\tthis->_childSchemaTypes = ${generateAllChildSchemaTypes(allProperties)};\n\\t}\n\n\\tvirtual ~${klass.name}() {\n\\t\\t${generateDestructors(allProperties).join(\"\\n\\t\\t\")}\n\\t}\n\nprotected:\n${Object.keys(propertiesPerType).map(type =>\n generateGettersAndSetters(klass, type, propertiesPerType[type])).\n join(\"\\n\")}\n\n${createInstanceMethod}\n};\n${namespace ? \"}\" : \"\"}\n\n#endif\n`;\n}\n\nfunction generateProperty(prop: Property) {\n let property = \"\";\n let langType: string;\n let initializer = \"\";\n let isPropPointer = \"\";\n\n if (prop.childType) {\n const isUpcaseFirst = prop.childType.match(/^[A-Z]/);\n\n if(prop.type === \"ref\") {\n langType = `${prop.childType}`;\n initializer = `new ${prop.childType}()`;\n\n } else if(prop.type === \"array\") {\n langType = (isUpcaseFirst)\n ? `ArraySchema<${prop.childType}*>`\n : `ArraySchema<${typeMaps[prop.childType]}>`;\n initializer = `new ${langType}()`;\n\n } else if(prop.type === \"map\") {\n langType = (isUpcaseFirst)\n ? `MapSchema<${prop.childType}*>`\n : `MapSchema<${typeMaps[prop.childType]}>`;\n initializer = `new ${langType}()`;\n }\n isPropPointer = \"*\";\n\n } else {\n langType = typeMaps[prop.type];\n initializer = typeInitializer[prop.type];\n }\n\n property += ` ${langType} ${isPropPointer}${prop.name}`;\n\n return `\\t${property} = ${initializer};`\n}\n\nfunction generateGettersAndSetters(klass: Class, type: string, properties: Property[]) {\n let langType = typeMaps[type];\n let typeCast = \"\";\n\n const getMethodName = `get${capitalize(type)}`;\n const setMethodName = `set${capitalize(type)}`;\n\n if (type === \"ref\") {\n langType = \"Schema*\";\n\n } else if (type === \"array\") {\n langType = `ArraySchema<char*> *`;\n typeCast = `(ArraySchema<char*> *)`;\n\n } else if (type === \"map\") {\n langType = `MapSchema<char*> *`;\n typeCast = `(MapSchema<char*> *)`;\n }\n\n return `\\tinline ${langType} ${getMethodName}(const string &field)\n\\t{\n\\t\\t${generateFieldIfElseChain(properties,\n (property) => `field == \"${property.name}\"`,\n (property) => `return ${typeCast}this->${property.name};`)}\n\\t\\treturn ${klass.extends}::${getMethodName}(field);\n\\t}\n\n\\tinline void ${setMethodName}(const string &field, ${langType} value)\n\\t{\n\\t\\t${generateFieldIfElseChain(properties,\n (property) => `field == \"${property.name}\"`,\n (property) => {\n const isSchemaType = (typeMaps[property.childType] === undefined)\n\n if (type === \"ref\") {\n langType = `${property.childType}*`;\n typeCast = (isSchemaType)\n ? `(${property.childType}*)`\n : `/* bug? */`;\n\n } else if (type === \"array\") {\n typeCast = (isSchemaType)\n ? `(ArraySchema<${property.childType}*> *)`\n : `(ArraySchema<${typeMaps[property.childType]}> *)`;\n\n } else if (type === \"map\") {\n typeCast = (isSchemaType)\n ? `(MapSchema<${property.childType}*> *)`\n : `(MapSchema<${typeMaps[property.childType]}> *)`;\n }\n\n return `this->${property.name} = ${typeCast}value;\\n\\t\\t\\treturn;`\n })}\n\\t\\treturn ${klass.extends}::${setMethodName}(field, value);\n\\t}`;\n}\n\nfunction generateFieldIfElseChain(\n properties: Property[],\n ifCallback: (property: Property) => string,\n callback: (property: Property) => string,\n filter: (property: Property) => boolean = (_) => true,\n) {\n let chain = \"\";\n\n const uniqueChecks: string[] = [];\n properties.filter(filter).forEach((property, i) => {\n const check = ifCallback(property);\n if (uniqueChecks.indexOf(check) === -1) {\n uniqueChecks.push(check);\n\n } else {\n return;\n }\n\n if (i === 0) { chain += \"if \" } else { chain += \" else if \" }\n chain += `(${check})\n\\t\\t{\n\\t\\t\\t${callback(property)}\\n\n\\t\\t}`\n });\n\n return chain;\n}\n\nfunction generateAllIndexes(properties: Property[]) {\n return `{${properties.map((property, i) => `{${i}, \"${property.name}\"}`).join(\", \")}}`\n\n}\n\nfunction generateAllTypes(properties: Property[]) {\n return `{${properties.map((property, i) => `{${i}, \"${property.type}\"}`).join(\", \")}}`\n}\n\nfunction generateAllChildSchemaTypes(properties: Property[]) {\n return `{${properties.map((property, i) => {\n if (property.childType && typeMaps[property.childType] === undefined) {\n return `{${i}, typeid(${property.childType})}`\n } else {\n return null;\n }\n }).filter(r => r !== null).join(\", \")}}`\n}\n\nfunction generateAllChildPrimitiveTypes(properties: Property[]) {\n return `{${properties.map((property, i) => {\n if (typeMaps[property.childType] !== undefined) {\n return `{${i}, \"${property.childType}\"}`\n } else {\n return null;\n }\n }).filter(r => r !== null).join(\", \")}}`\n}\n\nfunction generateDestructors(properties: Property[]) {\n return properties.map((property, i) => {\n if (property.childType) {\n return `delete this->${property.name};`;\n } else {\n return null;\n }\n }).filter(r => r !== null);\n}\n\nfunction getAllProperties (klass: Class, allClasses: Class[]) {\n let properties: Property[] = [];\n\n getInheritanceTree(klass, allClasses).reverse().forEach((klass) => {\n properties = properties.concat(klass.properties);\n });\n\n return properties;\n}"]}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
3
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
4
|
+
if (!m) return o;
|
|
5
|
+
var i = m.call(o), r, ar = [], e;
|
|
6
|
+
try {
|
|
7
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
8
|
+
}
|
|
9
|
+
catch (error) { e = { error: error }; }
|
|
10
|
+
finally {
|
|
11
|
+
try {
|
|
12
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
13
|
+
}
|
|
14
|
+
finally { if (e) throw e.error; }
|
|
15
|
+
}
|
|
16
|
+
return ar;
|
|
17
|
+
};
|
|
18
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
|
|
19
|
+
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
|
|
20
|
+
to[j] = from[i];
|
|
21
|
+
return to;
|
|
22
|
+
};
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.generate = void 0;
|
|
25
|
+
var types_1 = require("../types");
|
|
26
|
+
var typeMaps = {
|
|
27
|
+
"string": "string",
|
|
28
|
+
"number": "float",
|
|
29
|
+
"boolean": "bool",
|
|
30
|
+
"int8": "sbyte",
|
|
31
|
+
"uint8": "byte",
|
|
32
|
+
"int16": "short",
|
|
33
|
+
"uint16": "ushort",
|
|
34
|
+
"int32": "int",
|
|
35
|
+
"uint32": "uint",
|
|
36
|
+
"int64": "long",
|
|
37
|
+
"uint64": "ulong",
|
|
38
|
+
"float32": "float",
|
|
39
|
+
"float64": "double",
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* C# Code Generator
|
|
43
|
+
*/
|
|
44
|
+
var capitalize = function (s) {
|
|
45
|
+
if (typeof s !== 'string')
|
|
46
|
+
return '';
|
|
47
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
48
|
+
};
|
|
49
|
+
function generate(context, options) {
|
|
50
|
+
return __spreadArray(__spreadArray([], __read(context.classes.map(function (structure) { return ({
|
|
51
|
+
name: structure.name + ".cs",
|
|
52
|
+
content: generateClass(structure, options.namespace)
|
|
53
|
+
}); }))), __read(context.interfaces.map(function (structure) { return ({
|
|
54
|
+
name: structure.name + ".cs",
|
|
55
|
+
content: generateInterface(structure, options.namespace)
|
|
56
|
+
}); })));
|
|
57
|
+
}
|
|
58
|
+
exports.generate = generate;
|
|
59
|
+
function generateClass(klass, namespace) {
|
|
60
|
+
var indent = (namespace) ? "\t" : "";
|
|
61
|
+
return types_1.getCommentHeader() + "\n\nusing Colyseus.Schema;\nusing Action = System.Action;\n" + (namespace ? "\nnamespace " + namespace + " {" : "") + "\n" + indent + "public partial class " + klass.name + " : " + klass.extends + " {\n" + klass.properties.map(function (prop) { return generateProperty(prop, indent); }).join("\n\n") + "\n\n" + indent + "\t/*\n" + indent + "\t * Support for individual property change callbacks below...\n" + indent + "\t */\n\n" + generateAllFieldCallbacks(klass, indent) + "\n" + indent + "}\n" + (namespace ? "}" : "") + "\n";
|
|
62
|
+
}
|
|
63
|
+
function generateProperty(prop, indent) {
|
|
64
|
+
if (indent === void 0) { indent = ""; }
|
|
65
|
+
var typeArgs = "\"" + prop.type + "\"";
|
|
66
|
+
var property = "public";
|
|
67
|
+
var langType;
|
|
68
|
+
var initializer = "";
|
|
69
|
+
if (prop.childType) {
|
|
70
|
+
var isUpcaseFirst = prop.childType.match(/^[A-Z]/);
|
|
71
|
+
langType = getType(prop);
|
|
72
|
+
typeArgs += ", typeof(" + langType + ")";
|
|
73
|
+
if (!isUpcaseFirst) {
|
|
74
|
+
typeArgs += ", \"" + prop.childType + "\"";
|
|
75
|
+
}
|
|
76
|
+
initializer = "new " + langType + "()";
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
langType = getType(prop);
|
|
80
|
+
initializer = "default(" + langType + ")";
|
|
81
|
+
}
|
|
82
|
+
property += " " + langType + " " + prop.name;
|
|
83
|
+
var ret = (prop.deprecated) ? "\t\t[System.Obsolete(\"field '" + prop.name + "' is deprecated.\", true)]\n" : '';
|
|
84
|
+
return ret + ("\t" + indent + "[Type(" + prop.index + ", " + typeArgs + ")]\n\t" + indent + property + " = " + initializer + ";");
|
|
85
|
+
}
|
|
86
|
+
function generateInterface(struct, namespace) {
|
|
87
|
+
var indent = (namespace) ? "\t" : "";
|
|
88
|
+
return types_1.getCommentHeader() + "\n\nusing Colyseus.Schema;\n" + (namespace ? "\nnamespace " + namespace + " {" : "") + "\n" + indent + "public class " + struct.name + " {\n" + struct.properties.map(function (prop) { return "\t" + indent + "public " + getType(prop) + " " + prop.name + ";"; }).join("\n") + "\n" + indent + "}\n" + (namespace ? "}" : "") + "\n";
|
|
89
|
+
}
|
|
90
|
+
function generateAllFieldCallbacks(klass, indent) {
|
|
91
|
+
//
|
|
92
|
+
// TODO: improve me. It would be great to generate less boilerplate in favor
|
|
93
|
+
// of a single implementation on C# Schema class itself.
|
|
94
|
+
//
|
|
95
|
+
var eventNames = [];
|
|
96
|
+
return klass.properties.map(function (prop) {
|
|
97
|
+
var eventName = "_" + prop.name + "Change";
|
|
98
|
+
eventNames.push(eventName);
|
|
99
|
+
return "\t" + indent + "protected event PropertyChangeHandler<" + getType(prop) + "> " + eventName + ";\n\t" + indent + "public Action On" + capitalize(prop.name) + "Change(PropertyChangeHandler<" + getType(prop) + "> handler) {\n\t" + indent + "\tif (__callbacks == null) { __callbacks = new SchemaCallbacks(); }\n\t" + indent + "\t__callbacks.AddPropertyCallback(nameof(" + prop.name + "));\n\t" + indent + "\t" + eventName + " += handler;\n\t" + indent + "\treturn () => {\n\t" + indent + "\t\t__callbacks.RemovePropertyCallback(nameof(" + prop.name + "));\n\t" + indent + "\t\t" + eventName + " -= handler;\n\t" + indent + "\t};\n\t" + indent + "}";
|
|
100
|
+
}).join("\n\n") + "\n\n\t" + indent + "protected override void TriggerFieldChange(DataChange change) {\n\t" + indent + "\tswitch (change.Field) {\n" + klass.properties.map(function (prop, i) {
|
|
101
|
+
return "\t" + indent + "\t\tcase nameof(" + prop.name + "): " + eventNames[i] + "?.Invoke((" + getType(prop) + ") change.Value, (" + getType(prop) + ") change.PreviousValue); break;";
|
|
102
|
+
}).join("\n") + "\n\t" + indent + "\t\tdefault: break;\n\t\t" + indent + "}\n\t" + indent + "}";
|
|
103
|
+
}
|
|
104
|
+
function getChildType(prop) {
|
|
105
|
+
return typeMaps[prop.childType];
|
|
106
|
+
}
|
|
107
|
+
function getType(prop) {
|
|
108
|
+
if (prop.childType) {
|
|
109
|
+
var isUpcaseFirst = prop.childType.match(/^[A-Z]/);
|
|
110
|
+
var type = void 0;
|
|
111
|
+
if (prop.type === "ref") {
|
|
112
|
+
type = (isUpcaseFirst)
|
|
113
|
+
? prop.childType
|
|
114
|
+
: getChildType(prop);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
var containerClass = capitalize(prop.type);
|
|
118
|
+
type = (isUpcaseFirst)
|
|
119
|
+
? containerClass + "Schema<" + prop.childType + ">"
|
|
120
|
+
: containerClass + "Schema<" + getChildType(prop) + ">";
|
|
121
|
+
}
|
|
122
|
+
return type;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
return (prop.type === "array")
|
|
126
|
+
? (typeMaps[prop.childType] || prop.childType) + "[]"
|
|
127
|
+
: typeMaps[prop.type];
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=csharp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csharp.js","sourceRoot":"","sources":["../../../src/codegen/languages/csharp.ts"],"names":[],"mappings":"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","sourcesContent":["import { Class, Property, File, getCommentHeader, Interface } from \"../types\";\nimport { GenerateOptions } from \"../api\";\nimport { Context } from \"../types\";\n\nconst typeMaps = {\n \"string\": \"string\",\n \"number\": \"float\",\n \"boolean\": \"bool\",\n \"int8\": \"sbyte\",\n \"uint8\": \"byte\",\n \"int16\": \"short\",\n \"uint16\": \"ushort\",\n \"int32\": \"int\",\n \"uint32\": \"uint\",\n \"int64\": \"long\",\n \"uint64\": \"ulong\",\n \"float32\": \"float\",\n \"float64\": \"double\",\n}\n\n/**\n * C# Code Generator\n */\nconst capitalize = (s) => {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nexport function generate (context: Context, options: GenerateOptions): File[] {\n return [\n ...context.classes.map(structure => ({\n name: `${structure.name}.cs`,\n content: generateClass(structure, options.namespace)\n })),\n ...context.interfaces.map(structure => ({\n name: `${structure.name}.cs`,\n content: generateInterface(structure, options.namespace)\n }))\n ];\n}\n\nfunction generateClass(klass: Class, namespace: string) {\n const indent = (namespace) ? \"\\t\" : \"\";\n return `${getCommentHeader()}\n\nusing Colyseus.Schema;\nusing Action = System.Action;\n${namespace ? `\\nnamespace ${namespace} {` : \"\"}\n${indent}public partial class ${klass.name} : ${klass.extends} {\n${klass.properties.map(prop => generateProperty(prop, indent)).join(\"\\n\\n\")}\n\n${indent}\\t/*\n${indent}\\t * Support for individual property change callbacks below...\n${indent}\\t */\n\n${generateAllFieldCallbacks(klass, indent)}\n${indent}}\n${namespace ? \"}\" : \"\"}\n`;\n}\n\nfunction generateProperty(prop: Property, indent: string = \"\") {\n let typeArgs = `\"${prop.type}\"`;\n let property = \"public\";\n let langType: string;\n let initializer = \"\";\n\n if (prop.childType) {\n const isUpcaseFirst = prop.childType.match(/^[A-Z]/);\n\n langType = getType(prop);\n typeArgs += `, typeof(${langType})`;\n\n if (!isUpcaseFirst) {\n typeArgs += `, \"${prop.childType}\"`;\n }\n\n initializer = `new ${langType}()`;\n\n } else {\n langType = getType(prop);\n initializer = `default(${langType})`;\n }\n\n property += ` ${langType} ${prop.name}`;\n\n let ret = (prop.deprecated) ? `\\t\\t[System.Obsolete(\"field '${prop.name}' is deprecated.\", true)]\\n` : '';\n\n return ret + `\\t${indent}[Type(${prop.index}, ${typeArgs})]\n\\t${indent}${property} = ${initializer};`;\n}\n\nfunction generateInterface(struct: Interface, namespace: string) {\n const indent = (namespace) ? \"\\t\" : \"\";\n return `${getCommentHeader()}\n\nusing Colyseus.Schema;\n${namespace ? `\\nnamespace ${namespace} {` : \"\"}\n${indent}public class ${struct.name} {\n${struct.properties.map(prop => `\\t${indent}public ${getType(prop)} ${prop.name};`).join(\"\\n\")}\n${indent}}\n${namespace ? \"}\" : \"\"}\n`;\n}\n\nfunction generateAllFieldCallbacks(klass: Class, indent: string) {\n //\n // TODO: improve me. It would be great to generate less boilerplate in favor\n // of a single implementation on C# Schema class itself.\n //\n const eventNames: string[] = [];\n return `${klass.properties.map(prop => {\n const eventName = `_${prop.name}Change`;\n eventNames.push(eventName);\n return `\\t${indent}protected event PropertyChangeHandler<${getType(prop)}> ${eventName};\n\\t${indent}public Action On${capitalize(prop.name)}Change(PropertyChangeHandler<${getType(prop)}> handler) {\n\\t${indent}\\tif (__callbacks == null) { __callbacks = new SchemaCallbacks(); }\n\\t${indent}\\t__callbacks.AddPropertyCallback(nameof(${prop.name}));\n\\t${indent}\\t${eventName} += handler;\n\\t${indent}\\treturn () => {\n\\t${indent}\\t\\t__callbacks.RemovePropertyCallback(nameof(${prop.name}));\n\\t${indent}\\t\\t${eventName} -= handler;\n\\t${indent}\\t};\n\\t${indent}}`;\n }).join(\"\\n\\n\")}\n\n\\t${indent}protected override void TriggerFieldChange(DataChange change) {\n\\t${indent}\\tswitch (change.Field) {\n${klass.properties.map((prop, i) => {\n return `\\t${indent}\\t\\tcase nameof(${prop.name}): ${eventNames[i]}?.Invoke((${getType(prop)}) change.Value, (${getType(prop)}) change.PreviousValue); break;`;\n}).join(\"\\n\")}\n\\t${indent}\\t\\tdefault: break;\n\\t\\t${indent}}\n\\t${indent}}`;\n}\n\nfunction getChildType(prop: Property) {\n return typeMaps[prop.childType];\n}\n\nfunction getType(prop: Property) {\n if (prop.childType) {\n const isUpcaseFirst = prop.childType.match(/^[A-Z]/);\n let type: string;\n\n if(prop.type === \"ref\") {\n type = (isUpcaseFirst)\n ? prop.childType\n : getChildType(prop);\n } else {\n const containerClass = capitalize(prop.type);\n type = (isUpcaseFirst)\n ? `${containerClass}Schema<${prop.childType}>`\n : `${containerClass}Schema<${getChildType(prop)}>`;\n }\n return type;\n\n } else {\n return (prop.type === \"array\")\n ? `${typeMaps[prop.childType] || prop.childType}[]`\n : typeMaps[prop.type];\n }\n}"]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generate = void 0;
|
|
4
|
+
var types_1 = require("../types");
|
|
5
|
+
var typeMaps = {
|
|
6
|
+
"string": "String",
|
|
7
|
+
"number": "Dynamic",
|
|
8
|
+
"boolean": "Bool",
|
|
9
|
+
"int8": "Int",
|
|
10
|
+
"uint8": "UInt",
|
|
11
|
+
"int16": "Int",
|
|
12
|
+
"uint16": "UInt",
|
|
13
|
+
"int32": "Int",
|
|
14
|
+
"uint32": "UInt",
|
|
15
|
+
"int64": "Int",
|
|
16
|
+
"uint64": "UInt",
|
|
17
|
+
"float32": "Float",
|
|
18
|
+
"float64": "Float",
|
|
19
|
+
};
|
|
20
|
+
var typeInitializer = {
|
|
21
|
+
"string": '""',
|
|
22
|
+
"number": "0",
|
|
23
|
+
"boolean": "false",
|
|
24
|
+
"int8": "0",
|
|
25
|
+
"uint8": "0",
|
|
26
|
+
"int16": "0",
|
|
27
|
+
"uint16": "0",
|
|
28
|
+
"int32": "0",
|
|
29
|
+
"uint32": "0",
|
|
30
|
+
"int64": "0",
|
|
31
|
+
"uint64": "0",
|
|
32
|
+
"float32": "0",
|
|
33
|
+
"float64": "0",
|
|
34
|
+
};
|
|
35
|
+
function generate(context, options) {
|
|
36
|
+
return context.classes.map(function (klass) { return ({
|
|
37
|
+
name: klass.name + ".hx",
|
|
38
|
+
content: generateClass(klass, options.namespace, context.classes)
|
|
39
|
+
}); });
|
|
40
|
+
}
|
|
41
|
+
exports.generate = generate;
|
|
42
|
+
function getInheritanceTree(klass, allClasses, includeSelf) {
|
|
43
|
+
if (includeSelf === void 0) { includeSelf = true; }
|
|
44
|
+
var currentClass = klass;
|
|
45
|
+
var inheritanceTree = [];
|
|
46
|
+
if (includeSelf) {
|
|
47
|
+
inheritanceTree.push(currentClass);
|
|
48
|
+
}
|
|
49
|
+
while (currentClass.extends !== "Schema") {
|
|
50
|
+
currentClass = allClasses.find(function (klass) { return klass.name == currentClass.extends; });
|
|
51
|
+
inheritanceTree.push(currentClass);
|
|
52
|
+
}
|
|
53
|
+
return inheritanceTree;
|
|
54
|
+
}
|
|
55
|
+
function generateClass(klass, namespace, allClasses) {
|
|
56
|
+
return types_1.getCommentHeader() + "\n\n" + (namespace ? "package " + namespace + ";" : "") + "\nimport io.colyseus.serializer.schema.Schema;\nimport io.colyseus.serializer.schema.types.*;\n\nclass " + klass.name + " extends " + klass.extends + " {\n" + klass.properties.map(function (prop) { return generateProperty(prop); }).join("\n") + "\n}\n";
|
|
57
|
+
}
|
|
58
|
+
function generateProperty(prop) {
|
|
59
|
+
var langType;
|
|
60
|
+
var initializer = "";
|
|
61
|
+
var typeArgs = "\"" + prop.type + "\"";
|
|
62
|
+
if (prop.childType) {
|
|
63
|
+
var isUpcaseFirst = prop.childType.match(/^[A-Z]/);
|
|
64
|
+
if (isUpcaseFirst) {
|
|
65
|
+
typeArgs += ", " + prop.childType;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
typeArgs += ", \"" + prop.childType + "\"";
|
|
69
|
+
}
|
|
70
|
+
if (prop.type === "ref") {
|
|
71
|
+
langType = "" + prop.childType;
|
|
72
|
+
initializer = "new " + prop.childType + "()";
|
|
73
|
+
}
|
|
74
|
+
else if (prop.type === "array") {
|
|
75
|
+
langType = (isUpcaseFirst)
|
|
76
|
+
? "ArraySchema<" + prop.childType + ">"
|
|
77
|
+
: "ArraySchema<" + typeMaps[prop.childType] + ">";
|
|
78
|
+
initializer = "new " + langType + "()";
|
|
79
|
+
}
|
|
80
|
+
else if (prop.type === "map") {
|
|
81
|
+
langType = (isUpcaseFirst)
|
|
82
|
+
? "MapSchema<" + prop.childType + ">"
|
|
83
|
+
: "MapSchema<" + typeMaps[prop.childType] + ">";
|
|
84
|
+
initializer = "new " + langType + "()";
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
langType = typeMaps[prop.type];
|
|
89
|
+
initializer = typeInitializer[prop.type];
|
|
90
|
+
}
|
|
91
|
+
return "\t@:type(" + typeArgs + ")\n\tpublic var " + prop.name + ": " + langType + " = " + initializer + ";\n";
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=haxe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"haxe.js","sourceRoot":"","sources":["../../../src/codegen/languages/haxe.ts"],"names":[],"mappings":"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","sourcesContent":["import { Class, Property, File, getCommentHeader, Context } from \"../types\";\nimport { GenerateOptions } from \"../api\";\n\nconst typeMaps = {\n \"string\": \"String\",\n \"number\": \"Dynamic\",\n \"boolean\": \"Bool\",\n \"int8\": \"Int\",\n \"uint8\": \"UInt\",\n \"int16\": \"Int\",\n \"uint16\": \"UInt\",\n \"int32\": \"Int\",\n \"uint32\": \"UInt\",\n \"int64\": \"Int\",\n \"uint64\": \"UInt\",\n \"float32\": \"Float\",\n \"float64\": \"Float\",\n}\n\nconst typeInitializer = {\n \"string\": '\"\"',\n \"number\": \"0\",\n \"boolean\": \"false\",\n \"int8\": \"0\",\n \"uint8\": \"0\",\n \"int16\": \"0\",\n \"uint16\": \"0\",\n \"int32\": \"0\",\n \"uint32\": \"0\",\n \"int64\": \"0\",\n \"uint64\": \"0\",\n \"float32\": \"0\",\n \"float64\": \"0\",\n}\n\nexport function generate (context: Context, options: GenerateOptions): File[] {\n return context.classes.map(klass => ({\n name: klass.name + \".hx\",\n content: generateClass(klass, options.namespace, context.classes)\n }));\n}\n\nfunction getInheritanceTree(klass: Class, allClasses: Class[], includeSelf: boolean = true) {\n let currentClass = klass;\n let inheritanceTree: Class[] = [];\n\n if (includeSelf) {\n inheritanceTree.push(currentClass);\n }\n\n while (currentClass.extends !== \"Schema\") {\n currentClass = allClasses.find(klass => klass.name == currentClass.extends);\n inheritanceTree.push(currentClass);\n }\n\n return inheritanceTree;\n}\n\nfunction generateClass(klass: Class, namespace: string, allClasses: Class[]) {\n return `${getCommentHeader()}\n\n${namespace ? `package ${namespace};` : \"\"}\nimport io.colyseus.serializer.schema.Schema;\nimport io.colyseus.serializer.schema.types.*;\n\nclass ${klass.name} extends ${klass.extends} {\n${klass.properties.map(prop => generateProperty(prop)).join(\"\\n\")}\n}\n`;\n}\n\nfunction generateProperty(prop: Property) {\n let langType: string;\n let initializer = \"\";\n let typeArgs = `\"${prop.type}\"`;\n\n if (prop.childType) {\n const isUpcaseFirst = prop.childType.match(/^[A-Z]/);\n\n if (isUpcaseFirst) {\n typeArgs += `, ${prop.childType}`;\n\n } else {\n typeArgs += `, \"${prop.childType}\"`;\n }\n\n if(prop.type === \"ref\") {\n langType = `${prop.childType}`;\n initializer = `new ${prop.childType}()`;\n\n } else if(prop.type === \"array\") {\n langType = (isUpcaseFirst)\n ? `ArraySchema<${prop.childType}>`\n : `ArraySchema<${typeMaps[prop.childType]}>`;\n initializer = `new ${langType}()`;\n\n } else if(prop.type === \"map\") {\n langType = (isUpcaseFirst)\n ? `MapSchema<${prop.childType}>`\n : `MapSchema<${typeMaps[prop.childType]}>`;\n initializer = `new ${langType}()`;\n }\n\n } else {\n langType = typeMaps[prop.type];\n initializer = typeInitializer[prop.type];\n }\n\n return `\\t@:type(${typeArgs})\\n\\tpublic var ${prop.name}: ${langType} = ${initializer};\\n`\n}\n"]}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generate = void 0;
|
|
4
|
+
var types_1 = require("../types");
|
|
5
|
+
var typeMaps = {
|
|
6
|
+
"string": "String",
|
|
7
|
+
"number": "float",
|
|
8
|
+
"boolean": "boolean",
|
|
9
|
+
"int8": "byte",
|
|
10
|
+
"uint8": "short",
|
|
11
|
+
"int16": "short",
|
|
12
|
+
"uint16": "int",
|
|
13
|
+
"int32": "int",
|
|
14
|
+
"uint32": "long",
|
|
15
|
+
"int64": "long",
|
|
16
|
+
"uint64": "long",
|
|
17
|
+
"float32": "float",
|
|
18
|
+
"float64": "double",
|
|
19
|
+
};
|
|
20
|
+
var typeInitializer = {
|
|
21
|
+
"string": '""',
|
|
22
|
+
"number": "0",
|
|
23
|
+
"boolean": "false",
|
|
24
|
+
"int8": "0",
|
|
25
|
+
"uint8": "0",
|
|
26
|
+
"int16": "0",
|
|
27
|
+
"uint16": "0",
|
|
28
|
+
"int32": "0",
|
|
29
|
+
"uint32": "0",
|
|
30
|
+
"int64": "0",
|
|
31
|
+
"uint64": "0",
|
|
32
|
+
"float32": "0",
|
|
33
|
+
"float64": "0",
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* C# Code Generator
|
|
37
|
+
*/
|
|
38
|
+
function generate(context, options) {
|
|
39
|
+
return context.classes.map(function (klass) { return ({
|
|
40
|
+
name: klass.name + ".java",
|
|
41
|
+
content: generateClass(klass, options.namespace)
|
|
42
|
+
}); });
|
|
43
|
+
}
|
|
44
|
+
exports.generate = generate;
|
|
45
|
+
function generateClass(klass, namespace) {
|
|
46
|
+
var indent = (namespace) ? "\t" : "";
|
|
47
|
+
return types_1.getCommentHeader() + "\n" + (namespace ? "\npackage " + namespace + ";" : "") + "\n\nimport io.colyseus.serializer.schema.Schema;\nimport io.colyseus.serializer.schema.annotations.SchemaClass;\nimport io.colyseus.serializer.schema.annotations.SchemaField;\n\n@SchemaClass\n" + indent + "public class " + klass.name + " extends " + klass.extends + " {\n" + klass.properties.map(function (prop) { return generateProperty(prop, indent); }).join("\n\n") + "\n" + indent + "}\n" + (namespace ? "}" : "") + "\n";
|
|
48
|
+
}
|
|
49
|
+
function generateProperty(prop, indent) {
|
|
50
|
+
if (indent === void 0) { indent = ""; }
|
|
51
|
+
var typeArgs = prop.index + "/" + prop.type;
|
|
52
|
+
var property = "public";
|
|
53
|
+
var langType;
|
|
54
|
+
var ctorArgs = "";
|
|
55
|
+
var initializer = "";
|
|
56
|
+
if (prop.childType) {
|
|
57
|
+
var isUpcaseFirst = prop.childType.match(/^[A-Z]/);
|
|
58
|
+
if (prop.type !== "ref" && isUpcaseFirst) {
|
|
59
|
+
ctorArgs = prop.childType + ".class";
|
|
60
|
+
}
|
|
61
|
+
if (prop.type === "ref") {
|
|
62
|
+
langType = (isUpcaseFirst)
|
|
63
|
+
? prop.childType
|
|
64
|
+
: typeMaps[prop.childType];
|
|
65
|
+
initializer = "new " + langType + ((prop.type !== "ref" && isUpcaseFirst) ? "<>" : "") + "(" + ctorArgs + ")";
|
|
66
|
+
}
|
|
67
|
+
else if (prop.type === "array") {
|
|
68
|
+
langType = (isUpcaseFirst)
|
|
69
|
+
? "ArraySchema<" + prop.childType + ">"
|
|
70
|
+
: "ArraySchema";
|
|
71
|
+
initializer = "new ArraySchema" + ((isUpcaseFirst) ? "<>" : "") + "(" + ctorArgs + ")";
|
|
72
|
+
}
|
|
73
|
+
else if (prop.type === "map") {
|
|
74
|
+
langType = (isUpcaseFirst)
|
|
75
|
+
? "MapSchema<" + prop.childType + ">"
|
|
76
|
+
: "MapSchema";
|
|
77
|
+
initializer = "new MapSchema" + ((isUpcaseFirst) ? "<>" : "") + "(" + ctorArgs + ")";
|
|
78
|
+
}
|
|
79
|
+
if (prop.type !== "ref") {
|
|
80
|
+
typeArgs += (isUpcaseFirst)
|
|
81
|
+
? "/ref"
|
|
82
|
+
: "/" + prop.childType;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
langType = typeMaps[prop.type];
|
|
87
|
+
initializer = typeInitializer[prop.type];
|
|
88
|
+
}
|
|
89
|
+
property += " " + langType + " " + prop.name;
|
|
90
|
+
return "\t@SchemaField(\"" + typeArgs + "\")\t" + indent + "\n\t" + indent + property + " = " + initializer + ";";
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=java.js.map
|