diff --git a/server/src/e2e/tolk/testcases/completion/top-level.test b/server/src/e2e/tolk/testcases/completion/top-level.test index 63c82b9f..7f41a330 100644 --- a/server/src/e2e/tolk/testcases/completion/top-level.test +++ b/server/src/e2e/tolk/testcases/completion/top-level.test @@ -19,6 +19,7 @@ Top level completion 14 onExternalMessage 14 onInternalMessage 14 onTickTock +14 storage ======================================================================== Top level completion after declaration @@ -43,6 +44,7 @@ fun foo() {} 14 onExternalMessage 14 onInternalMessage 14 onTickTock +14 storage ======================================================================== Top level completion before declaration and after import @@ -69,6 +71,7 @@ fun foo() {} 14 onExternalMessage 14 onInternalMessage 14 onTickTock +14 storage ======================================================================== No top level completion inside function diff --git a/server/src/languages/tolk/completion/index.ts b/server/src/languages/tolk/completion/index.ts index 29bc8b46..829928a6 100644 --- a/server/src/languages/tolk/completion/index.ts +++ b/server/src/languages/tolk/completion/index.ts @@ -31,6 +31,7 @@ import {VariableSizeTypeCompletionProvider} from "@server/languages/tolk/complet import {ExpressionSnippetsCompletionProvider} from "@server/languages/tolk/completion/providers/ExpressionSnippetsCompletionProvider" import {MatchArmsCompletionProvider} from "@server/languages/tolk/completion/providers/MatchArmsCompletionProvider" import {CompletionItemAdditionalInformation} from "@server/completion/CompletionItemAdditionalInformation" +import {StorageCompletionProvider} from "@server/languages/tolk/completion/providers/StorageCompletionProvider" export async function provideTolkCompletion( file: TolkFile, @@ -110,6 +111,7 @@ export async function provideTolkCompletion( new IndexAccessCompletionProvider(), new VariableSizeTypeCompletionProvider(), new MatchArmsCompletionProvider(ref), + new StorageCompletionProvider(), ] for (const provider of providers) { diff --git a/server/src/languages/tolk/completion/providers/StorageCompletionProvider.ts b/server/src/languages/tolk/completion/providers/StorageCompletionProvider.ts new file mode 100644 index 00000000..48511cb0 --- /dev/null +++ b/server/src/languages/tolk/completion/providers/StorageCompletionProvider.ts @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +// Copyright © 2025 TON Core +import type {CompletionProvider} from "@server/completion/CompletionProvider" +import {CompletionItemKind, InsertTextFormat} from "vscode-languageserver-types" +import type {CompletionContext} from "@server/languages/tolk/completion/CompletionContext" +import {CompletionResult, CompletionWeight} from "@server/completion/WeightedCompletionItem" + +export class StorageCompletionProvider implements CompletionProvider { + public isAvailable(ctx: CompletionContext): boolean { + return ctx.topLevel + } + + public addCompletion(_ctx: CompletionContext, result: CompletionResult): void { + result.add({ + label: "storage", + kind: CompletionItemKind.Snippet, + insertTextFormat: InsertTextFormat.Snippet, + insertText: `struct \${1:Storage} { + $0 +} + +fun \${1:Storage}.load() { + return \${1:Storage}.fromCell(contract.getData()); +} + +fun \${1:Storage}.save(self) { + contract.setData(self.toCell()); +}`, + weight: CompletionWeight.SNIPPET, + }) + } +}