Skip to content

Commit 2bf1011

Browse files
committed
Move DumpToText methods to a separate module.
1 parent 89a1e3f commit 2bf1011

File tree

1 file changed

+76
-28
lines changed

1 file changed

+76
-28
lines changed

tl/generate_tl.py

+76-28
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def addTextSerialize(typeList, typeData, typesDict, idPrefix, primeType, boxed,
4141
if (isTemplate != ''):
4242
templateArgument = '<MTP::SecureRequest>'
4343

44-
result += 'bool Serialize_' + name + '(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag) {\n'
44+
result += 'bool Serialize_' + name + '(DumpToTextBuffer &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag) {\n'
4545
if (len(conditions)):
4646
result += '\tauto flag = ' + prefix + name + templateArgument + '::Flags::from_raw(iflag);\n\n'
4747
if (len(prms)):
@@ -162,8 +162,11 @@ def readAndGenerate(inputFiles, outputPath, scheme):
162162
outputSource = outputPath + '.cpp'
163163
outputConversionHeader = outputPath + '-conversion.h'
164164
outputConversionSource = outputPath + '-conversion.cpp'
165+
outputSerializationHeader = outputPath + '-dump_to_text.h'
166+
outputSerializationSource = outputPath + '-dump_to_text.cpp'
165167
outputHeaderBasename = os.path.basename(outputHeader)
166168
outputConversionHeaderBasename = os.path.basename(outputConversionHeader)
169+
outputSerializationHeaderBasename = os.path.basename(outputSerializationHeader)
167170

168171
prefixes = scheme.get('prefixes', {})
169172
dataPrefix = prefixes.get('data', '')
@@ -196,16 +199,11 @@ def fullDataName(name):
196199
synonyms = scheme.get('synonyms', {})
197200
writeSections = scheme.get('sections', [])
198201
readWriteSection = 'read-write' in writeSections
199-
serializationSection = 'serialization' in writeSections
200202

201203
primitiveTypeNames = scheme.get('types')
202204
typeIdType = primitiveTypeNames.get('typeId')
203205
primeType = primitiveTypeNames.get('prime', '')
204206
bufferType = primitiveTypeNames.get('buffer', '')
205-
if primeType == '' or bufferType == '':
206-
if readWriteSection or serializationSection:
207-
print('Required types not provided.')
208-
sys.exit(1)
209207

210208
writeConversion = 'conversion' in scheme
211209
conversionScheme = scheme.get('conversion', {})
@@ -224,6 +222,15 @@ def conversionMake(name):
224222
def conversionMove(name):
225223
return conversionTemplate('move_object_as', name)
226224

225+
writeSerialization = 'dumpToText' in scheme
226+
serializationScheme = scheme.get('dumpToText', {})
227+
serializationInclude = serializationScheme.get('include') if writeSerialization else ''
228+
229+
if primeType == '' or bufferType == '':
230+
if readWriteSection or writeSerialization:
231+
print('Required types not provided.')
232+
sys.exit(1)
233+
227234
def isBuiltinType(name):
228235
return name in builtinTypes or name in builtinTemplateTypes
229236

@@ -1113,16 +1120,12 @@ def isBuiltinType(name):
11131120
flagOperators += 'inline ' + parentName + '::Flags mtpCastFlags(' + childName + '::Flags flags) { return static_cast<' + parentName + '::Flag>(flags.value()); }\n'
11141121
flagOperators += 'inline ' + parentName + '::Flags mtpCastFlags(MTPflags<' + childName + '::Flags> flags) { return mtpCastFlags(flags.v); }\n'
11151122

1116-
textSerializeHeader = ''
11171123
textSerializeSource = ''
1118-
if serializationSection:
1119-
textSerializeHeader = '\n\
1120-
// Human-readable text serialization\n\
1121-
[[nodiscard]] bool mtpTextSerializeType(MTPStringLogger &to, const ' + primeType + ' *&from, const ' + primeType + ' *end, ' + primeType + ' cons, uint32 level, ' + primeType + ' vcons);\n'
1124+
if writeSerialization:
1125+
# manual types added here
11221126

1123-
# manual types added here
11241127
textSerializeMethods += '\
1125-
bool _serialize_rpc_result(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag) {\n\
1128+
bool Serialize_rpc_result(DumpToTextBuffer &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag) {\n\
11261129
if (stage) {\n\
11271130
to.add(",\\n").addSpaces(lev);\n\
11281131
} else {\n\
@@ -1137,7 +1140,7 @@ def isBuiltinType(name):
11371140
return true;\n\
11381141
}\n\
11391142
\n\
1140-
bool _serialize_msg_container(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag) {\n\
1143+
bool Serialize_msg_container(DumpToTextBuffer &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag) {\n\
11411144
if (stage) {\n\
11421145
to.add(",\\n").addSpaces(lev);\n\
11431146
} else {\n\
@@ -1151,7 +1154,7 @@ def isBuiltinType(name):
11511154
return true;\n\
11521155
}\n\
11531156
\n\
1154-
bool _serialize_core_message(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag) {\n\
1157+
bool Serialize_core_message(DumpToTextBuffer &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag) {\n\
11551158
if (stage) {\n\
11561159
to.add(",\\n").addSpaces(lev);\n\
11571160
} else {\n\
@@ -1170,20 +1173,21 @@ def isBuiltinType(name):
11701173
\n'
11711174

11721175
textSerializeInit += '\
1173-
result.insert(' + idPrefix + 'rpc_result, _serialize_rpc_result);\n\
1174-
result.insert(' + idPrefix + 'msg_container, _serialize_msg_container);\n\
1175-
result.insert(' + idPrefix + 'core_message, _serialize_core_message);\n'
1176+
result.insert(' + idPrefix + 'rpc_result, Serialize_rpc_result);\n\
1177+
result.insert(' + idPrefix + 'msg_container, Serialize_msg_container);\n\
1178+
result.insert(' + idPrefix + 'core_message, Serialize_core_message);\n'
11761179
textSerializeSource = '\n\
1180+
namespace {\n\
1181+
\n\
11771182
using Types = QVector<' + typeIdType + '>;\n\
11781183
using StagesFlags = QVector<int32>;\n\
11791184
\n\
11801185
' + textSerializeMethods + '\n\
1181-
namespace {\n\
11821186
\n\
1183-
using TextSerializer = bool (*)(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag);\n\
1187+
using TextSerializer = bool (*)(DumpToTextBuffer &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag);\n\
11841188
using TextSerializers = QMap<' + typeIdType + ', TextSerializer>;\n\
11851189
\n\
1186-
QMap<' + typeIdType + ', TextSerializer> createTextSerializers() {\n\
1190+
QMap<' + typeIdType + ', TextSerializer> CreateTextSerializers() {\n\
11871191
auto result = QMap<' + typeIdType + ', TextSerializer>();\n\
11881192
\n\
11891193
' + textSerializeInit + '\n\
@@ -1192,8 +1196,8 @@ def isBuiltinType(name):
11921196
\n\
11931197
} // namespace\n\
11941198
\n\
1195-
bool mtpTextSerializeType(MTPStringLogger &to, const ' + primeType + ' *&from, const ' + primeType + ' *end, ' + primeType + ' cons, uint32 level, ' + primeType + ' vcons) {\n\
1196-
static auto serializers = createTextSerializers();\n\
1199+
bool DumpToTextType(DumpToTextBuffer &to, const ' + primeType + ' *&from, const ' + primeType + ' *end, ' + primeType + ' cons, uint32 level, ' + primeType + ' vcons) {\n\
1200+
static auto kSerializers = CreateTextSerializers();\n\
11971201
\n\
11981202
QVector<' + typeIdType + '> types, vtypes;\n\
11991203
QVector<int32> stages, flags;\n\
@@ -1221,13 +1225,13 @@ def isBuiltinType(name):
12211225
}\n\
12221226
\n\
12231227
int32 lev = level + types.size() - 1;\n\
1224-
auto it = serializers.constFind(type);\n\
1225-
if (it != serializers.cend()) {\n\
1228+
auto it = kSerializers.constFind(type);\n\
1229+
if (it != kSerializers.cend()) {\n\
12261230
if (!(*it.value())(to, stage, lev, types, vtypes, stages, flags, from, end, flag)) {\n\
12271231
to.error();\n\
12281232
return false;\n\
12291233
}\n\
1230-
} else if (mtpTextSerializeCore(to, from, end, type, lev, vtype)) {\n\
1234+
} else if (DumpToTextCore(to, from, end, type, lev, vtype)) {\n\
12311235
types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back();\n\
12321236
} else {\n\
12331237
to.error();\n\
@@ -1280,7 +1284,7 @@ class TypeCreator;\n\
12801284
' + flagOperators + '\n\
12811285
// Factory methods declaration\n\
12821286
' + factories + '\n\
1283-
' + ('} // namespace ' + globalNamespace + '\n' if globalNamespace != '' else '') + textSerializeHeader
1287+
' + ('} // namespace ' + globalNamespace + '\n' if globalNamespace != '' else '')
12841288

12851289
source = '\
12861290
// WARNING! All changes made in this file will be lost!\n\
@@ -1300,7 +1304,7 @@ class TypeCreator final {\n\
13001304
' + ('} // namespace ' + creatorNamespace + '\n\n' if creatorNamespace != '' else '') + '\
13011305
// Methods definition\n\
13021306
' + methods + '\n\
1303-
' + ('} // namespace ' + globalNamespace + '\n' if globalNamespace != '' else '') + textSerializeSource
1307+
' + ('} // namespace ' + globalNamespace + '\n' if globalNamespace != '' else '')
13041308

13051309
conversionHeader = '\
13061310
// WARNING! All changes made in this file will be lost!\n\
@@ -1326,6 +1330,33 @@ class TypeCreator final {\n\
13261330
' + conversionSource + '\n\
13271331
' + ('} // namespace ' + globalNamespace + '\n' if globalNamespace != '' else '')
13281332

1333+
serializationHeader = '\
1334+
// WARNING! All changes made in this file will be lost!\n\
1335+
// Created from ' + inputNames + ' by \'generate.py\'\n\
1336+
//\n\
1337+
#pragma once\n\
1338+
\n\
1339+
' + ('#include "' + builtinInclude + '"\n\n' if builtinInclude != '' else '') + '\
1340+
namespace MTP::details {\n\
1341+
\n\
1342+
struct DumpToTextBuffer;\n\
1343+
\n\
1344+
[[nodiscard]] bool DumpToTextType(DumpToTextBuffer &to, const ' + primeType + ' *&from, const ' + primeType + ' *end, ' + primeType + ' cons = 0, uint32 level = 0, ' + primeType + ' vcons = 0);\n\
1345+
\n\
1346+
} // namespace MTP::details\n'
1347+
1348+
serializationSource = '\
1349+
// WARNING! All changes made in this file will be lost!\n\
1350+
// Created from ' + inputNames + ' by \'generate.py\'\n\
1351+
//\n\
1352+
#include "' + outputSerializationHeaderBasename + '"\n\
1353+
#include "' + outputHeaderBasename + '"\n\
1354+
#include "' + serializationInclude + '"\n\
1355+
\n\
1356+
namespace MTP::details {\n\
1357+
' + textSerializeSource + '\n\
1358+
} // namespace MTP::details\n'
1359+
13291360
alreadyHeader = ''
13301361
if os.path.isfile(outputHeader):
13311362
with open(outputHeader, 'r') as already:
@@ -1358,3 +1389,20 @@ class TypeCreator final {\n\
13581389
if alreadySource != conversionSource:
13591390
with open(outputConversionSource, 'w') as out:
13601391
out.write(conversionSource)
1392+
1393+
if writeSerialization:
1394+
alreadyHeader = ''
1395+
if os.path.isfile(outputSerializationHeader):
1396+
with open(outputSerializationHeader, 'r') as already:
1397+
alreadyHeader = already.read()
1398+
if alreadyHeader != serializationHeader:
1399+
with open(outputSerializationHeader, 'w') as out:
1400+
out.write(serializationHeader)
1401+
1402+
alreadySource = ''
1403+
if os.path.isfile(outputSerializationSource):
1404+
with open(outputSerializationSource, 'r') as already:
1405+
alreadySource = already.read()
1406+
if alreadySource != serializationSource:
1407+
with open(outputSerializationSource, 'w') as out:
1408+
out.write(serializationSource)

0 commit comments

Comments
 (0)