fix(tl-utils): fixed reader codegen impl for non-zero-size fields between flags
This commit is contained in:
parent
6978e159d7
commit
dd4cc471f6
2 changed files with 42 additions and 15 deletions
|
@ -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<string, 1> = {}
|
||||
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(
|
||||
|
|
|
@ -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),',
|
||||
'}'
|
||||
)
|
||||
|
|
Loading…
Reference in a new issue