diff --git a/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts b/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts index 80b3e31e612314514e82dabcd172556a6484bd9b..3577daae5619358548d13e6b42eba51ea7e4a0b1 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts +++ b/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts @@ -360,6 +360,8 @@ export class SnippetSuggestion implements CompletionItem { export class SnippetSuggestProvider implements CompletionItemProvider { + private static readonly _maxPrefix = 10000; + constructor( @IModeService private readonly _modeService: IModeService, @ISnippetsService private readonly _snippets: ISnippetsService @@ -369,14 +371,17 @@ export class SnippetSuggestProvider implements CompletionItemProvider { provideCompletionItems(model: ITextModel, position: Position, context: CompletionContext): Promise { + if (position.column >= SnippetSuggestProvider._maxPrefix) { + return undefined; + } + const languageId = this._getLanguageIdAtPosition(model, position); return this._snippets.getSnippets(languageId).then(snippets => { let suggestions: SnippetSuggestion[]; - let shift = Math.max(0, position.column - 100); - let pos = { lineNumber: position.lineNumber, column: Math.max(1, position.column - 100) }; + let pos = { lineNumber: position.lineNumber, column: 1 }; let lineOffsets: number[] = []; - let linePrefixLow = model.getLineContent(position.lineNumber).substr(Math.max(0, position.column - 100), position.column - 1).toLowerCase(); + let linePrefixLow = model.getLineContent(position.lineNumber).substr(0, position.column - 1).toLowerCase(); while (pos.column < position.column) { let word = model.getWordAtPosition(pos); @@ -407,7 +412,6 @@ export class SnippetSuggestProvider implements CompletionItemProvider { let consumed = new Set(); suggestions = []; for (let start of lineOffsets) { - start -= shift; for (const snippet of snippets) { if (!consumed.has(snippet) && matches(linePrefixLow, start, snippet.prefixLow, 0)) { suggestions.push(new SnippetSuggestion(snippet, Range.fromPositions(position.delta(0, -(linePrefixLow.length - start)), position))); diff --git a/src/vs/workbench/parts/snippets/test/electron-browser/snippetsService.test.ts b/src/vs/workbench/parts/snippets/test/electron-browser/snippetsService.test.ts index f71295c7d908d466413c2c93f0b841f4b54d4afd..fdf7348bcac5ca1f361061ba856b0347d3052a91 100644 --- a/src/vs/workbench/parts/snippets/test/electron-browser/snippetsService.test.ts +++ b/src/vs/workbench/parts/snippets/test/electron-browser/snippetsService.test.ts @@ -310,4 +310,23 @@ suite('SnippetsService', function () { assert.equal(result.suggestions.length, 1); assert.equal(result.suggestions[0].label, 'mytemplate'); }); + + test('No snippets suggestion beyond character 100 if not at end of line #60247', async function () { + snippetService = new SimpleSnippetService([new Snippet( + ['fooLang'], + 'bug', + 'bug', + '', + 'second', + '', + SnippetSource.User + )]); + + const provider = new SnippetSuggestProvider(modeService, snippetService); + + let model = TextModel.createFromString('Thisisaverylonglinegoingwithmore100bcharactersandthismakesintellisensebecomea Thisisaverylonglinegoingwithmore100bcharactersandthismakesintellisensebecomea b text_after_b', undefined, modeService.getLanguageIdentifier('fooLang')); + let result = await provider.provideCompletionItems(model, new Position(1, 158), suggestContext); + + assert.equal(result.suggestions.length, 1); + }); });