mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
ast, fmt: simplify fmt.fn_decl() (#19054)
This commit is contained in:
parent
d91c7f1b3b
commit
4cf8328f71
@ -89,6 +89,13 @@ pub fn (t &Table) stringify_fn_decl(node &FnDecl, cur_mod string, m2a map[string
|
|||||||
f.write_string('pub ')
|
f.write_string('pub ')
|
||||||
}
|
}
|
||||||
f.write_string('fn ')
|
f.write_string('fn ')
|
||||||
|
pre_comments := node.comments.filter(it.pos.pos < node.name_pos.pos)
|
||||||
|
if pre_comments.len > 0 {
|
||||||
|
write_comments(pre_comments, mut f)
|
||||||
|
if !f.last_n(1)[0].is_space() {
|
||||||
|
f.write_string(' ')
|
||||||
|
}
|
||||||
|
}
|
||||||
if node.is_method {
|
if node.is_method {
|
||||||
f.write_string('(')
|
f.write_string('(')
|
||||||
mut styp := util.no_cur_mod(t.type_to_code(node.receiver.typ.clear_flag(.shared_f)),
|
mut styp := util.no_cur_mod(t.type_to_code(node.receiver.typ.clear_flag(.shared_f)),
|
||||||
@ -211,13 +218,50 @@ fn (t &Table) stringify_fn_after_name(node &FnDecl, mut f strings.Builder, cur_m
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn write_comments(comments []Comment, mut f strings.Builder) {
|
||||||
|
for i, c in comments {
|
||||||
|
if !f.last_n(1)[0].is_space() {
|
||||||
|
f.write_string(' ')
|
||||||
|
}
|
||||||
|
write_comment(c, mut f)
|
||||||
|
if c.is_inline && i < comments.len - 1 && !c.is_multi {
|
||||||
|
f.write_string(' ')
|
||||||
|
} else if (!c.is_inline || c.is_multi) && i < comments.len - 1 {
|
||||||
|
f.writeln('')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn write_comment(node Comment, mut f strings.Builder) {
|
||||||
|
if node.is_inline {
|
||||||
|
x := node.text.trim_left('\x01').trim_space()
|
||||||
|
if x.contains('\n') {
|
||||||
|
f.writeln('/*')
|
||||||
|
f.writeln(x)
|
||||||
|
f.write_string('*/')
|
||||||
|
} else {
|
||||||
|
f.write_string('/* ${x} */')
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mut s := node.text.trim_left('\x01').trim_right(' ')
|
||||||
|
mut out_s := '//'
|
||||||
|
if s != '' {
|
||||||
|
if s[0].is_letter() || s[0].is_digit() {
|
||||||
|
out_s += ' '
|
||||||
|
}
|
||||||
|
out_s += s
|
||||||
|
}
|
||||||
|
f.writeln(out_s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct StringifyModReplacement {
|
struct StringifyModReplacement {
|
||||||
mod string
|
mod string
|
||||||
alias string
|
alias string
|
||||||
weight int
|
weight int
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn shorten_full_name_based_on_aliases(input string, m2a map[string]string) string {
|
fn shorten_full_name_based_on_aliases(input string, m2a map[string]string) string {
|
||||||
if m2a.len == 0 || -1 == input.index_u8(`.`) {
|
if m2a.len == 0 || -1 == input.index_u8(`.`) {
|
||||||
// a simple typename, like `string` or `[]bool`; no module aliasings apply,
|
// a simple typename, like `string` or `[]bool`; no module aliasings apply,
|
||||||
// (or there just are not any mappings)
|
// (or there just are not any mappings)
|
||||||
|
132
vlib/v/fmt/fmt.v
132
vlib/v/fmt/fmt.v
@ -1019,7 +1019,7 @@ pub fn (mut f Fmt) enum_decl(node ast.EnumDecl) {
|
|||||||
|
|
||||||
pub fn (mut f Fmt) fn_decl(node ast.FnDecl) {
|
pub fn (mut f Fmt) fn_decl(node ast.FnDecl) {
|
||||||
f.attrs(node.attrs)
|
f.attrs(node.attrs)
|
||||||
f.fn_header(node)
|
f.write(f.table.stringify_fn_decl(&node, f.cur_mod, f.mod2alias))
|
||||||
// Handle trailing comments after fn header declarations
|
// Handle trailing comments after fn header declarations
|
||||||
if node.no_body && node.end_comments.len > 0 {
|
if node.no_body && node.end_comments.len > 0 {
|
||||||
first_comment := node.end_comments[0]
|
first_comment := node.end_comments[0]
|
||||||
@ -1043,136 +1043,6 @@ pub fn (mut f Fmt) fn_decl(node ast.FnDecl) {
|
|||||||
f.fn_body(node)
|
f.fn_body(node)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (mut f Fmt) fn_header(node ast.FnDecl) {
|
|
||||||
if node.is_pub {
|
|
||||||
f.write('pub ')
|
|
||||||
}
|
|
||||||
f.write('fn ')
|
|
||||||
pre_comments := node.comments.filter(it.pos.pos < node.name_pos.pos)
|
|
||||||
if pre_comments.len > 0 {
|
|
||||||
f.comments(pre_comments)
|
|
||||||
f.write(' ')
|
|
||||||
}
|
|
||||||
if node.is_method {
|
|
||||||
f.write('(')
|
|
||||||
mut styp := util.no_cur_mod(f.table.type_to_code(node.receiver.typ.clear_flag(.shared_f)),
|
|
||||||
f.cur_mod)
|
|
||||||
if node.rec_mut {
|
|
||||||
f.write(node.receiver.typ.share().str() + ' ')
|
|
||||||
styp = styp[1..] // remove &
|
|
||||||
}
|
|
||||||
f.write(node.receiver.name + ' ')
|
|
||||||
styp = util.no_cur_mod(styp, f.cur_mod)
|
|
||||||
if node.params[0].is_auto_rec {
|
|
||||||
styp = styp.trim('&')
|
|
||||||
}
|
|
||||||
f.write(styp + ') ')
|
|
||||||
} else if node.is_static_type_method {
|
|
||||||
mut styp := util.no_cur_mod(f.table.type_to_code(node.receiver.typ.clear_flag(.shared_f)),
|
|
||||||
f.cur_mod)
|
|
||||||
f.write(styp + '.')
|
|
||||||
}
|
|
||||||
mut name := if !node.is_method && node.language == .v {
|
|
||||||
node.name.all_after_last('.')
|
|
||||||
} else {
|
|
||||||
node.name
|
|
||||||
}
|
|
||||||
if node.is_static_type_method {
|
|
||||||
name = name.after('__static__')
|
|
||||||
}
|
|
||||||
f.write(name)
|
|
||||||
if name in ['+', '-', '*', '/', '%', '<', '>', '==', '!=', '>=', '<='] {
|
|
||||||
f.write(' ')
|
|
||||||
}
|
|
||||||
mut add_para_types := true
|
|
||||||
if node.generic_names.len > 0 {
|
|
||||||
if node.is_method {
|
|
||||||
sym := f.table.sym(node.params[0].typ)
|
|
||||||
if sym.info is ast.Struct {
|
|
||||||
generic_names := sym.info.generic_types.map(f.table.sym(it).name)
|
|
||||||
if generic_names == node.generic_names {
|
|
||||||
add_para_types = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if add_para_types {
|
|
||||||
f.write('[')
|
|
||||||
for i, gname in node.generic_names {
|
|
||||||
is_last := i == node.generic_names.len - 1
|
|
||||||
f.write(gname)
|
|
||||||
if !is_last {
|
|
||||||
f.write(', ')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
f.write(']')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
f.write('(')
|
|
||||||
for i, arg in node.params {
|
|
||||||
before_comments := arg.comments.filter(it.pos.pos < arg.pos.pos)
|
|
||||||
if before_comments.len > 0 {
|
|
||||||
f.comments(before_comments, level: .indent)
|
|
||||||
}
|
|
||||||
// skip receiver
|
|
||||||
if node.is_method && i == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if arg.is_hidden {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
is_last_arg := i == node.params.len - 1
|
|
||||||
is_type_only := arg.name == ''
|
|
||||||
should_add_type := true
|
|
||||||
if arg.is_mut {
|
|
||||||
f.write(arg.typ.share().str() + ' ')
|
|
||||||
}
|
|
||||||
f.write(arg.name)
|
|
||||||
arg_sym := f.table.sym(arg.typ)
|
|
||||||
if arg_sym.kind == .struct_ && (arg_sym.info as ast.Struct).is_anon {
|
|
||||||
f.write(' struct {')
|
|
||||||
struct_ := arg_sym.info as ast.Struct
|
|
||||||
for field in struct_.fields {
|
|
||||||
f.write(' ${field.name} ${f.table.type_to_str(field.typ)}')
|
|
||||||
if field.has_default_expr {
|
|
||||||
f.write(' = ${field.default_expr}')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if struct_.fields.len > 0 {
|
|
||||||
f.write(' ')
|
|
||||||
}
|
|
||||||
f.write('}')
|
|
||||||
} else {
|
|
||||||
mut s := f.table.type_to_str(arg.typ.clear_flag(.shared_f))
|
|
||||||
if arg.is_mut {
|
|
||||||
if s.starts_with('&') && ((!arg_sym.is_number() && arg_sym.kind != .bool)
|
|
||||||
|| node.language != .v) {
|
|
||||||
s = s[1..]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s = util.no_cur_mod(s, f.cur_mod)
|
|
||||||
s = ast.shorten_full_name_based_on_aliases(s, f.mod2alias)
|
|
||||||
if should_add_type {
|
|
||||||
if !is_type_only {
|
|
||||||
f.write(' ')
|
|
||||||
}
|
|
||||||
if node.is_variadic && is_last_arg {
|
|
||||||
f.write('...')
|
|
||||||
}
|
|
||||||
f.write(s)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !is_last_arg {
|
|
||||||
f.write(', ')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
f.write(')')
|
|
||||||
if node.return_type != ast.void_type {
|
|
||||||
sreturn_type := util.no_cur_mod(f.table.type_to_str(node.return_type), f.cur_mod)
|
|
||||||
short_sreturn_type := ast.shorten_full_name_based_on_aliases(sreturn_type, f.mod2alias)
|
|
||||||
f.write(' ${short_sreturn_type}')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn (mut f Fmt) anon_fn(node ast.AnonFn) {
|
pub fn (mut f Fmt) anon_fn(node ast.AnonFn) {
|
||||||
f.write(f.table.stringify_anon_decl(&node, f.cur_mod, f.mod2alias)) // `Expr` instead of `ast.Expr` in mod ast
|
f.write(f.table.stringify_anon_decl(&node, f.cur_mod, f.mod2alias)) // `Expr` instead of `ast.Expr` in mod ast
|
||||||
f.fn_body(node.decl)
|
f.fn_body(node.decl)
|
||||||
|
@ -3,6 +3,6 @@ fn /* main */ main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn // hi
|
fn // hi
|
||||||
print_hi() {
|
print_hi() {
|
||||||
println('hi')
|
println('hi')
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user