ast: fix error for generic sumtype init in generic fn call (#13238)
parent
79cb0db2ff
commit
05ff8f516d
|
@ -1668,6 +1668,41 @@ pub fn (mut t Table) unwrap_generic_type(typ Type, generic_names []string, concr
|
|||
}
|
||||
return new_type(new_idx).derive(typ).clear_flag(.generic)
|
||||
}
|
||||
SumType {
|
||||
mut variants := ts.info.variants.clone()
|
||||
for i in 0 .. variants.len {
|
||||
if variants[i].has_flag(.generic) {
|
||||
sym := t.sym(variants[i])
|
||||
if sym.kind in [.struct_, .sum_type, .interface_] {
|
||||
variants[i] = t.unwrap_generic_type(variants[i], generic_names,
|
||||
concrete_types)
|
||||
} else {
|
||||
if t_typ := t.resolve_generic_to_concrete(variants[i], generic_names,
|
||||
concrete_types)
|
||||
{
|
||||
variants[i] = t_typ
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
mut info := ts.info
|
||||
info.is_generic = false
|
||||
info.concrete_types = final_concrete_types
|
||||
info.parent_type = typ
|
||||
info.fields = fields
|
||||
info.variants = variants
|
||||
new_idx := t.register_sym(
|
||||
kind: .sum_type
|
||||
name: nrt
|
||||
cname: util.no_dots(c_nrt)
|
||||
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 {
|
||||
// resolve generic types inside methods
|
||||
mut imethods := ts.info.methods.clone()
|
||||
|
|
|
@ -980,14 +980,13 @@ pub mut:
|
|||
}
|
||||
|
||||
pub struct SumType {
|
||||
pub:
|
||||
variants []Type
|
||||
pub mut:
|
||||
fields []StructField
|
||||
found_fields bool
|
||||
is_anon bool
|
||||
// generic sumtype support
|
||||
is_generic bool
|
||||
variants []Type
|
||||
generic_types []Type
|
||||
concrete_types []Type
|
||||
parent_type Type
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
pub type Result<S> = Ok<S> | string
|
||||
|
||||
pub fn (x Result<S>) unwrap<S>() ?S {
|
||||
match x {
|
||||
Ok<S> {
|
||||
return x.value
|
||||
}
|
||||
string {
|
||||
return error(x)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct Ok<S> {
|
||||
value S
|
||||
}
|
||||
|
||||
pub fn ok<S>(value S) Result<S> {
|
||||
return Ok<S>{value}
|
||||
}
|
||||
|
||||
fn test_generic_symtype_init_in_generic_fn_call() {
|
||||
x := ok<int>(42)
|
||||
ret := x.unwrap() or { 0 }
|
||||
|
||||
println(ret)
|
||||
assert ret == 42
|
||||
}
|
Loading…
Reference in New Issue