Skip to content

Commit 1be8606

Browse files
committed
make snippet-contribution a proper contrib-file, remove local registration into contrib-file, move command into their own folder, have a command to populate a file from a top-level snippet
1 parent 36846c1 commit 1be8606

13 files changed

+256
-97
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { EditorAction2 } from 'vs/editor/browser/editorExtensions';
7+
import { localize } from 'vs/nls';
8+
import { Action2, IAction2Options } from 'vs/platform/actions/common/actions';
9+
10+
const defaultOptions: Partial<IAction2Options> = {
11+
category: {
12+
value: localize('snippets', 'Snippets'),
13+
original: 'Snippets'
14+
},
15+
};
16+
17+
export abstract class SnippetsAction extends Action2 {
18+
19+
constructor(desc: Readonly<IAction2Options>) {
20+
super({ ...defaultOptions, ...desc });
21+
}
22+
}
23+
24+
export abstract class SnippetEditorAction extends EditorAction2 {
25+
26+
constructor(desc: Readonly<IAction2Options>) {
27+
super({ ...defaultOptions, ...desc });
28+
}
29+
}

src/vs/workbench/contrib/snippets/browser/configureSnippets.ts renamed to src/vs/workbench/contrib/snippets/browser/commands/configureSnippets.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,22 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import * as nls from 'vs/nls';
7-
import { ILanguageService } from 'vs/editor/common/languages/language';
6+
import { isValidBasename } from 'vs/base/common/extpath';
87
import { extname } from 'vs/base/common/path';
9-
import { MenuId, registerAction2, Action2 } from 'vs/platform/actions/common/actions';
10-
import { IOpenerService } from 'vs/platform/opener/common/opener';
8+
import { basename, joinPath } from 'vs/base/common/resources';
119
import { URI } from 'vs/base/common/uri';
12-
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets.contribution';
13-
import { IQuickPickItem, IQuickInputService, QuickPickInput } from 'vs/platform/quickinput/common/quickInput';
14-
import { SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
15-
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
10+
import { ILanguageService } from 'vs/editor/common/languages/language';
11+
import * as nls from 'vs/nls';
12+
import { MenuId } from 'vs/platform/actions/common/actions';
1613
import { IFileService } from 'vs/platform/files/common/files';
17-
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
18-
import { isValidBasename } from 'vs/base/common/extpath';
19-
import { joinPath, basename } from 'vs/base/common/resources';
2014
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
15+
import { IOpenerService } from 'vs/platform/opener/common/opener';
16+
import { IQuickInputService, IQuickPickItem, QuickPickInput } from 'vs/platform/quickinput/common/quickInput';
17+
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
18+
import { SnippetsAction } from 'vs/workbench/contrib/snippets/browser/commands/abstractSnippetsActions';
19+
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets';
20+
import { SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
21+
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
2122
import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile';
2223

2324
namespace ISnippetPick {
@@ -199,7 +200,7 @@ async function createLanguageSnippetFile(pick: ISnippetPick, fileService: IFileS
199200
await textFileService.write(pick.filepath, contents);
200201
}
201202

202-
registerAction2(class ConfigureSnippets extends Action2 {
203+
export class ConfigureSnippets extends SnippetsAction {
203204

204205
constructor() {
205206
super({
@@ -221,7 +222,7 @@ registerAction2(class ConfigureSnippets extends Action2 {
221222
});
222223
}
223224

224-
async run(accessor: ServicesAccessor, ...args: any[]): Promise<any> {
225+
async run(accessor: ServicesAccessor): Promise<any> {
225226

226227
const snippetService = accessor.get(ISnippetsService);
227228
const quickInputService = accessor.get(IQuickInputService);
@@ -275,4 +276,4 @@ registerAction2(class ConfigureSnippets extends Action2 {
275276
}
276277

277278
}
278-
});
279+
}
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { groupBy, isFalsyOrEmpty } from 'vs/base/common/arrays';
7+
import { compare } from 'vs/base/common/strings';
8+
import { getCodeEditor } from 'vs/editor/browser/editorBrowser';
9+
import { ILanguageService } from 'vs/editor/common/languages/language';
10+
import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2';
11+
import { localize } from 'vs/nls';
12+
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
13+
import { IQuickInputService, IQuickPickItem, IQuickPickSeparator } from 'vs/platform/quickinput/common/quickInput';
14+
import { SnippetsAction } from 'vs/workbench/contrib/snippets/browser/commands/abstractSnippetsActions';
15+
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets';
16+
import { Snippet } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
17+
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
18+
19+
export class SelectSnippetForEmptyFile extends SnippetsAction {
20+
21+
constructor() {
22+
super({
23+
id: 'workbench.action.populateFromSnippet',
24+
title: {
25+
value: localize('label', 'Populate File from Snippet'),
26+
original: 'Populate File from Snippet'
27+
},
28+
f1: true,
29+
});
30+
}
31+
32+
async run(accessor: ServicesAccessor): Promise<void> {
33+
const snippetService = accessor.get(ISnippetsService);
34+
const quickInputService = accessor.get(IQuickInputService);
35+
const editorService = accessor.get(IEditorService);
36+
const langService = accessor.get(ILanguageService);
37+
38+
const editor = getCodeEditor(editorService.activeTextEditorControl);
39+
if (!editor || !editor.hasModel()) {
40+
return;
41+
}
42+
43+
const snippets = await snippetService.getSnippets(undefined, { topLevelSnippets: true, noRecencySort: true, includeNoPrefixSnippets: true });
44+
if (snippets.length === 0) {
45+
return;
46+
}
47+
48+
const selection = await this._pick(quickInputService, langService, snippets);
49+
if (!selection) {
50+
return;
51+
}
52+
53+
if (editor.hasModel()) {
54+
// apply snippet edit -> replaces everything
55+
SnippetController2.get(editor)?.apply([{
56+
range: editor.getModel().getFullModelRange(),
57+
template: selection.snippet.body
58+
}]);
59+
60+
// set language if possible
61+
if (langService.isRegisteredLanguageId(selection.langId)) {
62+
editor.getModel().setMode(selection.langId);
63+
}
64+
}
65+
}
66+
67+
private async _pick(quickInputService: IQuickInputService, langService: ILanguageService, snippets: Snippet[]) {
68+
69+
// spread snippet onto each language it supports
70+
type SnippetAndLanguage = { langId: string; snippet: Snippet };
71+
const all: SnippetAndLanguage[] = [];
72+
for (const snippet of snippets) {
73+
if (isFalsyOrEmpty(snippet.scopes)) {
74+
all.push({ langId: '', snippet });
75+
} else {
76+
for (const langId of snippet.scopes) {
77+
all.push({ langId, snippet });
78+
}
79+
}
80+
}
81+
82+
type SnippetAndLanguagePick = IQuickPickItem & { snippet: SnippetAndLanguage };
83+
const picks: (SnippetAndLanguagePick | IQuickPickSeparator)[] = [];
84+
85+
const groups = groupBy(all, (a, b) => compare(a.langId, b.langId));
86+
87+
for (const group of groups) {
88+
let first = true;
89+
for (const item of group) {
90+
91+
if (first) {
92+
picks.push({
93+
type: 'separator',
94+
label: langService.getLanguageName(item.langId) ?? item.langId
95+
});
96+
first = false;
97+
}
98+
99+
picks.push({
100+
snippet: item,
101+
label: item.snippet.prefix || item.snippet.name,
102+
detail: item.snippet.description
103+
});
104+
}
105+
}
106+
107+
const pick = await quickInputService.pick(picks, {
108+
placeHolder: localize('placeholder', 'Select a snippet'),
109+
matchOnDetail: true,
110+
});
111+
112+
return pick?.snippet;
113+
}
114+
}

src/vs/workbench/contrib/snippets/browser/insertSnippet.ts renamed to src/vs/workbench/contrib/snippets/browser/commands/insertSnippet.ts

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,18 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import * as nls from 'vs/nls';
7-
import { registerEditorAction, ServicesAccessor, EditorAction } from 'vs/editor/browser/editorExtensions';
6+
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
7+
import { ServicesAccessor } from 'vs/editor/browser/editorExtensions';
8+
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
89
import { ILanguageService } from 'vs/editor/common/languages/language';
9-
import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands';
10-
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets.contribution';
1110
import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2';
12-
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
13-
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
14-
import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
11+
import * as nls from 'vs/nls';
1512
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
1613
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
14+
import { SnippetEditorAction } from 'vs/workbench/contrib/snippets/browser/commands/abstractSnippetsActions';
1715
import { pickSnippet } from 'vs/workbench/contrib/snippets/browser/snippetPicker';
18-
16+
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets';
17+
import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
1918

2019
class Args {
2120

@@ -45,13 +44,16 @@ class Args {
4544
) { }
4645
}
4746

48-
class InsertSnippetAction extends EditorAction {
47+
export class InsertSnippetAction extends SnippetEditorAction {
4948

5049
constructor() {
5150
super({
5251
id: 'editor.action.insertSnippet',
53-
label: nls.localize('snippet.suggestions.label', "Insert Snippet"),
54-
alias: 'Insert Snippet',
52+
title: {
53+
value: nls.localize('snippet.suggestions.label', "Insert Snippet"),
54+
original: 'Insert Snippet'
55+
},
56+
f1: true,
5557
precondition: EditorContextKeys.writable,
5658
description: {
5759
description: `Insert Snippet`,
@@ -77,7 +79,8 @@ class InsertSnippetAction extends EditorAction {
7779
});
7880
}
7981

80-
async run(accessor: ServicesAccessor, editor: ICodeEditor, arg: any): Promise<void> {
82+
async runEditorCommand(accessor: ServicesAccessor, editor: ICodeEditor, arg: any) {
83+
8184
const languageService = accessor.get(ILanguageService);
8285
const snippetService = accessor.get(ISnippetsService);
8386

@@ -148,10 +151,3 @@ class InsertSnippetAction extends EditorAction {
148151
snippetService.updateUsageTimestamp(snippet);
149152
}
150153
}
151-
152-
registerEditorAction(InsertSnippetAction);
153-
154-
// compatibility command to make sure old keybinding are still working
155-
CommandsRegistry.registerCommand('editor.action.showSnippets', accessor => {
156-
return accessor.get(ICommandService).executeCommand('editor.action.insertSnippet');
157-
});

src/vs/workbench/contrib/snippets/browser/surroundWithSnippet.ts renamed to src/vs/workbench/contrib/snippets/browser/commands/surroundWithSnippet.ts

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,26 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6+
import { IDisposable } from 'vs/base/common/lifecycle';
67
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
7-
import { EditorAction2 } from 'vs/editor/browser/editorExtensions';
8+
import { Position } from 'vs/editor/common/core/position';
9+
import { IRange, Range } from 'vs/editor/common/core/range';
10+
import { Selection } from 'vs/editor/common/core/selection';
811
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
12+
import { CodeAction, CodeActionList, CodeActionProvider } from 'vs/editor/common/languages';
13+
import { ITextModel } from 'vs/editor/common/model';
14+
import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures';
15+
import { CodeActionKind } from 'vs/editor/contrib/codeAction/browser/types';
916
import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2';
1017
import { localize } from 'vs/nls';
11-
import { registerAction2 } from 'vs/platform/actions/common/actions';
1218
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
1319
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
1420
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
21+
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
22+
import { SnippetEditorAction } from 'vs/workbench/contrib/snippets/browser/commands/abstractSnippetsActions';
1523
import { pickSnippet } from 'vs/workbench/contrib/snippets/browser/snippetPicker';
16-
import { ISnippetsService } from './snippets.contribution';
17-
import { IDisposable } from 'vs/base/common/lifecycle';
18-
import { ITextModel } from 'vs/editor/common/model';
19-
import { CodeAction, CodeActionProvider, CodeActionList } from 'vs/editor/common/languages';
20-
import { CodeActionKind } from 'vs/editor/contrib/codeAction/browser/types';
21-
import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures';
22-
import { Range, IRange } from 'vs/editor/common/core/range';
23-
import { Selection } from 'vs/editor/common/core/selection';
2424
import { Snippet } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
25-
import { Registry } from 'vs/platform/registry/common/platform';
26-
import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions';
27-
import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle';
28-
import { Position } from 'vs/editor/common/core/position';
25+
import { ISnippetsService } from '../snippets';
2926

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

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

40-
class SurroundWithSnippetEditorAction extends EditorAction2 {
37+
export class SurroundWithSnippetEditorAction extends SnippetEditorAction {
4138

4239
static readonly options = {
4340
id: 'editor.action.surroundWithSnippet',
@@ -88,7 +85,7 @@ class SurroundWithSnippetEditorAction extends EditorAction2 {
8885
}
8986

9087

91-
class SurroundWithSnippetCodeActionProvider implements CodeActionProvider, IWorkbenchContribution {
88+
export class SurroundWithSnippetCodeActionProvider implements CodeActionProvider, IWorkbenchContribution {
9289

9390
private static readonly _MAX_CODE_ACTIONS = 4;
9491

@@ -160,6 +157,3 @@ class SurroundWithSnippetCodeActionProvider implements CodeActionProvider, IWork
160157
};
161158
}
162159
}
163-
164-
registerAction2(SurroundWithSnippetEditorAction);
165-
Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench).registerWorkbenchContribution(SurroundWithSnippetCodeActionProvider, LifecyclePhase.Restored);

src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { CompletionItem, CompletionItemKind, CompletionItemProvider, CompletionL
1212
import { ILanguageService } from 'vs/editor/common/languages/language';
1313
import { SnippetParser } from 'vs/editor/contrib/snippet/browser/snippetParser';
1414
import { localize } from 'vs/nls';
15-
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets.contribution';
15+
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets';
1616
import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
1717
import { isPatternInWord } from 'vs/base/common/filters';
1818
import { StopWatch } from 'vs/base/common/stopwatch';

src/vs/workbench/contrib/snippets/browser/snippetPicker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as nls from 'vs/nls';
7-
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets.contribution';
7+
import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets';
88
import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
99
import { IQuickPickItem, IQuickInputService, QuickPickInput } from 'vs/platform/quickinput/common/quickInput';
1010
import { Codicon } from 'vs/base/common/codicons';

0 commit comments

Comments
 (0)