From 4a32980a259ee5fcf9f88222f8f388f51aadf7da Mon Sep 17 00:00:00 2001 From: Spiros Grigoratos Date: Tue, 28 Feb 2023 17:25:47 +0200 Subject: [PATCH 1/6] added keywords --- server/src/types/keywords.ts | 2 ++ syntaxes/bitloops.tmLanguage.json | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/server/src/types/keywords.ts b/server/src/types/keywords.ts index bf710d8..5aa626e 100644 --- a/server/src/types/keywords.ts +++ b/server/src/types/keywords.ts @@ -12,6 +12,8 @@ export const components = { GraphQLController: 'GraphQLController', RESTController: 'RESTController', PackagePort: 'PackagePort', + Command: 'Command', + Query: 'Query', }; export const keywords = [ diff --git a/syntaxes/bitloops.tmLanguage.json b/syntaxes/bitloops.tmLanguage.json index 44a9a29..356d781 100644 --- a/syntaxes/bitloops.tmLanguage.json +++ b/syntaxes/bitloops.tmLanguage.json @@ -64,7 +64,7 @@ "patterns": [ { "name": "keyword.control.templateClass.bitloops", - "match": "\\b(Config|(REST\\.Methods)|REST|DTO|UseCase|Root|Entity|Rule|OK|Errors|ValueObject|Props|ReadModel|RESTController|RESTRouter|GraphQLController|Feature|Mapper|RepoPort|RepoAdapter|PackagePort|PackageAdapter|ApplicationErrors|DomainErrors|DomainError|ApplicationError)\\b" + "match": "\\b(Config|(REST\\.Methods)|REST|DTO|UseCase|Root|Entity|Rule|OK|Errors|ValueObject|Props|ReadModel|RESTController|RESTRouter|GraphQLController|Feature|Mapper|RepoPort|RepoAdapter|PackagePort|PackageAdapter|ApplicationErrors|DomainErrors|DomainError|ApplicationError|Command|Query|CommandHandler|QueryHandler)\\b" } ] }, @@ -72,7 +72,7 @@ "patterns": [ { "name": "entity.name.class.bitloops", - "match": "\\b[A-Z]+[a-zA-Z0-9]*(DTO|UseCase|Aggregate|VO|Entity|Error|Controller|Router|Feature|Mapper|RepoPort|RepoAdapter|PackagePort|PackageAdapter|Error)\\b" + "match": "\\b[A-Z]+[a-zA-Z0-9]*(DTO|UseCase|Aggregate|VO|Entity|Error|Controller|Router|Feature|Mapper|RepoPort|RepoAdapter|PackagePort|PackageAdapter|Error|Props|Rule|Command|Query|ReadModel|CommandHandler|QueryHandler)\\b" } ] }, From 4272963c1222a52f7d519cdaaf93a7b613fd0e0b Mon Sep 17 00:00:00 2001 From: Spiros Grigoratos Date: Thu, 2 Mar 2023 13:20:59 +0200 Subject: [PATCH 2/6] added completion after dot for StandardVO --- server/src/completion.ts | 61 ++++++++++++++++++++++++++++-------- server/src/lsp-connection.ts | 2 +- server/src/server.ts | 1 + server/src/types/keywords.ts | 3 ++ 4 files changed, 53 insertions(+), 14 deletions(-) diff --git a/server/src/completion.ts b/server/src/completion.ts index 7545b35..d969b2e 100644 --- a/server/src/completion.ts +++ b/server/src/completion.ts @@ -1,30 +1,65 @@ import { CompletionItem, CompletionItemKind, + InsertTextFormat, + InsertTextMode, TextDocumentPositionParams, + TextDocuments, } from 'vscode-languageserver/node.js'; import { documentation } from './information/documentation.js'; import { details } from './information/details.js'; import { allKeywords, components, keywords } from './types/keywords.js'; +import { TextDocument } from 'vscode-languageserver-textdocument'; + +//this would come from package +const StandardVO = { + prefixes: ['StandardVO', 'StandardVO.Currency'], + completions: { + StandardVO: ['Currency'], + 'StandardVO.Currency': ['Value', 'Create'], + }, +}; export class CompletionItemProvider { - public static onCompletion(_textDocumentPosition: TextDocumentPositionParams) { - return allKeywords.map((symbol) => ({ - label: symbol, - kind: CompletionItemKind.Keyword, - data: 1, - })); + public static onCompletion( + documents: TextDocuments, + _textDocumentPosition: TextDocumentPositionParams, + ) { + const document = documents.get(_textDocumentPosition.textDocument.uri); + let text = documents.get(_textDocumentPosition.textDocument.uri).getText(); + let position = _textDocumentPosition.position; + const offset = document.offsetAt(position); + for (const prefix of StandardVO.prefixes) { + const linePrefix = text.slice(offset - prefix.length - 1, offset); + if (linePrefix.endsWith(prefix + '.')) { + return [ + ...StandardVO.completions[prefix].map((symbol) => ({ + label: symbol, + kind: CompletionItemKind.Keyword, + data: 2, + //we could check for snippets too + })), + ]; + } + } + return [ + ...allKeywords.map((symbol) => ({ + label: symbol, + kind: CompletionItemKind.Keyword, + data: 1, + })), + ]; } public static onCompletionResolve(item: CompletionItem): CompletionItem { - const label: string = item.label; - if (documentation[item.label as keyof typeof documentation]) { - item.documentation = documentation[item.label as keyof typeof documentation]; + if (item.data == 1) { + if (documentation[item.label as keyof typeof documentation]) { + item.documentation = documentation[item.label as keyof typeof documentation]; + } + if (details[item.label as keyof typeof details]) { + item.detail = details[item.label as keyof typeof details]; + } } - if (details[item.label as keyof typeof details]) { - item.detail = details[item.label as keyof typeof details]; - } - return item; } } diff --git a/server/src/lsp-connection.ts b/server/src/lsp-connection.ts index c2e83c8..59ab597 100644 --- a/server/src/lsp-connection.ts +++ b/server/src/lsp-connection.ts @@ -29,7 +29,7 @@ export class LspConnection { this.documents.onDidClose(server.onDidClose.bind(server)); this.documents.onDidChangeContent(server.onDidChangeContent.bind(server)); - this.connection.onCompletion(server.completion.bind(server)); + this.connection.onCompletion(server.completion.bind(server, this.documents)); this.connection.onCompletionResolve(server.completionResolve.bind(server)); return this; } diff --git a/server/src/server.ts b/server/src/server.ts index 3819a59..fe6b819 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -64,6 +64,7 @@ export class BitloopsServer { // Tell the client that this server supports code completion. completionProvider: { resolveProvider: true, + triggerCharacters: ['.'], }, }, }; diff --git a/server/src/types/keywords.ts b/server/src/types/keywords.ts index 5aa626e..48de099 100644 --- a/server/src/types/keywords.ts +++ b/server/src/types/keywords.ts @@ -141,6 +141,9 @@ export const keywords = [ 'Operations', 'Mutation', 'Query', + + 'StandardVO', ]; +// 'StandardVO', export const allKeywords = Array.from(new Set([...Object.values(components), ...keywords])); From 51c3ec7b5fad41f16f9517f1d2478a965800702a Mon Sep 17 00:00:00 2001 From: Spiros Grigoratos Date: Thu, 2 Mar 2023 13:28:23 +0200 Subject: [PATCH 3/6] changed StandardVO.Currency completions --- server/src/completion.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/completion.ts b/server/src/completion.ts index d969b2e..3f3bc4b 100644 --- a/server/src/completion.ts +++ b/server/src/completion.ts @@ -16,7 +16,7 @@ const StandardVO = { prefixes: ['StandardVO', 'StandardVO.Currency'], completions: { StandardVO: ['Currency'], - 'StandardVO.Currency': ['Value', 'Create'], + 'StandardVO.Currency': ['Value', 'Errors'], }, }; From 155aa8d8900be1ca104b9711c6366d91f9364eff Mon Sep 17 00:00:00 2001 From: Spiros Grigoratos Date: Thu, 2 Mar 2023 13:30:05 +0200 Subject: [PATCH 4/6] changed name of variable coming from package --- server/src/completion.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/src/completion.ts b/server/src/completion.ts index 3f3bc4b..4129776 100644 --- a/server/src/completion.ts +++ b/server/src/completion.ts @@ -12,7 +12,7 @@ import { allKeywords, components, keywords } from './types/keywords.js'; import { TextDocument } from 'vscode-languageserver-textdocument'; //this would come from package -const StandardVO = { +const StandardVOCompletion = { prefixes: ['StandardVO', 'StandardVO.Currency'], completions: { StandardVO: ['Currency'], @@ -29,11 +29,11 @@ export class CompletionItemProvider { let text = documents.get(_textDocumentPosition.textDocument.uri).getText(); let position = _textDocumentPosition.position; const offset = document.offsetAt(position); - for (const prefix of StandardVO.prefixes) { + for (const prefix of StandardVOCompletion.prefixes) { const linePrefix = text.slice(offset - prefix.length - 1, offset); if (linePrefix.endsWith(prefix + '.')) { return [ - ...StandardVO.completions[prefix].map((symbol) => ({ + ...StandardVOCompletion.completions[prefix].map((symbol) => ({ label: symbol, kind: CompletionItemKind.Keyword, data: 2, From 9445bfec03103ebe5401a1ece57d40aee123cd4a Mon Sep 17 00:00:00 2001 From: Spiros Grigoratos Date: Thu, 2 Mar 2023 13:35:54 +0200 Subject: [PATCH 5/6] deleted StandardVO.Currency example --- server/src/completion.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/src/completion.ts b/server/src/completion.ts index 4129776..f73c6b2 100644 --- a/server/src/completion.ts +++ b/server/src/completion.ts @@ -13,10 +13,11 @@ import { TextDocument } from 'vscode-languageserver-textdocument'; //this would come from package const StandardVOCompletion = { - prefixes: ['StandardVO', 'StandardVO.Currency'], + prefixes: ['StandardVO'], + // , 'StandardVO.Currency'], completions: { StandardVO: ['Currency'], - 'StandardVO.Currency': ['Value', 'Errors'], + // 'StandardVO.Currency': ['Value', 'Errors'], }, }; From 9284de3ec21ffc923bcf2dc359a1c069faad891e Mon Sep 17 00:00:00 2001 From: Spiros Grigoratos Date: Thu, 2 Mar 2023 13:36:15 +0200 Subject: [PATCH 6/6] changed comment --- server/src/completion.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/completion.ts b/server/src/completion.ts index f73c6b2..71a7b2f 100644 --- a/server/src/completion.ts +++ b/server/src/completion.ts @@ -38,7 +38,7 @@ export class CompletionItemProvider { label: symbol, kind: CompletionItemKind.Keyword, data: 2, - //we could check for snippets too + //we could add snippets too })), ]; }