parser: fix assigning static method to anon fn (#19499)

This commit is contained in:
yuyi 2023-10-04 02:12:30 +08:00 committed by GitHub
parent 2563552cd6
commit 0904a9e892
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 0 deletions

View File

@ -2825,6 +2825,28 @@ fn (mut p Parser) name_expr() ast.Expr {
p.tok.pos())
}
}
// `anon_fn := Foo.bar` assign static method
if !known_var && lit0_is_capital && p.peek_tok.kind == .dot && language == .v
&& p.peek_token(2).kind == .name {
if func := p.table.find_fn(p.prepend_mod(p.tok.lit) + '__static__' + p.peek_token(2).lit) {
fn_type := ast.new_type(p.table.find_or_register_fn_type(func, false,
true))
pos := p.tok.pos()
typ_name := p.check_name()
p.check(.dot)
field_name := p.check_name()
pos.extend(p.tok.pos())
return ast.Ident{
name: p.prepend_mod(typ_name) + '__static__' + field_name
mod: p.mod
kind: .function
info: ast.IdentFn{
typ: fn_type
}
scope: p.scope
}
}
}
// `Color.green`
mut enum_name := p.check_name()
enum_name_pos := p.prev_tok.pos()

View File

@ -0,0 +1,15 @@
struct Foo {
}
fn Foo.bar() string {
println('bar')
return 'bar'
}
fn test_assign_static_method_to_anon_fn() {
// vfmt off
anon_fn := Foo.bar
// vfmt on
ret := anon_fn()
assert ret == 'bar'
}