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)
|
||||
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)
|
||||
p.check(.lcbr)
|
||||
enum_decl_comments := p.eat_comments({})
|
||||
|
@ -3059,6 +3064,11 @@ fn (mut p Parser) type_decl() ast.TypeDecl {
|
|||
decl_pos)
|
||||
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{}
|
||||
p.check(.assign)
|
||||
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)
|
||||
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
|
||||
if language == .c {
|
||||
name = 'C.$name'
|
||||
|
@ -449,10 +454,16 @@ fn (mut p Parser) interface_decl() ast.InterfaceDecl {
|
|||
}
|
||||
name_pos := p.tok.position()
|
||||
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')
|
||||
p.check(.lcbr)
|
||||
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
|
||||
reg_idx := p.table.register_type_symbol(
|
||||
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