Я пишу расширение для завершения веб-расширения api . Теперь проблема в том, что мне нужно зарегистрироваться как миллион провайдеров завершения, которые будут срабатывать в разных случаях, например, некоторые будут запускаться на chrome.
, некоторые - на chrome.tabs.
, а некоторые на chrome.tabs.onUpdated.
и так далее. Я новичок в написании расширений VS Code, и я знаю, как регистрировать провайдеров в activate
методе extension.ts
, который сейчас выглядит примерно так.
import * as vscode from 'vscode';
import chromeCompletionItemProvider from './chrome/chromeCompletionItemProvider';
import tabsCompletionItemProvider from './chrome/tabs/tabsCompletionItemProvider';
import accessibilityFeaturesCompletionItemProvider from './chrome/accessibilityFeatures/accessibilityFeaturesCompletionItemProvider';
const documentSelector = ['javascript', 'typescript', 'plaintext'];
export function activate(context: vscode.ExtensionContext) {
let chromeProvider = vscode.languages.registerCompletionItemProvider(documentSelector, {
provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, context: vscode.CompletionContext) {
const commitCharacterCompletion = new vscode.CompletionItem('chrome');
commitCharacterCompletion.commitCharacters = ['.'];
commitCharacterCompletion.documentation = new vscode.MarkdownString('Chrome provides extensions with many special-purpose APIs like `chrome.runtime` and `chrome.alarms`.');
// return all completion items as array
return [
commitCharacterCompletion,
];
}
});
const chromeItemsProvider = vscode.languages.registerCompletionItemProvider(documentSelector, chromeCompletionItemProvider, '.');
const accessibilityFeaturesProvider = vscode.languages.registerCompletionItemProvider(documentSelector, accessibilityFeaturesCompletionItemProvider, '.');
const tabsProvider = vscode.languages.registerCompletionItemProvider(documentSelector, tabsCompletionItemProvider, '.');
}
Я получил всех разных провайдеров в отдельных файлах и регистрирую их методом activate
. Но если мне придется продолжать их регистрировать, мой метод активации будет похож на 1000 строк. Есть ли способ их немного структурировать, например, Зарегистрируйте всех провайдеров, связанных с tabs
в tabsCompletionItemProvider.ts
.
Мой tabsCompletionItemProvider.ts
выглядит так:
import * as vscode from 'vscode';
import properties from './properties.json';
import methods from './methods.json';
import events from './events.json';
const tabsCompletionItemProvider = {
provideCompletionItems(document: vscode.TextDocument, position: vscode.Position) {
// get all text until the `position` and check if it reads `chrome.tabs.`
// and iff so then complete if `log`, `warn`, and `error`
let linePrefix = document.lineAt(position).text.substr(0, position.character);
if (!linePrefix.endsWith('chrome.tabs.')) {
return undefined;
}
const propertiesCompletionItems = properties.map(prop => new vscode.CompletionItem(prop.name, vscode.CompletionItemKind.Property));
const methodsCompletionItems = methods.map(func => {
const completionItem = new vscode.CompletionItem(func.name, vscode.CompletionItemKind.Method);
completionItem.documentation = new vscode.MarkdownString(func.description);
return completionItem;
});
const eventsCompletionItems = events.map(e => new vscode.CompletionItem(e.name, vscode.CompletionItemKind.Event));
return [
...propertiesCompletionItems,
...methodsCompletionItems,
...eventsCompletionItems,
];
}
};
export default tabsCompletionItemProvider;
Буду благодарен за любые предложения о том, как структурировать мой проект.