将 Port React 编译器移植到 Rust
……节点 Babel 解析器在函数类节点(FunctionDeclaration、ArrowFunctionExpression、FunctionExpression、ObjectMethod、DeclareFunction)上发出 "predicate": null 以指示 “没有 Flow `%checks` 断言”。普通的 `Option` 反序列化将 “缺失” 和 “显式 null” 都折叠成 `None`,而 `skip_serializing_if = "Option::is_none"` 在返回时剔除了该字段,因此往返 JSON 失去了该字段,且字节等效比较失败。对所有五个断言字段应用现有的 `crate::common::nullable_value` 反序列化器(从 pr-36173 提交 8b880f2 迁移,调整:该分支在所有函数类节点上已经有了普通的 `predicate` 字段,因此只有属性形式发生变化)。助手区分:- 缺失 -> None(在序列化时跳过) - null -> Some(Value::Null)(往返为 "predicate": null) - 对象 -> Some(Value::Object(_))(往返为填充的断言)这使得与断言相关的往返已知失败条目变得不必要;删除它们并仅保留孤立代理字符串值(serde_json 在解析时拒绝孤立代理, 与断言无关)。每次删除都与完整的 fixture 目录进行了验证:- component-in-object-method-body.flow:通过 - error.todo-round2_severity_diff:通过 - error.todo-update-expression-context-variable-via-type-annotation:通过 - error.todo-hoist-type-alias-before-declaration:条目已死亡(fixture 重命名为 todo-hoist-type-alias-before-declaration,contains() 检查不再匹配),且重命名的 fixture 在基线时在往返和范围解析重命名上都失败;现在通过。测试计划:- bash compiler/scripts/test-babel-ast.sh:往返:1782/1782(基线:1778/1779,1 失败)范围信息往返:1783/1783;重命名:1767/1767(12 跳过)(基线重命名:17767 中有 1 失败在同一 fixture 上)- cargo test --workspace:全部通过(33 个套件,0 失败)用实际支持替代六个 Flow `match` fixtures 的 “重命名为 error.todo-*” 方法,从 pr-36173 提交 0dc7f2e 和 d8aae6b 移植的。npm hermes-parser 可以解析匹配语法:它需要 hermes-parser >= 0.28,加上 `enableExperimentalFlowMatchSyntax` 解析器选项(快照固定为 0.25.1,并且从未通过该标志;0.26 带有不兼容的草稿语法)。- 将六个匹配 fixture 从 error.todo-* 还原为其原始名称,恢复重命名前的输入(hermes-规范格式)及其实际编译快照:match-expr-captured-var.flow.js match-expr-jsx-spread.flow.js match-expr-multi-gen-bindings.flow.js match-expr-outlined-jsx.flow.js match-expression-with-tuple-and-early-return.js match-stmt-self-ref-const.flow.js所有六个都通过了与已检查快照的比较,且无需再生成(yarn snap -p 'match-*':6 测试,6 通过,0 失败)。- snap: hermes-parser ^0.28.0 在 snap/package.json 中(+compiler yarn.lock;babel-plugin-syntax-hermes-parser 保持在 0.25.1,因为快照管道中的任何操作都不会重新解析匹配语法),通过 parseInput 传递 enableExperimentalFlowMatchSyntax,将该选项添加到 types.d.ts 中的 hermes-parser 模块类型。compiler/yarn.lock 还增加了先前缺失的 babel-plugin-react-compiler-rust 工作区的 typescript 条目(任何 yarn install 生成的现有漂移)。- method-call-scope-merge-mutable-range-sync:将 tr/td 重命名为 div/span(有效的 DOM 嵌套)。在 sprout 的容器中裸露 <tr> 引发的 validateDOMNesting 警告在两个评估中的恰好一个中触发(警告去重共享过程状态),因此日志有所不同,而渲染的输出则是相同的;这是基线时失败的 1 个测试。编译形状未改变;快照差异仅为标签字面量。- prettier:真实格式化匹配 fixtures,而不是忽略它们。删除 .prettierignore 中的 match-* 通配符(自 error.todo-* 重命名以来已过时:它们不再匹配任何文件,这就是 prettier 检查在基线时因 6 个解析错误失败的原因)。为使用 prettier-plugin-hermes-parser 的匹配 fixture 路径添加 .prettierrc.js 覆盖(根 devDep 为 ^0.32.0 + 根 yarn.lock),其解析器处理实验语法。- TS_SKIP_FIXTURES:未移除条目;当前列表(9 个条目)不包含与匹配相关的 fixtures。匹配 fixtures 完全通过 error.todo-* 重命名处理,该提交已恢复。快照反映 Rust 输出语义和跳过机制保持不变。测试计划:- yarn snap:1800 测试,1800 通过,0 失败(基线:1800 测试,1799 通过,1 失败)- yarn snap -p 'match-*' -v:6 测试,6 通过,0 失败- node scripts/prettier/index.js:退出 0(基线:在六个匹配 fixture 上退出 1,出现解析错误)- bash compiler/scripts/test-babel-ast.sh:解析 1771/1799(28 个解析错误,未改变:@babel/parser 无法解析匹配语法,因此这些 fixture 保持不在往返语料库中,正如重命名前一样);往返 1782/1782;范围信息 1783/1783;重命名 1767/1767(12 跳过);退出 0 钉住 TSImport
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡