mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
parser: disallow declaring static functions as method receivers (#19007)
This commit is contained in:
parent
77049600e6
commit
8735694d13
@ -292,7 +292,7 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
||||
}
|
||||
mut name := ''
|
||||
mut type_sym := p.table.sym(rec.typ)
|
||||
name_pos := p.tok.pos()
|
||||
mut name_pos := p.tok.pos()
|
||||
if p.tok.kind == .name {
|
||||
mut check_name := ''
|
||||
// TODO high order fn
|
||||
@ -304,6 +304,7 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
||||
p.check(.dot)
|
||||
check_name = p.check_name()
|
||||
name = type_name + '__static__' + check_name // "foo__bar"
|
||||
name_pos = name_pos.extend(p.prev_tok.pos())
|
||||
} else {
|
||||
check_name = if language == .js { p.check_js_name() } else { p.check_name() }
|
||||
name = check_name
|
||||
@ -452,6 +453,9 @@ run them via `v file.v` instead',
|
||||
}
|
||||
}
|
||||
}
|
||||
if is_method && is_static_type_method {
|
||||
p.error_with_pos('cannot declare a static function as a receiver method', name_pos)
|
||||
}
|
||||
// Register
|
||||
if is_method {
|
||||
// Do not allow to modify / add methods to types from other modules
|
||||
|
@ -0,0 +1,7 @@
|
||||
vlib/v/parser/tests/declare_static_fn_as_receiver_method_err.vv:4:12: error: cannot declare a static function as a receiver method
|
||||
2 | }
|
||||
3 |
|
||||
4 | fn (y Foo) Foo.new() Foo {
|
||||
| ~~~~~~~
|
||||
5 | return Foo{}
|
||||
6 | }
|
@ -0,0 +1,11 @@
|
||||
struct Foo {
|
||||
}
|
||||
|
||||
fn (y Foo) Foo.new() Foo {
|
||||
return Foo{}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
x := Foo{}.new()
|
||||
println(x)
|
||||
}
|
Loading…
Reference in New Issue
Block a user