From 8ab60bbeee6581346841f62b7f9d22a24a36c788 Mon Sep 17 00:00:00 2001 From: Swastik Date: Thu, 2 Nov 2023 19:50:18 +0530 Subject: [PATCH 1/6] checker: warn on unused imported functions used via `import math { sin, cos }` --- vlib/v/checker/checker.v | 3 +++ .../checker/tests/import_sym_fn_unused_warning_err.out | 10 ++++++++++ .../checker/tests/import_sym_fn_unused_warning_err.vv | 3 +++ 3 files changed, 16 insertions(+) create mode 100644 vlib/v/checker/tests/import_sym_fn_unused_warning_err.out create mode 100644 vlib/v/checker/tests/import_sym_fn_unused_warning_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index b2035811278ed2..8a5e2c87334bbe 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2547,6 +2547,9 @@ fn (mut c Checker) import_stmt(node ast.Import) { if !func.is_pub { c.error('module `${node.mod}` function `${sym.name}()` is private', sym.pos) } + if func.usages != 1 { + c.warn('module `${node.mod}` function `${sym.name}()` is unused', sym.pos) + } continue } if _ := c.file.global_scope.find_const(name) { diff --git a/vlib/v/checker/tests/import_sym_fn_unused_warning_err.out b/vlib/v/checker/tests/import_sym_fn_unused_warning_err.out new file mode 100644 index 00000000000000..d0bb2c363db71a --- /dev/null +++ b/vlib/v/checker/tests/import_sym_fn_unused_warning_err.out @@ -0,0 +1,10 @@ +vlib/v/checker/tests/import_sym_fn_unused_warning_err.vv:1:15: warning: module `math` function `sin()` is unused + 1 | import math { sin, cos } + | ~~~ + 2 | + 3 | fn main() {} +vlib/v/checker/tests/import_sym_fn_unused_warning_err.vv:1:20: warning: module `math` function `cos()` is unused + 1 | import math { sin, cos } + | ~~~ + 2 | + 3 | fn main() {} diff --git a/vlib/v/checker/tests/import_sym_fn_unused_warning_err.vv b/vlib/v/checker/tests/import_sym_fn_unused_warning_err.vv new file mode 100644 index 00000000000000..e5a7d32933c895 --- /dev/null +++ b/vlib/v/checker/tests/import_sym_fn_unused_warning_err.vv @@ -0,0 +1,3 @@ +import math { sin, cos } + +fn main() {} From 5985a7b35140c0d42fd5a180b7e2a8e435bfa04d Mon Sep 17 00:00:00 2001 From: Swastik Date: Thu, 2 Nov 2023 19:50:42 +0530 Subject: [PATCH 2/6] Revert "checker: warn on unused imported functions used via `import math { sin, cos }`" This reverts commit ddf0468f1c4f9af54ada162712c212214e58ca56. --- vlib/v/checker/checker.v | 3 --- .../checker/tests/import_sym_fn_unused_warning_err.out | 10 ---------- .../checker/tests/import_sym_fn_unused_warning_err.vv | 3 --- 3 files changed, 16 deletions(-) delete mode 100644 vlib/v/checker/tests/import_sym_fn_unused_warning_err.out delete mode 100644 vlib/v/checker/tests/import_sym_fn_unused_warning_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 8a5e2c87334bbe..b2035811278ed2 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2547,9 +2547,6 @@ fn (mut c Checker) import_stmt(node ast.Import) { if !func.is_pub { c.error('module `${node.mod}` function `${sym.name}()` is private', sym.pos) } - if func.usages != 1 { - c.warn('module `${node.mod}` function `${sym.name}()` is unused', sym.pos) - } continue } if _ := c.file.global_scope.find_const(name) { diff --git a/vlib/v/checker/tests/import_sym_fn_unused_warning_err.out b/vlib/v/checker/tests/import_sym_fn_unused_warning_err.out deleted file mode 100644 index d0bb2c363db71a..00000000000000 --- a/vlib/v/checker/tests/import_sym_fn_unused_warning_err.out +++ /dev/null @@ -1,10 +0,0 @@ -vlib/v/checker/tests/import_sym_fn_unused_warning_err.vv:1:15: warning: module `math` function `sin()` is unused - 1 | import math { sin, cos } - | ~~~ - 2 | - 3 | fn main() {} -vlib/v/checker/tests/import_sym_fn_unused_warning_err.vv:1:20: warning: module `math` function `cos()` is unused - 1 | import math { sin, cos } - | ~~~ - 2 | - 3 | fn main() {} diff --git a/vlib/v/checker/tests/import_sym_fn_unused_warning_err.vv b/vlib/v/checker/tests/import_sym_fn_unused_warning_err.vv deleted file mode 100644 index e5a7d32933c895..00000000000000 --- a/vlib/v/checker/tests/import_sym_fn_unused_warning_err.vv +++ /dev/null @@ -1,3 +0,0 @@ -import math { sin, cos } - -fn main() {} From eb0781c8b91a98bd484395134aa9b492b08a0aac Mon Sep 17 00:00:00 2001 From: Swastik Date: Mon, 18 Mar 2024 19:46:58 +0530 Subject: [PATCH 3/6] checker: disallow result callbacks functions like map/filter/all/any --- vlib/v/checker/fn.v | 8 ++++++ .../tests/map_result_callback_fn_err.out | 14 +++++++++++ .../tests/map_result_callback_fn_err.vv | 25 +++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 vlib/v/checker/tests/map_result_callback_fn_err.out create mode 100644 vlib/v/checker/tests/map_result_callback_fn_err.vv diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 1677877f58ad38..6048ffc2e97805 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -2742,6 +2742,14 @@ fn (mut c Checker) check_map_and_filter(is_map bool, elem_typ ast.Type, node ast } c.error('type mismatch, `${arg_expr.name}` must return a bool', arg_expr.pos) } + if arg_expr.return_type.has_flag(.result) && arg_expr.or_block.kind != .block { + if arg_expr.return_type.clear_option_and_result() in [ast.void_type, 0] { + c.error('cannot use Result type in `${node.name}`', arg_expr.pos) + } else { + c.error('cannot use Result type in `${node.name}` calls without unwrapping or using an or block', + arg_expr.pos) + } + } } ast.StringLiteral, ast.StringInterLiteral { if !is_map { diff --git a/vlib/v/checker/tests/map_result_callback_fn_err.out b/vlib/v/checker/tests/map_result_callback_fn_err.out new file mode 100644 index 00000000000000..3754b49bcfd2b6 --- /dev/null +++ b/vlib/v/checker/tests/map_result_callback_fn_err.out @@ -0,0 +1,14 @@ +vlib/v/checker/tests/map_result_callback_fn_err.vv:14:53: error: cannot use Result type in `map` calls without unwrapping or using an or block + 12 | + 13 | fn execsync(cmd cli.Command) ! { + 14 | dens := os.read_lines('/etc/fox/dens')!.map(urllib.parse(it)!) + | ~~~~~~~~~ + 15 | mut threads := []thread !{} + 16 | for den in dens { +vlib/v/checker/tests/map_result_callback_fn_err.vv:19:17: error: cannot use Result type in `map` + 17 | threads << spawn update(den) + 18 | } + 19 | threads.map(it.wait()!) + | ~~~~~~~ + 20 | } + 21 | diff --git a/vlib/v/checker/tests/map_result_callback_fn_err.vv b/vlib/v/checker/tests/map_result_callback_fn_err.vv new file mode 100644 index 00000000000000..5403decbefe800 --- /dev/null +++ b/vlib/v/checker/tests/map_result_callback_fn_err.vv @@ -0,0 +1,25 @@ +import os +import cli +import net.urllib + +pub fn sync() cli.Command { + return cli.Command{ + name: 'sync' + description: 'sync local dens from remote' + execute: execsync + } +} + +fn execsync(cmd cli.Command) ! { + dens := os.read_lines('/etc/fox/dens')!.map(urllib.parse(it)!) + mut threads := []thread !{} + for den in dens { + threads << spawn update(den) + } + threads.map(it.wait()!) +} + +fn update(den urllib.URL) ! { + println(den.str()) + return +} From 67e43469b05f31cff3af24106dcb283896664e83 Mon Sep 17 00:00:00 2001 From: Swastik Date: Mon, 18 Mar 2024 20:05:41 +0530 Subject: [PATCH 4/6] fix test --- vlib/x/sessions/db_store.v | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vlib/x/sessions/db_store.v b/vlib/x/sessions/db_store.v index fbd3f71a988e16..d90dce58e4b030 100644 --- a/vlib/x/sessions/db_store.v +++ b/vlib/x/sessions/db_store.v @@ -38,7 +38,7 @@ pub fn (mut store DBStore[T]) all() ![]T { }! // decode should never fail - return rows.map(json.decode(T, it.data)!) + return rows.map(json.decode(T, it.data) or { T{} }) } // get session for session id `sid`. The session can be `max_age` old. From f230820c8e1873c8491a50f745afdd99b97aafe8 Mon Sep 17 00:00:00 2001 From: Swastik Date: Sun, 14 Apr 2024 12:36:31 +0530 Subject: [PATCH 5/6] disallow only for empty return types --- vlib/v/checker/fn.v | 3 --- vlib/x/sessions/db_store.v | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 6048ffc2e97805..27c2687475c6fa 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -2745,9 +2745,6 @@ fn (mut c Checker) check_map_and_filter(is_map bool, elem_typ ast.Type, node ast if arg_expr.return_type.has_flag(.result) && arg_expr.or_block.kind != .block { if arg_expr.return_type.clear_option_and_result() in [ast.void_type, 0] { c.error('cannot use Result type in `${node.name}`', arg_expr.pos) - } else { - c.error('cannot use Result type in `${node.name}` calls without unwrapping or using an or block', - arg_expr.pos) } } } diff --git a/vlib/x/sessions/db_store.v b/vlib/x/sessions/db_store.v index d90dce58e4b030..fbd3f71a988e16 100644 --- a/vlib/x/sessions/db_store.v +++ b/vlib/x/sessions/db_store.v @@ -38,7 +38,7 @@ pub fn (mut store DBStore[T]) all() ![]T { }! // decode should never fail - return rows.map(json.decode(T, it.data) or { T{} }) + return rows.map(json.decode(T, it.data)!) } // get session for session id `sid`. The session can be `max_age` old. From 1d5da080221b4d9417785ba74ce2643155a32ff1 Mon Sep 17 00:00:00 2001 From: Swastik Date: Sun, 14 Apr 2024 13:56:01 +0530 Subject: [PATCH 6/6] update test --- vlib/v/checker/tests/map_result_callback_fn_err.out | 7 ------- 1 file changed, 7 deletions(-) diff --git a/vlib/v/checker/tests/map_result_callback_fn_err.out b/vlib/v/checker/tests/map_result_callback_fn_err.out index 3754b49bcfd2b6..d15591c819d350 100644 --- a/vlib/v/checker/tests/map_result_callback_fn_err.out +++ b/vlib/v/checker/tests/map_result_callback_fn_err.out @@ -1,10 +1,3 @@ -vlib/v/checker/tests/map_result_callback_fn_err.vv:14:53: error: cannot use Result type in `map` calls without unwrapping or using an or block - 12 | - 13 | fn execsync(cmd cli.Command) ! { - 14 | dens := os.read_lines('/etc/fox/dens')!.map(urllib.parse(it)!) - | ~~~~~~~~~ - 15 | mut threads := []thread !{} - 16 | for den in dens { vlib/v/checker/tests/map_result_callback_fn_err.vv:19:17: error: cannot use Result type in `map` 17 | threads << spawn update(den) 18 | }