From 5a231326d70ac92d9331274d4e9016603c46c9bb Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Thu, 11 Mar 2021 10:40:09 +0200 Subject: [PATCH] parser: improve syntax errors in module declarations --- vlib/v/checker/tests/module_multiple_names_err.out | 5 ----- vlib/v/checker/tests/module_syntax_err.out | 5 ----- vlib/v/parser/parser.v | 10 ++++++---- vlib/v/parser/tests/module_multiple_names_err.out | 5 +++++ .../tests/module_multiple_names_err.vv | 0 vlib/v/parser/tests/module_syntax_err.out | 5 +++++ vlib/v/{checker => parser}/tests/module_syntax_err.vv | 0 7 files changed, 16 insertions(+), 14 deletions(-) delete mode 100644 vlib/v/checker/tests/module_multiple_names_err.out delete mode 100644 vlib/v/checker/tests/module_syntax_err.out create mode 100644 vlib/v/parser/tests/module_multiple_names_err.out rename vlib/v/{checker => parser}/tests/module_multiple_names_err.vv (100%) create mode 100644 vlib/v/parser/tests/module_syntax_err.out rename vlib/v/{checker => parser}/tests/module_syntax_err.vv (100%) diff --git a/vlib/v/checker/tests/module_multiple_names_err.out b/vlib/v/checker/tests/module_multiple_names_err.out deleted file mode 100644 index 5c195ef29..000000000 --- a/vlib/v/checker/tests/module_multiple_names_err.out +++ /dev/null @@ -1,5 +0,0 @@ -vlib/v/checker/tests/module_multiple_names_err.vv:1:13: error: `module x` can only declare one module - 1 | module main os - | ~~ - 2 | fn main() { - 3 | println('hello, world') diff --git a/vlib/v/checker/tests/module_syntax_err.out b/vlib/v/checker/tests/module_syntax_err.out deleted file mode 100644 index 4f3dcb4d1..000000000 --- a/vlib/v/checker/tests/module_syntax_err.out +++ /dev/null @@ -1,5 +0,0 @@ -vlib/v/checker/tests/module_syntax_err.vv:1:12: error: `module x` syntax error - 1 | module main.os - | ^ - 2 | fn main() { - 3 | println('hello, world') diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 01773c9c5..5e20e5ac7 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -1835,12 +1835,14 @@ fn (mut p Parser) module_decl() ast.Module { // as it creates a wrong position when extended // to module_pos n_pos := p.tok.position() - if module_pos.line_nr == n_pos.line_nr && p.tok.kind != .comment { - if p.tok.kind != .name { - p.error_with_pos('`module x` syntax error', n_pos) + if module_pos.line_nr == n_pos.line_nr && p.tok.kind != .comment && p.tok.kind != .eof { + if p.tok.kind == .name { + p.error_with_pos('`module $name`, you can only declare one module, unexpected `$p.tok.lit`', + n_pos) return mod_node } else { - p.error_with_pos('`module x` can only declare one module', n_pos) + p.error_with_pos('`module $name`, unexpected `$p.tok.kind` after module name', + n_pos) return mod_node } } diff --git a/vlib/v/parser/tests/module_multiple_names_err.out b/vlib/v/parser/tests/module_multiple_names_err.out new file mode 100644 index 000000000..6ae53a873 --- /dev/null +++ b/vlib/v/parser/tests/module_multiple_names_err.out @@ -0,0 +1,5 @@ +vlib/v/parser/tests/module_multiple_names_err.vv:1:13: error: `module main`, you can only declare one module, unexpected `os` + 1 | module main os + | ~~ + 2 | fn main() { + 3 | println('hello, world') diff --git a/vlib/v/checker/tests/module_multiple_names_err.vv b/vlib/v/parser/tests/module_multiple_names_err.vv similarity index 100% rename from vlib/v/checker/tests/module_multiple_names_err.vv rename to vlib/v/parser/tests/module_multiple_names_err.vv diff --git a/vlib/v/parser/tests/module_syntax_err.out b/vlib/v/parser/tests/module_syntax_err.out new file mode 100644 index 000000000..38a1905e1 --- /dev/null +++ b/vlib/v/parser/tests/module_syntax_err.out @@ -0,0 +1,5 @@ +vlib/v/parser/tests/module_syntax_err.vv:1:12: error: `module main`, unexpected `.` after module name + 1 | module main.os + | ^ + 2 | fn main() { + 3 | println('hello, world') diff --git a/vlib/v/checker/tests/module_syntax_err.vv b/vlib/v/parser/tests/module_syntax_err.vv similarity index 100% rename from vlib/v/checker/tests/module_syntax_err.vv rename to vlib/v/parser/tests/module_syntax_err.vv -- 2.39.5