checker: fix json decoder with generic struct (#14700)

master
yuyi 2022-06-07 00:25:02 +08:00 committed by GitHub
parent ce26d5bc5c
commit abf35270cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 1 deletions

View File

@ -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'
}

View File

@ -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 {