提交 8977e39e 编写于 作者: J Johannes Rieken

first end-2-end for choice in snippets, #17545

上级 49ffef11
......@@ -12,6 +12,8 @@ import { dispose, IDisposable } from 'vs/base/common/lifecycle';
import { SnippetSession } from './snippetSession';
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
import { showSimpleSuggestions } from 'vs/editor/contrib/suggest/browser/suggest';
import { ISuggestion } from 'vs/editor/common/modes';
@commonEditorContribution
export class SnippetController2 {
......@@ -110,6 +112,19 @@ export class SnippetController2 {
this._inSnippet.set(true);
this._hasPrevTabstop.set(!this._session.isAtFirstPlaceholder);
this._hasNextTabstop.set(!this._session.isAtLastPlaceholder);
const { choice } = this._session;
if (choice) {
const suggestions = choice.options.map((option, i) => {
return <ISuggestion>{
label: option.value,
insertText: option.value,
type: 'value',
sortText: String(i)
};
});
showSimpleSuggestions(this._editor, suggestions);
}
}
finish(): void {
......
......@@ -9,7 +9,7 @@ import 'vs/css!./snippetSession';
import { getLeadingWhitespace } from 'vs/base/common/strings';
import { ICommonCodeEditor, IModel, TrackedRangeStickiness, IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon';
import { EditOperation } from 'vs/editor/common/core/editOperation';
import { TextmateSnippet, Placeholder, SnippetParser } from './snippetParser';
import { TextmateSnippet, Placeholder, Choice, SnippetParser } from './snippetParser';
import { Selection } from 'vs/editor/common/core/selection';
import { Range } from 'vs/editor/common/core/range';
import { IPosition } from 'vs/editor/common/core/position';
......@@ -155,6 +155,10 @@ export class OneSnippet {
return ret;
}
get choice(): Choice {
return this._placeholderGroups[this._placeholderGroupsIdx][0].choice;
}
merge(others: OneSnippet[]): void {
const model = this._editor.getModel();
......@@ -409,6 +413,10 @@ export class SnippetSession {
return this._snippets[0].hasPlaceholder;
}
get choice(): Choice {
return this._snippets[0].choice;
}
isSelectionWithinPlaceholders(): boolean {
if (!this.hasPlaceholder) {
......
......@@ -10,7 +10,7 @@ import { compareIgnoreCase } from 'vs/base/common/strings';
import { assign } from 'vs/base/common/objects';
import { onUnexpectedExternalError } from 'vs/base/common/errors';
import { TPromise } from 'vs/base/common/winjs.base';
import { IModel } from 'vs/editor/common/editorCommon';
import { IModel, IEditorContribution, ICommonCodeEditor } from 'vs/editor/common/editorCommon';
import { CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions';
import { ISuggestResult, ISuggestSupport, ISuggestion, SuggestRegistry } from 'vs/editor/common/modes';
import { Position, IPosition } from 'vs/editor/common/core/position';
......@@ -216,3 +216,28 @@ CommonEditorRegistry.registerDefaultLanguageCommand('_executeCompletionItemProvi
return result;
});
});
interface SuggestController extends IEditorContribution {
triggerSuggest(onlyFrom?: ISuggestSupport[]): void;
}
let _suggestions: ISuggestion[];
let _provider = new class implements ISuggestSupport {
provideCompletionItems(): ISuggestResult {
return _suggestions && { suggestions: _suggestions };
}
};
SuggestRegistry.register('*', _provider);
/**
*
* @param editor
* @param suggestions
*/
export function showSimpleSuggestions(editor: ICommonCodeEditor, suggestions: ISuggestion[]) {
_suggestions = suggestions;
editor.getContribution<SuggestController>('editor.contrib.suggestController').triggerSuggest([_provider]);
_suggestions = undefined;
}
......@@ -16,43 +16,10 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import * as editorCommon from 'vs/editor/common/editorCommon';
import { CommonEditorRegistry, commonEditorContribution, EditorCommand } from 'vs/editor/common/editorCommonExtensions';
import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2';
import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController';
import { ISuggestSupport, ISuggestResult, SuggestRegistry } from 'vs/editor/common/modes';
import { Position } from 'vs/editor/common/core/position';
import { showSimpleSuggestions } from 'vs/editor/contrib/suggest/browser/suggest';
import { IConfigurationRegistry, Extensions as ConfigExt } from 'vs/platform/configuration/common/configurationRegistry';
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
class TabCompletionProvider implements ISuggestSupport {
position: Position;
snippets: ISnippet[];
reset(): this {
return this.set(undefined, undefined);
}
set(position: Position, snippets: ISnippet[]): this {
this.position = position;
this.snippets = snippets;
return this;
}
provideCompletionItems(model: editorCommon.IModel, position: Position): ISuggestResult {
if (!this.snippets
|| this.position.lineNumber !== position.lineNumber
|| this.position.column > position.column
) {
return undefined;
}
const delta = position.column - this.position.column;
const suggestions: SnippetSuggestion[] = [];
for (const snippet of this.snippets) {
suggestions.push(new SnippetSuggestion(snippet, delta + snippet.prefix.length));
}
return { suggestions };
}
}
@commonEditorContribution
export class TabCompletionController implements editorCommon.IEditorContribution {
......@@ -65,9 +32,8 @@ export class TabCompletionController implements editorCommon.IEditorContribution
private readonly _editor: editorCommon.ICommonCodeEditor;
private readonly _snippetController: SnippetController2;
private readonly _suggestController: SuggestController;
private readonly _tabCompletionProvider: TabCompletionProvider;
private readonly _dispoables: IDisposable[] = [];
private readonly _snippets: ISnippet[] = [];
constructor(
editor: editorCommon.ICommonCodeEditor,
......@@ -76,14 +42,11 @@ export class TabCompletionController implements editorCommon.IEditorContribution
) {
this._editor = editor;
this._snippetController = SnippetController2.get(editor);
this._suggestController = SuggestController.get(editor);
this._tabCompletionProvider = new TabCompletionProvider();
this._dispoables.push(SuggestRegistry.register('*', this._tabCompletionProvider));
const hasSnippets = TabCompletionController.ContextKey.bindTo(contextKeyService);
this._dispoables.push(editor.onDidChangeCursorSelection(e => {
let snippets: ISnippet[] = [];
this._snippets.length = 0;
let selectFn: (snippet: ISnippet) => boolean;
if (e.selection.isEmpty()) {
......@@ -100,13 +63,12 @@ export class TabCompletionController implements editorCommon.IEditorContribution
if (selectFn) {
snippetService.visitSnippets(editor.getModel().getLanguageIdentifier().id, s => {
if (selectFn(s)) {
snippets.push(s);
this._snippets.push(s);
}
return true;
});
}
this._tabCompletionProvider.set(editor.getPosition(), snippets);
hasSnippets.set(this._tabCompletionProvider.snippets.length > 0);
hasSnippets.set(this._snippets.length > 0);
}));
}
......@@ -119,15 +81,15 @@ export class TabCompletionController implements editorCommon.IEditorContribution
}
performSnippetCompletions(): void {
const { snippets } = this._tabCompletionProvider;
if (snippets.length === 1) {
if (this._snippets.length === 1) {
// one -> just insert
const [snippet] = snippets;
const [snippet] = this._snippets;
this._snippetController.insert(snippet.codeSnippet, snippet.prefix.length, 0);
} else if (snippets.length > 1) {
} else if (this._snippets.length > 1) {
// two or more -> show IntelliSense box
this._suggestController.triggerSuggest([this._tabCompletionProvider]);
showSimpleSuggestions(this._editor, this._snippets.map(snippet => new SnippetSuggestion(snippet, snippet.prefix.length)));
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册