Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

joh/innocent tiger #155321

Merged
merged 6 commits into from
Jul 15, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
make snippet-contribution a proper contrib-file, remove local registr…
…ation into contrib-file, move command into their own folder, have a command to populate a file from a top-level snippet
  • Loading branch information
jrieken committed Jul 15, 2022
commit 1be8606b702f61fa88f52276d68246cdeb8ec906
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { EditorAction2 } from 'vs/editor/browser/editorExtensions';
import { localize } from 'vs/nls';
import { Action2, IAction2Options } from 'vs/platform/actions/common/actions';

const defaultOptions: Partial<IAction2Options> = {
category: {
value: localize('snippets', 'Snippets'),
original: 'Snippets'
},
};

export abstract class SnippetsAction extends Action2 {

constructor(desc: Readonly<IAction2Options>) {
super({ ...defaultOptions, ...desc });
}
}

export abstract class SnippetEditorAction extends EditorAction2 {

constructor(desc: Readonly<IAction2Options>) {
super({ ...defaultOptions, ...desc });
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,22 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import * as nls from 'vs/nls';
import { ILanguageService } from 'vs/editor/common/languages/language';
import { isValidBasename } from 'vs/base/common/extpath';
import { extname } from 'vs/base/common/path';
import { MenuId, registerAction2, Action2 } from 'vs/platform/actions/common/actions';
import { IOpenerService } from 'vs/platform/opener/common/opener';
import { basename, joinPath } from 'vs/base/common/resources';
import { URI } from 'vs/base/common/uri';
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets.contribution';
import { IQuickPickItem, IQuickInputService, QuickPickInput } from 'vs/platform/quickinput/common/quickInput';
import { SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
import { ILanguageService } from 'vs/editor/common/languages/language';
import * as nls from 'vs/nls';
import { MenuId } from 'vs/platform/actions/common/actions';
import { IFileService } from 'vs/platform/files/common/files';
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
import { isValidBasename } from 'vs/base/common/extpath';
import { joinPath, basename } from 'vs/base/common/resources';
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { IOpenerService } from 'vs/platform/opener/common/opener';
import { IQuickInputService, IQuickPickItem, QuickPickInput } from 'vs/platform/quickinput/common/quickInput';
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
import { SnippetsAction } from 'vs/workbench/contrib/snippets/browser/commands/abstractSnippetsActions';
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets';
import { SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile';

namespace ISnippetPick {
Expand Down Expand Up @@ -199,7 +200,7 @@ async function createLanguageSnippetFile(pick: ISnippetPick, fileService: IFileS
await textFileService.write(pick.filepath, contents);
}

registerAction2(class ConfigureSnippets extends Action2 {
export class ConfigureSnippets extends SnippetsAction {

constructor() {
super({
Expand All @@ -221,7 +222,7 @@ registerAction2(class ConfigureSnippets extends Action2 {
});
}

async run(accessor: ServicesAccessor, ...args: any[]): Promise<any> {
async run(accessor: ServicesAccessor): Promise<any> {

const snippetService = accessor.get(ISnippetsService);
const quickInputService = accessor.get(IQuickInputService);
Expand Down Expand Up @@ -275,4 +276,4 @@ registerAction2(class ConfigureSnippets extends Action2 {
}

}
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { groupBy, isFalsyOrEmpty } from 'vs/base/common/arrays';
import { compare } from 'vs/base/common/strings';
import { getCodeEditor } from 'vs/editor/browser/editorBrowser';
import { ILanguageService } from 'vs/editor/common/languages/language';
import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2';
import { localize } from 'vs/nls';
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { IQuickInputService, IQuickPickItem, IQuickPickSeparator } from 'vs/platform/quickinput/common/quickInput';
import { SnippetsAction } from 'vs/workbench/contrib/snippets/browser/commands/abstractSnippetsActions';
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets';
import { Snippet } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';

export class SelectSnippetForEmptyFile extends SnippetsAction {

constructor() {
super({
id: 'workbench.action.populateFromSnippet',
title: {
value: localize('label', 'Populate File from Snippet'),
original: 'Populate File from Snippet'
},
f1: true,
});
}

async run(accessor: ServicesAccessor): Promise<void> {
const snippetService = accessor.get(ISnippetsService);
const quickInputService = accessor.get(IQuickInputService);
const editorService = accessor.get(IEditorService);
const langService = accessor.get(ILanguageService);

const editor = getCodeEditor(editorService.activeTextEditorControl);
if (!editor || !editor.hasModel()) {
return;
}

const snippets = await snippetService.getSnippets(undefined, { topLevelSnippets: true, noRecencySort: true, includeNoPrefixSnippets: true });
if (snippets.length === 0) {
return;
}

const selection = await this._pick(quickInputService, langService, snippets);
if (!selection) {
return;
}

if (editor.hasModel()) {
// apply snippet edit -> replaces everything
SnippetController2.get(editor)?.apply([{
range: editor.getModel().getFullModelRange(),
template: selection.snippet.body
}]);

// set language if possible
if (langService.isRegisteredLanguageId(selection.langId)) {
editor.getModel().setMode(selection.langId);
}
}
}

private async _pick(quickInputService: IQuickInputService, langService: ILanguageService, snippets: Snippet[]) {

// spread snippet onto each language it supports
type SnippetAndLanguage = { langId: string; snippet: Snippet };
const all: SnippetAndLanguage[] = [];
for (const snippet of snippets) {
if (isFalsyOrEmpty(snippet.scopes)) {
all.push({ langId: '', snippet });
} else {
for (const langId of snippet.scopes) {
all.push({ langId, snippet });
}
}
}

type SnippetAndLanguagePick = IQuickPickItem & { snippet: SnippetAndLanguage };
const picks: (SnippetAndLanguagePick | IQuickPickSeparator)[] = [];

const groups = groupBy(all, (a, b) => compare(a.langId, b.langId));

for (const group of groups) {
let first = true;
for (const item of group) {

if (first) {
picks.push({
type: 'separator',
label: langService.getLanguageName(item.langId) ?? item.langId
});
first = false;
}

picks.push({
snippet: item,
label: item.snippet.prefix || item.snippet.name,
detail: item.snippet.description
});
}
}

const pick = await quickInputService.pick(picks, {
placeHolder: localize('placeholder', 'Select a snippet'),
matchOnDetail: true,
});

return pick?.snippet;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,18 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import * as nls from 'vs/nls';
import { registerEditorAction, ServicesAccessor, EditorAction } from 'vs/editor/browser/editorExtensions';
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
import { ServicesAccessor } from 'vs/editor/browser/editorExtensions';
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
import { ILanguageService } from 'vs/editor/common/languages/language';
import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands';
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets.contribution';
import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2';
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
import * as nls from 'vs/nls';
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { SnippetEditorAction } from 'vs/workbench/contrib/snippets/browser/commands/abstractSnippetsActions';
import { pickSnippet } from 'vs/workbench/contrib/snippets/browser/snippetPicker';

import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets';
import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile';

class Args {

Expand Down Expand Up @@ -45,13 +44,16 @@ class Args {
) { }
}

class InsertSnippetAction extends EditorAction {
export class InsertSnippetAction extends SnippetEditorAction {

constructor() {
super({
id: 'editor.action.insertSnippet',
label: nls.localize('snippet.suggestions.label', "Insert Snippet"),
alias: 'Insert Snippet',
title: {
value: nls.localize('snippet.suggestions.label', "Insert Snippet"),
original: 'Insert Snippet'
},
f1: true,
precondition: EditorContextKeys.writable,
description: {
description: `Insert Snippet`,
Expand All @@ -77,7 +79,8 @@ class InsertSnippetAction extends EditorAction {
});
}

async run(accessor: ServicesAccessor, editor: ICodeEditor, arg: any): Promise<void> {
async runEditorCommand(accessor: ServicesAccessor, editor: ICodeEditor, arg: any) {

const languageService = accessor.get(ILanguageService);
const snippetService = accessor.get(ISnippetsService);

Expand Down Expand Up @@ -148,10 +151,3 @@ class InsertSnippetAction extends EditorAction {
snippetService.updateUsageTimestamp(snippet);
}
}

registerEditorAction(InsertSnippetAction);

// compatibility command to make sure old keybinding are still working
CommandsRegistry.registerCommand('editor.action.showSnippets', accessor => {
return accessor.get(ICommandService).executeCommand('editor.action.insertSnippet');
});
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,26 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { IDisposable } from 'vs/base/common/lifecycle';
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
import { EditorAction2 } from 'vs/editor/browser/editorExtensions';
import { Position } from 'vs/editor/common/core/position';
import { IRange, Range } from 'vs/editor/common/core/range';
import { Selection } from 'vs/editor/common/core/selection';
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
import { CodeAction, CodeActionList, CodeActionProvider } from 'vs/editor/common/languages';
import { ITextModel } from 'vs/editor/common/model';
import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures';
import { CodeActionKind } from 'vs/editor/contrib/codeAction/browser/types';
import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2';
import { localize } from 'vs/nls';
import { registerAction2 } from 'vs/platform/actions/common/actions';
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
import { SnippetEditorAction } from 'vs/workbench/contrib/snippets/browser/commands/abstractSnippetsActions';
import { pickSnippet } from 'vs/workbench/contrib/snippets/browser/snippetPicker';
import { ISnippetsService } from './snippets.contribution';
import { IDisposable } from 'vs/base/common/lifecycle';
import { ITextModel } from 'vs/editor/common/model';
import { CodeAction, CodeActionProvider, CodeActionList } from 'vs/editor/common/languages';
import { CodeActionKind } from 'vs/editor/contrib/codeAction/browser/types';
import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures';
import { Range, IRange } from 'vs/editor/common/core/range';
import { Selection } from 'vs/editor/common/core/selection';
import { Snippet } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
import { Registry } from 'vs/platform/registry/common/platform';
import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions';
import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle';
import { Position } from 'vs/editor/common/core/position';
import { ISnippetsService } from '../snippets';

async function getSurroundableSnippets(snippetsService: ISnippetsService, model: ITextModel, position: Position, includeDisabledSnippets: boolean): Promise<Snippet[]> {

Expand All @@ -37,7 +34,7 @@ async function getSurroundableSnippets(snippetsService: ISnippetsService, model:
return allSnippets.filter(snippet => snippet.usesSelection);
}

class SurroundWithSnippetEditorAction extends EditorAction2 {
export class SurroundWithSnippetEditorAction extends SnippetEditorAction {

static readonly options = {
id: 'editor.action.surroundWithSnippet',
Expand Down Expand Up @@ -88,7 +85,7 @@ class SurroundWithSnippetEditorAction extends EditorAction2 {
}


class SurroundWithSnippetCodeActionProvider implements CodeActionProvider, IWorkbenchContribution {
export class SurroundWithSnippetCodeActionProvider implements CodeActionProvider, IWorkbenchContribution {

private static readonly _MAX_CODE_ACTIONS = 4;

Expand Down Expand Up @@ -160,6 +157,3 @@ class SurroundWithSnippetCodeActionProvider implements CodeActionProvider, IWork
};
}
}

registerAction2(SurroundWithSnippetEditorAction);
Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench).registerWorkbenchContribution(SurroundWithSnippetCodeActionProvider, LifecyclePhase.Restored);
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { CompletionItem, CompletionItemKind, CompletionItemProvider, CompletionL
import { ILanguageService } from 'vs/editor/common/languages/language';
import { SnippetParser } from 'vs/editor/contrib/snippet/browser/snippetParser';
import { localize } from 'vs/nls';
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets.contribution';
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets';
import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
import { isPatternInWord } from 'vs/base/common/filters';
import { StopWatch } from 'vs/base/common/stopwatch';
Expand Down
2 changes: 1 addition & 1 deletion src/vs/workbench/contrib/snippets/browser/snippetPicker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/

import * as nls from 'vs/nls';
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets.contribution';
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets';
import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
import { IQuickPickItem, IQuickInputService, QuickPickInput } from 'vs/platform/quickinput/common/quickInput';
import { Codicon } from 'vs/base/common/codicons';
Expand Down
Loading