From 81f8c8bfb2644dfc816e991c00eca784a04e3210 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 25 Jun 2018 12:10:00 +0200 Subject: [PATCH] show snippets that start with a trigger character, #37166 --- src/vs/editor/contrib/suggest/suggest.ts | 4 ++++ src/vs/editor/contrib/suggest/suggestModel.ts | 3 ++- .../electron-browser/snippetsService.ts | 11 ++++++++--- .../electron-browser/snippetsService.test.ts | 18 ++++++++++-------- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/vs/editor/contrib/suggest/suggest.ts b/src/vs/editor/contrib/suggest/suggest.ts index 8e083b3ed76..566e1b12963 100644 --- a/src/vs/editor/contrib/suggest/suggest.ts +++ b/src/vs/editor/contrib/suggest/suggest.ts @@ -37,6 +37,10 @@ export type SnippetConfig = 'top' | 'bottom' | 'inline' | 'none'; let _snippetSuggestSupport: ISuggestSupport; +export function getSnippetSuggestSupport(): ISuggestSupport { + return _snippetSuggestSupport; +} + export function setSnippetSuggestSupport(support: ISuggestSupport): ISuggestSupport { const old = _snippetSuggestSupport; _snippetSuggestSupport = support; diff --git a/src/vs/editor/contrib/suggest/suggestModel.ts b/src/vs/editor/contrib/suggest/suggestModel.ts index 417451c9a35..0032b4fdc52 100644 --- a/src/vs/editor/contrib/suggest/suggestModel.ts +++ b/src/vs/editor/contrib/suggest/suggestModel.ts @@ -18,7 +18,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import { ITextModel, IWordAtPosition } from 'vs/editor/common/model'; import { ISuggestSupport, StandardTokenType, SuggestContext, SuggestRegistry, SuggestTriggerKind } from 'vs/editor/common/modes'; import { CompletionModel } from './completionModel'; -import { ISuggestionItem, getSuggestionComparator, provideSuggestionItems } from './suggest'; +import { ISuggestionItem, getSuggestionComparator, provideSuggestionItems, getSnippetSuggestSupport } from './suggest'; export interface ICancelEvent { readonly retrigger: boolean; @@ -180,6 +180,7 @@ export class SuggestModel implements IDisposable { let set = supportsByTriggerCharacter[ch]; if (!set) { set = supportsByTriggerCharacter[ch] = new Set(); + set.add(getSnippetSuggestSupport()); } set.add(support); } diff --git a/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts b/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts index ab2b652f3f5..eecdc73b271 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts +++ b/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts @@ -6,7 +6,7 @@ import { localize } from 'vs/nls'; import { ITextModel } from 'vs/editor/common/model'; -import { ISuggestSupport, ISuggestResult, ISuggestion, LanguageId, SuggestionType, SnippetType } from 'vs/editor/common/modes'; +import { ISuggestSupport, ISuggestResult, ISuggestion, LanguageId, SuggestionType, SnippetType, SuggestContext } from 'vs/editor/common/modes'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { setSnippetSuggestSupport } from 'vs/editor/contrib/suggest/suggest'; import { IModeService } from 'vs/editor/common/services/modeService'; @@ -321,7 +321,7 @@ export class SnippetSuggestProvider implements ISuggestSupport { // } - provideCompletionItems(model: ITextModel, position: Position): Promise { + provideCompletionItems(model: ITextModel, position: Position, context: SuggestContext): Promise { const languageId = this._getLanguageIdAtPosition(model, position); return this._snippets.getSnippets(languageId).then(snippets => { @@ -337,7 +337,12 @@ export class SnippetSuggestProvider implements ISuggestSupport { let overwriteBefore = 0; let accetSnippet = true; - if (lowWordUntil.length > 0 && startsWith(lowPrefix, lowWordUntil)) { + if (typeof context.triggerCharacter === 'string') { + // cheap match on the trigger-character + overwriteBefore = context.triggerCharacter.length; + accetSnippet = startsWith(lowPrefix, context.triggerCharacter.toLowerCase()); + + } else if (lowWordUntil.length > 0 && startsWith(lowPrefix, lowWordUntil)) { // cheap match on the (none-empty) current word overwriteBefore = lowWordUntil.length; accetSnippet = true; 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 cd3123b3b6a..6c469038ba7 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 @@ -13,6 +13,7 @@ import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl'; import { TextModel } from 'vs/editor/common/model/textModel'; import { ISnippetsService } from 'vs/workbench/parts/snippets/electron-browser/snippets.contribution'; import { Snippet } from 'vs/workbench/parts/snippets/electron-browser/snippetsFile'; +import { SuggestContext, SuggestTriggerKind } from 'vs/editor/common/modes'; class SimpleSnippetService implements ISnippetsService { _serviceBrand: any; @@ -40,6 +41,7 @@ suite('SnippetsService', function () { let modeService: ModeServiceImpl; let snippetService: ISnippetsService; + let suggestContext: SuggestContext = { triggerKind: SuggestTriggerKind.Invoke }; setup(function () { modeService = new ModeServiceImpl(); @@ -66,7 +68,7 @@ suite('SnippetsService', function () { const provider = new SnippetSuggestProvider(modeService, snippetService); const model = TextModel.createFromString('', undefined, modeService.getLanguageIdentifier('fooLang')); - return provider.provideCompletionItems(model, new Position(1, 1)).then(result => { + return provider.provideCompletionItems(model, new Position(1, 1), suggestContext).then(result => { assert.equal(result.incomplete, undefined); assert.equal(result.suggestions.length, 2); }); @@ -77,7 +79,7 @@ suite('SnippetsService', function () { const provider = new SnippetSuggestProvider(modeService, snippetService); const model = TextModel.createFromString('bar', undefined, modeService.getLanguageIdentifier('fooLang')); - return provider.provideCompletionItems(model, new Position(1, 4)).then(result => { + return provider.provideCompletionItems(model, new Position(1, 4), suggestContext).then(result => { assert.equal(result.incomplete, undefined); assert.equal(result.suggestions.length, 1); assert.equal(result.suggestions[0].label, 'bar'); @@ -98,18 +100,18 @@ suite('SnippetsService', function () { const provider = new SnippetSuggestProvider(modeService, snippetService); let model = TextModel.createFromString('\t { + return provider.provideCompletionItems(model, new Position(1, 7), suggestContext).then(result => { assert.equal(result.suggestions.length, 1); model.dispose(); model = TextModel.createFromString('\t { assert.equal(result.suggestions.length, 1); model.dispose(); model = TextModel.createFromString('a { assert.equal(result.suggestions.length, 0); @@ -131,9 +133,9 @@ suite('SnippetsService', function () { const provider = new SnippetSuggestProvider(modeService, snippetService); let model = TextModel.createFromString('\n\t\n>/head>', undefined, modeService.getLanguageIdentifier('fooLang')); - return provider.provideCompletionItems(model, new Position(1, 1)).then(result => { + return provider.provideCompletionItems(model, new Position(1, 1), suggestContext).then(result => { assert.equal(result.suggestions.length, 1); - return provider.provideCompletionItems(model, new Position(2, 2)); + return provider.provideCompletionItems(model, new Position(2, 2), suggestContext); }).then(result => { assert.equal(result.suggestions.length, 1); }); @@ -161,7 +163,7 @@ suite('SnippetsService', function () { const provider = new SnippetSuggestProvider(modeService, snippetService); let model = TextModel.createFromString('', undefined, modeService.getLanguageIdentifier('fooLang')); - return provider.provideCompletionItems(model, new Position(1, 1)).then(result => { + return provider.provideCompletionItems(model, new Position(1, 1), suggestContext).then(result => { assert.equal(result.suggestions.length, 2); let [first, second] = result.suggestions; assert.equal(first.label, 'first'); -- GitLab