diff --git a/server/src/e2e/tolk/testcases/completion-select/match.test b/server/src/e2e/tolk/testcases/completion-select/match.test index 3ed83bcf..17cbf721 100644 --- a/server/src/e2e/tolk/testcases/completion-select/match.test +++ b/server/src/e2e/tolk/testcases/completion-select/match.test @@ -251,7 +251,7 @@ fun main(msg: AllowedMessageToMinter) { RequestWalletAddress => {}, ChangeMinterAdmin => {}, ChangeMinterContent => {}, - AllowedMessageToMinter + else => {}, } } @@ -273,3 +273,33 @@ fun foo(value: int) { FOO => {} } } + +======================================================================== +Match over type else completion +======================================================================== +fun foo(a: int | slice) { + match (a) { + els + } +} +------------------------------------------------------------------------ +fun foo(a: int | slice) { + match (a) { + else => {}, + } +} + +======================================================================== +Match over value else completion +======================================================================== +fun foo() { + match (10) { + els + } +} +------------------------------------------------------------------------ +fun foo() { + match (10) { + else => {}, + } +} diff --git a/server/src/e2e/tolk/testcases/completion/match.test b/server/src/e2e/tolk/testcases/completion/match.test index a70876e0..d5cbfcc8 100644 --- a/server/src/e2e/tolk/testcases/completion/match.test +++ b/server/src/e2e/tolk/testcases/completion/match.test @@ -24,6 +24,7 @@ fun foo(value: int | slice) { ------------------------------------------------------------------------ 22 int => {} 22 slice => {} +22 else => {} ======================================================================== Match over type completion, union type 2 @@ -52,6 +53,7 @@ fun main(msg: AllowedMessageToMinter) { 22 ChangeMinterContent => {} 22 MintNewJettons => {} 22 RequestWalletAddress => {} +22 else => {} ======================================================================== Match over type completion, union type, match with single arm @@ -80,6 +82,7 @@ fun main(msg: AllowedMessageToMinter) { 22 ChangeMinterAdmin => {} 22 ChangeMinterContent => {} 22 RequestWalletAddress => {} +22 else => {} ======================================================================== Match over type completion, union type, match with single arm, cursor before arm @@ -109,6 +112,7 @@ fun main(msg: AllowedMessageToMinter) { 22 ChangeMinterContent => {} 22 MintNewJettons => {} 22 RequestWalletAddress => {} +22 else => {} ======================================================================== Match over type completion, union type, match with several arms @@ -137,6 +141,7 @@ fun main(msg: AllowedMessageToMinter) { } ------------------------------------------------------------------------ 22 ChangeMinterContent => {} +22 else => {} ======================================================================== Match over type completion, union type, match with all arms @@ -165,6 +170,21 @@ fun main(msg: AllowedMessageToMinter) { } } ------------------------------------------------------------------------ +22 else => {} + +======================================================================== +Match over type with else completion +======================================================================== +const FOO = 100 + +fun foo(value: int | slice) { + match (value) { + int => {}, + else => {}, + els + } +} +------------------------------------------------------------------------ No completion items ======================================================================== @@ -179,3 +199,18 @@ fun foo(value: int) { } ------------------------------------------------------------------------ 20 FOO: int = 100 + +======================================================================== +Match over value with else completion +======================================================================== +const FOO = 100 + +fun foo(value: int) { + match (value) { + FOO => {}, + else => {}, + els + } +} +------------------------------------------------------------------------ +No completion items diff --git a/server/src/e2e/tolk/testcases/completion/struct-instance.test b/server/src/e2e/tolk/testcases/completion/struct-instance.test index 31cb2a85..8fb068ef 100644 --- a/server/src/e2e/tolk/testcases/completion/struct-instance.test +++ b/server/src/e2e/tolk/testcases/completion/struct-instance.test @@ -92,12 +92,10 @@ struct Foo { } fun test(value: int) { - Foo{ val value: 10 }; + Foo{ a, value: 10 }; } ------------------------------------------------------------------------ -5 value int -14 val -14 valt +9 age : int of Foo ======================================================================== Second field in struct init with variable diff --git a/server/src/languages/tolk/completion/providers/MatchArmsCompletionProvider.ts b/server/src/languages/tolk/completion/providers/MatchArmsCompletionProvider.ts index b3363074..ddd9bf0f 100644 --- a/server/src/languages/tolk/completion/providers/MatchArmsCompletionProvider.ts +++ b/server/src/languages/tolk/completion/providers/MatchArmsCompletionProvider.ts @@ -49,16 +49,44 @@ export class MatchArmsCompletionProvider implements CompletionProvider { insertText: value.insertText + "$1 => {$0}", }) } + + let seenElse = false + + const arms = body.namedChildren.filter(it => it?.type === "match_arm") + for (const arm of arms) { + if (arm?.childForFieldName("pattern_else")) { + seenElse = true + } + } + + if (!seenElse) { + result.add({ + label: "else", + labelDetails: { + detail: " => {}", + }, + kind: CompletionItemKind.Event, + insertTextFormat: InsertTextFormat.Snippet, + insertText: "else => {$0},", + weight: CompletionWeight.SNIPPET + 10, + }) + } return } const arms = body.namedChildren.filter(it => it?.type === "match_arm") + let seenElse = false const handledTypes: Set = new Set() for (const arm of arms) { if (!arm) continue + if (arm.childForFieldName("pattern_else")) { + seenElse = true + continue + } + const patternType = arm.childForFieldName("pattern_type") if (!patternType) continue @@ -83,5 +111,18 @@ export class MatchArmsCompletionProvider implements CompletionProvider { weight: CompletionWeight.SNIPPET, }) } + + if (!seenElse) { + result.add({ + label: "else", + labelDetails: { + detail: " => {}", + }, + kind: CompletionItemKind.Event, + insertTextFormat: InsertTextFormat.Snippet, + insertText: "else => {$0},", + weight: CompletionWeight.SNIPPET + 10, + }) + } } }