typescript - 如何构建多个完成提供程序
问题描述
我正在编写一个扩展来为 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 相关的所有提供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;
任何有关如何构建我的项目的建议将不胜感激。
解决方案
推荐阅读
- python - Pytest Cache Fixture with Pickle 而不是 JSON
- reactjs - 为什么我的空间使用 Material UI Grid System 变成了一条新线?
- c# - 这是让 C# 类共享对象的有效方法吗?
- javascript - 我的任务是在括号中传输字符串长度(javascript)
- c# - 如何在对象内插入对象?
- javascript - ERR_HTTP_HEADERS_SENT:在将标头发送到客户端节点后无法设置标头 Node js Express Firebase ERROR
- python - 删除关键字前以不同方式表达的数字
- javascript - 从图像切换到另一个图像时缩放第二个图像
- jenkins - 如何在 kubernetes 中管理 jenkins 秘密?
- css - 在列中时,弹性项目之间没有更多空间