Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider.ts
3296 views
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 { localize } from '../../../../nls.js';
7
import { CancellationToken } from '../../../../base/common/cancellation.js';
8
import { getLocation, parse } from '../../../../base/common/json.js';
9
import { Disposable } from '../../../../base/common/lifecycle.js';
10
import { Position } from '../../../../editor/common/core/position.js';
11
import { ITextModel } from '../../../../editor/common/model.js';
12
import { CompletionContext, CompletionList, CompletionItemKind, CompletionItem } from '../../../../editor/common/languages.js';
13
import { IExtensionManagementService } from '../../../../platform/extensionManagement/common/extensionManagement.js';
14
import { IWorkbenchContribution } from '../../../common/contributions.js';
15
import { Range } from '../../../../editor/common/core/range.js';
16
import { ILanguageFeaturesService } from '../../../../editor/common/services/languageFeatures.js';
17
18
19
export class ExtensionsCompletionItemsProvider extends Disposable implements IWorkbenchContribution {
20
constructor(
21
@IExtensionManagementService private readonly extensionManagementService: IExtensionManagementService,
22
@ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService,
23
) {
24
super();
25
26
this._register(languageFeaturesService.completionProvider.register({ language: 'jsonc', pattern: '**/settings.json' }, {
27
_debugDisplayName: 'extensionsCompletionProvider',
28
provideCompletionItems: async (model: ITextModel, position: Position, _context: CompletionContext, token: CancellationToken): Promise<CompletionList> => {
29
const getWordRangeAtPosition = (model: ITextModel, position: Position): Range | null => {
30
const wordAtPosition = model.getWordAtPosition(position);
31
return wordAtPosition ? new Range(position.lineNumber, wordAtPosition.startColumn, position.lineNumber, wordAtPosition.endColumn) : null;
32
};
33
34
const location = getLocation(model.getValue(), model.getOffsetAt(position));
35
const range = getWordRangeAtPosition(model, position) ?? Range.fromPositions(position, position);
36
37
// extensions.supportUntrustedWorkspaces
38
if (location.path[0] === 'extensions.supportUntrustedWorkspaces' && location.path.length === 2 && location.isAtPropertyKey) {
39
let alreadyConfigured: string[] = [];
40
try {
41
alreadyConfigured = Object.keys(parse(model.getValue())['extensions.supportUntrustedWorkspaces']);
42
} catch (e) {/* ignore error */ }
43
44
return { suggestions: await this.provideSupportUntrustedWorkspacesExtensionProposals(alreadyConfigured, range) };
45
}
46
47
return { suggestions: [] };
48
}
49
}));
50
}
51
52
private async provideSupportUntrustedWorkspacesExtensionProposals(alreadyConfigured: string[], range: Range): Promise<CompletionItem[]> {
53
const suggestions: CompletionItem[] = [];
54
const installedExtensions = (await this.extensionManagementService.getInstalled()).filter(e => e.manifest.main);
55
const proposedExtensions = installedExtensions.filter(e => alreadyConfigured.indexOf(e.identifier.id) === -1);
56
57
if (proposedExtensions.length) {
58
suggestions.push(...proposedExtensions.map(e => {
59
const text = `"${e.identifier.id}": {\n\t"supported": true,\n\t"version": "${e.manifest.version}"\n},`;
60
return { label: e.identifier.id, kind: CompletionItemKind.Value, insertText: text, filterText: text, range };
61
}));
62
} else {
63
const text = '"vscode.csharp": {\n\t"supported": true,\n\t"version": "0.0.0"\n},';
64
suggestions.push({ label: localize('exampleExtension', "Example"), kind: CompletionItemKind.Value, insertText: text, filterText: text, range });
65
}
66
67
return suggestions;
68
}
69
}
70
71