mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
tools: new tool to extracts function names declared in V files
This commit is contained in:
committed by
Alexander Medvednikov
parent
cd8b0d04bb
commit
eef73eea22
76
tools/vnames.v
Normal file
76
tools/vnames.v
Normal file
@@ -0,0 +1,76 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import flag
|
||||
import compiler
|
||||
|
||||
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('')
|
||||
println('###################### $file ######################')
|
||||
|
||||
// main work:
|
||||
mut v := compiler.new_v_compiler_with_args([file])
|
||||
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(toolexe)) )
|
||||
|
||||
mut fp := flag.new_flag_parser(os.args)
|
||||
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()
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user