提交 81f8c8bf 编写于 作者: J Johannes Rieken

show snippets that start with a trigger character, #37166

上级 80e64972
......@@ -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;
......
......@@ -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);
}
......
......@@ -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<ISuggestResult> {
provideCompletionItems(model: ITextModel, position: Position, context: SuggestContext): Promise<ISuggestResult> {
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;
......
......@@ -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<?php', undefined, modeService.getLanguageIdentifier('fooLang'));
return provider.provideCompletionItems(model, new Position(1, 7)).then(result => {
return provider.provideCompletionItems(model, new Position(1, 7), suggestContext).then(result => {
assert.equal(result.suggestions.length, 1);
model.dispose();
model = TextModel.createFromString('\t<?', undefined, modeService.getLanguageIdentifier('fooLang'));
return provider.provideCompletionItems(model, new Position(1, 4));
return provider.provideCompletionItems(model, new Position(1, 4), suggestContext);
}).then(result => {
assert.equal(result.suggestions.length, 1);
model.dispose();
model = TextModel.createFromString('a<?', undefined, modeService.getLanguageIdentifier('fooLang'));
return provider.provideCompletionItems(model, new Position(1, 4));
return provider.provideCompletionItems(model, new Position(1, 4), suggestContext);
}).then(result => {
assert.equal(result.suggestions.length, 0);
......@@ -131,9 +133,9 @@ suite('SnippetsService', function () {
const provider = new SnippetSuggestProvider(modeService, snippetService);
let model = TextModel.createFromString('<head>\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');
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册