feat(tl-utils): support flag for exposing raw flags in codegen

This commit is contained in:
teidesu 2022-06-28 18:57:22 +03:00
parent 16ffca23d2
commit 6978e159d7
6 changed files with 95 additions and 23 deletions

View file

@ -5,7 +5,7 @@ import { snakeToCamel } from './utils'
/** /**
* Returns code as an object entry * Returns code as an object entry
*/ */
export function generateReaderCodeForTlEntry(entry: TlEntry): string { export function generateReaderCodeForTlEntry(entry: TlEntry, includeFlags = false): string {
if (entry.id === 0) entry.id = computeConstructorIdFromEntry(entry) if (entry.id === 0) entry.id = computeConstructorIdFromEntry(entry)
let ret = `${entry.id}:function(r){` let ret = `${entry.id}:function(r){`
@ -23,6 +23,11 @@ export function generateReaderCodeForTlEntry(entry: TlEntry): string {
const code = `var ${arg.name}=r.uint();` const code = `var ${arg.name}=r.uint();`
ret = ret.replace('return{', code + 'return{') ret = ret.replace('return{', code + 'return{')
flagsFields[arg.name] = 1 flagsFields[arg.name] = 1
if (includeFlags) {
ret += `${arg.name}:${arg.name},`
}
return return
} }

View file

@ -54,7 +54,8 @@ function entryFullTypeName(entry: TlEntry): string {
export function generateTypescriptDefinitionsForTlEntry( export function generateTypescriptDefinitionsForTlEntry(
entry: TlEntry, entry: TlEntry,
baseNamespace = 'tl.', baseNamespace = 'tl.',
errors?: TlErrors errors?: TlErrors,
withFlags = false
): string { ): string {
let ret = '' let ret = ''
@ -86,17 +87,34 @@ export function generateTypescriptDefinitionsForTlEntry(
} }
if (comment) ret += jsComment(comment) + '\n' if (comment) ret += jsComment(comment) + '\n'
ret += `interface ${entryFullTypeName(entry)} {\n _: '${entry.name}';\n` let genericsString = ''
const genericsIndex: Record<string, 1> = {}
if (entry.generics?.length) {
genericsString = '<'
entry.generics.forEach((it, idx) => {
const tsType =
it.type === 'Type'
? 'tl.TlObject'
: fullTypeName(it.type, baseNamespace)
const genericsIndex: Record<string, string> = {} genericsIndex[it.name] = 1
if (entry.generics) { if (idx !== 0) genericsString += ', '
entry.generics.forEach((it) => { genericsString += `${it.name} extends ${tsType}`
genericsIndex[it.name] = it.type
}) })
genericsString += '>'
} }
ret += `interface ${entryFullTypeName(entry)}${genericsString} {\n _: '${
entry.name
}';\n`
entry.arguments.forEach((arg) => { entry.arguments.forEach((arg) => {
if (arg.type === '#') return if (arg.type === '#') {
if (withFlags) {
ret += ` ${arg.name}: number;\n`
}
return
}
if (arg.comment) { if (arg.comment) {
ret += indent(4, jsComment(arg.comment)) + '\n' ret += indent(4, jsComment(arg.comment)) + '\n'
@ -112,13 +130,8 @@ export function generateTypescriptDefinitionsForTlEntry(
if (type[0] === '!') type = type.substr(1) if (type[0] === '!') type = type.substr(1)
if (type in genericsIndex) { if (type in genericsIndex) {
type = genericsIndex[type]
if (type === 'Type') {
type = 'any'
typeFinal = true typeFinal = true
} }
}
if (!typeFinal) type = fullTypeName(arg.type, baseNamespace) if (!typeFinal) type = fullTypeName(arg.type, baseNamespace)

View file

@ -14,7 +14,10 @@ export const TL_WRITER_PRELUDE =
* *
* `h` (has) function should be available * `h` (has) function should be available
*/ */
export function generateWriterCodeForTlEntry(entry: TlEntry): string { export function generateWriterCodeForTlEntry(
entry: TlEntry,
withFlags = false
): string {
if (entry.id === 0) entry.id = computeConstructorIdFromEntry(entry) if (entry.id === 0) entry.id = computeConstructorIdFromEntry(entry)
let ret = `'${entry.name}':function(w${ let ret = `'${entry.name}':function(w${
@ -27,7 +30,7 @@ export function generateWriterCodeForTlEntry(entry: TlEntry): string {
entry.arguments.forEach((arg) => { entry.arguments.forEach((arg) => {
if (arg.type === '#') { if (arg.type === '#') {
ret += `var ${arg.name}=0;` ret += `var ${arg.name}=${withFlags ? `v.${arg.name}` : '0'};`
entry.arguments.forEach((arg1) => { entry.arguments.forEach((arg1) => {
let s let s
@ -99,14 +102,15 @@ export function generateWriterCodeForTlEntry(entry: TlEntry): string {
export function generateWriterCodeForTlEntries( export function generateWriterCodeForTlEntries(
entries: TlEntry[], entries: TlEntry[],
varName: string, varName: string,
prelude = true prelude = true,
withFlags = false
): string { ): string {
let ret = '' let ret = ''
if (prelude) ret += TL_WRITER_PRELUDE if (prelude) ret += TL_WRITER_PRELUDE
ret += `var ${varName}={\n` ret += `var ${varName}={\n`
entries.forEach((entry) => { entries.forEach((entry) => {
ret += generateWriterCodeForTlEntry(entry) + '\n' ret += generateWriterCodeForTlEntry(entry, withFlags) + '\n'
}) })
return ret + '}' return ret + '}'

View file

@ -121,4 +121,19 @@ describe('generateReaderCodeForTlEntry', () => {
'}' '}'
) )
}) })
it('generates code with raw flags for constructors with flags', () => {
const entry = parseTlToEntries('test flags:# flags2:# = Test;')[0]
expect(generateReaderCodeForTlEntry(entry, true)).eq(
`${entry.id}:function(r){${[
'var flags=r.uint();',
'var flags2=r.uint();',
'return{',
"_:'test',",
'flags:flags,',
'flags2:flags2,',
'}',
].join('')}},`
)
})
}) })

View file

@ -131,10 +131,30 @@ describe('generateTypescriptDefinitionsForTlEntry', () => {
'---functions---\ninvokeWithoutUpdates#bf9459b7 {X:Type} query:!X = X;', '---functions---\ninvokeWithoutUpdates#bf9459b7 {X:Type} query:!X = X;',
'interface RawInvokeWithoutUpdatesRequest<X extends tl.TlObject> {', 'interface RawInvokeWithoutUpdatesRequest<X extends tl.TlObject> {',
" _: 'invokeWithoutUpdates';", " _: 'invokeWithoutUpdates';",
" query: X;", ' query: X;',
'}' '}'
) )
}) })
it('generates code with raw flags for constructors with flags', () => {
const entry = parseTlToEntries('test flags:# flags2:# = Test;')[0]
expect(
generateTypescriptDefinitionsForTlEntry(
entry,
undefined,
undefined,
true
)
).eq(
[
'interface RawTest {',
" _: 'test';",
' flags: number;',
' flags2: number;',
'}',
].join('\n')
)
})
}) })
describe('generateTypescriptDefinitionsForTlSchema', () => { describe('generateTypescriptDefinitionsForTlSchema', () => {
@ -306,14 +326,16 @@ type TlObject =
| tl.test.RawGetTestRequest | tl.test.RawGetTestRequest
`.trim(), `.trim(),
], ],
[` [
`
ns.isAnyTest = _isAny('Test'); ns.isAnyTest = _isAny('Test');
ns.test = {}; ns.test = {};
(function(ns){ (function(ns){
ns.isAnyTest = _isAny('test.Test'); ns.isAnyTest = _isAny('test.Test');
})(ns.test); })(ns.test);
_types = JSON.parse('{"test":"Test","test2":"Test","test.test":"test.Test","test.test2":"test.Test"}'); _types = JSON.parse('{"test":"Test","test2":"Test","test.test":"test.Test","test.test2":"test.Test"}');
`.trim()] `.trim(),
]
) )
}) })
}) })

View file

@ -83,7 +83,7 @@ describe('generateWriterCodeForTlEntry', () => {
'if(_timeout)w.int(v.timeout);', 'if(_timeout)w.int(v.timeout);',
'var flags2=0;', 'var flags2=0;',
'if(v.canDeleteChannel===true)flags2|=1;', 'if(v.canDeleteChannel===true)flags2|=1;',
'w.uint(flags2);', 'w.uint(flags2);'
) )
}) })
@ -121,4 +121,17 @@ describe('generateWriterCodeForTlEntry', () => {
'w.object(v.query);' 'w.object(v.query);'
) )
}) })
it('generates code with raw flags for constructors with flags', () => {
const entry = parseTlToEntries('test flags:# flags2:# = Test;')[0]
expect(generateWriterCodeForTlEntry(entry, true)).eq(
`'${entry.name}':function(w,v){${[
`w.uint(${entry.id});`,
'var flags=v.flags;',
'w.uint(flags);',
'var flags2=v.flags2;',
'w.uint(flags2);',
].join('')}},`
)
})
}) })