checker: fix json decoder with generic struct (#14700)
parent
ce26d5bc5c
commit
abf35270cf
|
@ -0,0 +1,24 @@
|
||||||
|
import json
|
||||||
|
|
||||||
|
struct Result<T> {
|
||||||
|
ok bool
|
||||||
|
result T
|
||||||
|
}
|
||||||
|
|
||||||
|
struct User {
|
||||||
|
id int
|
||||||
|
username string
|
||||||
|
}
|
||||||
|
|
||||||
|
fn func<T>() ?T {
|
||||||
|
text := '{"ok": true, "result":{"id":37467243, "username": "ciao"}}'
|
||||||
|
a := json.decode(Result<T>, text)?
|
||||||
|
return a.result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_decode_with_generic_struct() ? {
|
||||||
|
ret := func<User>()?
|
||||||
|
println(ret)
|
||||||
|
assert ret.id == 37467243
|
||||||
|
assert ret.username == 'ciao'
|
||||||
|
}
|
|
@ -506,7 +506,12 @@ pub fn (mut c Checker) fn_call(mut node ast.CallExpr, mut continue_check &bool)
|
||||||
}
|
}
|
||||||
expr := node.args[0].expr
|
expr := node.args[0].expr
|
||||||
if expr is ast.TypeNode {
|
if expr is ast.TypeNode {
|
||||||
sym := c.table.sym(c.unwrap_generic(expr.typ))
|
mut unwrapped_typ := c.unwrap_generic(expr.typ)
|
||||||
|
if c.table.sym(expr.typ).kind == .struct_ && expr.typ.has_flag(.generic) {
|
||||||
|
unwrapped_typ = c.table.unwrap_generic_type(expr.typ, c.table.cur_fn.generic_names,
|
||||||
|
c.table.cur_concrete_types)
|
||||||
|
}
|
||||||
|
sym := c.table.sym(unwrapped_typ)
|
||||||
if c.table.known_type(sym.name) && sym.kind != .placeholder {
|
if c.table.known_type(sym.name) && sym.kind != .placeholder {
|
||||||
mut kind := sym.kind
|
mut kind := sym.kind
|
||||||
if sym.info is ast.Alias {
|
if sym.info is ast.Alias {
|
||||||
|
|
Loading…
Reference in New Issue