我正在用 C#(使用 VS2022)构建一个语言服务器,它实现语言服务器协议(LSP)17.2.8(https://www.nuget.org/packages/Microsoft.VisualStudio.LanguageServer.Protocol.Extensions )
我是语言服务器协议的新手,可能有一个简单的解决方案可以解决我的问题。我为悬停弹出窗口创建了 Markdown 内容,但内容显示为纯文本。
这是悬停,
[JsonRpcMethod(Methods.TextDocumentHoverName)]
public Hover OnHover(JToken arg)
{
LogInfo($"OnHover: Received: {arg}");
var parameter = arg.ToObject<TextDocumentPositionParams>();
[SNIP details]
var hoverContent = new SumType<string, MarkedString>[]{
new SumType<string, MarkedString>(new MarkedString
{
Language = MarkupKind.PlainText.ToString(),
Value = full_Descr + "\n",
}),
new SumType<string, MarkedString>(new MarkedString
{
Language = MarkupKind.Markdown.ToString(),
Value = "```text\n" + performanceStr + "\n```",
})
};
var result = new Hover()
{
Contents = hoverContent
};
LogInfo($"OnHover: Sent: {JToken.FromObject(result)}");
return result;
}
语言服务器将以下消息发送到我的 VisualStudio 扩展 (vsix):
{
"contents": [
{
"language": "PlainText",
"value": "VPCONFLICTQ : [NONE,AVX512_CD] Detect Conflicts Within a Vector of Packed Dword/Qword Values into Dense Memory/ Register\n"
},
{
"language": "Markdown",
"value": "```text\n µOps µOps µOps \nArchitecture Instruction Fused Unfused Port Latency Throughput \nSkylakeX VPCONFLICTQ x,x 3 3 p01 p5 4 2 \nSkylakeX VPCONFLICTQ y,y 15 15 p01 p5 13 7 \nSkylakeX VPCONFLICTQ z,z 22 22 p0 p5 17 12 \n```"
}
]
}
初始化语言服务器时,它会发送(到我的 VS 扩展)带有功能的 JSON(删除所有其他功能)。
{
"capabilities": {
"hoverProvider": {}
}
}
问题:我还需要配置其他内容才能获得带有 Markdown 布局的弹出窗口吗? Visual Studio 端不支持 Markdown 吗?我需要 HoverClientCapability 来配置内容吗?
事实上的参考实现可以在 VSSDK-Extensibility-Samples (https://github.com/microsoft/VSSDK-Extensibility-Samples/tree/master/LanguageServerProtocol) 中找到,但它没有 Markdown 弹出窗口。即使是指向工作 C# 代码的链接也将不胜感激。
编辑:请参阅此处了解我的尝试。
据我了解,markdown 还不能用。 Roslyn 和其他 Microsoft 产品显然使用
Microsoft.VisualStudio.LanguageServer.Protocol.VSInternalHover
,它有一个附加的 RawContent
字段,告诉 Visual Studio 有关分类等信息。请参阅下面的示例。
示例:
return new VSInternalHover
{
Range = ProtocolConversions.TextSpanToRange(info.Span, text),
Contents = new MarkupContent
{
Kind = MarkupKind.Markdown,
Value = GetMarkdownString(descriptionBuilder)
},
RawContent = new ClassifiedTextElement(descriptionBuilder.Select(tp => new ClassifiedTextRun(tp.Tag.ToClassificationTypeName(), tp.Text)))
};
另请注意,在 roslyn
中引用了
Microsoft.VisualStudio.LanguageServer.Protocol.VSInternalClientCapabilities
。
根据