Ric*_*ich 3 visual-studio-code language-server-protocol
在语言服务器协议规范中,语义标记响应具有一个数据字段,该数据字段是标记的整数数组。
export interface SemanticTokens {
/**
* The actual tokens.
*/
data: uinteger[];
}
Run Code Online (Sandbox Code Playgroud)
在所有示例中,语义标记都是在客户端使用 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
Run Code Online (Sandbox Code Playgroud)
它在以下位置有三个标记(使用 0 索引):
foo,第 2 行,第 5 个字符bars,第 2 行,字符 10bazzled,第 5 行,字符 2这是data服务器可以响应的一个可能的有效值:
// 1st token, 2nd token, 3rd token
[ 2,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ]
Run Code Online (Sandbox Code Playgroud)
这只是以下信息的压缩形式:
[ { 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
]
Run Code Online (Sandbox Code Playgroud)
也就是说,每组 5 个连续元素对应一个标记。这 5 个元素的含义按顺序如下:
deltaLine:该标记与前一个标记之间的行差异deltaStartChar:此标记与前一个标记之间的起始字符差异(如果前一个标记位于同一行),或者只是此标记的起始字符(如果前一个标记位于不同行)length:该令牌的长度tokenType:令牌类型图例的索引tokenModifiers:标记修饰符的位标志因此,例如,第二个标记具有deltaLine = 0,这意味着它与第一个标记在同一行,并且deltaStartChar = 5意味着它在第一个标记开始后 5 个字符开始。第一个标记之前没有标记,因此它的位置被视为绝对位置。
这是令tokenType牌类型图例的索引,它是在协议初始化握手期间建立的。令牌修饰符的图例也在初始化握手期间建立。
虽然tokenModifiers上面的值只是一个整数,但它会被解释为一个位向量,其中每个位指示相应的修饰符是打开还是关闭。例如,上面为第一个标记 ( foo) 分配了修饰符0b11,表示第 0 个和第 1 个标记修饰符都处于活动状态,并且所有其他修饰符不适用于该标记。
| 归档时间: |
|
| 查看次数: |
1004 次 |
| 最近记录: |