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,27 +1093,22 @@ pub fn (mut t Table) generic_struct_insts_to_concrete() {
}
mut parent_info := parent.info as Struct
mut fields := parent_info.fields.clone()
for i, _ in fields {
mut field := fields[i]
if field.typ.has_flag(.generic) {
if parent_info.generic_types.len != info.generic_types.len {
// TODO: proper error
panic('generic template mismatch')
}
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
}
if parent_info.generic_types.len == info.generic_types.len {
for i, _ in fields {
mut field := fields[i]
if t_typ := t.resolve_generic_by_types(field.typ, parent_info.generic_types,
info.generic_types)
{
field.typ = t_typ
}
fields[i] = field
}
fields[i] = field
parent_info.generic_types = []
parent_info.fields = fields
typ.is_public = true
typ.kind = .struct_
typ.info = parent_info
}
parent_info.generic_types = []
parent_info.fields = fields
typ.is_public = true
typ.kind = .struct_
typ.info = parent_info
}
}
}

View File

@ -49,3 +49,15 @@ fn test_generics_with_generics_struct_string() {
assert ret.contains("data: ['foo', 'bar']")
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')
}