AI宝库

AI宝库首页 › AI 资讯 › Microsoft 宣布类型服务器协议,语言服务器协议的扩展

Microsoft 宣布类型服务器协议,语言服务器协议的扩展

来源:Hacker News · 发布时间:10-27 · 由 AI宝库每小时自动聚合

文章 URL:https://github.com/microsoft/pylance-release/blob/main/docs/tsp/type-server-protocol.md. 评论 URL: https://news.ycombinator.com/robject?id=50248371 互联网档案馆的存檔,存档日期2013-12-21.

Type Server协议(TSP)是JSON-RPC协议,用于为Python分析数据询问类型服务器。 一个类型服务器维护一个工作空间的类型分析状态,以及对协议版本,快照,Python搜索路径,导入解析度,以及类型查询(计算,声明,以及预期类型)的解答请求。

协议使用语言服务器协议(LSP)的数据形状和会有用的常规,如位置和范围,它代表URI,就像LSP所做的一样。 TSP方法使用类型Server/前缀。

本文件夹中的协议文物是权威定义:

- 类型ServerProtocol.ts定义了类型脚本接口和请求类型。

- Tsp.json是机器可读协议模型。

- tsp.schema.json是协议模型的JSON计划。

TSP使用语义版本字符串进行客户端/服务器相容性检查。 在协议处于"0.x"行时,小版本的更改可能正在被打破。 补丁版本的修改在同一小行内保持后相容。

客户端启动一个类型服务器,并使用服务器支持的传输,例如stdio或Node IPC,在JSON-RPC主连接上与它通信。 在使用stdio时,stdout必须保留给JSON-RPC协议消息。

一个类型服务器预计将获得足够的工作空间和文件状态,以响应它所支持的TSP请求。 客户端通常为此状态使用普通的LSP初始化和文档同步,然后在同一JSON-RPC连接上发送类型Server/*请求。

TSP也支持可选的额外只读连接。 原始连接仍然是主要连接并拥有初始化,工作空间状态,文档同步,状态变化通知,以及连接控制。 只有在客户端和服务器在初始化过程中谈判支持后,才会打开额外的连接。

典型会话按此顺序排列:

- 客户端启动或连接到类型服务器。

- 客户端和服务器初始化任何共享的工作空间状态,通常通过LSP初始化和初始化消息。

- 客户端呼叫类型Server/getPresidentProtocolVersion,并验证返回的 semver 字符串与其期望的协议版本兼容。

- 客户端呼叫类型Server/getSnapshot,以获取第一个快照标识符。

- 客户端发送类型- query、 导入- 分辨率或搜索- 路径请求,包括当请求形状需要时的当前快照。

- 服务器发送类型Server/snapshotChanged 当以前的类型结果不再有效时。

多连接模式是一个可选的性能特征。 它让一个客户端为同一类型的服务器打开额外的本地频道,用于只读的TSP请求,而主连接继续拥有可变的工作空间状态。

客户只有在能够从同时进行只读工作中受益时,如量大类型查询或背景工作者,才应使用多连接模式,这些查询不应阻断JSON-RPC的主连接。 服务器仍然必须在单连接模式下正确工作。 协议正确性不得需要多连接支持。

多连接支持是通过正常的LSP初始化请求和响应来谈判的。 一个可以打开额外TSP频道的客户端在能力。 experiment.typeServer MultiConnection 下为所支持的运输类型做广告:

{

"能力":{

"实验":{

"类型Server多连接":{

"所支持的运输": ["ipc"]

}

}

}

}

一个服务器可以在初始化结果中服务额外的 TSP 通道返回相同的能力形状:

{

"能力":{

"实验":{

"类型Server多连接":{

"所支持的运输": ["ipc"]

}

}

}

}

多连接模式只有在双方广告型号Server MultiConnection和两个被支持的Transport列表至少有一个通用的传输时才启用。 如果任何一方省略了能力,或者没有共同的传输,会话仍然是单接,客户端不得发送类型Server/接通。

目前支持的额外连接的内置运输类型为ipc. 这种谈判与主连接是分开的,主连接可以使用stdio或Node IPC.

在初始化和运输谈判之后,客户端通过在主连接上发送类型Server/连接打开一个额外的通道:

{

"类型":"开"

"仁":"平"作"平".

"args": ["'ipc-endpoint'"] (中文(简体) ).

}

对于ipc,args阵列识别服务器应该连接的终点或终点。 服务器应该验证请求,迅速连接到提供的端点,并成功返回结果:接受请求时为真。 如果服务器无法打开频道,它应该返回成功:假的,当对日志有用时包含一个短消息。

当平台IPC机制支持时,ipc端点预计将提供全复式JSON-RPC流。 在这种情况下,参数包含一个端点字符串:

{

"类型":"开"

"仁":"平"作"平".

"args": ["'full-duplex-ipc-endpoint'"] (中文(中国大陆) ).

}

如果平台IPC机制只暴露出单向端点,args包含两个端点字符串。 端点名称取自于类型服务器的视角:第一个端点为服务器输入流,第二个端点为服务器输出流。

{

"类型":"开"

"仁":"平"作"平".

"args": ["<输入-ipc-endpoint>","<输出-ipc-endpoint>"].

}

客户端通过发送类型Server/连接到主连接上同一运输类型和端点身份来关闭一个额外的通道:

{

"类型":"接近"

"仁":"平"作"平".

"args": ["'ipc-endpoint'"] (中文(简体) ).

}

服务器应当停止为匹配的额外通道服务并迅速关闭传输。 如果服务器未在客户端的超时预算内完成关闭,客户端也可以拆除其本地运输。

相近请求应当使用打开通道的同一种参数形状:一个完全双相的IPC流的端点,或者一个分相的IPC流的同一种输入/输出端点对。

主要连接拥有所有状态变化的流量。 下列情况必须保持主连接:

- LSP初始化和生命周期信息。

- 工作空间、配置、文件监视器和文件同步通知。

-服务器对客户的快照通知

- Server/连接控制请求。

额外的连接是 TSP - 仅读。 它们可能被用于不突变服务器状态的请求,其结果对客户端提供的快照有效。

额外连接上允许的TSP消息被绑定在经过谈判的TSP版本上。 如果一个服务器报告支持一个TSP版本,并广告该会话的多连接支持,它必须支持为该版本定义的每一个外连接的TSP消息。

下表列出 TSP 版本,该版本首先允许在额外连接上每个消息:

服务器应拒绝 LSP 流量,状态变化通知,类型Server/连接,以及任何在额外连接收到时不允许谈判的 TSP 版本的 TSP 消息。

一个快照是一个非负整数,它能识别该类型服务器分析状态的点-时视图。 类型手柄,声明,符号等返回对象仅对返回时的快照有效,除非另有明确请求称。

当先前返回的类型分析结果无效时,类型服务器必须推进快照。 典型的无效事件包括:打开文件更改,关闭文件,配置更改,被监视文件更改,依赖性更改,或任何更改分析结果的缓存重置。

快照规则:

- 类型Server/getSnapshot返回当前快照标识符。

- 不得在会议期间减少快照识别器。

- 类型Server/snapshot Changed报告上一个和新的快照标识符。

- 包含 stale快照的请求会因 JSON- RPC 错误而失败,让客户端用新快取重试。 LSP的服务器失效出错代码(-32802)是本案首选出错。

TSP遵循LSP的立场公约:

- 线路是零基的

-字符偏移是零基的UTF-16代码单元。

- 利用起始位置和终点位置确定源段。

如果一个类型服务器存储另一个编码中的源位置,它必须转换协议边界上的位置。 不正确的转换可能导致客户端请求错误的语法节点的信息。

类型query请求(类型Server/getComputedType,类型Server/getDecaledType,类型Server/getExpectedType)以节点或声明的参数识别源构造。 节点是URI外加源域。 一种声明描述一个符号在何地和如何被定义,或者是一个由源 AST 节点支持的正则声明,或者是一个由类型检查器创建且没有源节点的被综合声明。

无效的 Handle 是 - 1,并代表一个无效或无法使用的控件。 客户端和服务器应当将其作为一个哨站值,而不是一个有效的对象标识。

类型结果为 JSON 可序列标记对象。 每种类型都包含一个歧视者,告诉客户如何解释其他对象。 协议支持内置类型,声明类型,功能,类,结合,模块,类型变量,超载集,合成类型,以及类型引用。

每一个类型对象都带有一个数字类型的区分符,一个数字代号,和一个位域的旗帜:

类型对象为快照带,类型ID为响应-局部:

- 返回类型对象只对生成它的请求所用的快照有效。

- 类型ID用于将类型参考对象与同一序列化响应图中较早的类型对象相连接。

- 身份证类型不是一张快照的稳定的全球身份,不应在不同的答复中进行比较。

- 应使用类型参考,以避免在一个答复中重复大型或递归型图表。

目前的协议是故意小的。 确切的参数和结果形状在协议的文物中被定义;下表列出每个TSP消息及其方向和有效载荷形状。

一个类型服务器应该执行它与客户端集成并返回未定义的信件,只有在协议的结果类型允许的情况下。

3个类型query请求因它们报告同一节点或声明的类型而不同:

- 类型Server/getComputedType返回从代码流推断出的类型。 在将 缩到 int后,计算出的 b = a + 1 中的 b 类型为 int.

- 类型Server/getDeclaredType返回来源中明确写入的类型。 对于 def foo(a:int QQ str),所声明的一型为 int QQ str.

- 类型Server/getExpectedType返回周围上下文所期望的类型。 对于调用foo(4),预期的论证类型是int QQ str.

使用标准的JSON-RPC错误响应。

出错应当包括足够的消息细节,使客户端日志能够识别失败的请求,但不应暴露本地机密或只显示执行状态。

兼容类型服务器应验证这些行为:

- 类型Server/get 支持协议Version 返回客户端支持的 semver 字符串。

- 所有要求和通知的有效载荷都按照规程对文物进行序列化和去序列化。

- 类型Server/getSnapshot返回非阴性快照,快照不会退后。

- 文档、配置和被监视文件更改在可以更改返回的分析数据时会使快照失效。

- 带有 stale快照的请求以可重试的取消错误失败。

- 位置和范围转换使用基于零的UTF-16常规。

- 导入解析请求返回文件URI,或根据协议结果类型没有结果。

- 对客户端提供的快照进行类型查询(计算、申报和预期)返回成型良好或未定义的Type对象。

- 多连接支持只有在服务器能够服务于谈判后的额外运输时才发布广告。

- 额外连接接受允许的每个 TSP 请求

本文由 AI宝库自动抓取并翻译,版权归原作者所有;如需查看原文请点下方链接。

相关 AI 工具

相关免费羊毛

同源资讯

阅读原文(github.com)

标题、摘要与正文均来自该信源的公开页面,版权归原作者所有;本站自动聚合与翻译,仅作出处跳转。

← 返回 AI 资讯列表AI工具图鉴首页

返回 AI宝库首页 · 提交工具 · 商务合作 · 关于本站 · 590 款 AI 工具分类导航 · 每日 AI 热门项目与动态