diff --git a/src/analysis.zig b/src/analysis.zig index 650f8460e..64fe9f034 100644 --- a/src/analysis.zig +++ b/src/analysis.zig @@ -415,7 +415,17 @@ pub fn firstParamIs( else => expected_type, }; - return deref_type.eql(deref_expected_type); + return switch (deref_type.data) { + .either => |entries| { + for (entries) |entry| { + if (entry.type_data.eql(deref_expected_type.data)) { + return true; + } + } + return false; + }, + else => deref_type.eql(deref_expected_type), + }; } pub fn getVariableSignature( diff --git a/tests/lsp_features/completion.zig b/tests/lsp_features/completion.zig index f347fd095..ccf54bb33 100644 --- a/tests/lsp_features/completion.zig +++ b/tests/lsp_features/completion.zig @@ -4338,6 +4338,34 @@ test "generic function with @This() as self param" { }); } +test "methods of branching type" { + try testCompletion( + \\const Reader = switch (undefined) { + \\ .windows => struct { + \\ fn foo(_: *Reader) bool {} + \\ }, + \\ else => struct { + \\ fn bar(_: *Reader) bool {} + \\ }, + \\}; + \\test { + \\ var reader: Reader = undefined; + \\ reader. + \\} + , &.{ + .{ + .label = "foo", + .kind = .Function, + .detail = "fn (_: *either type) bool", + }, + .{ + .label = "bar", + .kind = .Function, + .detail = "fn (_: *either type) bool", + }, + }); +} + fn testCompletion(source: []const u8, expected_completions: []const Completion) !void { try testCompletionWithOptions(source, expected_completions, .{}); }