From ae898e77c56343091d2dfd31136ccb96f9c16dc0 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Mon, 3 May 2021 18:22:10 +0300 Subject: [PATCH] v.markused: handle interface implementation methods, and vweb programs --- vlib/v/ast/table.v | 2 ++ vlib/v/checker/checker.v | 8 ++++++-- vlib/v/markused/markused.v | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/vlib/v/ast/table.v b/vlib/v/ast/table.v index a4e59df410..3d7101c2eb 100644 --- a/vlib/v/ast/table.v +++ b/vlib/v/ast/table.v @@ -24,6 +24,7 @@ pub mut: is_fmt bool used_fns map[string]bool // filled in by the checker, when pref.skip_unused = true; used_consts map[string]bool // filled in by the checker, when pref.skip_unused = true; + used_vweb_types []Type // vweb context types, filled in by checker, when pref.skip_unused = true; panic_handler FnPanicHandler = default_table_panic_handler panic_userdata voidptr = voidptr(0) // can be used to pass arbitrary data to panic_handler; panic_npanics int @@ -44,6 +45,7 @@ pub fn (t &Table) free() { t.cmod_prefix.free() t.used_fns.free() t.used_consts.free() + t.used_vweb_types.free() } } diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 078eb78480..3b569657f5 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -79,7 +79,6 @@ mut: timers &util.Timers = util.new_timers(false) comptime_fields_type map[string]ast.Type fn_scope &ast.Scope = voidptr(0) - used_fns map[string]bool // used_fns['println'] == true main_fn_decl_node ast.FnDecl match_exhaustive_cutoff_limit int = 10 // TODO: these are here temporarily and used for deprecations; remove soon @@ -6746,7 +6745,11 @@ fn (mut c Checker) post_process_generic_fns() { node.cur_concrete_types = concrete_types c.fn_decl(mut node) if node.name in ['vweb.run_app', 'vweb.run'] { - c.vweb_gen_types << concrete_types + for ct in concrete_types { + if ct !in c.vweb_gen_types { + c.vweb_gen_types << ct + } + } } } node.cur_concrete_types = [] @@ -6961,6 +6964,7 @@ fn (mut c Checker) verify_all_vweb_routes() { if c.vweb_gen_types.len == 0 { return } + c.table.used_vweb_types = c.vweb_gen_types typ_vweb_result := c.table.find_type_idx('vweb.Result') old_file := c.file for vgt in c.vweb_gen_types { diff --git a/vlib/v/markused/markused.v b/vlib/v/markused/markused.v index cbe92e4abe..cbc79c7393 100644 --- a/vlib/v/markused/markused.v +++ b/vlib/v/markused/markused.v @@ -158,6 +158,8 @@ pub fn mark_used(mut table ast.Table, pref &pref.Preferences, ast_files []ast.Fi continue } } + + // handle assertions and testing framework callbacks: if pref.is_debug { all_fn_root_names << 'panic_debug' } @@ -174,6 +176,40 @@ pub fn mark_used(mut table ast.Table, pref &pref.Preferences, ast_files []ast.Fi } } + // handle interface implementation methods: + for isym in table.type_symbols { + if isym.kind != .interface_ { + continue + } + interface_info := isym.info as ast.Interface + if interface_info.methods.len == 0 { + continue + } + for itype in interface_info.types { + for method in interface_info.methods { + interface_implementation_method_name := '${itype}.$method.name' + all_fn_root_names << interface_implementation_method_name + } + } + } + + // handle vweb magic router methods: + typ_vweb_result := table.find_type_idx('vweb.Result') + if typ_vweb_result != 0 { + for vgt in table.used_vweb_types { + sym_app := table.get_type_symbol(vgt) + for m in sym_app.methods { + if m.return_type == typ_vweb_result { + pvgt := vgt.set_nr_muls(1) + eprintln('vgt: $vgt | pvgt: $pvgt | sym_app.name: $sym_app.name | m.name: $m.name') + all_fn_root_names << '${pvgt}.$m.name' + } + } + } + } + + // + mut walker := Walker{ table: table files: ast_files