vfmt: add ability to use vfmt as a filter from stdin to stdout (#8432)
parent
7f5d654c3a
commit
d26ac0f6cb
|
@ -29,17 +29,6 @@ struct FormatOptions {
|
||||||
|
|
||||||
const (
|
const (
|
||||||
formatted_file_token = '\@\@\@' + 'FORMATTED_FILE: '
|
formatted_file_token = '\@\@\@' + 'FORMATTED_FILE: '
|
||||||
platform_and_file_extensions = [
|
|
||||||
['windows', '_windows.v'],
|
|
||||||
['linux', '_lin.v', '_linux.v', '_nix.v'],
|
|
||||||
['macos', '_mac.v', '_darwin.v'],
|
|
||||||
['freebsd', '_bsd.v', '_freebsd.v'],
|
|
||||||
['netbsd', '_bsd.v', '_netbsd.v'],
|
|
||||||
['openbsd', '_bsd.v', '_openbsd.v'],
|
|
||||||
['solaris', '_solaris.v'],
|
|
||||||
['haiku', '_haiku.v'],
|
|
||||||
['qnx', '_qnx.v'],
|
|
||||||
]
|
|
||||||
vtmp_folder = util.get_vtmp_folder()
|
vtmp_folder = util.get_vtmp_folder()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -100,7 +89,11 @@ fn main() {
|
||||||
}
|
}
|
||||||
files << file
|
files << file
|
||||||
}
|
}
|
||||||
if files.len == 0 {
|
if is_atty(0) == 0 && files.len == 0 {
|
||||||
|
foptions.format_pipe()
|
||||||
|
exit(0)
|
||||||
|
}
|
||||||
|
if files.len == 0 || '-help' in args || '--help' in args {
|
||||||
vhelp.show_topic('fmt')
|
vhelp.show_topic('fmt')
|
||||||
exit(0)
|
exit(0)
|
||||||
}
|
}
|
||||||
|
@ -183,6 +176,26 @@ fn (foptions &FormatOptions) format_file(file string) {
|
||||||
eprintln('$formatted_file_token$vfmt_output_path')
|
eprintln('$formatted_file_token$vfmt_output_path')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn (foptions &FormatOptions) format_pipe() {
|
||||||
|
mut prefs := pref.new_preferences()
|
||||||
|
prefs.is_fmt = true
|
||||||
|
if foptions.is_verbose {
|
||||||
|
eprintln('vfmt2 running fmt.fmt over stdin')
|
||||||
|
}
|
||||||
|
input_text := os.get_raw_lines_joined()
|
||||||
|
table := table.new_table()
|
||||||
|
// checker := checker.new_checker(table, prefs)
|
||||||
|
file_ast := parser.parse_text(input_text, '', table, .parse_comments, prefs, &ast.Scope{
|
||||||
|
parent: 0
|
||||||
|
})
|
||||||
|
// checker.check(file_ast)
|
||||||
|
formatted_content := fmt.fmt(file_ast, table, foptions.is_debug)
|
||||||
|
print(formatted_content)
|
||||||
|
if foptions.is_verbose {
|
||||||
|
eprintln('fmt.fmt worked and $formatted_content.len bytes were written to stdout.')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn print_compiler_options(compiler_params &pref.Preferences) {
|
fn print_compiler_options(compiler_params &pref.Preferences) {
|
||||||
eprintln(' os: ' + compiler_params.os.str())
|
eprintln(' os: ' + compiler_params.os.str())
|
||||||
eprintln(' ccompiler: $compiler_params.ccompiler')
|
eprintln(' ccompiler: $compiler_params.ccompiler')
|
||||||
|
@ -264,17 +277,6 @@ fn (f FormatOptions) str() string {
|
||||||
' is_verify: $f.is_verify" }'
|
' is_verify: $f.is_verify" }'
|
||||||
}
|
}
|
||||||
|
|
||||||
fn file_to_target_os(file string) string {
|
|
||||||
for extensions in platform_and_file_extensions {
|
|
||||||
for ext in extensions {
|
|
||||||
if file.ends_with(ext) {
|
|
||||||
return extensions[0]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ''
|
|
||||||
}
|
|
||||||
|
|
||||||
fn file_to_mod_name_and_is_module_file(file string) (string, bool) {
|
fn file_to_mod_name_and_is_module_file(file string) (string, bool) {
|
||||||
mut mod_name := 'main'
|
mut mod_name := 'main'
|
||||||
mut is_module_file := false
|
mut is_module_file := false
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
Usage:
|
Usage:
|
||||||
v fmt [options] path_to_source.v [path_to_other_source.v]
|
v fmt [options] path_to_source.v [path_to_other_source.v]
|
||||||
v fmt [options] path/to/dir [path/to/other_dir]
|
v fmt [options] path/to/dir [path/to/other_dir]
|
||||||
|
cat source.v | v fmt
|
||||||
|
Read source code from stdin, output formatted file to stdout.
|
||||||
|
|
||||||
Formats the given V source files or recursively formats all files in the directory,
|
Formats the given V source files or recursively formats all files in the directory,
|
||||||
then prints their formatted source to stdout.
|
then prints their formatted source to stdout.
|
||||||
|
|
19
vlib/os/os.v
19
vlib/os/os.v
|
@ -265,6 +265,25 @@ pub fn get_lines_joined() string {
|
||||||
return inputstr
|
return inputstr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get_raw_lines_joined reads *all* input lines from stdin.
|
||||||
|
// It returns them as one large string. NB: unlike os.get_lines_joined,
|
||||||
|
// empty lines (that contain only `\r\n` or `\n`), will be present in
|
||||||
|
// the output.
|
||||||
|
// Reading is stopped, only on EOF of stdin.
|
||||||
|
pub fn get_raw_lines_joined() string {
|
||||||
|
mut line := ''
|
||||||
|
mut lines := []string{}
|
||||||
|
for {
|
||||||
|
line = get_raw_line()
|
||||||
|
if line.len <= 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
lines << line
|
||||||
|
}
|
||||||
|
res := lines.join('')
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
// user_os returns current user operating system name.
|
// user_os returns current user operating system name.
|
||||||
pub fn user_os() string {
|
pub fn user_os() string {
|
||||||
$if linux {
|
$if linux {
|
||||||
|
|
|
@ -457,15 +457,7 @@ pub fn parse_args(args []string) (&Preferences, string) {
|
||||||
output_option = '-o "$tmp_exe_file_path"'
|
output_option = '-o "$tmp_exe_file_path"'
|
||||||
}
|
}
|
||||||
tmp_v_file_path := '${tmp_file_path}.v'
|
tmp_v_file_path := '${tmp_file_path}.v'
|
||||||
mut lines := []string{}
|
contents := os.get_raw_lines_joined()
|
||||||
for {
|
|
||||||
iline := os.get_raw_line()
|
|
||||||
if iline.len == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
lines << iline
|
|
||||||
}
|
|
||||||
contents := lines.join('')
|
|
||||||
os.write_file(tmp_v_file_path, contents) or {
|
os.write_file(tmp_v_file_path, contents) or {
|
||||||
panic('Failed to create temporary file $tmp_v_file_path')
|
panic('Failed to create temporary file $tmp_v_file_path')
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue