v/cmd/tools/vnames.v

86 lines
1.8 KiB
V
Raw Normal View History

module main
2019-12-23 11:09:22 +01:00
import (
os
flag
strings
compiler
2020-02-09 10:08:04 +01:00
v.pref
2019-12-23 11:09:22 +01:00
)
const (
tool_version = '0.0.1'
tool_description = ' Extracts the function names declared in a v file.'
)
fn f_to_string(fmod string, f compiler.Fn) ?string {
svisibility := if f.is_public {
'public'
}else{
'private'
}
if fmod != f.v_fn_module() { return none }
if fmod == 'builtin' {
return '$svisibility\t' + f.v_fn_name()
}
return '$svisibility\t' + f.v_fn_module() + '.' + f.v_fn_name()
}
fn analyze_v_file(file string) {
println('')
hash := strings.repeat(`#`, (76 - file.len) / 2)
println('$hash $file $hash')
// main work:
2020-02-09 10:08:04 +01:00
mut pref := &pref.Preferences{
path: file
}
pref.fill_with_defaults()
mut v := compiler.new_v(pref)
v.add_v_files_to_compile()
for f in v.files { v.parse(f, .decl) }
fi := v.get_file_parser_index( file ) or { panic(err) }
fmod := v.parsers[fi].mod
2020-03-07 22:26:26 +01:00
// output:
mut fns :=[]string
for _, f in v.table.fns {
fname := f_to_string(fmod, f) or { continue }
fns << fname
}
fns.sort()
for f in fns { println(f) }
2020-03-07 22:26:26 +01:00
}
fn main(){
toolexe := os.executable()
2020-03-07 22:26:26 +01:00
compiler.set_vroot_folder(os.dir(os.dir(os.dir(toolexe))))
2019-12-23 11:09:22 +01:00
mut fp := flag.new_flag_parser(os.args)
2020-03-07 22:26:26 +01:00
fp.application(os.filename(toolexe))
fp.version( tool_version )
fp.description( tool_description )
fp.arguments_description('FILE.v/FOLDER [FILE.v/FOLDER]...')
fp.limit_free_args_to_at_least(1)
fp.skip_executable()
2020-03-07 22:26:26 +01:00
show_help:=fp.bool_('help', `h`, false, 'Show this help screen\n')
if( show_help ){
println( fp.usage() )
exit(0)
}
2020-03-07 22:26:26 +01:00
mut files := []string
locations := fp.finalize() or { eprintln('Error: ' + err) exit(1) }
for xloc in locations {
loc := os.realpath(xloc)
xfiles := if os.is_dir(loc){ os.walk_ext(loc,'.v') } else { [loc] }
filtered_files := xfiles.filter(!it.ends_with('_js.v'))
files << filtered_files
}
for file in files {
analyze_v_file(file)
}
}