From 29d6a08056d27fe700f00bfb07a02a1d29589578 Mon Sep 17 00:00:00 2001 From: rjmacarthy Date: Sun, 3 Mar 2024 21:01:24 +0000 Subject: [PATCH 1/2] update completion, simplify duplicate sequences --- src/extension/completion-formatter.ts | 81 +++++++-------------------- src/extension/providers/completion.ts | 15 +++-- 2 files changed, 32 insertions(+), 64 deletions(-) diff --git a/src/extension/completion-formatter.ts b/src/extension/completion-formatter.ts index a8bca71c..468c524c 100644 --- a/src/extension/completion-formatter.ts +++ b/src/extension/completion-formatter.ts @@ -102,62 +102,31 @@ export class CompletionFormatter { private normalise = (text: string) => text?.trim() - private removeDuplicateText = () => { - const normalisedAfter = this.normalise(this._textAfterCursor) - if ( - (normalisedAfter && - this._normalisedCompletion && - normalisedAfter === this._normalisedCompletion) || - (this._textAfterCursor && - (!this._completion.length && - this._normalisedCompletion.endsWith(this._textAfterCursor))) - ) { - this._completion = '' - return this - } - - if ( - this._normalisedCompletion && - normalisedAfter && - this._normalisedCompletion.includes(normalisedAfter) - ) { - if (QUOTES.includes(normalisedAfter.at(-1) as string)) { - this._completion = this._completion.replace( - normalisedAfter.slice(0, -1), - '' - ) - return this + private removeDuplicateText() { + const after = this.normalise(this._textAfterCursor) + + const maxLength = Math.min(this._completion.length, after.length) + let overlapLength = 0 + + for (let length = 1; length <= maxLength; length++) { + const endOfCompletion = this._completion.substring( + this._completion.length - length + ) + const startOfAfter = after.substring(0, length) + if (endOfCompletion === startOfAfter) { + overlapLength = length } - - this._completion = this._completion.replace(normalisedAfter, '') - return this } - if ( - this._normalisedCompletion && - normalisedAfter.includes(this._normalisedCompletion) - ) { - const before = normalisedAfter.at( - normalisedAfter.indexOf(this._normalisedCompletion) - 1 - ) as string - const after = normalisedAfter.at( - normalisedAfter.indexOf(this._normalisedCompletion) + - this._normalisedCompletion.length - ) as string - if (this.isMiddleWord(before, after)) { - return this - } - this._completion = '' - return this + if (overlapLength > 0) { + this._completion = this._completion.substring( + 0, + this._completion.length - overlapLength + ) } return this } - - private isMiddleWord(before: string, after: string) { - return before && after && /\w/.test(before) && /\w/.test(after) - } - private isCursorAtMiddleOfWord() { return ( this._charAfterCursor && @@ -247,16 +216,6 @@ export class CompletionFormatter { return this } - private checkBrackets = (): CompletionFormatter => { - if ( - this.isOnlyBrackets(this._normalisedCompletion) || - this.isSingleBracket(this._normalisedCompletion) - ) { - this._completion = this._normalisedCompletion - } - return this - } - private skipMiddleOfWord() { if (this.isCursorAtMiddleOfWord()) { this._completion = '' @@ -265,6 +224,9 @@ export class CompletionFormatter { } private getCompletion = () => { + if (this._completion.trim().length === 0) { + this._completion = '' + } return this._completion } @@ -285,7 +247,6 @@ export class CompletionFormatter { .removeUnnecessaryMiddleQuote() .ignoreBlankLines() .removeInvalidLineBreaks() - .checkBrackets() .removeDuplicateText() .skipMiddleOfWord() .getCompletion() diff --git a/src/extension/providers/completion.ts b/src/extension/providers/completion.ts index 55f3fe2c..f8222484 100644 --- a/src/extension/providers/completion.ts +++ b/src/extension/providers/completion.ts @@ -24,10 +24,7 @@ import { StreamResponse } from '../../common/types' import { getFimPrompt, getStopWords } from '../fim-templates' -import { - LINE_BREAK_REGEX, - MAX_CONTEXT_LINE_COUNT -} from '../../common/constants' +import { LINE_BREAK_REGEX, MAX_CONTEXT_LINE_COUNT } from '../../common/constants' import { streamResponse } from '../stream' import { createStreamRequestBody } from '../model-options' import { Logger } from '../../common/logger' @@ -101,6 +98,11 @@ export class CompletionProvider implements InlineCompletionItemProvider { document, position ) + + if (this.isMiddleWord(prefixSuffix)) { + return [] + } + const prompt = await this.getPrompt(prefixSuffix) const cachedCompletion = cache.getCache(prefixSuffix) @@ -140,6 +142,11 @@ export class CompletionProvider implements InlineCompletionItemProvider { }) } + private isMiddleWord(prefixSuffix: PrefixSuffix) { + const { prefix, suffix } = prefixSuffix + return /\w/.test(prefix.at(-1) as string) && /\w/.test(suffix.at(0) as string) + } + private buildStreamRequest(prompt: string) { const requestBody = createStreamRequestBody(this._apiProvider, prompt, { model: this._fimModel, From 30b779698d85d1c453ce48a094df346fdfb4cdd9 Mon Sep 17 00:00:00 2001 From: rjmacarthy Date: Sun, 3 Mar 2024 21:01:48 +0000 Subject: [PATCH 2/2] 3.7.9 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 84422ad3..a6aacfe8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "twinny", - "version": "3.7.8", + "version": "3.7.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "twinny", - "version": "3.7.8", + "version": "3.7.9", "license": "MIT", "dependencies": { "@types/react": "^18.2.46", diff --git a/package.json b/package.json index 85be1ca7..383f0245 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "twinny", "displayName": "twinny - AI Code Completion and Chat", "description": "Locally hosted AI code completion plugin for vscode", - "version": "3.7.8", + "version": "3.7.9", "icon": "assets/icon.png", "keywords": [ "code-inference",