From 2bedb097f2f5d8e5489e5c4b2033e9a50a26cc2f Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 11 Mar 2026 11:32:38 +0300 Subject: [PATCH] parser: generic interface methods expect old syntax (fixes #25087) --- vlib/v/parser/fn.v | 21 ++++++++++++++----- .../generics/generics_interface_method_test.v | 2 +- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/vlib/v/parser/fn.v b/vlib/v/parser/fn.v index 7e6817443..42e10a6f4 100644 --- a/vlib/v/parser/fn.v +++ b/vlib/v/parser/fn.v @@ -744,11 +744,22 @@ fn (mut p Parser) fn_decl() ast.FnDecl { // generic names can be infer with receiver's generic names if is_method && rec.typ.has_flag(.generic) { sym := p.table.sym(rec.typ) - if sym.info is ast.Struct { - decl_generic_names := p.types_to_names(sym.info.generic_types, p.tok.pos(), - 'sym.info.generic_types') or { return ast.FnDecl{ - scope: unsafe { nil } - } } + mut rec_generic_types := []ast.Type{} + match sym.info { + ast.Struct { + rec_generic_types = sym.info.generic_types.clone() + } + ast.Interface { + rec_generic_types = sym.info.generic_types.clone() + } + else {} + } + if rec_generic_types.len > 0 { + decl_generic_names := p.types_to_names(rec_generic_types, p.tok.pos(), 'rec_generic_types') or { + return ast.FnDecl{ + scope: unsafe { nil } + } + } fn_generic_names := generic_names.clone() generic_names = p.table.generic_type_names(rec.typ) if decl_generic_names.len != generic_names.len { diff --git a/vlib/v/tests/generics/generics_interface_method_test.v b/vlib/v/tests/generics/generics_interface_method_test.v index 34454f21a..3d4721234 100644 --- a/vlib/v/tests/generics/generics_interface_method_test.v +++ b/vlib/v/tests/generics/generics_interface_method_test.v @@ -3,7 +3,7 @@ mut: next() ?T } -fn (mut it Iter[T]) collect[T]() []T { +fn (mut it Iter[T]) collect() []T { mut data := []T{} for { val := it.next() or { break } -- 2.39.5