parent
64028eedb8
commit
64c8fb061d
|
@ -1540,6 +1540,7 @@ pub fn (mut t Table) resolve_generic_to_concrete(generic_type Type, generic_name
|
|||
pub fn (mut t Table) unwrap_generic_type(typ Type, generic_names []string, concrete_types []Type) Type {
|
||||
mut final_concrete_types := []Type{}
|
||||
mut fields := []StructField{}
|
||||
mut needs_unwrap_types := []Type{}
|
||||
mut nrt := ''
|
||||
mut c_nrt := ''
|
||||
ts := t.sym(typ)
|
||||
|
@ -1627,6 +1628,20 @@ pub fn (mut t Table) unwrap_generic_type(typ Type, generic_names []string, concr
|
|||
}
|
||||
if final_concrete_types.len > 0 {
|
||||
for method in ts.methods {
|
||||
for i in 1 .. method.params.len {
|
||||
if method.params[i].typ.has_flag(.generic)
|
||||
&& method.params[i].typ != method.params[0].typ {
|
||||
if method.params[i].typ !in needs_unwrap_types {
|
||||
needs_unwrap_types << method.params[i].typ
|
||||
}
|
||||
}
|
||||
if method.return_type.has_flag(.generic)
|
||||
&& method.return_type != method.params[0].typ {
|
||||
if method.return_type !in needs_unwrap_types {
|
||||
needs_unwrap_types << method.return_type
|
||||
}
|
||||
}
|
||||
}
|
||||
t.register_fn_concrete_types(method.fkey(), final_concrete_types)
|
||||
}
|
||||
}
|
||||
|
@ -1648,6 +1663,9 @@ pub fn (mut t Table) unwrap_generic_type(typ Type, generic_names []string, concr
|
|||
mod: ts.mod
|
||||
info: info
|
||||
)
|
||||
for typ_ in needs_unwrap_types {
|
||||
t.unwrap_generic_type(typ_, generic_names, concrete_types)
|
||||
}
|
||||
return new_type(new_idx).derive(typ).clear_flag(.generic)
|
||||
}
|
||||
Interface {
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
module main
|
||||
|
||||
pub struct Randomizer<T> {
|
||||
}
|
||||
|
||||
pub struct Element<T> {
|
||||
}
|
||||
|
||||
fn test_generics_with_nested_generic_type_parameter() {
|
||||
a := new_randomizer<int>()
|
||||
println(a)
|
||||
assert '$a' == '&Randomizer<int>{}'
|
||||
}
|
||||
|
||||
pub fn new_randomizer<T>() &Randomizer<T> {
|
||||
return &Randomizer<T>{}
|
||||
}
|
||||
|
||||
pub fn (mut r Randomizer<T>) add_multiple(elements []Element<T>) {
|
||||
}
|
Loading…
Reference in New Issue