checker: print error and pos for lacking main or pub main
parent
f2be3d7ffb
commit
0f9322bf36
|
@ -62,10 +62,17 @@ pub fn (c mut Checker) check2(ast_file ast.File) []scanner.Error {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (c mut Checker) check_files(ast_files []ast.File) {
|
pub fn (c mut Checker) check_files(ast_files []ast.File) {
|
||||||
mut all_mods := map[string]int
|
mut has_main_fn := false
|
||||||
for file in ast_files {
|
for file in ast_files {
|
||||||
c.check(file)
|
c.check(file)
|
||||||
all_mods[ file.mod.name ] = all_mods[ file.mod.name ] + 1
|
if file.mod.name == 'main' {
|
||||||
|
if fn_decl := get_main_fn_decl(file) {
|
||||||
|
has_main_fn = true
|
||||||
|
if fn_decl.is_pub {
|
||||||
|
c.error('function `main` cannot be declared public', fn_decl.pos)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Make sure fn main is defined in non lib builds
|
// Make sure fn main is defined in non lib builds
|
||||||
if c.pref.build_mode == .build_module || c.pref.is_test {
|
if c.pref.build_mode == .build_module || c.pref.is_test {
|
||||||
|
@ -75,20 +82,21 @@ pub fn (c mut Checker) check_files(ast_files []ast.File) {
|
||||||
// shared libs do not need to have a main
|
// shared libs do not need to have a main
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// check that a main program has a `fn main(){}` function:
|
if !has_main_fn {
|
||||||
if all_mods['main'] > 0 {
|
c.error('function `main` must be declared in the main module', token.Position{})
|
||||||
for i, f in c.table.fns {
|
|
||||||
if f.name == 'main' {
|
|
||||||
if f.is_pub {
|
|
||||||
c.error('function `main` cannot be declared public', token.Position{})
|
|
||||||
exit(1)
|
|
||||||
}
|
}
|
||||||
return
|
}
|
||||||
|
|
||||||
|
fn get_main_fn_decl(file ast.File) ?ast.FnDecl {
|
||||||
|
for stmt in file.stmts {
|
||||||
|
if stmt is ast.FnDecl {
|
||||||
|
fn_decl := stmt as ast.FnDecl
|
||||||
|
if fn_decl.name == 'main' {
|
||||||
|
return fn_decl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
c.error('function `main` is undeclared in the main module', token.Position{})
|
|
||||||
exit(1)
|
|
||||||
}
|
}
|
||||||
|
return none
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (c mut Checker) struct_decl(decl ast.StructDecl) {
|
pub fn (c mut Checker) struct_decl(decl ast.StructDecl) {
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
vlib/v/checker/tests/inout/no_fn_main.v:1:1: error: function `main` must be declared in the main module
|
||||||
|
1| fn no_main() {
|
||||||
|
^
|
||||||
|
2| println('Hello world !')
|
||||||
|
3| }
|
|
@ -0,0 +1,3 @@
|
||||||
|
fn no_main() {
|
||||||
|
println('Hello world !')
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
vlib/v/checker/tests/inout/pub_fn_main.v:1:1: error: function `main` cannot be declared public
|
||||||
|
1| pub fn main() {
|
||||||
|
~~~
|
||||||
|
2| println('Hello world !')
|
||||||
|
3| }
|
|
@ -0,0 +1,3 @@
|
||||||
|
pub fn main() {
|
||||||
|
println('Hello world !')
|
||||||
|
}
|
Loading…
Reference in New Issue