Skip to content

feat(plugins): 同一语言只由一个已启用的插件提供语言服务器 - #39

Merged
1lck merged 2 commits into
mainfrom
feat/exclusive-language-servers
Nov 14, 2026
Merged

1lck merged 2 commits into
mainfrom
feat/exclusive-language-servers

Conversation

@1lck

@1lck 1lck commented Nov 14, 2026

Copy link
Copy Markdown
Contributor

关联

  • 宿主接线:1lck/Lithe-IDEA(随后开 PR,提交后在此补链接)
  • 起因:Java Support(JDT LS)和 Java Navigation(轻量跳转)都为 java 声明语言服务器。两个都启用时,Viva 宿主按插件列表顺序静默取第一个,另一个形同失效;Java Navigation 的 README 只能写“暂时不要同时启用”。

改了什么

  • plugins.installed.lifecycle 的 installed[] 新增可选 languageServers:该版本清单里每个语言服务器的 languageID,最多 256 个、非空、不重复,否则 invalid_request。
  • 只看每个插件最新安装版本的语言服务器(按 major.minor.patch 比较,解析不了的版本排在最后),与宿主运行哪个版本的规则一致。
  • enable 或 confirmInstall 之后插件处于启用状态时,其他已启用、且与它共享语言的插件,各得到一步 { kind: "displacePlugin", pluginID, languageIDs },按 ID 排序,languageIDs 只列共享的语言。宿主据此把对方记为停用、停掉进程,并告诉用户原因。
  • 规则出现之前就同时启用的两个插件:启用状态按 ID 只保留第一个,选择本身不改;等用户启用其中一个时,用 displacePlugin 定下来。
  • disable 不顶替任何插件,另一个插件的启用选择会自然接手。
  • 不带 languageServers 的旧请求行为不变。

文档

  • 契约 README「Language servers」写明:同一语言只由一个已启用插件提供,可以有轻量版与完整版两个插件,但不会同时运行。
  • 开发指南 lsp-plugin-lifecycle.md 中英两段同步。
  • rust/contracts/rust-core-api.md 补字段、步骤和规则。
  • 协议更新记录补本 PR(pluginAPIVersion 0 内的补充,不加能力版本)。

验证

  • cargo test -p lithe-core --lib shared_plugin_lifecycle_fixture:通过。共享 fixture 新增 8 个用例、2 个非法请求用例。
  • 撤掉实现后同一测试失败(unknown field languageServers),实现恢复后通过。
  • cargo clippy -p lithe-plugin-lifecycle --all-targets -D warnings、cargo fmt --check、node shared/plugins/scripts/verify-docs.mjs:通过。

🤖 Generated with Claude Code

1lck and others added 2 commits November 14, 2026 00:40
plugins.installed.lifecycle 的已安装版本可带 languageServers(清单声明的语言服务器
languageID)。启用插件、或确认安装后插件处于启用状态时,其他已启用且最新版本为同一语言
声明语言服务器的插件,各得到一个 displacePlugin 步骤:宿主记为停用、停掉进程并告诉用户。
规则之前已同时启用的两个插件,启用状态按 ID 只保留第一个,选择不改,等用户启用其中一个时
再定下来;停用不会顶替别的插件。

契约 README、开发指南和 rust-core-api 写明该规则,共享 fixture 覆盖启用、安装、更新、
只看最新版本、旧状态和停用。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant