76 lines
1.5 KiB
V
76 lines
1.5 KiB
V
module js
|
|
|
|
import v.ast
|
|
|
|
struct JsDoc {
|
|
gen &JsGen
|
|
}
|
|
|
|
fn new_jsdoc(gen &JsGen) &JsDoc {
|
|
return &JsDoc{
|
|
gen: gen
|
|
}
|
|
}
|
|
|
|
fn (mut d JsDoc) write(s string) {
|
|
if !d.gen.enable_doc { return }
|
|
d.gen.write(s)
|
|
}
|
|
|
|
fn (mut d JsDoc) writeln(s string) {
|
|
if !d.gen.enable_doc { return }
|
|
d.gen.writeln(s)
|
|
}
|
|
|
|
fn (mut d JsDoc) gen_typ(typ string) {
|
|
d.writeln('/** @type {$typ} */')
|
|
}
|
|
|
|
fn (mut d JsDoc) gen_const(typ string) {
|
|
d.writeln('/** @constant {$typ} */')
|
|
}
|
|
|
|
fn (mut d JsDoc) gen_enum() {
|
|
// Enum values can only be ints for now
|
|
typ := 'number'
|
|
d.writeln('/** @enum {$typ} */')
|
|
}
|
|
|
|
fn (mut d JsDoc) gen_fac_fn(fields []ast.StructField) {
|
|
d.writeln('/**')
|
|
d.writeln(' * @constructor')
|
|
d.write(' * @param {{')
|
|
for i, field in fields {
|
|
// Marked as optional: structs have default default values,
|
|
// so all struct members don't have to be initialized.
|
|
d.write('$field.name?: ${d.gen.typ(field.typ)}')
|
|
if i < fields.len - 1 { d.write(', ') }
|
|
}
|
|
d.writeln('}} init')
|
|
d.writeln('*/')
|
|
}
|
|
|
|
fn (mut d JsDoc) gen_fn(it ast.FnDecl) {
|
|
type_name := d.gen.typ(it.return_type)
|
|
d.writeln('/**')
|
|
d.writeln(' * @function')
|
|
if it.is_deprecated {
|
|
d.writeln(' * @deprecated')
|
|
}
|
|
for i, arg in it.args {
|
|
if it.is_method && i == 0 {
|
|
continue
|
|
}
|
|
arg_type_name := d.gen.typ(arg.typ)
|
|
is_varg := i == it.args.len - 1 && it.is_variadic
|
|
name := d.gen.js_name(arg.name)
|
|
if is_varg {
|
|
d.writeln(' * @param {...$arg_type_name} $name')
|
|
} else {
|
|
d.writeln(' * @param {$arg_type_name} $name')
|
|
}
|
|
}
|
|
d.writeln(' * @returns {$type_name}')
|
|
d.writeln('*/')
|
|
}
|