mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
v.markused: handle interface implementation methods, and vweb programs
This commit is contained in:
parent
106cd384da
commit
ae898e77c5
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user