Skip to content

Commit a87ba9e

Browse files
authored
checker: fix some specific interface generic inference within generics struct and method (#20932)
1 parent cc443e5 commit a87ba9e

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

vlib/v/checker/interface.v

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -303,10 +303,16 @@ fn (mut c Checker) resolve_generic_interface(typ ast.Type, interface_type ast.Ty
303303
}
304304
for i, iparam in imethod.params {
305305
param := method.params[i] or { ast.Param{} }
306-
if iparam.typ.has_flag(.generic) {
306+
mut need_inferred_type := false
307+
if !iparam.typ.has_flag(.generic) && iparam.typ == param.typ
308+
&& imethod.return_type == method.return_type
309+
&& imethod.name == method.name {
310+
need_inferred_type = true
311+
}
312+
if iparam.typ.has_flag(.generic) || need_inferred_type {
307313
param_sym := c.table.sym(iparam.typ)
308314
arg_sym := c.table.sym(param.typ)
309-
if c.table.get_type_name(iparam.typ) == gt_name {
315+
if c.table.get_type_name(iparam.typ) == gt_name || need_inferred_type {
310316
inferred_type = param.typ
311317
} else if arg_sym.info is ast.Array && param_sym.info is ast.Array {
312318
mut arg_elem_typ, mut param_elem_typ := arg_sym.info.elem_type, param_sym.info.elem_type
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
struct Store[Z] {
2+
mut:
3+
event_handlers []IEventHandler[Z]
4+
}
5+
6+
fn (mut me Store[Z]) add_event_handler(event_handler IEventHandler[Z]) {
7+
me.event_handlers << IEventHandler[Z](event_handler)
8+
}
9+
10+
interface IEventHandler[Z] {
11+
mut:
12+
apply(event Z)
13+
}
14+
15+
struct UserEvent {}
16+
17+
struct UserEventHandler {}
18+
19+
pub fn (mut me UserEventHandler) apply(event UserEvent) {}
20+
21+
fn test_generic_interface_with_method_using_generic_struct() {
22+
mut s := Store[UserEvent]{}
23+
s.add_event_handler(UserEventHandler{})
24+
assert s.event_handlers.len > 0
25+
}

0 commit comments

Comments
 (0)