请注意返回类型现在是:ProviderResult<data<T[] | CompletionList<T>>>
export type data<T> = T extends Function
? never
: T extends object // recurse
? { [k in keyof T]: data<T[k]>; }
: T;
export interface CompletionItemProvider<T extends CompletionItem = CompletionItem> {
//...
provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken, context: CompletionContext): ProviderResult<data<T[] | CompletionList<T>>>;
//...
}
这将允许扩展使用以下内容(而无需使用new vscode.Range
分配实际范围):
provideCompletionItems(/*...*/) {
return [{
label: 'hello',
range: {
start: { line: 10, character: 0 },
end: { line: 10, character: 1}
}
}];
}
3条答案
按热度按时间lrl1mhuk1#
尽管这不是一个强制执行,但我将声明返回类型如下:
并且会指定列表应该是同质的。例如,我们假设如果第一个元素是
CompletionItem
,那么所有项目都是CompletionItem
的示例。3pvhb19x2#
我通常喜欢这样做,但我不确定这是完整的内容。在一定程度上,你今天已经可以用提供者结果来实现这一点,这些结果具有“无功能的”数据,例如代码镜头或不带范围的补全。然而,我们仍然会遍历这些对象,并将它们转换为DTO类型 - 从lsp-dto到我们的dtos,再到渲染器上的领域对象。我还不确定我们的“无功能的”类型是否对应于lsp-dto,或者它们首先需要被转换...所以,让我们看看这实际上能节省多少。
另一种方法是找到一种方式,使得LSP对象可以通过。比如,
vscode.Range#toJSON
可以指定返回LSP范围。然后我们有一个特殊的类实现了vscode.Range
,通过 Package 一个JSON blob来实现,它只懒惰地访问/解包这个JSON blob,通常只是简单地将其转发到它的toJSON
实现中z9gpfhce3#
首先,进行测量是有意义的。我将采取以下措施: