From 4252318d34550d94c090d715235ae338e2cc9d64 Mon Sep 17 00:00:00 2001 From: Aleksei Piianin Date: Tue, 12 Nov 2024 08:08:50 +0100 Subject: [PATCH 1/3] resolve return type of orelse with return --- src/analysis.zig | 11 +++++++++-- tests/lsp_features/completion.zig | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/analysis.zig b/src/analysis.zig index b56fa901f..ce2781818 100644 --- a/src/analysis.zig +++ b/src/analysis.zig @@ -1610,8 +1610,15 @@ fn resolveTypeOfNodeUncached(analyser: *Analyser, node_handle: NodeWithHandle) e .unwrap_optional => try analyser.resolveOptionalUnwrap(base_type), .array_access => try analyser.resolveBracketAccessType(base_type, .Single), .@"orelse" => { - const type_right = try analyser.resolveTypeOfNodeInternal(.{ .node = datas[node].rhs, .handle = handle }) orelse return null; - return try analyser.resolveOrelseType(base_type, type_right); + const type_right = try analyser.resolveTypeOfNodeInternal(.{ .node = datas[node].rhs, .handle = handle }); + if (type_right) |tr| { + return try analyser.resolveOrelseType(base_type, tr); + } + const type_left = try analyser.resolveTypeOfNodeInternal(.{ .node = datas[node].lhs, .handle = handle }) orelse return null; + return try analyser.resolveOrelseType(base_type, switch (type_left.data) { + .optional => |o| o.*, + else => type_left, + }); }, .@"catch" => try analyser.resolveUnwrapErrorUnionType(base_type, .payload), .@"try" => try analyser.resolveUnwrapErrorUnionType(base_type, .payload), diff --git a/tests/lsp_features/completion.zig b/tests/lsp_features/completion.zig index c1be4d3b8..5e4ee72fb 100644 --- a/tests/lsp_features/completion.zig +++ b/tests/lsp_features/completion.zig @@ -2529,6 +2529,24 @@ test "@extern" { }); } +test "@orelse with return" { + try testCompletion( + \\test { + \\ const S = struct { + \\ alpha: u32, + \\ }; + \\ const v: ?*const S = &S{ .alpha = 5 }; + \\ const foo = v orelse { + \\ return; + \\ }; + \\ foo. + \\} + , &.{ + .{ .label = "*", .kind = .Operator, .detail = "S" }, + .{ .label = "alpha", .kind = .Field, .detail = "u32" }, + }); +} + test "builtin fns return type" { try testCompletion( \\pub const chip_mod = struct { From 7df0b486336a5c400e0fde8ced5dba696cb1ce19 Mon Sep 17 00:00:00 2001 From: Aleksei Piianin Date: Tue, 12 Nov 2024 08:21:16 +0100 Subject: [PATCH 2/3] renamed test --- tests/lsp_features/completion.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lsp_features/completion.zig b/tests/lsp_features/completion.zig index 5e4ee72fb..1c9502871 100644 --- a/tests/lsp_features/completion.zig +++ b/tests/lsp_features/completion.zig @@ -2529,7 +2529,7 @@ test "@extern" { }); } -test "@orelse with return" { +test "@orelse with block" { try testCompletion( \\test { \\ const S = struct { From 8f59fde07fbbfb6e1b0234b11166e067c251e1fd Mon Sep 17 00:00:00 2001 From: Aleksei Piianin Date: Sun, 17 Nov 2024 08:19:24 +0100 Subject: [PATCH 3/3] simplify handling of lhs --- src/analysis.zig | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/analysis.zig b/src/analysis.zig index ce2781818..b8a31bcc8 100644 --- a/src/analysis.zig +++ b/src/analysis.zig @@ -1610,15 +1610,8 @@ fn resolveTypeOfNodeUncached(analyser: *Analyser, node_handle: NodeWithHandle) e .unwrap_optional => try analyser.resolveOptionalUnwrap(base_type), .array_access => try analyser.resolveBracketAccessType(base_type, .Single), .@"orelse" => { - const type_right = try analyser.resolveTypeOfNodeInternal(.{ .node = datas[node].rhs, .handle = handle }); - if (type_right) |tr| { - return try analyser.resolveOrelseType(base_type, tr); - } - const type_left = try analyser.resolveTypeOfNodeInternal(.{ .node = datas[node].lhs, .handle = handle }) orelse return null; - return try analyser.resolveOrelseType(base_type, switch (type_left.data) { - .optional => |o| o.*, - else => type_left, - }); + const type_right = try analyser.resolveTypeOfNodeInternal(.{ .node = datas[node].rhs, .handle = handle }) orelse return try analyser.resolveOptionalUnwrap(base_type); + return try analyser.resolveOrelseType(base_type, type_right); }, .@"catch" => try analyser.resolveUnwrapErrorUnionType(base_type, .payload), .@"try" => try analyser.resolveUnwrapErrorUnionType(base_type, .payload),