资讯动态

Allowlist for `build/flow/src/parser/test/flow`

发布时间:2026/9/20 22:24:41 来源:尧图企业网站定制
Allowlist forbuild/flow/src/parser/test/flow【免费下载链接】babel Babel is a compiler for writing next generation JavaScript.项目地址: https://gitcode.com/gh_mirrors/ba/babel[!NOTE] This file is automatically generated byutils/parser-test-runner. Only single-line comments after the list item will be preserved.两个要点值得特别注意 1. **自动生成**文件头部明确声明它由 utils/parser-test-runner 自动生成--update-allowlist 会整体重写它机制细节见本文第五节 2. **注释保留规则**列表项之后只有**单行注释**会被保留这是维护者给条目补充差异原因说明的唯一合法渠道在 TypeScript 的 allowlist 中可以看到大量 !-- ... -- 形式的注释例如 [scripts/parser-tests/typescript/allowlist.md](https://link.gitcode.com/i/1515cc31b5b8db5e75793e2ce706c7c3) 中对 duplicateIdentifierRelatedSpans1.ts 标注的 TS checks duplicate identifiers across related files, but babel-parser handles them separately。 ### 两类差异条目 文件主体是两个编号小节分别对应两类方向相反的解析行为差异 markdown ## 15 invalid programs did not produce a parsing error ## 254 valid programs produced a parsing errorinvalid programs did not produce a parsing error无效程序未报错Flow 认为这些程序是非法的会报语法错误但 Babel 解析器却成功解析了。这类差异在测试术语中称为false positive误放行即本应拒绝却没有拒绝说明 Babel 的语法检查比 Flow 更宽松。valid programs produced a parsing error有效程序报错Flow 认为这些程序是合法的但 Babel 解析器抛出了错误。这类差异称为false negative误报错即本应通过却拒绝说明 Babel 对某些 Flow 合法语法支持不到位——这是兼容性缺口的主要来源。当前 Flow allowlist 中 15 条误放行、254 条误报错合计 269 个已知差异点。条目路径的解析每个条目都是 Markdown 链接格式- 显示名。例如- JSX_invalid/migrated_0000.js这里的相对路径是相对于 allowlist 文件自身即scripts/parser-tests/flow/计算的向上三级进入build/flow/src/parser/test/flow/这正是 scripts/parser-tests/flow/index.js 第 99 行配置的testDir。需要说明的是build/flow/是存放 Flow 官方 parser 测试快照的目录由构建/拉取流程生成在本镜像仓库中并未直接提交运行器通过getTestIdFromAllowlistLine正则^- \[(.?)\]从每一行提取[显示名]部分作为用例 ID用于和测试结果匹配。三、15 条无效程序未报错误放行条目详解这一小节体量小但信息密度高全部 15 条列举如下完整内容见 scripts/parser-tests/flow/allowlist.md分类用例JSX 非法用例JSX_invalid/migrated_0000.js箭头函数非法用例arrow_function_invalid/migrated_0002.js类成员class_method_kinds/polymorphic_getter.js、class_properties/migrated_0026.js导出语句export_statements/invalid_export_enum_disabled.js循环for_await_loops/migrated_0000.jsTS 语法别名6 条占比最高ts_syntax/invalid_alias_keyof.js、invalid_alias_never.js、invalid_alias_readonly.js、invalid_alias_undefined.js、invalid_alias_unknown.js、invalid_readonly_type.jsFlow 类型保留字types/aliases/invalid_keyword_symbol.js、types/reserved/function.jstypeof 类型实参types/typeof/with-targs-bad-newline.js从这组数据可以看出两个值得关注的事实ts_syntax类别独占 6 条Flow 自身为了兼容 TypeScript 而接受的若干别名写法如type T keyof、never、readonly、undefined、unknown等作为类型别名的使用Babel 解析器同样放行了。这侧面说明 Babel 对这些 TS 风格别名的解析策略与 Flow 在宽松度上保持一致。这些是过于宽松的信号如果某天 Babel 决定严格对齐 Flow 的错误行为就需要从这一节移除对应条目并在解析器中补上相应校验——移除后若仍不报错测试将直接失败。四、254 条有效程序报错误报错条目分类梳理这是 allowlist 的主体也真实反映了 Babel 解析器与 Flow 语法之间的兼容性差距分布。按条目目录前缀归类统计如下已逐一核对原文条目合计恰好 254 条分类条目数涉及语法特性说明types/*declare 语句、命名空间等52declare_module、declare_namespace、declare_statements、declare_export、export_declare、mapped_types、tuplesinexact/labeled/optional/spread/variance、render_types、type_params的 const 参数、writeonly_variance等 Flow 特有的声明语法ts_syntax/*33satisfies、readonly_type、template_literal_type、unique_symbol、export_as_namespace、parameter_properties、override、mapped_type_key_remapping、optional_indexer等 Flow 对 TS 语法的移植enums/*27Flow 枚举const/declare 枚举、布尔/数字/字符串成员初始化规则、大小写、重复成员名、bigint 等match/*23Flow pattern matching 提案语法表达式/语句形态、守卫guards、模式pattern-array/core/instance/member/object/or-as等records/*22Flow records 提案声明与表达式形态、字面量键、方法、static 属性、spread、typeargs 等comment_interning/*14注释内联comment interning机制类型别名、接口、装饰器、导入、对象类型等节点上的注释归属type_guards/*14asserts is、implies、is/as参数、poly 守卫等 Flow 类型守卫语法components/*12Flow 组件语法component声明、类型参数、as重命名、rest 参数、declare 形态等ambient_declarations/*10命名空间/模块内的声明function、getter/setter、variable、namespaceabstract_class/*9抽象类抽象方法/属性、declare、protected/public、export 形态class_declare_method/*5declare class中的方法泛型、重载、staticimport_equals_declaration/*5import ... require(...)、import type ... require(...)及限定名形态types/tuples/*、types/mapped_types/*等已在types/*统计——其余ES6/modules、JSX、async_await、decorators、export_assignment、hook_syntax、computed_keys、call_properties_invalid、arrow_function、assert_operator、conditional_types、opaque_aliases 等28分散的迁移用例migrated_00xx.js后缀表明来自 Flow 测试的自动迁移与少量独立特性用例从条目看兼容性缺口的两类成因结合 scripts/parser-tests/flow/index.js 的选项转换逻辑这 254 条可以归因到两类情况Flow 独有/提案级语法Babel 明确未实现components、assert_operator、pattern_matching、records、intern_comments这五个测试选项在 flow/index.js 中直接被continue跳过注释写着 we dont support this syntax。所以match/*、records/*、components/*、assert_operator/*下的条目是结构性缺口——Babel 现阶段根本不解析这些语法自然全部误报错。已实现但行为有细微差异enums/*Babel 通过flowOptions.enums true开启、comment_interning/*、abstract_class/*、ts_syntax/*等大多属于这一类每条都对应一个具体的解析行为差异是后续逐步修复、逐条从 allowlist 中移除的对象。五、自动生成机制parser-test-runner 源码剖析allowlist 不是手写的其全部生命周期都由 scripts/parser-tests/utils/parser-test-runner.js 中的TestRunner类驱动。整体流程run()第 46-61 行为读取 allowlist → 逐个跑测试 → 汇总解释 → 输出报告或重写 allowlist。判定expectedError 与 actualError每个测试用例在getTests()中携带expectedErrorFlow 期望它报错与否来自 Flow 测试自带的.tree.json中errors字段随后runTest()第 69-81 行用 Babel 解析器实际跑一遍得到actualErrortest.result test.expectedError ! test.actualError ? fail : pass;四分类解释interpretinterpret()第 200-255 行将每个用例归入 8 个桶之一本质是两个维度的交叉allowed在 allowlist 中/disallowed不在 ×success/failure/falsePositive/falseNegativefalsePositiveFlow 期望报错、Babel 未报错falseNegativeFlow 期望通过、Babel 报错success双方都通过failure双方都报错。测试通过的条件是所有不在 allowlist 中的用例行为一致且 allowlist 中不存在指向已消失用例的悬空条目unrecognized。任何新的差异都会落到disallowed.*桶中导致退出码为 1output()第 335 行process.exitCode summary.passed ? 0 : 1。重写updateAllowlist传入--update-allowlist时updateAllowlist()第 115-192 行会从现有文件解析所有条目剔除已不再差异的用例disallowed.success、disallowed.failure与失效条目unrecognized把新出现的disallowed.falsePositive追加到无效程序未报错小节、disallowed.falseNegative追加到有效程序报错小节两个小节各自按 ID 排序并重新计算小节标题中的计数最后整体写回文件。这就是为什么文件头部的计数15 / 254永远与正文条数一致——它完全由生成逻辑维护。同时只有保留在行内的单行注释会随条目存活这印证了文件头部的注释保留声明。六、Flow 测试驱动细节选项映射与 module/script 重试scripts/parser-tests/flow/index.js 承担了把 Flow 测试格式翻译成 Babel 解析器配置的适配工作是理解 allowlist 条目的关键上下文。测试用例的加载格式loadTests()第 77-96 行约定每个.js用例可配有两个伴生文件.tree.json期望的 AST 与错误信息缺失视为{}和.options.jsonFlow 测试选项。expectedError由 tree 中errors数组是否有内容决定const shouldSuccess test.tree (!test.tree.errors || !test.tree.errors.length);Flow 选项 → Babel 选项的映射表convertFlowParserTestOptionsToBabelParserOptions()第 11-56 行实现了映射默认配置固定为{ plugins: [[flow, { all: true }], flowComments, jsx], }各 Flow 测试选项的处理策略如下表这是Babel 到底支不支持 Flow 的哪些特性的第一手证据Flow 测试选项Babel 侧处理含义componentscontinue忽略不支持该语法相关用例全部落入误报错assert_operatorcontinue不支持assert操作符pattern_matchingcontinue不支持 match 模式匹配recordscontinue不支持 recordsintern_commentscontinue不支持注释内联enumsflowOptions.enums true开启 Flow 枚举解析esproposal_decorators追加decorators-legacy插件用 legacy 装饰器模式对齐types为 false 时options.plugins []关闭全部类型解析插件use_strictoptions.strictMode enabled控制严格模式其他未知选项抛出Unknown flow parser test option防止静默遗漏这张表解释了为什么 allowlist 中会成片出现match/*、records/*、components/*条目——它们不是待修复的 bug而是明确暂不支持的语法被整体登记在案。module 失败后在 script 模式重试parse()第 118-138 行还有一个务实细节当用例以sourceType: module解析失败、而该用例本不应报错时会改用sourceType: script再试一次。这降低了因模块模式误判例如把某些代码当模块解析时产生合法但多余的报错而产生的假差异避免不必要的 allowlist 条目。七、如何运行 Flow 兼容性测试与更新 allowlist运行前提build/flow/src/parser/test/flow目录下需存在 Flow 官方测试快照含.js、.tree.json、.options.json运行器在第 6 行直接导入packages/babel-parser/lib/index.js即依赖 babel-parser 的编译产物因此通常需要先完成 babel-parser 的构建。运行与更新命令# 常规运行跑完全部用例并输出报告 yarn node scripts/parser-tests/flow/index.js # 更新 allowlist把当前差异同步写回 allowlist.md yarn node scripts/parser-tests/flow/index.js --update-allowlist【免费下载链接】babel Babel is a compiler for writing next generation JavaScript.项目地址: https://gitcode.com/gh_mirrors/ba/babel创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价