mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
checker: make sure vweb actions return vweb.Result
This commit is contained in:
parent
1ed0cd9a74
commit
a794dea809
@ -410,6 +410,19 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) {
|
||||
c.table.fns[node.name].dep_names = dep_names
|
||||
}
|
||||
}
|
||||
|
||||
// vweb checks
|
||||
if node.attrs.len > 0 && c.file.imports.filter(it.mod == 'vweb').len > 0 {
|
||||
// If it's a vweb action (has the ['/url'] attribute), make sure it returns a vweb.Result
|
||||
for attr in node.attrs {
|
||||
if attr.name.starts_with('/') {
|
||||
if c.table.sym(node.return_type).name != 'vweb.Result' {
|
||||
c.error('vweb actions must return `vweb.Result`', node.pos)
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// check_same_type_ignoring_pointers util function to check if the Types are the same, including all
|
||||
@ -2175,6 +2188,7 @@ fn (mut c Checker) method_call(mut node ast.CallExpr) ast.Type {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return node.return_type
|
||||
}
|
||||
|
||||
|
7
vlib/v/checker/tests/vweb_missing_result.out
Normal file
7
vlib/v/checker/tests/vweb_missing_result.out
Normal file
@ -0,0 +1,7 @@
|
||||
vlib/v/checker/tests/vweb_missing_result.vv:9:1: error: vweb actions must return `vweb.Result`
|
||||
7 | // actions must return results
|
||||
8 | ['/foo/:bar']
|
||||
9 | pub fn (mut app App) foo(a string) {
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
10 | }
|
||||
11 |
|
15
vlib/v/checker/tests/vweb_missing_result.vv
Normal file
15
vlib/v/checker/tests/vweb_missing_result.vv
Normal file
@ -0,0 +1,15 @@
|
||||
import vweb
|
||||
|
||||
struct App {
|
||||
vweb.Context
|
||||
}
|
||||
|
||||
// actions must return results
|
||||
['/foo/:bar']
|
||||
pub fn (mut app App) foo(a string) {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
port := 8181
|
||||
vweb.run[App](&App{}, port)
|
||||
}
|
Loading…
Reference in New Issue
Block a user