From 24e0a6cff282b9e7021b2bfda5cb938e4be32c4f Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Mon, 22 Aug 2022 08:22:46 +0300 Subject: [PATCH] checker: fix vls test compilation --- vlib/v/checker/fn.v | 9 ++++++ .../generics_method_returning_optional_test.v | 30 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 vlib/v/tests/generics_method_returning_optional_test.v diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 0725817f1e..3c00ee7ab4 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -1552,6 +1552,15 @@ pub fn (mut c Checker) method_call(mut node ast.CallExpr) ast.Type { c.table.register_fn_concrete_types(method.fkey(), concrete_types) } + // resolve return generics struct to concrete type + if method.generic_names.len > 0 && method.return_type.has_flag(.generic) + && !isnil(c.table.cur_fn) && c.table.cur_fn.generic_names.len == 0 { + node.return_type = c.table.unwrap_generic_type(method.return_type, method.generic_names, + concrete_types) + } else { + node.return_type = method.return_type + } + if node.concrete_types.len > 0 && node.concrete_types.all(!it.has_flag(.generic)) && method.return_type.has_flag(.generic) && method.generic_names.len > 0 && method.generic_names.len == node.concrete_types.len { diff --git a/vlib/v/tests/generics_method_returning_optional_test.v b/vlib/v/tests/generics_method_returning_optional_test.v new file mode 100644 index 0000000000..1bd79b3bb0 --- /dev/null +++ b/vlib/v/tests/generics_method_returning_optional_test.v @@ -0,0 +1,30 @@ +import json + +pub struct NotificationMessage { +pub: + method string + params T +} + +struct Abc {} + +pub fn (x &Abc) notification_at() ?NotificationMessage { + return json.decode(NotificationMessage, '{}') +} + +pub fn (x &Abc) generic_method(method_name string) ?NotificationMessage { + return x.notification_at() +} + +struct Res {} + +pub fn (mut x Abc) diagnostics() ?Res { + got := x.generic_method('xyz')? + return got.params +} + +fn test_generic_method_returning_optional() ? { + mut a := Abc{} + a.diagnostics()? + assert true +}