v.markused: handle interface implementation methods, and vweb programs

pull/9880/head^2
Delyan Angelov 2021-05-03 18:22:10 +03:00
parent 106cd384da
commit ae898e77c5
No known key found for this signature in database
GPG Key ID: 66886C0F12D595ED
3 changed files with 44 additions and 2 deletions

View File

@ -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()
}
}

View File

@ -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 {

View File

@ -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