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}'}},`
|
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 {
|
||||||
|
returnCode += `${argName}:${condition}?`
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ret += `${argName}:`
|
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(
|
||||||
|
|
|
@ -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),',
|
||||||
'}'
|
'}'
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue