首页 > 解决方案 > 如何构建多个完成提供程序

问题描述

我正在编写一个扩展来为 web-extension 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 行一样长。有什么方法可以让我对它们进行一些结构化,例如注册与 in 相关的所有提供tabstabsCompletionItemProvider.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;

任何有关如何构建我的项目的建议将不胜感激。

标签: typescriptvisual-studio-codevscode-extensions

解决方案


推荐阅读