v.parser: prohibit redeclaration of builtin types (#10563)

pull/10569/head
shadowninja55 2021-06-25 06:08:56 -04:00 committed by GitHub
parent e9de30373f
commit be8be3d319
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 59 additions and 34 deletions

View File

@ -85,18 +85,22 @@ fn on_error(receiver voidptr, e &Error, work &Work) {
```v oksyntax ```v oksyntax
module main module main
import eventbus
const eb = eventbus.new()
struct Work { struct Work {
hours int hours int
} }
struct Error { struct AnError {
message string message string
} }
fn do_work() { fn do_work() {
work := Work{20} work := Work{20}
// get a mutable Params instance & put some data into it // get a mutable Params instance & put some data into it
error := &Error{'Error: no internet connection.'} error := &AnError{'Error: no internet connection.'}
// publish the event // publish the event
eb.publish('error', work, error) eb.publish('error', work, error)
} }

View File

@ -542,11 +542,7 @@ pub fn (t &Table) unalias_num_type(typ Type) Type {
return typ return typ
} }
[inline] fn (mut t Table) check_for_already_registered_symbol(typ TypeSymbol, existing_idx int) int {
pub fn (mut t Table) register_type_symbol(typ TypeSymbol) int {
// println('register_type_symbol( $typ.name )')
existing_idx := t.type_idxs[typ.name]
if existing_idx > 0 {
ex_type := t.type_symbols[existing_idx] ex_type := t.type_symbols[existing_idx]
match ex_type.kind { match ex_type.kind {
.placeholder { .placeholder {
@ -578,8 +574,29 @@ pub fn (mut t Table) register_type_symbol(typ TypeSymbol) int {
return -1 return -1
} }
} }
return -2
} }
typ_idx := t.type_symbols.len
[inline]
pub fn (mut t Table) register_type_symbol(typ TypeSymbol) int {
mut typ_idx := -2
mut existing_idx := t.type_idxs[typ.name]
if existing_idx > 0 {
typ_idx = t.check_for_already_registered_symbol(typ, existing_idx)
if typ_idx != -2 {
return typ_idx
}
}
if typ.mod == 'main' {
existing_idx = t.type_idxs[typ.name.trim_prefix('main.')]
if existing_idx > 0 {
typ_idx = t.check_for_already_registered_symbol(typ, existing_idx)
if typ_idx != -2 {
return typ_idx
}
}
}
typ_idx = t.type_symbols.len
t.type_symbols << typ t.type_symbols << typ
t.type_idxs[typ.name] = typ_idx t.type_idxs[typ.name] = typ_idx
return typ_idx return typ_idx

View File

@ -0,0 +1,3 @@
vlib/v/parser/tests/prohibit_redeclaration_of_builtin_types.vv:1:8: error: cannot register struct `Option`, another type with this name exists
1 | struct Option {}
| ~~~~~~

View File

@ -0,0 +1 @@
struct Option {}