vscode 考虑降低扩展提供的结果的要求,

pn9klfpd  于 6个月前  发布在  Vscode
关注(0)|答案(3)|浏览(75)

请注意返回类型现在是: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}
		}
	}];
}
lrl1mhuk

lrl1mhuk1#

尽管这不是一个强制执行,但我将声明返回类型如下:

ProviderResult<T[] | data<T>[] | CompletionList<T> | CompletionList<data<T>>>>

并且会指定列表应该是同质的。例如,我们假设如果第一个元素是 CompletionItem ,那么所有项目都是 CompletionItem 的示例。

3pvhb19x

3pvhb19x2#

我通常喜欢这样做,但我不确定这是完整的内容。在一定程度上,你今天已经可以用提供者结果来实现这一点,这些结果具有“无功能的”数据,例如代码镜头或不带范围的补全。然而,我们仍然会遍历这些对象,并将它们转换为DTO类型 - 从lsp-dto到我们的dtos,再到渲染器上的领域对象。我还不确定我们的“无功能的”类型是否对应于lsp-dto,或者它们首先需要被转换...所以,让我们看看这实际上能节省多少。
另一种方法是找到一种方式,使得LSP对象可以通过。比如,vscode.Range#toJSON 可以指定返回LSP范围。然后我们有一个特殊的类实现了 vscode.Range,通过 Package 一个JSON blob来实现,它只懒惰地访问/解包这个JSON blob,通常只是简单地将其转发到它的 toJSON 实现中

z9gpfhce

z9gpfhce3#

首先,进行测量是有意义的。我将采取以下措施:

  • 编写代码,原地修改LSP JSON结果,将其转换为包含范围和位置的数据。
  • 运行测试以完成项目和诊断,因为我认为这是我们最需要转换的部分。

相关问题