parser: error on non local array/map methods & add tests
parent
a0d10a6606
commit
d1224ffb5a
|
@ -1,4 +1,4 @@
|
|||
pub fn (a []int) reduce(iter fn (int, int) int, accum_start int) int {
|
||||
pub fn reduce(a []int, iter fn (int, int) int, accum_start int) int {
|
||||
iter(accum_start)
|
||||
}
|
||||
|
||||
|
|
|
@ -281,7 +281,14 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
|||
// Do not allow to modify / add methods to types from other modules
|
||||
// arrays/maps dont belong to a module only their element types do
|
||||
// we could also check if kind is .array, .array_fixed, .map instead of mod.len
|
||||
if type_sym.mod.len > 0 && type_sym.mod != p.mod && type_sym.language == .v {
|
||||
mut is_non_local := type_sym.mod.len > 0 && type_sym.mod != p.mod && type_sym.language == .v
|
||||
// check maps & arrays, must be defined in same module as the elem type
|
||||
if !is_non_local && type_sym.kind in [.array, .map] {
|
||||
elem_type_sym := p.table.get_type_symbol(p.table.value_type(rec_type))
|
||||
is_non_local = elem_type_sym.mod.len > 0 &&
|
||||
elem_type_sym.mod != p.mod && elem_type_sym.language == .v
|
||||
}
|
||||
if is_non_local {
|
||||
p.error_with_pos('cannot define new methods on non-local type $type_sym.name',
|
||||
rec_type_pos)
|
||||
return ast.FnDecl{}
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
vlib/v/parser/tests/method_decl_on_non_local_array.vv:1:7: error: cannot define new methods on non-local type []int
|
||||
1 | fn (a []int) get_number() int {
|
||||
| ~~~~~
|
||||
2 | return 1
|
||||
3 | }
|
|
@ -0,0 +1,3 @@
|
|||
fn (a []int) get_number() int {
|
||||
return 1
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
vlib/v/parser/tests/method_decl_on_non_local_map.vv:1:7: error: cannot define new methods on non-local type map[string]string
|
||||
1 | fn (a map[string]string) get_number() int {
|
||||
| ~~~~~~~~~~~~~~~~~
|
||||
2 | return 1
|
||||
3 | }
|
|
@ -0,0 +1,3 @@
|
|||
fn (a map[string]string) get_number() int {
|
||||
return 1
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
vlib/v/parser/tests/method_decl_on_non_local_type.vv:1:7: error: cannot define new methods on non-local type int
|
||||
1 | fn (a int) get_number() int {
|
||||
| ~~~
|
||||
2 | return 1
|
||||
3 | }
|
|
@ -0,0 +1,3 @@
|
|||
fn (a int) get_number() int {
|
||||
return 1
|
||||
}
|
Loading…
Reference in New Issue