generics: fix generic_struct_insts_to_concrete (#9536)

pull/9544/head
yuyi 2021-03-31 19:11:55 +08:00 committed by GitHub
parent 0b39de2fd3
commit f1797a0150
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 18 deletions

View File

@ -1093,19 +1093,13 @@ pub fn (mut t Table) generic_struct_insts_to_concrete() {
} }
mut parent_info := parent.info as Struct mut parent_info := parent.info as Struct
mut fields := parent_info.fields.clone() mut fields := parent_info.fields.clone()
if parent_info.generic_types.len == info.generic_types.len {
for i, _ in fields { for i, _ in fields {
mut field := fields[i] mut field := fields[i]
if field.typ.has_flag(.generic) { if t_typ := t.resolve_generic_by_types(field.typ, parent_info.generic_types,
if parent_info.generic_types.len != info.generic_types.len { info.generic_types)
// TODO: proper error {
panic('generic template mismatch') field.typ = t_typ
}
for j, gp in parent_info.generic_types {
if gp == field.typ {
field.typ = info.generic_types[j].derive(field.typ).clear_flag(.generic)
break
}
}
} }
fields[i] = field fields[i] = field
} }
@ -1117,3 +1111,4 @@ pub fn (mut t Table) generic_struct_insts_to_concrete() {
} }
} }
} }
}

View File

@ -49,3 +49,15 @@ fn test_generics_with_generics_struct_string() {
assert ret.contains("data: ['foo', 'bar']") assert ret.contains("data: ['foo', 'bar']")
assert ret.contains('index: 11') assert ret.contains('index: 11')
} }
fn test_generics_struct_insts_to_concrete() {
ai := ArrayIterator<int>{
data: [11, 22],
index: 22
}
println(ai)
ret := '$ai'
assert ret.contains('ArrayIterator<int>{')
assert ret.contains('data: [11, 22]')
assert ret.contains('index: 22')
}