From ff04683554876d9aeaa866c8c22866a7b3cfd87a Mon Sep 17 00:00:00 2001 From: yuyi Date: Tue, 30 Jul 2024 21:15:48 +0800 Subject: [PATCH] parser, checker: check comptime veb.html('index.html') (#21961) --- vlib/v/checker/comptime.v | 12 +++++++++++- vlib/v/checker/tests/comptime_veb_vweb_call_err.out | 13 +++++++++++++ vlib/v/checker/tests/comptime_veb_vweb_call_err.vv | 7 +++++++ vlib/v/checker/tests/templates/empty.html | 1 + vlib/v/parser/comptime.v | 10 +++++++--- 5 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 vlib/v/checker/tests/comptime_veb_vweb_call_err.out create mode 100644 vlib/v/checker/tests/comptime_veb_vweb_call_err.vv create mode 100644 vlib/v/checker/tests/templates/empty.html diff --git a/vlib/v/checker/comptime.v b/vlib/v/checker/comptime.v index 91a6b6453..e7c474f77 100644 --- a/vlib/v/checker/comptime.v +++ b/vlib/v/checker/comptime.v @@ -111,7 +111,17 @@ fn (mut c Checker) comptime_call(mut node ast.ComptimeCall) ast.Type { c.table.cur_fn = save_cur_fn } if node.method_name == 'html' { - rtyp := c.table.find_type_idx('vweb.Result') + ret_sym := c.table.sym(c.table.cur_fn.return_type) + if ret_sym.cname !in ['veb__Result', 'vweb__Result', 'x__vweb__Result'] { + ct_call := if node.is_veb { 'veb' } else { 'vweb' } + c.error('`\$${ct_call}.html()` must be called inside a web method, e.g. `fn (mut app App) foo(mut ctx Context) ${ct_call}.Result { return \$${ct_call}.html(\'index.html\') }`', + node.pos) + } + rtyp := if node.is_veb { + c.table.find_type_idx('veb.Result') + } else { + c.table.find_type_idx('vweb.Result') + } node.result_type = rtyp return rtyp } diff --git a/vlib/v/checker/tests/comptime_veb_vweb_call_err.out b/vlib/v/checker/tests/comptime_veb_vweb_call_err.out new file mode 100644 index 000000000..da151c53f --- /dev/null +++ b/vlib/v/checker/tests/comptime_veb_vweb_call_err.out @@ -0,0 +1,13 @@ +vlib/v/checker/tests/comptime_veb_vweb_call_err.vv:5:2: error: `$veb.html()` must be called inside a web method, e.g. `fn (mut app App) foo(mut ctx Context) veb.Result { return $veb.html('index.html') }` + 3 | + 4 | fn main() { + 5 | $veb.html('./templates/empty.html') + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 6 | $vweb.html('./templates/empty.html') + 7 | } +vlib/v/checker/tests/comptime_veb_vweb_call_err.vv:6:2: error: `$vweb.html()` must be called inside a web method, e.g. `fn (mut app App) foo(mut ctx Context) vweb.Result { return $vweb.html('index.html') }` + 4 | fn main() { + 5 | $veb.html('./templates/empty.html') + 6 | $vweb.html('./templates/empty.html') + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 7 | } diff --git a/vlib/v/checker/tests/comptime_veb_vweb_call_err.vv b/vlib/v/checker/tests/comptime_veb_vweb_call_err.vv new file mode 100644 index 000000000..cfac2cc36 --- /dev/null +++ b/vlib/v/checker/tests/comptime_veb_vweb_call_err.vv @@ -0,0 +1,7 @@ +import veb +import vweb + +fn main() { + $veb.html('./templates/empty.html') + $vweb.html('./templates/empty.html') +} diff --git a/vlib/v/checker/tests/templates/empty.html b/vlib/v/checker/tests/templates/empty.html new file mode 100644 index 000000000..18ecdcb79 --- /dev/null +++ b/vlib/v/checker/tests/templates/empty.html @@ -0,0 +1 @@ + diff --git a/vlib/v/parser/comptime.v b/vlib/v/parser/comptime.v index 1c0f8f2d9..b6cbe8799 100644 --- a/vlib/v/parser/comptime.v +++ b/vlib/v/parser/comptime.v @@ -115,14 +115,18 @@ fn (mut p Parser) comptime_call() ast.ComptimeCall { return err_node } import_mods := p.ast_imports.map(it.mod) - if name == 'vweb' && 'vweb' !in import_mods && 'x.vweb' !in import_mods { - p.error_with_pos('`\$vweb` cannot be used without importing vweb', start_pos.extend(p.prev_tok.pos())) - return err_node + if name == 'vweb' { + if 'vweb' !in import_mods && 'x.vweb' !in import_mods { + p.error_with_pos('`\$vweb` cannot be used without importing vweb', start_pos.extend(p.prev_tok.pos())) + return err_node + } + p.register_used_import('vweb') } else if name == 'veb' { if 'veb' !in import_mods { p.error_with_pos('`\$veb` cannot be used without importing veb', start_pos.extend(p.prev_tok.pos())) return err_node } + p.register_used_import('veb') is_veb = true } p.check(.dot) -- 2.39.5