mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
v.markused: fix -skip-unused regression for v itself and for tetris
This commit is contained in:
parent
5eb67ccd94
commit
40d32c7eed
@ -7,7 +7,7 @@ import v.util
|
|||||||
import v.pref
|
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 t 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)
|
||||||
@ -100,38 +100,49 @@ pub fn mark_used(mut t ast.Table, pref &pref.Preferences, ast_files []ast.File)
|
|||||||
'os.init_os_args_wide',
|
'os.init_os_args_wide',
|
||||||
]
|
]
|
||||||
|
|
||||||
// implicit string builders are generated in auto_eq_methods.v
|
for k, mut mfn in all_fns {
|
||||||
mut sb_mut_type := ''
|
mut method_receiver_typename := ''
|
||||||
if sbfn := t.find_fn('strings.new_builder') {
|
if mfn.is_method {
|
||||||
sb_mut_type = sbfn.return_type.set_nr_muls(1).str() + '.'
|
method_receiver_typename = table.type_to_str(mfn.receiver.typ)
|
||||||
|
}
|
||||||
|
if method_receiver_typename == '&wyrand.WyRandRNG' {
|
||||||
|
// WyRandRNG is the default rand pseudo random generator
|
||||||
|
all_fn_root_names << k
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if method_receiver_typename == '&strings.Builder' {
|
||||||
|
// implicit string builders are generated in auto_eq_methods.v
|
||||||
|
all_fn_root_names << k
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
for k, _ in all_fns {
|
|
||||||
if k.ends_with('.str') {
|
if k.ends_with('.str') {
|
||||||
all_fn_root_names << k
|
all_fn_root_names << k
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
if k.ends_with('.init') {
|
if k.ends_with('.init') {
|
||||||
all_fn_root_names << k
|
all_fn_root_names << k
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
if k.ends_with('.free') {
|
if k.ends_with('.free') {
|
||||||
all_fn_root_names << k
|
all_fn_root_names << k
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
if k.ends_with('.lock') || k.ends_with('.unlock') || k.ends_with('.rlock')
|
if k.ends_with('.lock') || k.ends_with('.unlock') || k.ends_with('.rlock')
|
||||||
|| k.ends_with('.runlock') {
|
|| k.ends_with('.runlock') {
|
||||||
all_fn_root_names << k
|
all_fn_root_names << k
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
if pref.is_test {
|
if pref.is_test {
|
||||||
if k.starts_with('test_') || k.contains('.test_') {
|
if k.starts_with('test_') || k.contains('.test_') {
|
||||||
all_fn_root_names << k
|
all_fn_root_names << k
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
if k.starts_with('testsuite_') || k.contains('.testsuite_') {
|
if k.starts_with('testsuite_') || k.contains('.testsuite_') {
|
||||||
eprintln('>>> test suite: $k')
|
// eprintln('>>> test suite: $k')
|
||||||
all_fn_root_names << k
|
all_fn_root_names << k
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if sb_mut_type != '' && k.starts_with(sb_mut_type) {
|
|
||||||
all_fn_root_names << k
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if pref.is_debug {
|
if pref.is_debug {
|
||||||
all_fn_root_names << 'panic_debug'
|
all_fn_root_names << 'panic_debug'
|
||||||
@ -140,7 +151,7 @@ pub fn mark_used(mut t ast.Table, pref &pref.Preferences, ast_files []ast.File)
|
|||||||
if pref.is_test {
|
if pref.is_test {
|
||||||
all_fn_root_names << 'main.cb_assertion_ok'
|
all_fn_root_names << 'main.cb_assertion_ok'
|
||||||
all_fn_root_names << 'main.cb_assertion_failed'
|
all_fn_root_names << 'main.cb_assertion_failed'
|
||||||
if benched_tests_sym := t.find_type('main.BenchedTests') {
|
if benched_tests_sym := table.find_type('main.BenchedTests') {
|
||||||
bts_type := benched_tests_sym.methods[0].params[0].typ
|
bts_type := benched_tests_sym.methods[0].params[0].typ
|
||||||
all_fn_root_names << '${bts_type}.testing_step_start'
|
all_fn_root_names << '${bts_type}.testing_step_start'
|
||||||
all_fn_root_names << '${bts_type}.testing_step_end'
|
all_fn_root_names << '${bts_type}.testing_step_end'
|
||||||
@ -150,7 +161,7 @@ pub fn mark_used(mut t ast.Table, pref &pref.Preferences, ast_files []ast.File)
|
|||||||
}
|
}
|
||||||
|
|
||||||
mut walker := Walker{
|
mut walker := Walker{
|
||||||
table: t
|
table: table
|
||||||
files: ast_files
|
files: ast_files
|
||||||
all_fns: all_fns
|
all_fns: all_fns
|
||||||
all_consts: all_consts
|
all_consts: all_consts
|
||||||
@ -163,12 +174,13 @@ pub fn mark_used(mut t ast.Table, pref &pref.Preferences, ast_files []ast.File)
|
|||||||
}
|
}
|
||||||
if walker.n_maps > 0 {
|
if walker.n_maps > 0 {
|
||||||
for k, mut mfn in all_fns {
|
for k, mut mfn in all_fns {
|
||||||
if k in ['new_map_2', 'new_map_init_2']
|
mut method_receiver_typename := ''
|
||||||
|| (k.starts_with('map_') || k.ends_with('clone') || k.ends_with('exists_1')
|
if mfn.is_method {
|
||||||
|| k.ends_with('keys') || k.ends_with('keys_1') || k.ends_with('get_1')
|
method_receiver_typename = table.type_to_str(mfn.receiver.typ)
|
||||||
|| k.ends_with('get_1_check') || k.ends_with('set_1') || k.ends_with('key')
|
}
|
||||||
|| k.ends_with('value') || k.ends_with('has_index') || k.ends_with('expand')
|
if k in ['new_map_2', 'new_map_init_2', 'map_hash_string']
|
||||||
|| k.ends_with('zeros_to_end')) {
|
|| method_receiver_typename == '&map' || method_receiver_typename == '&DenseArray'
|
||||||
|
|| k.starts_with('map_') {
|
||||||
walker.fn_decl(mut mfn)
|
walker.fn_decl(mut mfn)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -180,12 +192,12 @@ pub fn mark_used(mut t ast.Table, pref &pref.Preferences, ast_files []ast.File)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
t.used_fns = walker.used_fns.move()
|
table.used_fns = walker.used_fns.move()
|
||||||
t.used_consts = walker.used_consts.move()
|
table.used_consts = walker.used_consts.move()
|
||||||
|
|
||||||
$if trace_skip_unused ? {
|
$if trace_skip_unused ? {
|
||||||
eprintln('>> t.used_fns: $t.used_fns.keys()')
|
eprintln('>> t.used_fns: $table.used_fns.keys()')
|
||||||
eprintln('>> t.used_consts: $t.used_consts.keys()')
|
eprintln('>> t.used_consts: $table.used_consts.keys()')
|
||||||
eprintln('>> walker.n_maps: $walker.n_maps')
|
eprintln('>> walker.n_maps: $walker.n_maps')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -197,6 +197,8 @@ fn (mut w Walker) expr(node ast.Expr) {
|
|||||||
}
|
}
|
||||||
ast.DumpExpr {
|
ast.DumpExpr {
|
||||||
w.expr(node.expr)
|
w.expr(node.expr)
|
||||||
|
w.fn_by_name('eprint')
|
||||||
|
w.fn_by_name('eprintln')
|
||||||
}
|
}
|
||||||
ast.GoExpr {
|
ast.GoExpr {
|
||||||
w.expr(node.go_stmt.call_expr)
|
w.expr(node.go_stmt.call_expr)
|
||||||
@ -210,6 +212,15 @@ fn (mut w Walker) expr(node ast.Expr) {
|
|||||||
w.expr(node.left)
|
w.expr(node.left)
|
||||||
w.expr(node.right)
|
w.expr(node.right)
|
||||||
w.or_block(node.or_block)
|
w.or_block(node.or_block)
|
||||||
|
if node.left_type == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sym := w.table.get_type_symbol(node.left_type)
|
||||||
|
if sym.kind == .struct_ {
|
||||||
|
if opmethod := sym.find_method(node.op.str()) {
|
||||||
|
w.fn_decl(mut &ast.FnDecl(opmethod.source_fn))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ast.IfGuardExpr {
|
ast.IfGuardExpr {
|
||||||
w.expr(node.expr)
|
w.expr(node.expr)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user