From 12ebed05897108ab7d81258e906cd4d7ddff080a Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Sun, 15 Dec 2019 04:51:18 +0300 Subject: [PATCH] error on an incorrect V command --- v.v | 135 ++++++++++++++++++++++++------------------- vlib/compiler/main.v | 4 +- 2 files changed, 79 insertions(+), 60 deletions(-) diff --git a/v.v b/v.v index f9ddf2192d..7a20e78dc6 100755 --- a/v.v +++ b/v.v @@ -12,6 +12,12 @@ import ( //time ) +const ( + known_commands = ['run', 'build', 'version', 'doc'] + simple_tools = ['up', 'create', 'test', 'test-compiler', 'build-tools', + 'build-examples', 'build-vbinaries'] +) + fn main() { //t := time.ticks() //defer { println(time.ticks() - t) } @@ -22,81 +28,37 @@ fn main() { // NOT passed through VFLAGS, otherwise the naked `v` invocation for // the repl does not work when you have VFLAGS with -cc or -cflags set // which may be surprising to v users. - stuff_after_executable := os.args[1..] - commands := stuff_after_executable.filter(!it.starts_with('-')) - - simple_tools := ['up', 'create', 'test', 'test-compiler', 'build-tools', 'build-examples', 'build-vbinaries'] - for tool in simple_tools { - if tool in commands { - compiler.launch_tool('v$tool') - return - } + command := if os.args.len > 1 { os.args[1] } else { '' } + // external tool + if command in simple_tools { + compiler.launch_tool('v' + command) + return + } + // v run, v doc, etc + if !command.starts_with('-') && !os.exists(command) { + v_command(command, args) } - // Print the version and exit. - if '-v' in options || '--version' in options || 'version' in commands { + if '-v' in options || '--version' in options { version_hash := compiler.vhash() println('V $compiler.Version $version_hash') return } - else if '-h' in options || '--help' in options || 'help' in commands { + else if '-h' in options || '--help' in options { println(compiler.help_text) return } - else if 'translate' in commands { - println('Translating C to V will be available in V 0.3 (January)') - return - } - else if 'search' in commands || 'install' in commands || 'update' in commands || 'remove' in commands { - compiler.launch_tool('vpm') - return - } - else if ('get' in commands) { // obsoleted - println('use `v install` to install modules from vpm.vlang.io ') - return - } - else if 'symlink' in commands { - compiler.create_symlink() - return - } - // TODO quit if the v compiler is too old - // u := os.file_last_mod_unix('v') - // If there's no tmp path with current version yet, the user must be using a pre-built package - // - // Just fmt and exit - else if 'fmt' in commands { - compiler.vfmt(args) - return - } // No args? REPL - else if 'runrepl' in commands || commands.len == 0 || (args.len == 2 && args[1] == '-') { + else if command == '' || (args.len == 2 && args[1] == '-') { compiler.launch_tool('vrepl') return } - // Generate the docs and exit - else if 'doc' in commands { - vexe := os.executable() - vdir := os.dir(os.executable()) - os.chdir(vdir) - mod := args.last() - os.system('$vexe build module vlib$os.path_separator' + args.last()) - txt := os.read_file(filepath.join(compiler.v_modules_path, 'vlib', '${mod}.vh')) or { - panic(err) - } - println(txt) - exit(0) - // v.gen_doc_html_for_module(args.last()) - } - else { - //println('unknown command/argument\n') - //println(compiler.help_text) - } // Construct the V object from command line arguments mut v := compiler.new_v(args) if v.pref.is_verbose { println(args) } - if 'run' in args { + if command == 'run' { // always recompile for now, too error prone to skip recompilation otherwise // for example for -repl usage, especially when piping lines to v v.compile() @@ -110,7 +72,7 @@ fn main() { } if v.pref.is_stats { tmark.stop() - println( 'compilation took: ' + tmark.total_duration().str() + 'ms') + println('compilation took: ' + tmark.total_duration().str() + 'ms') } if v.pref.is_test { v.run_compiled_executable_and_exit() @@ -118,3 +80,60 @@ fn main() { v.finalize_compilation() } +fn v_command(command string, args []string) { + match command { + '', '.', 'run' { + + } + 'version' { + println('V $compiler.Version $compiler.vhash()') + return + } + 'help' { + println(compiler.help_text) + return + } + 'translate' { + println('Translating C to V will be available in V 0.3 (January)') + return + } + 'search', 'install', 'update' { + compiler.launch_tool('vpm') + } + 'get' { + println('use `v install` to install modules from vpm.vlang.io ') + return + } + 'symlink' { + compiler.create_symlink() + return + } + 'fmt' { + compiler.vfmt(args) + return + } + 'runrepl' { + compiler.launch_tool('vrepl') + return + } + 'doc' { + vexe := os.executable() + vdir := os.dir(os.executable()) + os.chdir(vdir) + mod := args.last() + os.system('$vexe build module vlib$os.path_separator' + args.last()) + txt := os.read_file(filepath.join(compiler.v_modules_path, 'vlib', '${mod}.vh')) or { + panic(err) + } + println(txt) + exit(0) + // v.gen_doc_html_for_module(args.last()) + } + else { + println('v $command: unknown command') + println('Run "v help" for usage.') + return + } + } +} + diff --git a/vlib/compiler/main.v b/vlib/compiler/main.v index 582fb04704..e57a714d69 100644 --- a/vlib/compiler/main.v +++ b/vlib/compiler/main.v @@ -510,7 +510,7 @@ pub fn (v mut V) generate_main() { if test_fn_names.len == 0 { verror('test files need to have at least one test function') } - + // Generate a C `main`, which calls every single test function v.gen_main_start(false) @@ -782,7 +782,7 @@ pub fn (v &V) get_user_files() []string { user_files << single_test_v_file dir = os.basedir( single_test_v_file ) } - + if dir.ends_with('.v') || dir.ends_with('.vsh') { single_v_file := dir // Just compile one file and get parent dir