v.builder: refactor to make adding other post checker stages easier
parent
2eafea6308
commit
adffae4453
|
@ -9,6 +9,7 @@ import v.vmod
|
||||||
import v.checker
|
import v.checker
|
||||||
import v.parser
|
import v.parser
|
||||||
import v.depgraph
|
import v.depgraph
|
||||||
|
import v.markused
|
||||||
|
|
||||||
pub struct Builder {
|
pub struct Builder {
|
||||||
pub:
|
pub:
|
||||||
|
@ -65,6 +66,34 @@ pub fn new_builder(pref &pref.Preferences) Builder {
|
||||||
// max_nr_errors: pref.error_limit ?? 100 TODO potential syntax?
|
// max_nr_errors: pref.error_limit ?? 100 TODO potential syntax?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn (mut b Builder) front_stages(v_files []string) ? {
|
||||||
|
util.timing_start('PARSE')
|
||||||
|
b.parsed_files = parser.parse_files(v_files, b.table, b.pref, b.global_scope)
|
||||||
|
b.parse_imports()
|
||||||
|
util.get_timers().show('SCAN')
|
||||||
|
util.get_timers().show('PARSE')
|
||||||
|
util.get_timers().show_if_exists('PARSE stmt')
|
||||||
|
if b.pref.only_check_syntax {
|
||||||
|
return error('stop_after_parser')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (mut b Builder) middle_stages() ? {
|
||||||
|
util.timing_start('CHECK')
|
||||||
|
b.table.generic_struct_insts_to_concrete()
|
||||||
|
b.checker.check_files(b.parsed_files)
|
||||||
|
util.timing_measure('CHECK')
|
||||||
|
b.print_warnings_and_errors()
|
||||||
|
if b.pref.skip_unused {
|
||||||
|
markused.mark_used(mut b.table, b.pref, b.parsed_files)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (mut b Builder) front_and_middle_stages(v_files []string) ? {
|
||||||
|
b.front_stages(v_files) ?
|
||||||
|
b.middle_stages() ?
|
||||||
|
}
|
||||||
|
|
||||||
// parse all deps from already parsed files
|
// parse all deps from already parsed files
|
||||||
pub fn (mut b Builder) parse_imports() {
|
pub fn (mut b Builder) parse_imports() {
|
||||||
mut done_imports := []string{}
|
mut done_imports := []string{}
|
||||||
|
|
|
@ -1,33 +1,12 @@
|
||||||
module builder
|
module builder
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import v.parser
|
|
||||||
import v.pref
|
import v.pref
|
||||||
import v.util
|
import v.util
|
||||||
import v.gen.c
|
import v.gen.c
|
||||||
import v.markused
|
|
||||||
|
|
||||||
pub fn (mut b Builder) gen_c(v_files []string) string {
|
pub fn (mut b Builder) gen_c(v_files []string) string {
|
||||||
util.timing_start('PARSE')
|
b.front_and_middle_stages(v_files) or { return '' }
|
||||||
b.parsed_files = parser.parse_files(v_files, b.table, b.pref, b.global_scope)
|
|
||||||
b.parse_imports()
|
|
||||||
util.get_timers().show('SCAN')
|
|
||||||
util.get_timers().show('PARSE')
|
|
||||||
util.get_timers().show_if_exists('PARSE stmt')
|
|
||||||
if b.pref.only_check_syntax {
|
|
||||||
return ''
|
|
||||||
}
|
|
||||||
|
|
||||||
util.timing_start('CHECK')
|
|
||||||
b.table.generic_struct_insts_to_concrete()
|
|
||||||
b.checker.check_files(b.parsed_files)
|
|
||||||
util.timing_measure('CHECK')
|
|
||||||
|
|
||||||
if b.pref.skip_unused {
|
|
||||||
markused.mark_used(mut b.table, b.pref, b.parsed_files)
|
|
||||||
}
|
|
||||||
|
|
||||||
b.print_warnings_and_errors()
|
|
||||||
// TODO: move gen.cgen() to c.gen()
|
// TODO: move gen.cgen() to c.gen()
|
||||||
util.timing_start('C GEN')
|
util.timing_start('C GEN')
|
||||||
res := c.gen(b.parsed_files, b.table, b.pref)
|
res := c.gen(b.parsed_files, b.table, b.pref)
|
||||||
|
|
|
@ -1,29 +1,12 @@
|
||||||
module builder
|
module builder
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import v.parser
|
|
||||||
import v.pref
|
import v.pref
|
||||||
import v.util
|
import v.util
|
||||||
import v.gen.js
|
import v.gen.js
|
||||||
import v.markused
|
|
||||||
|
|
||||||
pub fn (mut b Builder) gen_js(v_files []string) string {
|
pub fn (mut b Builder) gen_js(v_files []string) string {
|
||||||
util.timing_start('PARSE')
|
b.front_and_middle_stages(v_files) or { return '' }
|
||||||
b.parsed_files = parser.parse_files(v_files, b.table, b.pref, b.global_scope)
|
|
||||||
b.parse_imports()
|
|
||||||
util.get_timers().show('SCAN')
|
|
||||||
util.get_timers().show('PARSE')
|
|
||||||
util.get_timers().show_if_exists('PARSE stmt')
|
|
||||||
//
|
|
||||||
util.timing_start('CHECK')
|
|
||||||
b.checker.check_files(b.parsed_files)
|
|
||||||
util.timing_measure('CHECK')
|
|
||||||
//
|
|
||||||
if b.pref.skip_unused {
|
|
||||||
markused.mark_used(mut b.table, b.pref, b.parsed_files)
|
|
||||||
}
|
|
||||||
b.print_warnings_and_errors()
|
|
||||||
//
|
|
||||||
util.timing_start('JS GEN')
|
util.timing_start('JS GEN')
|
||||||
res := js.gen(b.parsed_files, b.table, b.pref)
|
res := js.gen(b.parsed_files, b.table, b.pref)
|
||||||
util.timing_measure('JS GEN')
|
util.timing_measure('JS GEN')
|
||||||
|
|
|
@ -1,29 +1,14 @@
|
||||||
module builder
|
module builder
|
||||||
|
|
||||||
import v.parser
|
|
||||||
import v.pref
|
import v.pref
|
||||||
import v.util
|
import v.util
|
||||||
import v.gen.native
|
import v.gen.native
|
||||||
import v.markused
|
|
||||||
|
|
||||||
pub fn (mut b Builder) build_native(v_files []string, out_file string) {
|
pub fn (mut b Builder) build_native(v_files []string, out_file string) {
|
||||||
$if !linux && !macos {
|
if b.pref.os != .linux || b.pref.os != .macos {
|
||||||
eprintln('Warning: v -native can only generate macOS and Linux binaries for now')
|
eprintln('Warning: v -native can only generate macOS and Linux binaries for now')
|
||||||
}
|
}
|
||||||
util.timing_start('PARSE')
|
b.front_and_middle_stages(v_files) or { return }
|
||||||
b.parsed_files = parser.parse_files(v_files, b.table, b.pref, b.global_scope)
|
|
||||||
b.parse_imports()
|
|
||||||
util.get_timers().show('SCAN')
|
|
||||||
util.get_timers().show('PARSE')
|
|
||||||
util.get_timers().show_if_exists('PARSE stmt')
|
|
||||||
//
|
|
||||||
util.timing_start('CHECK')
|
|
||||||
b.checker.check_files(b.parsed_files)
|
|
||||||
util.timing_measure('CHECK')
|
|
||||||
//
|
|
||||||
if b.pref.skip_unused {
|
|
||||||
markused.mark_used(mut b.table, b.pref, b.parsed_files)
|
|
||||||
}
|
|
||||||
util.timing_start('Native GEN')
|
util.timing_start('Native GEN')
|
||||||
b.stats_lines, b.stats_bytes = native.gen(b.parsed_files, b.table, out_file, b.pref)
|
b.stats_lines, b.stats_bytes = native.gen(b.parsed_files, b.table, out_file, b.pref)
|
||||||
util.timing_measure('Native GEN')
|
util.timing_measure('Native GEN')
|
||||||
|
|
|
@ -9,12 +9,10 @@ import v.pref
|
||||||
// mark_used walks the AST, starting at main() and marks all used fns transitively
|
// mark_used walks the AST, starting at main() and marks all used fns transitively
|
||||||
pub fn mark_used(mut table ast.Table, pref &pref.Preferences, ast_files []ast.File) {
|
pub fn mark_used(mut table ast.Table, pref &pref.Preferences, ast_files []ast.File) {
|
||||||
mut all_fns, all_consts := all_fn_and_const(ast_files)
|
mut all_fns, all_consts := all_fn_and_const(ast_files)
|
||||||
|
|
||||||
util.timing_start(@METHOD)
|
util.timing_start(@METHOD)
|
||||||
defer {
|
defer {
|
||||||
util.timing_measure(@METHOD)
|
util.timing_measure(@METHOD)
|
||||||
}
|
}
|
||||||
|
|
||||||
mut all_fn_root_names := [
|
mut all_fn_root_names := [
|
||||||
'main.main',
|
'main.main',
|
||||||
'__new_array',
|
'__new_array',
|
||||||
|
|
Loading…
Reference in New Issue