@codingame/monaco-vscode-api 1.80.0 → 1.80.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +2 -1
  2. package/dist/api.js +6 -6
  3. package/dist/default-extensions/npm/npmBrowserMain.js.map +1 -1
  4. package/dist/default-extensions/typescript-language-features/tsserver.web.js.map +1 -1
  5. package/dist/missing-services.js +4 -1
  6. package/dist/monaco.js +4 -0
  7. package/dist/override/vs/platform/dialogs/common/dialogs.js +7 -0
  8. package/dist/service-override/dialogs.js +2 -1
  9. package/dist/service-override/extensions.js +2 -1
  10. package/dist/service-override/keybindings.js +1 -0
  11. package/dist/service-override/languageDetectionWorker.d.ts +5 -0
  12. package/dist/service-override/languageDetectionWorker.js +15 -0
  13. package/dist/service-override/layout.js +12 -1
  14. package/dist/service-override/snippets.js +1 -0
  15. package/dist/service-override/views.d.ts +24 -2
  16. package/dist/service-override/views.js +119 -12
  17. package/dist/services.js +2 -1
  18. package/dist/vscode/vs/platform/audioCues/browser/media/all.mp3.js +17 -17
  19. package/dist/vscode/vs/platform/diagnostics/common/diagnostics.js +27 -0
  20. package/dist/vscode/vs/platform/dialogs/common/dialogs.js +126 -0
  21. package/dist/vscode/vs/workbench/api/browser/mainThreadAuthentication.js +2 -1
  22. package/dist/vscode/vs/workbench/api/browser/mainThreadCustomEditors.js +2 -1
  23. package/dist/vscode/vs/workbench/api/browser/mainThreadDialogs.js +2 -1
  24. package/dist/vscode/vs/workbench/api/browser/mainThreadFileSystemEventService.js +2 -1
  25. package/dist/vscode/vs/workbench/api/browser/mainThreadMessageService.js +2 -1
  26. package/dist/vscode/vs/workbench/browser/actions/layoutActions.js +1 -0
  27. package/dist/vscode/vs/workbench/browser/actions/windowActions.js +2 -1
  28. package/dist/vscode/vs/workbench/browser/actions/workspaceActions.js +2 -1
  29. package/dist/vscode/vs/workbench/browser/actions/workspaceCommands.js +1 -0
  30. package/dist/vscode/vs/workbench/browser/parts/dialogs/dialog.web.contribution.js +2 -1
  31. package/dist/vscode/vs/workbench/browser/parts/dialogs/dialogHandler.js +2 -1
  32. package/dist/vscode/vs/workbench/browser/parts/editor/editorActions.js +2 -1
  33. package/dist/vscode/vs/workbench/browser/parts/editor/editorGroupView.js +2 -1
  34. package/dist/vscode/vs/workbench/browser/parts/editor/editorPanes.js +2 -1
  35. package/dist/vscode/vs/workbench/browser/parts/editor/editorPlaceholder.js +2 -1
  36. package/dist/vscode/vs/workbench/common/editor/editorInput.d.ts +1 -1
  37. package/dist/vscode/vs/workbench/common/theme.js +5 -5
  38. package/dist/vscode/vs/workbench/contrib/bulkEdit/browser/bulkEditService.js +2 -1
  39. package/dist/vscode/vs/workbench/contrib/codeActions/browser/codeActions.contribution.js +25 -0
  40. package/dist/vscode/vs/workbench/contrib/codeActions/browser/codeActionsContribution.js +138 -0
  41. package/dist/vscode/vs/workbench/contrib/codeActions/browser/documentationContribution.js +59 -0
  42. package/dist/vscode/vs/workbench/contrib/codeActions/common/codeActionsExtensionPoint.js +61 -0
  43. package/dist/vscode/vs/workbench/contrib/codeActions/common/documentationExtensionPoint.js +58 -0
  44. package/dist/vscode/vs/workbench/contrib/customEditor/browser/customEditorInput.js +2 -1
  45. package/dist/vscode/vs/workbench/contrib/debug/browser/breakpointEditorContribution.js +2 -1
  46. package/dist/vscode/vs/workbench/contrib/debug/browser/debugAdapterManager.js +2 -1
  47. package/dist/vscode/vs/workbench/contrib/debug/browser/debugService.js +2 -1
  48. package/dist/vscode/vs/workbench/contrib/debug/browser/debugTaskRunner.js +2 -1
  49. package/dist/vscode/vs/workbench/contrib/debug/browser/rawDebugSession.js +2 -1
  50. package/dist/vscode/vs/workbench/contrib/debug/common/debugLifecycle.js +2 -1
  51. package/dist/vscode/vs/workbench/contrib/extensions/browser/extensionsActions.js +2 -1
  52. package/dist/vscode/vs/workbench/contrib/files/browser/fileActions.js +2 -1
  53. package/dist/vscode/vs/workbench/contrib/files/browser/fileCommands.js +2 -1
  54. package/dist/vscode/vs/workbench/contrib/files/browser/fileImportExport.js +2 -1
  55. package/dist/vscode/vs/workbench/contrib/files/browser/views/explorerViewer.js +2 -1
  56. package/dist/vscode/vs/workbench/contrib/folding/browser/folding.contribution.js +84 -0
  57. package/dist/vscode/vs/workbench/contrib/inlayHints/browser/inlayHintsAccessibilty.js +172 -0
  58. package/dist/vscode/vs/workbench/contrib/interactive/browser/interactiveEditorInput.js +2 -1
  59. package/dist/vscode/vs/workbench/contrib/keybindings/browser/keybindings.contribution.js +24 -0
  60. package/dist/vscode/vs/workbench/contrib/languageDetection/browser/languageDetection.contribution.js +132 -0
  61. package/dist/vscode/vs/workbench/contrib/languageStatus/browser/languageStatus.contribution.js +360 -0
  62. package/dist/vscode/vs/workbench/contrib/languageStatus/browser/media/languageStatus.css.js +4 -0
  63. package/dist/vscode/vs/workbench/contrib/list/browser/list.contribution.js +15 -0
  64. package/dist/vscode/vs/workbench/contrib/mergeEditor/browser/mergeEditorInputModel.js +2 -1
  65. package/dist/vscode/vs/workbench/contrib/notebook/common/notebookContextKeys.js +3 -0
  66. package/dist/vscode/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess.js +2 -1
  67. package/dist/vscode/vs/workbench/contrib/search/browser/searchView.js +2 -1
  68. package/dist/vscode/vs/workbench/contrib/searchEditor/browser/searchEditorInput.js +2 -1
  69. package/dist/vscode/vs/workbench/contrib/snippets/browser/commands/abstractSnippetsActions.js +20 -0
  70. package/dist/vscode/vs/workbench/contrib/snippets/browser/commands/configureSnippets.js +264 -0
  71. package/dist/vscode/vs/workbench/contrib/snippets/browser/commands/fileTemplateSnippets.js +87 -0
  72. package/dist/vscode/vs/workbench/contrib/snippets/browser/commands/insertSnippet.js +126 -0
  73. package/dist/vscode/vs/workbench/contrib/snippets/browser/commands/surroundWithSnippet.js +56 -0
  74. package/dist/vscode/vs/workbench/contrib/snippets/browser/snippetCodeActionProvider.js +133 -0
  75. package/dist/vscode/vs/workbench/contrib/snippets/browser/snippetPicker.js +83 -0
  76. package/dist/vscode/vs/workbench/contrib/snippets/browser/snippets.contribution.js +113 -0
  77. package/dist/vscode/vs/workbench/contrib/tasks/browser/taskQuickPick.js +2 -1
  78. package/dist/vscode/vs/workbench/contrib/tasks/browser/tasksQuickAccess.js +2 -1
  79. package/dist/vscode/vs/workbench/contrib/terminal/browser/terminalEditorInput.js +2 -1
  80. package/dist/vscode/vs/workbench/contrib/terminal/browser/terminalInstance.js +2 -1
  81. package/dist/vscode/vs/workbench/contrib/terminal/browser/terminalService.js +5 -3
  82. package/dist/vscode/vs/workbench/services/authentication/browser/authenticationService.js +1 -0
  83. package/dist/vscode/vs/workbench/services/dialogs/browser/abstractFileDialogService.js +2 -1
  84. package/dist/vscode/vs/workbench/services/dialogs/browser/simpleFileDialog.js +2 -1
  85. package/dist/vscode/vs/workbench/services/dialogs/common/dialogService.js +1 -0
  86. package/dist/vscode/vs/workbench/services/extensions/browser/extensionService.js +1 -0
  87. package/dist/vscode/vs/workbench/services/extensions/browser/extensionUrlHandler.js +1 -0
  88. package/dist/vscode/vs/workbench/services/extensions/common/abstractExtensionService.js +2 -1
  89. package/dist/vscode/vs/workbench/services/languageDetection/browser/languageDetectionSimpleWorker.js +173 -0
  90. package/dist/vscode/vs/workbench/services/languageDetection/browser/languageDetectionWorkerServiceImpl.js +257 -0
  91. package/dist/vscode/vs/workbench/services/languageDetection/common/languageDetectionWorkerService.js +2 -1
  92. package/dist/vscode/vs/workbench/services/remote/common/remoteExplorerService.js +2 -1
  93. package/dist/vscode/vs/workbench/services/textfile/browser/browserTextFileService.js +2 -1
  94. package/dist/vscode/vs/workbench/services/textfile/browser/textFileService.js +2 -1
  95. package/dist/vscode/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.js +2 -1
  96. package/dist/workers/languageDetection.worker.js +8 -0
  97. package/monaco-editor-treemending.patch +551 -551
  98. package/package.json +3 -2
@@ -0,0 +1,264 @@
1
+ import { isValidBasename } from 'monaco-editor/esm/vs/base/common/extpath.js';
2
+ import { extname } from 'monaco-editor/esm/vs/base/common/path.js';
3
+ import { basename, joinPath } from 'monaco-editor/esm/vs/base/common/resources.js';
4
+ import { URI } from 'monaco-editor/esm/vs/base/common/uri.js';
5
+ import { ILanguageService } from 'monaco-editor/esm/vs/editor/common/languages/language.js';
6
+ import * as nls from 'monaco-editor/esm/vs/nls.js';
7
+ import { MenuId } from 'monaco-editor/esm/vs/platform/actions/common/actions.js';
8
+ import { IFileService } from 'monaco-editor/esm/vs/platform/files/common/files.js';
9
+ import { ILabelService } from 'monaco-editor/esm/vs/platform/label/common/label.js';
10
+ import { IOpenerService } from 'monaco-editor/esm/vs/platform/opener/common/opener.js';
11
+ import { IQuickInputService } from 'monaco-editor/esm/vs/platform/quickinput/common/quickInput.js';
12
+ import { IWorkspaceContextService } from 'monaco-editor/esm/vs/platform/workspace/common/workspace.js';
13
+ import { SnippetsAction } from './abstractSnippetsActions.js';
14
+ import { ISnippetsService } from '../snippets.js';
15
+ import { ITextFileService } from '../../../../services/textfile/common/textfiles.js';
16
+ import { IUserDataProfileService } from '../../../../services/userDataProfile/common/userDataProfile.js';
17
+ var ISnippetPick;
18
+ ( (function(ISnippetPick) {
19
+ function is(thing) {
20
+ return !!thing && URI.isUri(thing.filepath);
21
+ }
22
+ ISnippetPick.is = is;
23
+ })(ISnippetPick || (ISnippetPick = {})));
24
+ async function computePicks(snippetService, userDataProfileService, languageService, labelService) {
25
+ const existing = [];
26
+ const future = [];
27
+ const seen = ( new Set());
28
+ const added = ( new Map());
29
+ for (const file of await snippetService.getSnippetFiles()) {
30
+ if (file.source === 3 ) {
31
+ continue;
32
+ }
33
+ if (file.isGlobalSnippets) {
34
+ await file.load();
35
+ const names = ( new Set());
36
+ let source;
37
+ outer: for (const snippet of file.data) {
38
+ if (!source) {
39
+ source = snippet.source;
40
+ }
41
+ for (const scope of snippet.scopes) {
42
+ const name = languageService.getLanguageName(scope);
43
+ if (name) {
44
+ if (names.size >= 4) {
45
+ names.add(`${name}...`);
46
+ break outer;
47
+ }
48
+ else {
49
+ names.add(name);
50
+ }
51
+ }
52
+ }
53
+ }
54
+ const snippet = {
55
+ label: basename(file.location),
56
+ filepath: file.location,
57
+ description: names.size === 0
58
+ ? ( nls.localize('global.scope', "(global)"))
59
+ : ( nls.localize('global.1', "({0})", [...names].join(', ')))
60
+ };
61
+ existing.push(snippet);
62
+ if (!source) {
63
+ continue;
64
+ }
65
+ const detail = ( nls.localize(
66
+ 'detail.label',
67
+ "({0}) {1}",
68
+ source,
69
+ labelService.getUriLabel(file.location, { relative: true })
70
+ ));
71
+ const lastItem = added.get(basename(file.location));
72
+ if (lastItem) {
73
+ snippet.detail = detail;
74
+ lastItem.snippet.detail = lastItem.detail;
75
+ }
76
+ added.set(basename(file.location), { snippet, detail });
77
+ }
78
+ else {
79
+ const mode = basename(file.location).replace(/\.json$/, '');
80
+ existing.push({
81
+ label: basename(file.location),
82
+ description: `(${languageService.getLanguageName(mode)})`,
83
+ filepath: file.location
84
+ });
85
+ seen.add(mode);
86
+ }
87
+ }
88
+ const dir = userDataProfileService.currentProfile.snippetsHome;
89
+ for (const languageId of languageService.getRegisteredLanguageIds()) {
90
+ const label = languageService.getLanguageName(languageId);
91
+ if (label && !( seen.has(languageId))) {
92
+ future.push({
93
+ label: languageId,
94
+ description: `(${label})`,
95
+ filepath: joinPath(dir, `${languageId}.json`),
96
+ hint: true
97
+ });
98
+ }
99
+ }
100
+ existing.sort((a, b) => {
101
+ const a_ext = extname(a.filepath.path);
102
+ const b_ext = extname(b.filepath.path);
103
+ if (a_ext === b_ext) {
104
+ return a.label.localeCompare(b.label);
105
+ }
106
+ else if (a_ext === '.code-snippets') {
107
+ return -1;
108
+ }
109
+ else {
110
+ return 1;
111
+ }
112
+ });
113
+ future.sort((a, b) => {
114
+ return a.label.localeCompare(b.label);
115
+ });
116
+ return { existing, future };
117
+ }
118
+ async function createSnippetFile(scope, defaultPath, quickInputService, fileService, textFileService, opener) {
119
+ function createSnippetUri(input) {
120
+ const filename = extname(input) !== '.code-snippets'
121
+ ? `${input}.code-snippets`
122
+ : input;
123
+ return joinPath(defaultPath, filename);
124
+ }
125
+ await fileService.createFolder(defaultPath);
126
+ const input = await quickInputService.input({
127
+ placeHolder: ( nls.localize('name', "Type snippet file name")),
128
+ async validateInput(input) {
129
+ if (!input) {
130
+ return ( nls.localize('bad_name1', "Invalid file name"));
131
+ }
132
+ if (!isValidBasename(input)) {
133
+ return ( nls.localize('bad_name2', "'{0}' is not a valid file name", input));
134
+ }
135
+ if (await fileService.exists(createSnippetUri(input))) {
136
+ return ( nls.localize('bad_name3', "'{0}' already exists", input));
137
+ }
138
+ return undefined;
139
+ }
140
+ });
141
+ if (!input) {
142
+ return undefined;
143
+ }
144
+ const resource = createSnippetUri(input);
145
+ await textFileService.write(resource, [
146
+ '{',
147
+ '\t// Place your ' + scope + ' snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and ',
148
+ '\t// description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope ',
149
+ '\t// is left empty or omitted, the snippet gets applied to all languages. The prefix is what is ',
150
+ '\t// used to trigger the snippet and the body will be expanded and inserted. Possible variables are: ',
151
+ '\t// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. ',
152
+ '\t// Placeholders with the same ids are connected.',
153
+ '\t// Example:',
154
+ '\t// "Print to console": {',
155
+ '\t// \t"scope": "javascript,typescript",',
156
+ '\t// \t"prefix": "log",',
157
+ '\t// \t"body": [',
158
+ '\t// \t\t"console.log(\'$1\');",',
159
+ '\t// \t\t"$2"',
160
+ '\t// \t],',
161
+ '\t// \t"description": "Log output to console"',
162
+ '\t// }',
163
+ '}'
164
+ ].join('\n'));
165
+ await opener.open(resource);
166
+ return undefined;
167
+ }
168
+ async function createLanguageSnippetFile(pick, fileService, textFileService) {
169
+ if (await fileService.exists(pick.filepath)) {
170
+ return;
171
+ }
172
+ const contents = [
173
+ '{',
174
+ '\t// Place your snippets for ' + pick.label + ' here. Each snippet is defined under a snippet name and has a prefix, body and ',
175
+ '\t// description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:',
176
+ '\t// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the ',
177
+ '\t// same ids are connected.',
178
+ '\t// Example:',
179
+ '\t// "Print to console": {',
180
+ '\t// \t"prefix": "log",',
181
+ '\t// \t"body": [',
182
+ '\t// \t\t"console.log(\'$1\');",',
183
+ '\t// \t\t"$2"',
184
+ '\t// \t],',
185
+ '\t// \t"description": "Log output to console"',
186
+ '\t// }',
187
+ '}'
188
+ ].join('\n');
189
+ await textFileService.write(pick.filepath, contents);
190
+ }
191
+ class ConfigureSnippets extends SnippetsAction {
192
+ constructor() {
193
+ super({
194
+ id: 'workbench.action.openSnippets',
195
+ title: {
196
+ value: ( nls.localize('openSnippet.label', "Configure User Snippets")),
197
+ original: 'Configure User Snippets'
198
+ },
199
+ shortTitle: {
200
+ value: ( nls.localize('userSnippets', "User Snippets")),
201
+ mnemonicTitle: ( nls.localize(
202
+ { key: 'miOpenSnippets', comment: ['&& denotes a mnemonic'] },
203
+ "User &&Snippets"
204
+ )),
205
+ original: 'User Snippets'
206
+ },
207
+ f1: true,
208
+ menu: [
209
+ { id: MenuId.MenubarPreferencesMenu, group: '2_configuration', order: 4 },
210
+ { id: MenuId.GlobalActivity, group: '2_configuration', order: 4 },
211
+ ]
212
+ });
213
+ }
214
+ async run(accessor) {
215
+ const snippetService = accessor.get(ISnippetsService);
216
+ const quickInputService = accessor.get(IQuickInputService);
217
+ const opener = accessor.get(IOpenerService);
218
+ const languageService = accessor.get(ILanguageService);
219
+ const userDataProfileService = accessor.get(IUserDataProfileService);
220
+ const workspaceService = accessor.get(IWorkspaceContextService);
221
+ const fileService = accessor.get(IFileService);
222
+ const textFileService = accessor.get(ITextFileService);
223
+ const labelService = accessor.get(ILabelService);
224
+ const picks = await computePicks(snippetService, userDataProfileService, languageService, labelService);
225
+ const existing = picks.existing;
226
+ const globalSnippetPicks = [{
227
+ scope: ( nls.localize('new.global_scope', 'global')),
228
+ label: ( nls.localize('new.global', "New Global Snippets file...")),
229
+ uri: userDataProfileService.currentProfile.snippetsHome
230
+ }];
231
+ const workspaceSnippetPicks = [];
232
+ for (const folder of workspaceService.getWorkspace().folders) {
233
+ workspaceSnippetPicks.push({
234
+ scope: ( nls.localize('new.workspace_scope', "{0} workspace", folder.name)),
235
+ label: ( nls.localize('new.folder', "New Snippets file for '{0}'...", folder.name)),
236
+ uri: folder.toResource('.vscode')
237
+ });
238
+ }
239
+ if (existing.length > 0) {
240
+ existing.unshift({ type: 'separator', label: ( nls.localize('group.global', "Existing Snippets")) });
241
+ existing.push({ type: 'separator', label: ( nls.localize('new.global.sep', "New Snippets")) });
242
+ }
243
+ else {
244
+ existing.push({ type: 'separator', label: ( nls.localize('new.global.sep', "New Snippets")) });
245
+ }
246
+ const pick = await quickInputService.pick([].concat(existing, globalSnippetPicks, workspaceSnippetPicks, picks.future), {
247
+ placeHolder: ( nls.localize('openSnippet.pickLanguage', "Select Snippets File or Create Snippets")),
248
+ matchOnDescription: true
249
+ });
250
+ if (globalSnippetPicks.indexOf(pick) >= 0) {
251
+ return createSnippetFile(pick.scope, pick.uri, quickInputService, fileService, textFileService, opener);
252
+ }
253
+ else if (workspaceSnippetPicks.indexOf(pick) >= 0) {
254
+ return createSnippetFile(pick.scope, pick.uri, quickInputService, fileService, textFileService, opener);
255
+ }
256
+ else if (ISnippetPick.is(pick)) {
257
+ if (pick.hint) {
258
+ await createLanguageSnippetFile(pick, fileService, textFileService);
259
+ }
260
+ return opener.open(pick.filepath);
261
+ }
262
+ }
263
+ }
264
+ export { ConfigureSnippets };
@@ -0,0 +1,87 @@
1
+ import { isFalsyOrEmpty, groupBy } from 'monaco-editor/esm/vs/base/common/arrays.js';
2
+ import { compare } from 'monaco-editor/esm/vs/base/common/strings.js';
3
+ import { getCodeEditor } from 'monaco-editor/esm/vs/editor/browser/editorBrowser.js';
4
+ import { ILanguageService } from 'monaco-editor/esm/vs/editor/common/languages/language.js';
5
+ import { SnippetController2 } from 'monaco-editor/esm/vs/editor/contrib/snippet/browser/snippetController2.js';
6
+ import { localize } from 'monaco-editor/esm/vs/nls.js';
7
+ import { IQuickInputService } from 'monaco-editor/esm/vs/platform/quickinput/common/quickInput.js';
8
+ import { SnippetsAction } from './abstractSnippetsActions.js';
9
+ import { ISnippetsService } from '../snippets.js';
10
+ import { IEditorService } from '../../../../services/editor/common/editorService.js';
11
+ class ApplyFileSnippetAction extends SnippetsAction {
12
+ constructor() {
13
+ super({
14
+ id: ApplyFileSnippetAction.Id,
15
+ title: {
16
+ value: ( localize('label', 'Fill File with Snippet')),
17
+ original: 'Fill File with Snippet'
18
+ },
19
+ f1: true,
20
+ });
21
+ }
22
+ async run(accessor) {
23
+ const snippetService = accessor.get(ISnippetsService);
24
+ const quickInputService = accessor.get(IQuickInputService);
25
+ const editorService = accessor.get(IEditorService);
26
+ const langService = accessor.get(ILanguageService);
27
+ const editor = getCodeEditor(editorService.activeTextEditorControl);
28
+ if (!editor || !editor.hasModel()) {
29
+ return;
30
+ }
31
+ const snippets = await snippetService.getSnippets(undefined, { fileTemplateSnippets: true, noRecencySort: true, includeNoPrefixSnippets: true });
32
+ if (snippets.length === 0) {
33
+ return;
34
+ }
35
+ const selection = await this._pick(quickInputService, langService, snippets);
36
+ if (!selection) {
37
+ return;
38
+ }
39
+ if (editor.hasModel()) {
40
+ SnippetController2.get(editor)?.apply([{
41
+ range: editor.getModel().getFullModelRange(),
42
+ template: selection.snippet.body
43
+ }]);
44
+ editor.getModel().setLanguage(langService.createById(selection.langId), ApplyFileSnippetAction.Id);
45
+ editor.focus();
46
+ }
47
+ }
48
+ async _pick(quickInputService, langService, snippets) {
49
+ const all = [];
50
+ for (const snippet of snippets) {
51
+ if (isFalsyOrEmpty(snippet.scopes)) {
52
+ all.push({ langId: '', snippet });
53
+ }
54
+ else {
55
+ for (const langId of snippet.scopes) {
56
+ all.push({ langId, snippet });
57
+ }
58
+ }
59
+ }
60
+ const picks = [];
61
+ const groups = groupBy(all, (a, b) => compare(a.langId, b.langId));
62
+ for (const group of groups) {
63
+ let first = true;
64
+ for (const item of group) {
65
+ if (first) {
66
+ picks.push({
67
+ type: 'separator',
68
+ label: langService.getLanguageName(item.langId) ?? item.langId
69
+ });
70
+ first = false;
71
+ }
72
+ picks.push({
73
+ snippet: item,
74
+ label: item.snippet.prefix || item.snippet.name,
75
+ detail: item.snippet.description
76
+ });
77
+ }
78
+ }
79
+ const pick = await quickInputService.pick(picks, {
80
+ placeHolder: ( localize('placeholder', 'Select a snippet')),
81
+ matchOnDetail: true,
82
+ });
83
+ return pick?.snippet;
84
+ }
85
+ }
86
+ ApplyFileSnippetAction.Id = 'workbench.action.populateFileFromSnippet';
87
+ export { ApplyFileSnippetAction };
@@ -0,0 +1,126 @@
1
+ import { EditorContextKeys } from 'monaco-editor/esm/vs/editor/common/editorContextKeys.js';
2
+ import { ILanguageService } from 'monaco-editor/esm/vs/editor/common/languages/language.js';
3
+ import { SnippetController2 } from 'monaco-editor/esm/vs/editor/contrib/snippet/browser/snippetController2.js';
4
+ import * as nls from 'monaco-editor/esm/vs/nls.js';
5
+ import { IClipboardService } from 'monaco-editor/esm/vs/platform/clipboard/common/clipboardService.js';
6
+ import { IInstantiationService } from 'monaco-editor/esm/vs/platform/instantiation/common/instantiation.js';
7
+ import { SnippetEditorAction } from './abstractSnippetsActions.js';
8
+ import { pickSnippet } from '../snippetPicker.js';
9
+ import { ISnippetsService } from '../snippets.js';
10
+ import { Snippet } from '../snippetsFile.js';
11
+ class Args {
12
+ static fromUser(arg) {
13
+ if (!arg || typeof arg !== 'object') {
14
+ return Args._empty;
15
+ }
16
+ let { snippet, name, langId } = arg;
17
+ if (typeof snippet !== 'string') {
18
+ snippet = undefined;
19
+ }
20
+ if (typeof name !== 'string') {
21
+ name = undefined;
22
+ }
23
+ if (typeof langId !== 'string') {
24
+ langId = undefined;
25
+ }
26
+ return ( new Args(snippet, name, langId));
27
+ }
28
+ constructor(snippet, name, langId) {
29
+ this.snippet = snippet;
30
+ this.name = name;
31
+ this.langId = langId;
32
+ }
33
+ }
34
+ Args._empty = ( new Args(undefined, undefined, undefined));
35
+ class InsertSnippetAction extends SnippetEditorAction {
36
+ constructor() {
37
+ super({
38
+ id: 'editor.action.insertSnippet',
39
+ title: {
40
+ value: ( nls.localize('snippet.suggestions.label', "Insert Snippet")),
41
+ original: 'Insert Snippet'
42
+ },
43
+ f1: true,
44
+ precondition: EditorContextKeys.writable,
45
+ description: {
46
+ description: `Insert Snippet`,
47
+ args: [{
48
+ name: 'args',
49
+ schema: {
50
+ 'type': 'object',
51
+ 'properties': {
52
+ 'snippet': {
53
+ 'type': 'string'
54
+ },
55
+ 'langId': {
56
+ 'type': 'string',
57
+ },
58
+ 'name': {
59
+ 'type': 'string'
60
+ }
61
+ },
62
+ }
63
+ }]
64
+ }
65
+ });
66
+ }
67
+ async runEditorCommand(accessor, editor, arg) {
68
+ const languageService = accessor.get(ILanguageService);
69
+ const snippetService = accessor.get(ISnippetsService);
70
+ if (!editor.hasModel()) {
71
+ return;
72
+ }
73
+ const clipboardService = accessor.get(IClipboardService);
74
+ const instaService = accessor.get(IInstantiationService);
75
+ const snippet = await ( new Promise((resolve, reject) => {
76
+ const { lineNumber, column } = editor.getPosition();
77
+ const { snippet, name, langId } = Args.fromUser(arg);
78
+ if (snippet) {
79
+ return resolve(( new Snippet(
80
+ false,
81
+ [],
82
+ '',
83
+ '',
84
+ '',
85
+ snippet,
86
+ '',
87
+ 1 ,
88
+ `random/${Math.random()}`
89
+ )));
90
+ }
91
+ let languageId;
92
+ if (langId) {
93
+ if (!languageService.isRegisteredLanguageId(langId)) {
94
+ return resolve(undefined);
95
+ }
96
+ languageId = langId;
97
+ }
98
+ else {
99
+ editor.getModel().tokenization.tokenizeIfCheap(lineNumber);
100
+ languageId = editor.getModel().getLanguageIdAtPosition(lineNumber, column);
101
+ if (!languageService.getLanguageName(languageId)) {
102
+ languageId = editor.getModel().getLanguageId();
103
+ }
104
+ }
105
+ if (name) {
106
+ snippetService.getSnippets(languageId, { includeNoPrefixSnippets: true })
107
+ .then(snippets => snippets.find(snippet => snippet.name === name))
108
+ .then(resolve, reject);
109
+ }
110
+ else {
111
+ resolve(instaService.invokeFunction(pickSnippet, languageId));
112
+ }
113
+ }));
114
+ if (!snippet) {
115
+ return;
116
+ }
117
+ let clipboardText;
118
+ if (snippet.needsClipboard) {
119
+ clipboardText = await clipboardService.readText();
120
+ }
121
+ editor.focus();
122
+ SnippetController2.get(editor)?.insert(snippet.codeSnippet, { clipboardText });
123
+ snippetService.updateUsageTimestamp(snippet);
124
+ }
125
+ }
126
+ export { InsertSnippetAction };
@@ -0,0 +1,56 @@
1
+ import { EditorContextKeys } from 'monaco-editor/esm/vs/editor/common/editorContextKeys.js';
2
+ import { SnippetController2 } from 'monaco-editor/esm/vs/editor/contrib/snippet/browser/snippetController2.js';
3
+ import { localize } from 'monaco-editor/esm/vs/nls.js';
4
+ import { IClipboardService } from 'monaco-editor/esm/vs/platform/clipboard/common/clipboardService.js';
5
+ import { ContextKeyExpr } from 'monaco-editor/esm/vs/platform/contextkey/common/contextkey.js';
6
+ import { IInstantiationService } from 'monaco-editor/esm/vs/platform/instantiation/common/instantiation.js';
7
+ import { SnippetEditorAction } from './abstractSnippetsActions.js';
8
+ import { pickSnippet } from '../snippetPicker.js';
9
+ import { ISnippetsService } from '../snippets.js';
10
+ async function getSurroundableSnippets(snippetsService, model, position, includeDisabledSnippets) {
11
+ const { lineNumber, column } = position;
12
+ model.tokenization.tokenizeIfCheap(lineNumber);
13
+ const languageId = model.getLanguageIdAtPosition(lineNumber, column);
14
+ const allSnippets = await snippetsService.getSnippets(languageId, { includeNoPrefixSnippets: true, includeDisabledSnippets });
15
+ return allSnippets.filter(snippet => snippet.usesSelection);
16
+ }
17
+ class SurroundWithSnippetEditorAction extends SnippetEditorAction {
18
+ constructor() {
19
+ super({
20
+ ...SurroundWithSnippetEditorAction.options,
21
+ precondition: ( ContextKeyExpr.and(EditorContextKeys.writable, EditorContextKeys.hasNonEmptySelection)),
22
+ f1: true,
23
+ });
24
+ }
25
+ async runEditorCommand(accessor, editor) {
26
+ if (!editor.hasModel()) {
27
+ return;
28
+ }
29
+ const instaService = accessor.get(IInstantiationService);
30
+ const snippetsService = accessor.get(ISnippetsService);
31
+ const clipboardService = accessor.get(IClipboardService);
32
+ const snippets = await getSurroundableSnippets(snippetsService, editor.getModel(), editor.getPosition(), true);
33
+ if (!snippets.length) {
34
+ return;
35
+ }
36
+ const snippet = await instaService.invokeFunction(pickSnippet, snippets);
37
+ if (!snippet) {
38
+ return;
39
+ }
40
+ let clipboardText;
41
+ if (snippet.needsClipboard) {
42
+ clipboardText = await clipboardService.readText();
43
+ }
44
+ editor.focus();
45
+ SnippetController2.get(editor)?.insert(snippet.codeSnippet, { clipboardText });
46
+ snippetsService.updateUsageTimestamp(snippet);
47
+ }
48
+ }
49
+ SurroundWithSnippetEditorAction.options = {
50
+ id: 'editor.action.surroundWithSnippet',
51
+ title: {
52
+ value: ( localize('label', 'Surround With Snippet...')),
53
+ original: 'Surround With Snippet...'
54
+ }
55
+ };
56
+ export { SurroundWithSnippetEditorAction, getSurroundableSnippets };
@@ -0,0 +1,133 @@
1
+ import { __decorate, __param } from '../../../../../../node_modules/tslib/tslib.es6.js';
2
+ import { DisposableStore } from 'monaco-editor/esm/vs/base/common/lifecycle.js';
3
+ import { Selection } from 'monaco-editor/esm/vs/editor/common/core/selection.js';
4
+ import { ILanguageFeaturesService } from 'monaco-editor/esm/vs/editor/common/services/languageFeatures.js';
5
+ import { CodeActionKind } from 'monaco-editor/esm/vs/editor/contrib/codeAction/common/types.js';
6
+ import { localize } from 'monaco-editor/esm/vs/nls.js';
7
+ import { IConfigurationService } from 'monaco-editor/esm/vs/platform/configuration/common/configuration.js';
8
+ import { IInstantiationService } from 'monaco-editor/esm/vs/platform/instantiation/common/instantiation.js';
9
+ import { ApplyFileSnippetAction } from './commands/fileTemplateSnippets.js';
10
+ import { SurroundWithSnippetEditorAction, getSurroundableSnippets } from './commands/surroundWithSnippet.js';
11
+ import { ISnippetsService } from './snippets.js';
12
+ let SurroundWithSnippetCodeActionProvider = class SurroundWithSnippetCodeActionProvider {
13
+ constructor(_snippetService) {
14
+ this._snippetService = _snippetService;
15
+ }
16
+ async provideCodeActions(model, range) {
17
+ if (range.isEmpty()) {
18
+ return undefined;
19
+ }
20
+ const position = Selection.isISelection(range) ? range.getPosition() : range.getStartPosition();
21
+ const snippets = await getSurroundableSnippets(this._snippetService, model, position, false);
22
+ if (!snippets.length) {
23
+ return undefined;
24
+ }
25
+ const actions = [];
26
+ for (const snippet of snippets) {
27
+ if (actions.length >= SurroundWithSnippetCodeActionProvider._MAX_CODE_ACTIONS) {
28
+ actions.push(SurroundWithSnippetCodeActionProvider._overflowCommandCodeAction);
29
+ break;
30
+ }
31
+ actions.push({
32
+ title: ( localize('codeAction', "Surround With: {0}", snippet.name)),
33
+ kind: CodeActionKind.SurroundWith.value,
34
+ edit: asWorkspaceEdit(model, range, snippet)
35
+ });
36
+ }
37
+ return {
38
+ actions,
39
+ dispose() { }
40
+ };
41
+ }
42
+ };
43
+ SurroundWithSnippetCodeActionProvider._MAX_CODE_ACTIONS = 4;
44
+ SurroundWithSnippetCodeActionProvider._overflowCommandCodeAction = {
45
+ kind: CodeActionKind.SurroundWith.value,
46
+ title: SurroundWithSnippetEditorAction.options.title.value,
47
+ command: {
48
+ id: SurroundWithSnippetEditorAction.options.id,
49
+ title: SurroundWithSnippetEditorAction.options.title.value,
50
+ },
51
+ };
52
+ SurroundWithSnippetCodeActionProvider = ( __decorate([
53
+ ( __param(0, ISnippetsService))
54
+ ], SurroundWithSnippetCodeActionProvider));
55
+ let FileTemplateCodeActionProvider = class FileTemplateCodeActionProvider {
56
+ constructor(_snippetService) {
57
+ this._snippetService = _snippetService;
58
+ this.providedCodeActionKinds = [CodeActionKind.SurroundWith.value];
59
+ }
60
+ async provideCodeActions(model) {
61
+ if (model.getValueLength() !== 0) {
62
+ return undefined;
63
+ }
64
+ const snippets = await this._snippetService.getSnippets(model.getLanguageId(), { fileTemplateSnippets: true, includeNoPrefixSnippets: true });
65
+ const actions = [];
66
+ for (const snippet of snippets) {
67
+ if (actions.length >= FileTemplateCodeActionProvider._MAX_CODE_ACTIONS) {
68
+ actions.push(FileTemplateCodeActionProvider._overflowCommandCodeAction);
69
+ break;
70
+ }
71
+ actions.push({
72
+ title: ( localize('title', 'Start with: {0}', snippet.name)),
73
+ kind: CodeActionKind.SurroundWith.value,
74
+ edit: asWorkspaceEdit(model, model.getFullModelRange(), snippet)
75
+ });
76
+ }
77
+ return {
78
+ actions,
79
+ dispose() { }
80
+ };
81
+ }
82
+ };
83
+ FileTemplateCodeActionProvider._MAX_CODE_ACTIONS = 4;
84
+ FileTemplateCodeActionProvider._overflowCommandCodeAction = {
85
+ title: ( localize('overflow.start.title', 'Start with Snippet')),
86
+ kind: CodeActionKind.SurroundWith.value,
87
+ command: {
88
+ id: ApplyFileSnippetAction.Id,
89
+ title: ''
90
+ }
91
+ };
92
+ FileTemplateCodeActionProvider = ( __decorate([
93
+ ( __param(0, ISnippetsService))
94
+ ], FileTemplateCodeActionProvider));
95
+ function asWorkspaceEdit(model, range, snippet) {
96
+ return {
97
+ edits: [{
98
+ versionId: model.getVersionId(),
99
+ resource: model.uri,
100
+ textEdit: {
101
+ range,
102
+ text: snippet.body,
103
+ insertAsSnippet: true,
104
+ }
105
+ }]
106
+ };
107
+ }
108
+ let SnippetCodeActions = class SnippetCodeActions {
109
+ constructor(instantiationService, languageFeaturesService, configService) {
110
+ this._store = ( new DisposableStore());
111
+ const setting = 'editor.snippets.codeActions.enabled';
112
+ const sessionStore = ( new DisposableStore());
113
+ const update = () => {
114
+ sessionStore.clear();
115
+ if (configService.getValue(setting)) {
116
+ sessionStore.add(languageFeaturesService.codeActionProvider.register('*', instantiationService.createInstance(SurroundWithSnippetCodeActionProvider)));
117
+ sessionStore.add(languageFeaturesService.codeActionProvider.register('*', instantiationService.createInstance(FileTemplateCodeActionProvider)));
118
+ }
119
+ };
120
+ update();
121
+ this._store.add(configService.onDidChangeConfiguration(e => e.affectsConfiguration(setting) && update()));
122
+ this._store.add(sessionStore);
123
+ }
124
+ dispose() {
125
+ this._store.dispose();
126
+ }
127
+ };
128
+ SnippetCodeActions = ( __decorate([
129
+ ( __param(0, IInstantiationService)),
130
+ ( __param(1, ILanguageFeaturesService)),
131
+ ( __param(2, IConfigurationService))
132
+ ], SnippetCodeActions));
133
+ export { SnippetCodeActions };