gpt4 book ai didi

visual-studio-code - 语言服务器语义标记

转载 作者:行者123 更新时间:2023-12-05 01:54:51 26 4
gpt4 key购买 nike

在语言服务器协议(protocol)规范中,语义标记响应有一个数据字段,它是标记的整数数组。

export interface SemanticTokens {
/**
* The actual tokens.
*/
data: uinteger[];
}

在所有示例中,语义标记都是在客户端使用 SemanticTokensBuilder 完成的,该 SemanticTokensBuilder 为每种标记类型指定行和列范围。你是怎么做服务器端的? VSCode发送“textDocument/semanticTokens/full”方法时,语言服务器返回什么?

最佳答案

通过查看示例可能最容易解释。此示例改编自 https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#textDocument_semanticTokens .

假设您的文件包含内容 \n\n foo bars\n\n bazzled\n,即用空格呈现它看起来像这样:



foo bars

bazzled

这在以下位置有三个标记(使用 0 索引):

  1. foo,第 2 行,字符 5
  2. bars,第 2 行,字符 10
  3. bazzled,在第 5 行,char 2

这是服务器可以响应的一种可能的有效数据:

// 1st token,  2nd token,  3rd token
[ 2,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ]

这只是以下信息的压缩形式:

[ { deltaLine: 2, deltaStartChar: 5, length: 3, tokenType: 0, tokenModifiers: 3 },  // first token
{ deltaLine: 0, deltaStartChar: 5, length: 4, tokenType: 1, tokenModifiers: 0 }, // second token
{ deltaLine: 3, deltaStartChar: 2, length: 7, tokenType: 2, tokenModifiers: 0 } // third token
]

也就是说,每组 5 个连续元素对应一个标记。这 5 个元素依次具有以下含义:

  1. deltaLine:这个token和之前的行差
  2. deltaStartChar:此标记与前一个标记之间的起始字符差异(如果前一个标记在同一行),或者只是此标记的起始字符(如果前一个标记在不同的行上)线)
  3. length:这个token的长度
  4. tokenType: token 类型图例的索引
  5. tokenModifiers: token 修饰符的位标志

因此,例如,第二个标记有 deltaLine = 0,意味着它与第一个标记在同一行,而 deltaStartChar = 5 意味着它开始第一个标记开始后的 5 个字符。第一个标记之前没有标记,因此它的位置被认为是绝对的。

tokenType 是 token 类型图例的索引,它是在协议(protocol)初始化握手期间建立的。 token 修饰符的图例也在初始化握手期间建立。

虽然上面的 tokenModifiers 值只是一个整数,但它会被解释为一个位向量,其中每一位表示相应的修饰符是打开还是关闭。例如,上面为第一个标记(foo)分配了修饰符0b11,表示第 0 个和第 1 个标记修饰符都处于事件状态,所有其他修饰符都不适用到这个 token 。

关于visual-studio-code - 语言服务器语义标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70490767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com