mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
tools: support VAUTOFIX=1 v check-md vlib/term/README.md
for fixing unformatted examples without manual edits
This commit is contained in:
parent
064e35fbc4
commit
007430ef2b
@ -8,7 +8,6 @@ import os.cmdline
|
|||||||
import rand
|
import rand
|
||||||
import term
|
import term
|
||||||
import vhelp
|
import vhelp
|
||||||
import v.pref
|
|
||||||
import regex
|
import regex
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -23,6 +22,8 @@ const (
|
|||||||
non_option_args = cmdline.only_non_options(os.args[2..])
|
non_option_args = cmdline.only_non_options(os.args[2..])
|
||||||
is_verbose = os.getenv('VERBOSE') != ''
|
is_verbose = os.getenv('VERBOSE') != ''
|
||||||
vcheckfolder = os.join_path(os.temp_dir(), 'v', 'vcheck_$os.getuid()')
|
vcheckfolder = os.join_path(os.temp_dir(), 'v', 'vcheck_$os.getuid()')
|
||||||
|
should_autofix = os.getenv('VAUTOFIX') != ''
|
||||||
|
vexe = @VEXE
|
||||||
)
|
)
|
||||||
|
|
||||||
struct CheckResult {
|
struct CheckResult {
|
||||||
@ -155,8 +156,8 @@ enum MDFileParserState {
|
|||||||
|
|
||||||
struct MDFile {
|
struct MDFile {
|
||||||
path string
|
path string
|
||||||
lines []string
|
|
||||||
mut:
|
mut:
|
||||||
|
lines []string
|
||||||
examples []VCodeExample
|
examples []VCodeExample
|
||||||
current VCodeExample
|
current VCodeExample
|
||||||
state MDFileParserState = .markdown
|
state MDFileParserState = .markdown
|
||||||
@ -422,8 +423,7 @@ fn get_fmt_exit_code(vfile string, vexe string) int {
|
|||||||
fn (mut f MDFile) check_examples() CheckResult {
|
fn (mut f MDFile) check_examples() CheckResult {
|
||||||
mut errors := 0
|
mut errors := 0
|
||||||
mut oks := 0
|
mut oks := 0
|
||||||
vexe := pref.vexe_path()
|
recheck_all_examples: for e in f.examples {
|
||||||
for e in f.examples {
|
|
||||||
if e.command == 'ignore' {
|
if e.command == 'ignore' {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -451,8 +451,10 @@ fn (mut f MDFile) check_examples() CheckResult {
|
|||||||
if res != 0 {
|
if res != 0 {
|
||||||
eprintln(eline(f.path, e.sline, 0, 'example failed to compile'))
|
eprintln(eline(f.path, e.sline, 0, 'example failed to compile'))
|
||||||
}
|
}
|
||||||
if fmt_res != 0 {
|
f.report_not_formatted_example_if_needed(e, fmt_res, vfile) or {
|
||||||
eprintln(eline(f.path, e.sline, 0, 'example is not formatted'))
|
unsafe {
|
||||||
|
goto recheck_all_examples
|
||||||
|
}
|
||||||
}
|
}
|
||||||
eprintln(vcontent)
|
eprintln(vcontent)
|
||||||
should_cleanup_vfile = false
|
should_cleanup_vfile = false
|
||||||
@ -467,8 +469,10 @@ fn (mut f MDFile) check_examples() CheckResult {
|
|||||||
if res != 0 {
|
if res != 0 {
|
||||||
eprintln(eline(f.path, e.sline, 0, 'example failed to generate C code'))
|
eprintln(eline(f.path, e.sline, 0, 'example failed to generate C code'))
|
||||||
}
|
}
|
||||||
if fmt_res != 0 {
|
f.report_not_formatted_example_if_needed(e, fmt_res, vfile) or {
|
||||||
eprintln(eline(f.path, e.sline, 0, 'example is not formatted'))
|
unsafe {
|
||||||
|
goto recheck_all_examples
|
||||||
|
}
|
||||||
}
|
}
|
||||||
eprintln(vcontent)
|
eprintln(vcontent)
|
||||||
should_cleanup_vfile = false
|
should_cleanup_vfile = false
|
||||||
@ -483,8 +487,10 @@ fn (mut f MDFile) check_examples() CheckResult {
|
|||||||
if res != 0 {
|
if res != 0 {
|
||||||
eprintln(eline(f.path, e.sline, 0, '`example failed to compile with -enable-globals'))
|
eprintln(eline(f.path, e.sline, 0, '`example failed to compile with -enable-globals'))
|
||||||
}
|
}
|
||||||
if fmt_res != 0 {
|
f.report_not_formatted_example_if_needed(e, fmt_res, vfile) or {
|
||||||
eprintln(eline(f.path, e.sline, 0, '`example is not formatted'))
|
unsafe {
|
||||||
|
goto recheck_all_examples
|
||||||
|
}
|
||||||
}
|
}
|
||||||
eprintln(vcontent)
|
eprintln(vcontent)
|
||||||
should_cleanup_vfile = false
|
should_cleanup_vfile = false
|
||||||
@ -499,8 +505,10 @@ fn (mut f MDFile) check_examples() CheckResult {
|
|||||||
if res != 0 {
|
if res != 0 {
|
||||||
eprintln(eline(f.path, e.sline, 0, 'example failed to compile with -live'))
|
eprintln(eline(f.path, e.sline, 0, 'example failed to compile with -live'))
|
||||||
}
|
}
|
||||||
if fmt_res != 0 {
|
f.report_not_formatted_example_if_needed(e, fmt_res, vfile) or {
|
||||||
eprintln(eline(f.path, e.sline, 0, 'example is not formatted'))
|
unsafe {
|
||||||
|
goto recheck_all_examples
|
||||||
|
}
|
||||||
}
|
}
|
||||||
eprintln(vcontent)
|
eprintln(vcontent)
|
||||||
should_cleanup_vfile = false
|
should_cleanup_vfile = false
|
||||||
@ -515,8 +523,10 @@ fn (mut f MDFile) check_examples() CheckResult {
|
|||||||
if res == 0 {
|
if res == 0 {
|
||||||
eprintln(eline(f.path, e.sline, 0, '`failcompile` example compiled'))
|
eprintln(eline(f.path, e.sline, 0, '`failcompile` example compiled'))
|
||||||
}
|
}
|
||||||
if fmt_res != 0 {
|
f.report_not_formatted_example_if_needed(e, fmt_res, vfile) or {
|
||||||
eprintln(eline(f.path, e.sline, 0, 'example is not formatted'))
|
unsafe {
|
||||||
|
goto recheck_all_examples
|
||||||
|
}
|
||||||
}
|
}
|
||||||
eprintln(vcontent)
|
eprintln(vcontent)
|
||||||
should_cleanup_vfile = false
|
should_cleanup_vfile = false
|
||||||
@ -531,8 +541,10 @@ fn (mut f MDFile) check_examples() CheckResult {
|
|||||||
if res != 0 {
|
if res != 0 {
|
||||||
eprintln(eline(f.path, e.sline, 0, '`oksyntax` example with invalid syntax'))
|
eprintln(eline(f.path, e.sline, 0, '`oksyntax` example with invalid syntax'))
|
||||||
}
|
}
|
||||||
if fmt_res != 0 {
|
f.report_not_formatted_example_if_needed(e, fmt_res, vfile) or {
|
||||||
eprintln(eline(f.path, e.sline, 0, '`oksyntax` example is not formatted'))
|
unsafe {
|
||||||
|
goto recheck_all_examples
|
||||||
|
}
|
||||||
}
|
}
|
||||||
eprintln(vcontent)
|
eprintln(vcontent)
|
||||||
should_cleanup_vfile = false
|
should_cleanup_vfile = false
|
||||||
@ -543,7 +555,11 @@ fn (mut f MDFile) check_examples() CheckResult {
|
|||||||
}
|
}
|
||||||
'okfmt' {
|
'okfmt' {
|
||||||
if fmt_res != 0 {
|
if fmt_res != 0 {
|
||||||
eprintln(eline(f.path, e.sline, 0, 'okfmt example is not formatted'))
|
f.report_not_formatted_example_if_needed(e, fmt_res, vfile) or {
|
||||||
|
unsafe {
|
||||||
|
goto recheck_all_examples
|
||||||
|
}
|
||||||
|
}
|
||||||
eprintln(vcontent)
|
eprintln(vcontent)
|
||||||
should_cleanup_vfile = false
|
should_cleanup_vfile = false
|
||||||
errors++
|
errors++
|
||||||
@ -594,3 +610,51 @@ fn clear_previous_line() {
|
|||||||
}
|
}
|
||||||
term.clear_previous_line()
|
term.clear_previous_line()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn (mut f MDFile) report_not_formatted_example_if_needed(e VCodeExample, fmt_res int, vfile string) ! {
|
||||||
|
if fmt_res == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
eprintln(eline(f.path, e.sline, 0, 'example is not formatted'))
|
||||||
|
if !should_autofix {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
f.autofix_example(e, vfile) or {
|
||||||
|
if err is ExampleWasRewritten {
|
||||||
|
eprintln('>> f.path: $f.path | example from $e.sline to $e.eline was re-formated by vfmt')
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
eprintln('>> f.path: $f.path | encountered error while autofixing the example: $err')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ExampleWasRewritten {
|
||||||
|
Error
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (mut f MDFile) autofix_example(e VCodeExample, vfile string) ! {
|
||||||
|
eprintln('>>> AUTOFIXING f.path: $f.path | e.sline: $e.sline | vfile: $vfile')
|
||||||
|
res := cmdexecute('${os.quoted_path(vexe)} fmt -w ${os.quoted_path(vfile)}')
|
||||||
|
if res != 0 {
|
||||||
|
return error('could not autoformat the example')
|
||||||
|
}
|
||||||
|
formatted_content_lines := os.read_lines(vfile) or { return }
|
||||||
|
mut new_lines := []string{}
|
||||||
|
new_lines << f.lines#[0..e.sline + 1]
|
||||||
|
new_lines << formatted_content_lines
|
||||||
|
new_lines << f.lines#[e.eline..]
|
||||||
|
f.update_examples(new_lines)!
|
||||||
|
os.rm(vfile) or {}
|
||||||
|
return ExampleWasRewritten{}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (mut f MDFile) update_examples(new_lines []string) ! {
|
||||||
|
os.write_file(f.path, new_lines.join('\n'))!
|
||||||
|
f.lines = new_lines
|
||||||
|
f.examples = []
|
||||||
|
f.current = VCodeExample{}
|
||||||
|
f.state = .markdown
|
||||||
|
for j, line in f.lines {
|
||||||
|
f.parse_line(j, line)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user