From adffae44531746b6f31fb15d8dd0715aa91dd4fd Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Thu, 6 May 2021 14:26:10 +0300 Subject: [PATCH] v.builder: refactor to make adding other post checker stages easier --- vlib/v/builder/builder.v | 29 +++++++++++++++++++++++++++++ vlib/v/builder/c.v | 23 +---------------------- vlib/v/builder/js.v | 19 +------------------ vlib/v/builder/native.v | 19 ++----------------- vlib/v/markused/markused.v | 2 -- 5 files changed, 33 insertions(+), 59 deletions(-) diff --git a/vlib/v/builder/builder.v b/vlib/v/builder/builder.v index 9a40401486..05ca558926 100644 --- a/vlib/v/builder/builder.v +++ b/vlib/v/builder/builder.v @@ -9,6 +9,7 @@ import v.vmod import v.checker import v.parser import v.depgraph +import v.markused pub struct Builder { pub: @@ -65,6 +66,34 @@ pub fn new_builder(pref &pref.Preferences) Builder { // 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 pub fn (mut b Builder) parse_imports() { mut done_imports := []string{} diff --git a/vlib/v/builder/c.v b/vlib/v/builder/c.v index 3f41365ebb..e39fd14c28 100644 --- a/vlib/v/builder/c.v +++ b/vlib/v/builder/c.v @@ -1,33 +1,12 @@ module builder import os -import v.parser import v.pref import v.util import v.gen.c -import v.markused pub fn (mut b Builder) gen_c(v_files []string) 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 '' - } - - 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() + b.front_and_middle_stages(v_files) or { return '' } // TODO: move gen.cgen() to c.gen() util.timing_start('C GEN') res := c.gen(b.parsed_files, b.table, b.pref) diff --git a/vlib/v/builder/js.v b/vlib/v/builder/js.v index f92345fb6d..f136ac0ceb 100644 --- a/vlib/v/builder/js.v +++ b/vlib/v/builder/js.v @@ -1,29 +1,12 @@ module builder import os -import v.parser import v.pref import v.util import v.gen.js -import v.markused pub fn (mut b Builder) gen_js(v_files []string) 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') - // - 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() - // + b.front_and_middle_stages(v_files) or { return '' } util.timing_start('JS GEN') res := js.gen(b.parsed_files, b.table, b.pref) util.timing_measure('JS GEN') diff --git a/vlib/v/builder/native.v b/vlib/v/builder/native.v index fdbdd47a00..73508a133f 100644 --- a/vlib/v/builder/native.v +++ b/vlib/v/builder/native.v @@ -1,29 +1,14 @@ module builder -import v.parser import v.pref import v.util import v.gen.native -import v.markused 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') } - 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') - // - 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.front_and_middle_stages(v_files) or { return } util.timing_start('Native GEN') b.stats_lines, b.stats_bytes = native.gen(b.parsed_files, b.table, out_file, b.pref) util.timing_measure('Native GEN') diff --git a/vlib/v/markused/markused.v b/vlib/v/markused/markused.v index f6c65615f6..abf8c79e04 100644 --- a/vlib/v/markused/markused.v +++ b/vlib/v/markused/markused.v @@ -9,12 +9,10 @@ import v.pref // 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) { mut all_fns, all_consts := all_fn_and_const(ast_files) - util.timing_start(@METHOD) defer { util.timing_measure(@METHOD) } - mut all_fn_root_names := [ 'main.main', '__new_array',