Skip to content

mcpp-vscode 0.7.0: build.mcpp 是 C++ 文件,由 C++ Modules 编译;「其他 C++ 语言服务」一键关闭 - #18

Merged
speak-agent merged 1 commit into
mainfrom
feat/0.7.0-build-mcpp-is-cpp
Oct 13, 2026
Merged

speak-agent merged 1 commit into
mainfrom
feat/0.7.0-build-mcpp-is-cpp

Conversation

@speak-agent

Copy link
Copy Markdown
Member

为什么

0.6.0 把 build.mcpp 声明为独立语言 mcpp-build(filenames: ["build.mcpp"])。VS Code 中文件名匹配优先于扩展名匹配,于是 build.mcpp 绕开了按 cpp 选择文档的 C++ Modules(mcppls):

  • 构建程序只得到逐行文本检查,没有编译器的补全、跳转与诊断;
  • import mcpp.rules.qt; 之后的 mcpp::rules::qt::… 被误报为 unknown mcpp::rules(每个 Qt 构建程序都有)。

改了什么

B1 build.mcpp 是 cpp 文档

  • 删除 mcpp-build 语言、source.mcpp-build grammar 与其 language configuration;改为给 cpp 声明 filenames: ["build.mcpp"](不依赖 mcppls 也成立)。
  • build-script 能力注册在 { language: "cpp", pattern: "**/build.mcpp" } 上;模块 grammar 只注入 source.cpp。
  • 迁移:"[mcpp-build]": {…} 的语言专属设置改写到 "[cpp]"(CHANGELOG 已写明)。

B2 C++ Modules 在时去重,不在时修正

  • C++ Modules 服务该文件(已安装且启用、mcppls.enable 不为 false)时:unknownSymbol 关闭,import 之后的模块补全与悬停交给它;状态变化时立即重新检查已打开的文件。
  • 保留:SPEC-007 规则检查、mcpp:: 指令补全与悬停、代码片段。
  • unknownSymbol 运行时看文件自己的 import:import mcpp.<X>…; 带进来的 mcpp::<X> 不报。

B3 「其他 C++ 语言服务」一行(工程 → 基本信息 → 语言服务)

  • C/C++ IntelliSense、clangd、ccls 在工作:warning 图标 + 名称,点击执行 mcppls.turnOffOtherCppFeatures(mcppls 自己询问作用范围,写的是对方扩展自己的设置,从不写 mcppls.*)。
  • 只有 C++ Modules:pass 图标,disabledForeground 着色,「仅 C++ Modules 在提供 C++ 语言服务」,无点击。
  • mcppls 记得改过的设置时,右键菜单「恢复」→ mcppls.restoreOtherCppFeatures。
  • 数据:mcppls 0.0.16 起的 otherCppFeatures();旧版本或读取失败时退回本地只读检测(同三个候选),此时不提供恢复。
  • 能力表:关闭与恢复拆成两条(原先共用一条候选链,"关闭"缺失时会落到"恢复"),danger: none。

顺带修复 CI 的生成物漂移门

  • mcpp 2026.10.11.1 把 [build] 的键移到 key_registry.cppm(registry_keys("build")),generate-toml-schema.mjs 找不到 kKnownBuildKeys[] 而失败;生成器改为在这种写法下读 registry。快照按 2026.10.11.1 重新生成。

验证

  • npm test:681 通过(新增:import 感知的 unknownSymbol、关闭 unknownSymbol 时规则检查仍在、otherCppFeatures 的两种来源与畸形输入、视图三种状态、右键菜单的 when、manifest 不再有 mcpp-build)。
  • Extension Host e2e(5 个 mcppls stub 变体):各 8 通过,新增「build.mcpp 以 cpp 打开、只有规则检查的诊断」。
  • check:generated 对 mcpp main 通过。

…一键关闭

build.mcpp 不再是独立语言 mcpp-build。VS Code 中文件名匹配优先于扩展名匹配,
0.6.0 的 mcpp-build 让 build.mcpp 绕开了按 cpp 选择文档的 C++ Modules:构建程序
只得到逐行文本检查,`import mcpp.rules.qt;` 之后的 `mcpp::rules::qt::…` 被误报为
unknown mcpp::rules。现在本扩展把 build.mcpp 声明为 cpp,删除 mcpp-build 的语言、
grammar 与 language configuration,build-script 能力注册在名为 build.mcpp 的 cpp
文档上,模块 grammar 只注入 source.cpp。

C++ Modules 在服务该文件时(已安装、已启用、mcppls.enable 不为 false),
unknownSymbol 与 import 之后的模块补全、悬停交给它;SPEC-007 规则检查、mcpp::
指令的补全悬停与代码片段保留。unknownSymbol 自身改为看文件的 import:
`import mcpp.<X>…;` 带进来的 `mcpp::<X>` 不再报。

工程 → 基本信息 → 语言服务增加「其他 C++ 语言服务」一行:C/C++、clangd、ccls
在工作时显示警告与名称,点击执行 C++ Modules 自己的关闭命令(它询问作用范围);
没有时为暗色的通过图标;C++ Modules 记得改过的设置时,右键菜单提供恢复。数据来自
C++ Modules 0.0.16 的 otherCppFeatures(),旧版本退回本地只读检测。关闭与恢复拆成
两条能力,不再共用一条候选链。

另:mcpp 2026.10.11.1 把 [build] 的键移到 key registry,toml schema 生成器改从
那里读取;build-script 快照与 toml schema 随之按 2026.10.11.1 重新生成。
@speak-agent
speak-agent merged commit 1be6c16 into main Oct 13, 2026
11 checks passed
@speak-agent
speak-agent deleted the feat/0.7.0-build-mcpp-is-cpp branch October 13, 2026 20:11
Sunrisepeak added a commit to Sunrisepeak/mcpp-language-server that referenced this pull request Oct 13, 2026
…nput is no change, a module that failed in an import is named, build.mcpp beside the mcpp extension (#58)

Typing (A4), idle (A1, A2), failed modules (A3) and build.mcpp beside mcpp-vscode (A6); plan .agents/docs/2026-10-14-cross-repo-build-mcpp-and-typing-cpu-plan.md. With mcpp-community/mcpp-vscode#18 and mcpp-community/mcpp-plugins#47.
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.

2 participants