mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
86 lines
1.8 KiB
V
86 lines
1.8 KiB
V
module main
|
|
|
|
import (
|
|
os
|
|
flag
|
|
strings
|
|
compiler
|
|
v.pref
|
|
)
|
|
|
|
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:
|
|
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
|
|
|
|
// 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) }
|
|
|
|
}
|
|
|
|
fn main(){
|
|
toolexe := os.executable()
|
|
compiler.set_vroot_folder(os.dir(os.dir(os.dir(toolexe))))
|
|
|
|
mut fp := flag.new_flag_parser(os.args)
|
|
fp.application(os.file_name(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()
|
|
show_help:=fp.bool('help', `h`, false, 'Show this help screen\n')
|
|
if( show_help ){
|
|
println( fp.usage() )
|
|
exit(0)
|
|
}
|
|
|
|
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)
|
|
}
|
|
}
|