74 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			V
		
	
	
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
 | 
						|
// Use of this source code is governed by an MIT license that can be found in the LICENSE file.
 | 
						|
module main
 | 
						|
 | 
						|
import v.vet
 | 
						|
import v.pref
 | 
						|
import v.parser
 | 
						|
import v.util
 | 
						|
import v.table
 | 
						|
import os
 | 
						|
import os.cmdline
 | 
						|
 | 
						|
struct VetOptions {
 | 
						|
	is_verbose bool
 | 
						|
	errors     []string
 | 
						|
}
 | 
						|
 | 
						|
fn (vet_options &VetOptions) vprintln(s string) {
 | 
						|
	if !vet_options.is_verbose {
 | 
						|
		return
 | 
						|
	}
 | 
						|
	println(s)
 | 
						|
}
 | 
						|
 | 
						|
fn main() {
 | 
						|
	args := util.join_env_vflags_and_os_args()
 | 
						|
	paths := cmdline.only_non_options(cmdline.options_after(args, ['vet']))
 | 
						|
	vet_options := VetOptions{
 | 
						|
		is_verbose: '-verbose' in args || '-v' in args
 | 
						|
	}
 | 
						|
	for path in paths {
 | 
						|
		if !os.exists(path) {
 | 
						|
			eprintln('File/folder $path does not exist')
 | 
						|
			continue
 | 
						|
		}
 | 
						|
		if path.ends_with('_test.v') || (path.contains('/tests/') && !path.contains('vlib/v/vet/')) {
 | 
						|
			eprintln('skipping $path')
 | 
						|
			continue
 | 
						|
		}
 | 
						|
		if path.ends_with('.v') || path.ends_with('.vv') {
 | 
						|
			vet_options.vet_file(path)
 | 
						|
		} else if os.is_dir(path) {
 | 
						|
			vet_options.vprintln("vetting folder '$path'...")
 | 
						|
			vfiles := os.walk_ext(path, '.v')
 | 
						|
			vvfiles := os.walk_ext(path, '.vv')
 | 
						|
			mut files := []string{}
 | 
						|
			files << vfiles
 | 
						|
			files << vvfiles
 | 
						|
			for file in files {
 | 
						|
				if file.ends_with('_test.v') || file.contains('/tests/') { // TODO copy pasta
 | 
						|
					continue
 | 
						|
				}
 | 
						|
				vet_options.vet_file(file)
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if vet_options.errors.len > 0 {
 | 
						|
		for err in vet_options.errors {
 | 
						|
			eprintln(err)
 | 
						|
		}
 | 
						|
		eprintln('NB: You can run `v fmt -w file.v` to fix these automatically')
 | 
						|
		exit(1)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
fn (vet_options &VetOptions) vet_file(path string) {
 | 
						|
	mut prefs := pref.new_preferences()
 | 
						|
	prefs.is_vet = true
 | 
						|
	table := table.new_table()
 | 
						|
	vet_options.vprintln("vetting file '$path'...")
 | 
						|
	file_ast := parser.parse_vet_file(path, table, prefs, vet_options.errors)
 | 
						|
	vet.vet(file_ast, table, true)
 | 
						|
}
 |