v.parser: prohibit registering selectively imported (structs / enums / aliases / interfaces) (#10579)
							parent
							
								
									67d1b72e36
								
							
						
					
					
						commit
						830cf4645c
					
				|  | @ -2962,6 +2962,11 @@ fn (mut p Parser) enum_decl() ast.EnumDecl { | ||||||
| 			end_pos) | 			end_pos) | ||||||
| 		return ast.EnumDecl{} | 		return ast.EnumDecl{} | ||||||
| 	} | 	} | ||||||
|  | 	if enum_name in p.imported_symbols { | ||||||
|  | 		p.error_with_pos('cannot register enum `$enum_name`, this type was already imported', | ||||||
|  | 			end_pos) | ||||||
|  | 		return ast.EnumDecl{} | ||||||
|  | 	} | ||||||
| 	name := p.prepend_mod(enum_name) | 	name := p.prepend_mod(enum_name) | ||||||
| 	p.check(.lcbr) | 	p.check(.lcbr) | ||||||
| 	enum_decl_comments := p.eat_comments({}) | 	enum_decl_comments := p.eat_comments({}) | ||||||
|  | @ -3059,6 +3064,11 @@ fn (mut p Parser) type_decl() ast.TypeDecl { | ||||||
| 			decl_pos) | 			decl_pos) | ||||||
| 		return ast.FnTypeDecl{} | 		return ast.FnTypeDecl{} | ||||||
| 	} | 	} | ||||||
|  | 	if name in p.imported_symbols { | ||||||
|  | 		p.error_with_pos('cannot register alias `$name`, this type was already imported', | ||||||
|  | 			end_pos) | ||||||
|  | 		return ast.AliasTypeDecl{} | ||||||
|  | 	} | ||||||
| 	mut sum_variants := []ast.TypeNode{} | 	mut sum_variants := []ast.TypeNode{} | ||||||
| 	p.check(.assign) | 	p.check(.assign) | ||||||
| 	mut type_pos := p.tok.position() | 	mut type_pos := p.tok.position() | ||||||
|  |  | ||||||
|  | @ -73,6 +73,11 @@ fn (mut p Parser) struct_decl() ast.StructDecl { | ||||||
| 		p.error_with_pos('struct names must have more than one character', name_pos) | 		p.error_with_pos('struct names must have more than one character', name_pos) | ||||||
| 		return ast.StructDecl{} | 		return ast.StructDecl{} | ||||||
| 	} | 	} | ||||||
|  | 	if name in p.imported_symbols { | ||||||
|  | 		p.error_with_pos('cannot register struct `$name`, this type was already imported', | ||||||
|  | 			name_pos) | ||||||
|  | 		return ast.StructDecl{} | ||||||
|  | 	} | ||||||
| 	mut orig_name := name | 	mut orig_name := name | ||||||
| 	if language == .c { | 	if language == .c { | ||||||
| 		name = 'C.$name' | 		name = 'C.$name' | ||||||
|  | @ -449,10 +454,16 @@ fn (mut p Parser) interface_decl() ast.InterfaceDecl { | ||||||
| 	} | 	} | ||||||
| 	name_pos := p.tok.position() | 	name_pos := p.tok.position() | ||||||
| 	p.check_for_impure_v(language, name_pos) | 	p.check_for_impure_v(language, name_pos) | ||||||
| 	interface_name := p.prepend_mod(p.check_name()).clone() | 	modless_name := p.check_name() | ||||||
|  | 	interface_name := p.prepend_mod(modless_name).clone() | ||||||
| 	// println('interface decl $interface_name')
 | 	// println('interface decl $interface_name')
 | ||||||
| 	p.check(.lcbr) | 	p.check(.lcbr) | ||||||
| 	pre_comments := p.eat_comments({}) | 	pre_comments := p.eat_comments({}) | ||||||
|  | 	if modless_name in p.imported_symbols { | ||||||
|  | 		p.error_with_pos('cannot register interface `$interface_name`, this type was already imported', | ||||||
|  | 			name_pos) | ||||||
|  | 		return ast.InterfaceDecl{} | ||||||
|  | 	} | ||||||
| 	// Declare the type
 | 	// Declare the type
 | ||||||
| 	reg_idx := p.table.register_type_symbol( | 	reg_idx := p.table.register_type_symbol( | ||||||
| 		is_public: is_pub | 		is_public: is_pub | ||||||
|  |  | ||||||
|  | @ -0,0 +1,4 @@ | ||||||
|  | vlib/v/parser/tests/register_imported_alias.vv:2:6: error: cannot register alias `Duration`, this type was already imported | ||||||
|  |     1 | import time { Duration } | ||||||
|  |     2 | type Duration = bool | ||||||
|  |       |      ~~~~~~~~ | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | import time { Duration } | ||||||
|  | type Duration = bool | ||||||
|  | @ -0,0 +1,4 @@ | ||||||
|  | vlib/v/parser/tests/register_imported_enum.vv:2:6: error: cannot register enum `Method`, this type was already imported | ||||||
|  |     1 | import net.http { Method } | ||||||
|  |     2 | enum Method { foo bar } | ||||||
|  |       |      ~~~~~~ | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | import net.http { Method } | ||||||
|  | enum Method { foo bar } | ||||||
|  | @ -0,0 +1,4 @@ | ||||||
|  | vlib/v/parser/tests/register_imported_interface.vv:2:11: error: cannot register interface `Reader`, this type was already imported | ||||||
|  |     1 | import io { Reader } | ||||||
|  |     2 | interface Reader {} | ||||||
|  |       |           ~~~~~~ | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | import io { Reader } | ||||||
|  | interface Reader {} | ||||||
|  | @ -0,0 +1,4 @@ | ||||||
|  | vlib/v/parser/tests/register_imported_struct.vv:2:8: error: cannot register struct `File`, this type was already imported | ||||||
|  |     1 | import os { File } | ||||||
|  |     2 | struct File {} | ||||||
|  |       |        ~~~~ | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | import os { File } | ||||||
|  | struct File {} | ||||||
		Loading…
	
		Reference in New Issue