Как структурировать несколько поставщиков завершения - PullRequest
0 голосов
/ 17 марта 2019

Я пишу расширение для завершения веб-расширения 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;

Буду благодарен за любые предложения о том, как структурировать мой проект.

...