fix(tl-utils): fixed reader codegen impl for non-zero-size fields between flags

This commit is contained in:
teidesu 2022-06-28 19:23:32 +03:00
parent 6978e159d7
commit dd4cc471f6
2 changed files with 42 additions and 15 deletions

View file

@ -14,23 +14,32 @@ export function generateReaderCodeForTlEntry(entry: TlEntry, includeFlags = fals
return ret + `return{_:'${entry.name}'}},` return ret + `return{_:'${entry.name}'}},`
} }
ret += `return{_:'${entry.name}',` let beforeReturn = ''
let returnCode = `_:'${entry.name}',`
const flagsFields: Record<string, 1> = {} const flagsFields: Record<string, 1> = {}
let lastFlagIdx = -1
entry.arguments.forEach((arg) => { entry.arguments.forEach((arg, idx) => {
if (arg.type === '#') { if (arg.type === '#') {
const code = `var ${arg.name}=r.uint();` lastFlagIdx = idx
ret = ret.replace('return{', code + 'return{')
flagsFields[arg.name] = 1 flagsFields[arg.name] = 1
}
})
entry.arguments.forEach((arg, idx) => {
if (arg.type === '#') {
beforeReturn += `var ${arg.name}=r.uint();`
if (includeFlags) { if (includeFlags) {
ret += `${arg.name}:${arg.name},` returnCode += `${arg.name}:${arg.name},`
} }
return return
} }
const isBeforeLastFlag = lastFlagIdx > idx
const argName = snakeToCamel(arg.name) const argName = snakeToCamel(arg.name)
if (arg.predicate) { if (arg.predicate) {
@ -52,13 +61,23 @@ export function generateReaderCodeForTlEntry(entry: TlEntry, includeFlags = fals
const condition = `${fieldName}&${1 << bitIndex}` const condition = `${fieldName}&${1 << bitIndex}`
if (arg.type === 'true') { if (arg.type === 'true') {
ret += `${argName}:!!(${condition}),` returnCode += `${argName}:!!(${condition}),`
return return
} }
ret += `${argName}:${condition}?` if (isBeforeLastFlag) {
beforeReturn += `var ${argName}=${condition}?`
returnCode += `${argName}:${argName},`
} else { } else {
ret += `${argName}:` returnCode += `${argName}:${condition}?`
}
} else {
if (isBeforeLastFlag) {
beforeReturn += `var ${argName}=`
returnCode += `${argName}:${argName},`
} else {
returnCode += `${argName}:`
}
} }
let vector = false let vector = false
@ -75,20 +94,26 @@ export function generateReaderCodeForTlEntry(entry: TlEntry, includeFlags = fals
type = 'object' type = 'object'
} }
let code
if (vector) { if (vector) {
ret += `r.vector(r.${type})` code = `r.vector(r.${type})`
} else { } else {
ret += `r.${type}()` code = `r.${type}()`
} }
if (arg.predicate) { 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( export function generateReaderCodeForTlEntries(

View file

@ -76,12 +76,14 @@ describe('generateReaderCodeForTlEntry', () => {
test( test(
'updates.channelDifferenceEmpty#3e11affb flags:# final:flags.0?true pts:int timeout:flags.1?int flags2:# can_delete_channel:flags2.0?true = updates.ChannelDifference;', '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 flags=r.uint();',
'var pts=r.int();',
'var timeout=flags&2?r.int():void 0;',
'var flags2=r.uint();', 'var flags2=r.uint();',
'return{', 'return{',
"_:'updates.channelDifferenceEmpty',", "_:'updates.channelDifferenceEmpty',",
'final:!!(flags&1),', 'final:!!(flags&1),',
'pts:r.int(),', "pts:pts,",
'timeout:flags&2?r.int():void 0,', "timeout:timeout,",
'canDeleteChannel:!!(flags2&1),', 'canDeleteChannel:!!(flags2&1),',
'}' '}'
) )