ast, cgen: fix generic method str() overload (#12330)
parent
475a2f9b43
commit
0e95e4d7b4
|
@ -1186,6 +1186,11 @@ pub fn (t &TypeSymbol) has_method(name string) bool {
|
|||
return true
|
||||
}
|
||||
|
||||
pub fn (t &TypeSymbol) has_method_with_generic_parent(name string) bool {
|
||||
t.find_method_with_generic_parent(name) or { return false }
|
||||
return true
|
||||
}
|
||||
|
||||
pub fn (t &TypeSymbol) find_method(name string) ?Fn {
|
||||
for method in t.methods {
|
||||
if method.name == name {
|
||||
|
@ -1240,7 +1245,7 @@ pub fn (t &TypeSymbol) str_method_info() (bool, bool, int) {
|
|||
mut has_str_method := false
|
||||
mut expects_ptr := false
|
||||
mut nr_args := 0
|
||||
if sym_str_method := t.find_method('str') {
|
||||
if sym_str_method := t.find_method_with_generic_parent('str') {
|
||||
has_str_method = true
|
||||
nr_args = sym_str_method.params.len
|
||||
if nr_args > 0 {
|
||||
|
|
|
@ -144,6 +144,9 @@ fn (mut g Gen) get_str_fn(typ ast.Type) string {
|
|||
str_fn_name = styp_to_str_fn_name(sym.name)
|
||||
}
|
||||
}
|
||||
if sym.has_method_with_generic_parent('str') && mut sym.info is ast.Struct {
|
||||
str_fn_name = g.generic_fn_name(sym.info.concrete_types, str_fn_name, false)
|
||||
}
|
||||
g.str_types << StrType{
|
||||
typ: unwrapped
|
||||
styp: styp
|
||||
|
@ -157,7 +160,7 @@ fn (mut g Gen) final_gen_str(typ StrType) {
|
|||
}
|
||||
g.generated_str_fns << typ
|
||||
sym := g.table.get_type_symbol(typ.typ)
|
||||
if sym.has_method('str') && !typ.typ.has_flag(.optional) {
|
||||
if sym.has_method_with_generic_parent('str') && !typ.typ.has_flag(.optional) {
|
||||
return
|
||||
}
|
||||
styp := typ.styp
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
struct Gen<G> {
|
||||
data G
|
||||
id int
|
||||
size int
|
||||
}
|
||||
|
||||
fn (g Gen<G>) str() string {
|
||||
return 'Gen<G> $g.id, $g.data, ${g.size}.'
|
||||
}
|
||||
|
||||
fn test_generics_method_str_overload() {
|
||||
mut g := Gen<string>{'Gen', 0, 10}
|
||||
println(g)
|
||||
assert '$g' == 'Gen<G> 0, Gen, 10.'
|
||||
}
|
Loading…
Reference in New Issue