diff --git a/packages/tl-utils/src/codegen/reader.ts b/packages/tl-utils/src/codegen/reader.ts index 3bf7d985..4ade8972 100644 --- a/packages/tl-utils/src/codegen/reader.ts +++ b/packages/tl-utils/src/codegen/reader.ts @@ -14,23 +14,32 @@ export function generateReaderCodeForTlEntry(entry: TlEntry, includeFlags = fals return ret + `return{_:'${entry.name}'}},` } - ret += `return{_:'${entry.name}',` + let beforeReturn = '' + let returnCode = `_:'${entry.name}',` const flagsFields: Record = {} + let lastFlagIdx = -1 - entry.arguments.forEach((arg) => { + entry.arguments.forEach((arg, idx) => { if (arg.type === '#') { - const code = `var ${arg.name}=r.uint();` - ret = ret.replace('return{', code + 'return{') + lastFlagIdx = idx flagsFields[arg.name] = 1 + } + }) + + entry.arguments.forEach((arg, idx) => { + if (arg.type === '#') { + beforeReturn += `var ${arg.name}=r.uint();` if (includeFlags) { - ret += `${arg.name}:${arg.name},` + returnCode += `${arg.name}:${arg.name},` } return } + const isBeforeLastFlag = lastFlagIdx > idx + const argName = snakeToCamel(arg.name) if (arg.predicate) { @@ -52,13 +61,23 @@ export function generateReaderCodeForTlEntry(entry: TlEntry, includeFlags = fals const condition = `${fieldName}&${1 << bitIndex}` if (arg.type === 'true') { - ret += `${argName}:!!(${condition}),` + returnCode += `${argName}:!!(${condition}),` return } - ret += `${argName}:${condition}?` + if (isBeforeLastFlag) { + beforeReturn += `var ${argName}=${condition}?` + returnCode += `${argName}:${argName},` + } else { + returnCode += `${argName}:${condition}?` + } } else { - ret += `${argName}:` + if (isBeforeLastFlag) { + beforeReturn += `var ${argName}=` + returnCode += `${argName}:${argName},` + } else { + returnCode += `${argName}:` + } } let vector = false @@ -75,20 +94,26 @@ export function generateReaderCodeForTlEntry(entry: TlEntry, includeFlags = fals type = 'object' } + let code if (vector) { - ret += `r.vector(r.${type})` + code = `r.vector(r.${type})` } else { - ret += `r.${type}()` + code = `r.${type}()` } if (arg.predicate) { - ret += ':void 0' + code += ':void 0' } - ret += ',' + + if (isBeforeLastFlag) { + beforeReturn += code + ';' + } else { + returnCode += code + ',' + } }) - return ret + '}},' + return `${ret}${beforeReturn}return{${returnCode}}},` } export function generateReaderCodeForTlEntries( diff --git a/packages/tl-utils/tests/codegen/reader.spec.ts b/packages/tl-utils/tests/codegen/reader.spec.ts index 829e0d56..fc2470fa 100644 --- a/packages/tl-utils/tests/codegen/reader.spec.ts +++ b/packages/tl-utils/tests/codegen/reader.spec.ts @@ -76,12 +76,14 @@ describe('generateReaderCodeForTlEntry', () => { test( 'updates.channelDifferenceEmpty#3e11affb flags:# final:flags.0?true pts:int timeout:flags.1?int flags2:# can_delete_channel:flags2.0?true = updates.ChannelDifference;', 'var flags=r.uint();', + 'var pts=r.int();', + 'var timeout=flags&2?r.int():void 0;', 'var flags2=r.uint();', 'return{', "_:'updates.channelDifferenceEmpty',", 'final:!!(flags&1),', - 'pts:r.int(),', - 'timeout:flags&2?r.int():void 0,', + "pts:pts,", + "timeout:timeout,", 'canDeleteChannel:!!(flags2&1),', '}' )