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.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)
 | 
						|
	}
 | 
						|
}
 |