ast: fix generic sumtype of alias generic struct (#12611)
parent
65e9503556
commit
9825c7e06c
|
@ -362,14 +362,15 @@ pub struct GetEmbedsOptions {
|
|||
// the hierarchy of embeds is returned as a list
|
||||
pub fn (t &Table) get_embeds(sym &TypeSymbol, options GetEmbedsOptions) [][]Type {
|
||||
mut embeds := [][]Type{}
|
||||
if sym.info is Struct {
|
||||
for embed in sym.info.embeds {
|
||||
unalias_sym := if sym.info is Alias { t.get_type_symbol(sym.info.parent_type) } else { sym }
|
||||
if unalias_sym.info is Struct {
|
||||
for embed in unalias_sym.info.embeds {
|
||||
embed_sym := t.get_type_symbol(embed)
|
||||
mut preceding := options.preceding
|
||||
preceding << embed
|
||||
embeds << t.get_embeds(embed_sym, preceding: preceding)
|
||||
}
|
||||
if sym.info.embeds.len == 0 && options.preceding.len > 0 {
|
||||
if unalias_sym.info.embeds.len == 0 && options.preceding.len > 0 {
|
||||
embeds << options.preceding
|
||||
}
|
||||
}
|
||||
|
@ -527,6 +528,9 @@ pub fn (t &Table) find_field_from_embeds_recursive(sym &TypeSymbol, field_name s
|
|||
return field, embed_types
|
||||
}
|
||||
}
|
||||
} else if sym.info is Alias {
|
||||
unalias_sym := t.get_type_symbol(sym.info.parent_type)
|
||||
return t.find_field_from_embeds_recursive(unalias_sym, field_name)
|
||||
}
|
||||
return none
|
||||
}
|
||||
|
@ -556,6 +560,9 @@ pub fn (t &Table) find_field_from_embeds(sym &TypeSymbol, field_name string) ?(S
|
|||
return field, embed_type
|
||||
}
|
||||
}
|
||||
} else if sym.info is Alias {
|
||||
unalias_sym := t.get_type_symbol(sym.info.parent_type)
|
||||
return t.find_field_from_embeds(unalias_sym, field_name)
|
||||
}
|
||||
return none
|
||||
}
|
||||
|
@ -581,7 +588,7 @@ pub fn (t &Table) resolve_common_sumtype_fields(sym_ &TypeSymbol) {
|
|||
mut field_map := map[string]StructField{}
|
||||
mut field_usages := map[string]int{}
|
||||
for variant in info.variants {
|
||||
mut v_sym := t.get_type_symbol(variant)
|
||||
mut v_sym := t.get_final_type_symbol(variant)
|
||||
fields := match mut v_sym.info {
|
||||
Struct {
|
||||
t.struct_fields(v_sym)
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
struct Shared {
|
||||
val int
|
||||
}
|
||||
|
||||
struct AA<T> {
|
||||
Shared
|
||||
}
|
||||
|
||||
type AAint = AA<int>
|
||||
type AAbool = AA<bool>
|
||||
|
||||
struct BB<T> {
|
||||
Shared
|
||||
}
|
||||
|
||||
type BBint = BB<int>
|
||||
type BBbool = BB<bool>
|
||||
|
||||
type CC = AAbool | AAint | BBbool | BBint
|
||||
|
||||
fn (c CC) str() string {
|
||||
return '$c.val'
|
||||
}
|
||||
|
||||
fn test_generic_sumtype_of_alias_generic_struct() {
|
||||
mut c := []CC{}
|
||||
c << AAint{
|
||||
val: 1
|
||||
}
|
||||
c << BBbool{
|
||||
val: 2
|
||||
}
|
||||
println('$c')
|
||||
assert '$c' == '[1, 2]'
|
||||
}
|
Loading…
Reference in New Issue