@nx-lang /语言核心
NX语言服务的那一半与传输无关:主机上下文
内容键控快照缓存、查询调度程序和的进程内实现
@nx-lang/language-protocol的 NxLanguageService.
它上面有两个东西,任何一个都不能和另一个在行号上有分歧,因为 dispatcher只有一个副本,查询的文本被准确地分析,因为它被发送:
@nx-lang/language-http添加请求解析、正文限制、错误响应和 一个Node监听器,从@nx-lang/sdk-node.@nx-lang/sdk-wasm将它绑定到来自WebAssembly主机的快照,所以a 浏览器的答案会像服务器一样悬停。
包不从 node:。它运行在浏览器、Web Worker和Node中。
进程内服务
import { createSnapshotLanguageService } from "@nx-lang/language-core";
const service = createSnapshotLanguageService({
createSnapshot: (documents, { implicitImports }) =>
host.createLanguageSnapshot(documents, { implicitImports }),
context: {
documents: [{ uri: "nx://host/catalog.nx", identity: "catalog.nx", source: catalogSource }],
implicitImports: ["catalog.nx"]
},
cacheSize: 8
});
const hover = await service.hover({ documents, uri, position }, signal);
结果实现 NxLanguageService,所以 @nx-lang/monaco 还有其他的客户
Interface在不知道分析发生在哪里的情况下获取它。
sourceTree 将文档的每个部分作为类型化节点进行应答,并将声明作为节点
指的是;协议的README描述了答案。它是 不稳定它的形状可能会改变
任何版本,直到下一个版本提交到它。 sourceEdit 回答文本编辑,使一个
改变读者在树的一个节点上的要求,或者为什么不能做;它也不稳定。
dispose() 释放所有缓存
分析;服务人员随后再次回答,重新分析。
答案在调用线程上同步产生,因此只能观察到取消
在工作开始之前:一个已经流产的 signal 拒绝。 AbortError 什么也不要求
快照。无论谁在调用者的线程上运行服务- playground都在
Worker -是使cancel抢占的原因。
快照和缓存
一、 SnapshotLike 是调度员需要的小平面: hover, completions, diagnostics,
documentSymbols, sourceTree, sourceEdit, dispose。这两个sdk的快照都满足它,并且可以进行测试
就因为一个假的。
documentSetKey 按文档集自己的内容(URI、标识和源)进行分析
前面加上它的长度,所以没有两个集合可以连接成同一个字符串。文档的 version 剩下的
这是故意的:它是编辑器的计数器,而不是内容,并且同一文本下的新数字有
同样的分析。调度程序将当前请求的版本放回应答中,因此a
丢弃版本答案的客户端仍然看到自己的版本。
SnapshotCache 保存最近使用的分析并处理它驱逐的内容。盘旋的风暴
一秒钟内多次发送相同的文本;保留最后几套是让答录机变得便宜的原因
一个线程。
主机环境
具有自己声明的主机(例如外部组件的目录)将它们作为
context: documents 连接每个查询的文档集,而不需要客户端发送它们
implicitImports,每个查询文档导入的标识,就好像它以通配符开头一样
每个的导入。
没有任何内容被添加,也没有任何位置被重写:
- 被查询的位置是客户端发送的位置,快照被准确地询问;
- 悬停范围、文档符号范围和诊断范围将返回所查询的范围 文件本身的行、列;
- 位于上下文文档中的诊断在下面报告 文档的 URI,有它自己的 坐标,因此宿主声明中的错误永远不会显示在作者编写的行中;
- 相关位置不需要调整,无论它指向哪里。
文档中包含上下文文档的URI或标识的查询被拒绝:客户端
不能替换主机的上下文。 contextCollision(documents, context) 是check, HTTP
处理程序的答案 400 invalid-request 命名身份。
迁移从 prelude
这个 prelude 选项将主机的文本置于所查询的文档之前,并移动每个位置。
它被删除,并且仍然通过它的调用在使用消息命名构建时失败 context.
替换的是两行:
// Before
createSnapshotLanguageService({ createSnapshot, prelude: { source: catalogSource } });
// After
createSnapshotLanguageService({
createSnapshot,
context: {
documents: [{ uri: "nx://host/catalog.nx", identity: "catalog.nx", source: catalogSource }],
implicitImports: ["catalog.nx"]
}
});
preludeOffsets, withPrelude, shiftPositionIn, shiftRangeOut 和 PRELUDE_ORIGIN 被删除
用它;再也没有什么变化了,所以他们没有什么可做的。
构建和测试
pnpm --filter @nx-lang/language-core build
pnpm --filter @nx-lang/language-core test