
Void 中 TypeScript/TSX TextMate 语法的来源、维护流程与 Scope 设计演进【免费下载链接】void开源AI代码编辑器Cursor的替代方案。项目地址: https://gitcode.com/GitHub_Trending/void2/void本指南以仓库内 extensions/typescript-basics/syntaxes/Readme.md 为核心系统讲解 Void 内置 TypeScript / TypeScript ReactTSX语法高亮的来源、升级维护流程、构建期补丁机制以及维护者针对 scope语义作用域命名留下的迁移笔记与设计思考。读完本文你将理解这一份 TextMate 语法文件是如何从上游项目派生、在每次升级时被自动裁剪与修补、最终通过扩展贡献点接入编辑器渲染管线并能独立完成一次语法的更新、验证与回归测试。语法文件的来源与定位Void基于 VS Code 体系构建的开源 AI 代码编辑器将 TypeScript 语法高亮作为一个独立的语言扩展发布位于 extensions/typescript-basics核心产物是两份 TextMate grammar 文件TypeScript.tmLanguage.jsonscope 为source.ts约 231 KBTypeScriptReact.tmLanguage.jsonscope 为source.tsx约 228 KB根据 Readme 的明确说明这两份文件并非本地原创而是从 TypeScript-TmLanguage 上游项目派生的镜像分别对应上游的TypeScript.tmLanguage与TypeScriptReact.tmLanguage。在 TypeScript.tmLanguage.json 文件头部的information_for_contributors字段中也有同样声明并记录了生成时所基于的上游提交哈希方便追溯版本对齐。因此对这份语法文件的正确贡献姿势是先向上游项目提交修复被上游接纳后再把新版本同步进本仓库而不是直接改动本地派生文件。这与 Readme 中欢迎在修复被上游接受后提交更新请求的说明一致。升级语法的工作流更新、补丁与回归测试Readme 给出了标准的升级路径结合仓库源码可以还原完整流程。第一步拉取上游最新语法文档中的命令为在extensions/typescript-basics目录下执行npm run update-grammars需要说明的是本扩展自身的 package.json 中实际声明的脚本是单数的update-grammar执行node ./build/update-grammars.mjs而在仓库根目录的 package.json 中则存在update-grammars复数的聚合脚本执行node build/npm/update-all-grammars.mjs用于批量刷新所有语言扩展的语法。无论从哪个入口执行最终都会调用扩展下的 update-grammars.mjs 完成实际拉取与转换。第二步构建期补丁patch直接拉取的上游语法不会原样落盘update-grammars.mjs 中通过patchGrammar串联了三道补丁这正是 Readme 末尾关于library 类型列表是否该保留这一疑问在工程上的实际答案补丁函数作用removeDom从support-objects仓库中剔除HTMLElement、JSON、Math等浏览器/DOM 内建类型规则并移除support.class.error.、support.class.builtin.、support.function.前缀的内建支持规则removeNodeTypes剔除 Node.js 相关类型support.variable.object.node、support.class.node.以及process、console等运行时可用的全局对象规则patchJsdoctype过滤掉 JSDoc 类型语法jsdoctype仓库中标记为illegal的规则也就是说Readme 中内置一大串 library 类型会显著增大语法体积、且正确性依赖运行时环境的顾虑最终通过在派生时剥离平台相关内建类型来解决语法只保留语言本体结构运行时全局由 JavaScript 实际环境决定。同文件的adaptToJavaScript函数还会把TypeScriptReact.tmLanguage进一步转换为 JavaScript 系列语法生成 JavaScript.tmLanguage.json 等文件因此这份 TypeScript 语法的质量同时辐射 JS 语法。第三步跑集成测试Readme 特别强调升级后不要忘记运行集成测试./scripts/test-integration.sh该脚本位于仓库根目录 scripts/test-integration.sh负责对语法高亮等集成行为做回归验证防止上游变更破坏现有渲染结果。Scope 命名迁移笔记与设计思考Readme 主体是维护者留下的迁移笔记与待办这几条笔记直接反映了 TextMate 语法 scope 设计的演进方向是理解本仓库语法组织方式的关键。声明与引用的区分笔记建议区分变量/函数声明与变量/函数引用为函数引用引入新的 scope 段function-call为声明引入definition段备选方案是统一使用support.function。从当前 TypeScript.tmLanguage.json 的实际情况看function-call片段已在语法中出现多次且文件中大量使用entity.name.function.ts标注函数名、meta.return.type.ts标注返回类型——这说明函数名是命名实体、类型位置单独成段的划分已经落地。与之呼应的是 package.json 中的semanticTokenScopes贡献它把语义化 token如property、variable、function、namespace、variable.defaultLibrary映射到 TextMate scope如variable.other.property.ts、entity.name.function.ts、support.variable.ts。这意味着编辑器存在两套高亮通道——语法层TextMate与语义层Language Server而这份映射表正是二者对齐的桥梁。return.type重命名为return-type笔记指出应把return.type改为return-type以便与其他语法例如 Java、C 等的既有命名习惯保持一致。从当前语法文件看返回类型 scope 已统一为meta.return.type.ts形式说明该重命名已在历次升级中完成。entity.name.class重命名为entity.name.type.class同样是为了与其他语法对齐类型声明统一归入entity.name.type.*命名空间。当前 TypeScript.tmLanguage.json 中已使用entity.name.type.class.ts而unbalancedBracketScopes中列出的meta.brace.angle、keyword.operator.bitwise.shift等条目则是为了在括号匹配时避免把类型参数T里的尖括号误判为不配对括号——这正是类型语法设计在编辑器底层交互中的延伸。语法如何接入编辑器grammars 贡献点语法文件本身只是 scope 规则真正接入渲染管线依靠扩展清单中的contributes.grammars声明。以 extensions/typescript-basics/package.json 为例typescript语言绑定source.tstypescriptreact绑定source.tsx语法文件路径指向对应的 tmLanguage JSONunbalancedBracketScopes列出在括号配对时不应计入配对的 scope如尖括号、箭头函数、位移运算符tokenTypes将模板字符串内的表达式、JSDoc 类型实例等标记为other等特殊 token 类型控制它们不参与括号/缩进等结构化处理typescriptreact通过embeddedLanguages声明 TSX 标签内的语言嵌套映射jsx-tags、typescriptreact另外注册了两个 JSDoc 注入语法documentation.injection.ts、documentation.injection.js.jsx通过injectTo注入到source.ts、source.tsx、source.js等语法中用于在文档注释块内提供高亮与补全见 jsdoc.ts.injection.tmLanguage.json。grammars这个贡献点本身的 schema 定义在核心代码 src/vs/workbench/services/textMate/common/TMGrammars.ts 中其中ITMSyntaxExtensionPoint接口完整描述了language、scopeName、path、embeddedLanguages、tokenTypes、injectTo、balancedBracketScopes、unbalancedBracketScopes等字段任何想为编辑器贡献自定义语法的扩展都可参照此 schema。配套的语言编辑行为language-configuration高亮之外TypeScript 的编辑体验还由 language-configuration.json 支撑它与语法文件配合形成完整的语言支持注释与括号行注释//、块注释/* */以及${ }、{ }、[ ]、( )的括号定义、自动闭合与环绕配对折叠通过folding.markers支持// #region/// #endregion折叠标记缩进规则increaseIndentPattern/decreaseIndentPattern/unIndentedLinePattern分别处理块开括号的缩进、闭括号的缩进、以及注释行与case/default语句的缩进修正回车行为onEnterRules在/**内回车自动补*续行、在*/前回车自动收尾、在行注释内回车自动补//、在单行if/for/while后回车自动缩进等JSDoc 快速注释输入/**回车即进入文档注释编辑模式与注入语法的高亮配合。测试与验证要点升级语法后建议按以下顺序自检运行语法更新脚本确认两份 TS 语法及派生的 JS 语法文件均已刷新涉及 update-grammars.mjs 与 extensions/javascript 下的产物执行 scripts/test-integration.sh 回归集成测试用编辑器实际打开.ts、.tsx、.mts、.cts、.tsbuildinfo文件重点检查泛型尖括号高亮、箭头函数返回类型、JSDoc 块内高亮、#region折叠与缩进行为是否符合预期如需新增代码片段可参考 typescript.code-snippets 的既有结构其中已内置ctor、class、import、get、log等常用片段模板。总之syntaxes/Readme.md 是理解 Void 内 TypeScript 语法体系的地图它指明了派生来源、升级流程与 scope 演进方向而配套的构建脚本、补丁逻辑、扩展清单与核心 schema 代码则为这条维护路径提供了可执行的完整实现。【免费下载链接】void开源AI代码编辑器Cursor的替代方案。项目地址: https://gitcode.com/GitHub_Trending/void2/void创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考