parser: check for import errors
							parent
							
								
									2f4fc86d58
								
							
						
					
					
						commit
						ef505e21ee
					
				|  | @ -0,0 +1,5 @@ | ||||||
|  | vlib/v/checker/tests/import_multiple_modules_err.v:1:13: error: cannot import multiple modules at a time | ||||||
|  |     1 | import time math | ||||||
|  |       |             ~~~~ | ||||||
|  |     2 | fn main() { | ||||||
|  |     3 |     println(time.now().unix_time()) | ||||||
|  | @ -0,0 +1,4 @@ | ||||||
|  | import time math | ||||||
|  | fn main() { | ||||||
|  | 	println(time.now().unix_time()) | ||||||
|  | } | ||||||
|  | @ -0,0 +1,6 @@ | ||||||
|  | vlib/v/checker/tests/import_not_same_line_err.v:2:2: error: `import` and `module` must be at same line | ||||||
|  |     1 | import | ||||||
|  |     2 |  time | ||||||
|  |       |  ~~~~ | ||||||
|  |     3 | fn main() { | ||||||
|  |     4 |     println(time.now()) | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | import | ||||||
|  |  time | ||||||
|  | fn main() { | ||||||
|  | 	println(time.now()) | ||||||
|  | } | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | vlib/v/checker/tests/import_syntax_err.v:1:12: error: module syntax error, please use `x.y.z` | ||||||
|  |     1 | import time, os | ||||||
|  |       |            ^ | ||||||
|  |     2 | fn main() { | ||||||
|  |     3 |     println(time.now()) | ||||||
|  | @ -0,0 +1,4 @@ | ||||||
|  | import time, os | ||||||
|  | fn main() { | ||||||
|  | 	println(time.now()) | ||||||
|  | } | ||||||
|  | @ -958,15 +958,26 @@ fn (mut p Parser) module_decl() ast.Module { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn (mut p Parser) import_stmt() ast.Import { | fn (mut p Parser) import_stmt() ast.Import { | ||||||
|  | 	import_pos := p.tok.position() | ||||||
| 	p.check(.key_import) | 	p.check(.key_import) | ||||||
| 	pos := p.tok.position() | 	pos := p.tok.position() | ||||||
| 	if p.tok.kind == .lpar { | 	if p.tok.kind == .lpar { | ||||||
| 		p.error_with_pos('`import()` has been deprecated, use `import x` instead', pos) | 		p.error_with_pos('`import()` has been deprecated, use `import x` instead', pos) | ||||||
| 	} | 	} | ||||||
| 	mut mod_name := p.check_name() | 	mut mod_name := p.check_name() | ||||||
|  | 	if import_pos.line_nr != pos.line_nr { | ||||||
|  | 		p.error_with_pos('`import` and `module` must be at same line', pos) | ||||||
|  | 	} | ||||||
| 	mut mod_alias := mod_name | 	mut mod_alias := mod_name | ||||||
| 	for p.tok.kind == .dot { | 	for p.tok.kind == .dot { | ||||||
| 		p.next() | 		p.next() | ||||||
|  | 		pos_t := p.tok.position() | ||||||
|  | 		if p.tok.kind != .name { | ||||||
|  | 			p.error_with_pos('module syntax error, please use `x.y.z`', pos) | ||||||
|  | 		} | ||||||
|  | 		if import_pos.line_nr != pos_t.line_nr { | ||||||
|  | 			p.error_with_pos('`import` and `submodule` must be at same line', pos) | ||||||
|  | 		} | ||||||
| 		submod_name := p.check_name() | 		submod_name := p.check_name() | ||||||
| 		mod_name += '.' + submod_name | 		mod_name += '.' + submod_name | ||||||
| 		mod_alias = submod_name | 		mod_alias = submod_name | ||||||
|  | @ -975,6 +986,14 @@ fn (mut p Parser) import_stmt() ast.Import { | ||||||
| 		p.next() | 		p.next() | ||||||
| 		mod_alias = p.check_name() | 		mod_alias = p.check_name() | ||||||
| 	} | 	} | ||||||
|  | 	pos_t := p.tok.position() | ||||||
|  | 	if import_pos.line_nr == pos_t.line_nr { | ||||||
|  | 		if p.tok.kind != .name { | ||||||
|  | 			p.error_with_pos('module syntax error, please use `x.y.z`', pos_t) | ||||||
|  | 		} else { | ||||||
|  | 			p.error_with_pos('cannot import multiple modules at a time', pos_t) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 	p.imports[mod_alias] = mod_name | 	p.imports[mod_alias] = mod_name | ||||||
| 	p.table.imports << mod_name | 	p.table.imports << mod_name | ||||||
| 	node := ast.Import{ | 	node := ast.Import{ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue