编程语言编译器语言运行时标准库开发工具【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址https://gitcode.com/gh_mirrors/sdk1/sdk点击查看免费下载导读本文围绕 Dart SDK 仓库中 pkg/front_end/testcases/README.md 展开系统讲解package:front_end前身与核心引擎名为 Fasta测试用例集的运行机制同一份.dart测试源码为何会编译出多份期望结果、各编译配置Outlines、strong mode、modular 等由什么驱动以及如何精准更新单个、整目录乃至全部测试的 expectation 文件。读完本文你将掌握dart pkg/front_end/tool/update_expectations.dart与./pkg/front_end/tool/cfe testing ...两条核心命令的完整用法并理解背后testing.json配置、测试套件入口和.status状态文件的工作原理。一、测试用例集概览一份源码多种编译配置pkg/front_end/testcases/目录及其子目录中的测试用例会被以各种不同的编译配置反复编译目的是覆盖 Fasta更广义地说是package:front_end的各个侧面解析、类型推断、泛型实例化、常量求值、空安全、模式匹配、增量编译等等。每种配置下产生的编译器输出都会被保存为独立的期望文件expectation测试时把当前编译结果与期望文件逐字比对任何差异都会暴露为失败。从目录结构看testcases/下按语言特性与场景组织了大量子目录例如general/通用语言特性与历史回归、inference*/各类推断、nnbd/、patterns/、records/、extension_types/、class_modifiers/、augmentations/、dart2js/、dart2wasm/、dartdevc/、expression/、incremental/、rasta/解析器错误恢复等详见 pkg/front_end/testcases。每个目录还附带对应的.status状态文件如 outline.status、strong.status用于声明某些用例在该配置下的预期结果通过、跳过或预期报错。这些配置的唯一事实来源source of truth是 pkg/front_end/testing.json。README 明确写道配置的权威定义就是这个文件任何对测试配置的理解都应从它开始。二、配置中枢pkg/front_end/testing.jsontesting.json的顶层结构是一个suites数组每个 suite 描述一类测试如何收集用例、编译并校验结果。从当前仓库内容看它声明了二十余个 suite包括messages、textual_outline、instrumenter、outline、strong、modular、incremental_dartino、expression、incremental、incremental_bulk_compiler_smoke、incremental_bulk_compiler_full、parser、outline_extractor、parser_equivalence、parser_all、lint、dartdoctest、coverage_merger、spelling_test_src、spelling_test_not_src、spelling_test_external_targets等。每个 suite 的常用字段含义如下字段作用示例取自strongsuitename套件标识命令行中按此名称引用strongkind套件实现类型当前仓库中均为ChainChainsource该套件对应的测试驱动入口脚本位于test/或tool/下test/strong_suite.dartroot用例根目录相对于pkg/front_end/testcases/status状态文件相对路径testcases/strong.statusincludeEndsWith只收集以此后缀结尾的文件[.dart, .crash_dart]excludeContains路径中包含指定片段则排除例如strong套件排除dartino、expression、nnbd_mixed目录见下exclude用正则排除的文件如.*_part[0-9]*\.dart$、.*_lib[0-9]*\.dart$不收集_part/_lib辅助文件见下subRoots附加的源码子根用于messages、lint等跨包套件可选pattern精确的用例路径正则列表用于incremental_bulk_compiler_smoke这类精选用例可选以strongsuite 为例它从testcases/收集所有.dart与.crash_dart文件排除/testcases/dartino/、/testcases/expression/、/testcases/nnbd_mixed/目录并排除_part*、_lib*辅助文件其驱动脚本是 pkg/front_end/test/strong_suite.dart。outlinesuite 与之类似但排除的是dartino、dart2wasm、expression目录见 pkg/front_end/testing.json。testing.json的尾部还有analyze配置块指定 analyzer 的 options、URI 集合、git grep 的 pathspecs 与排除项说明这份配置文件同时服务于静态分析检查。配置如何被命令行工具加载pkg/front_end/tool/cfe是一个入口 shell 脚本当参数为testing时它会定位到${REPO_DIR}/pkg/testing/bin/testing.dart并把--config${REPO_DIR}/pkg/front_end/testing.json追加到参数中而 pkg/front_end/tool/cfe.dart 则直接导入package:testing/src/run_tests.dart来驱动测试运行。因此./pkg/front_end/tool/cfe testing ...的所有命令都隐式地以testing.json为准——这正是 README 称其为 source of truth 的落点。三、expectation 文件测试输出的金标准在testcases/中每个.dart用例旁边都并列存放着多份.expect期望文件。以 pkg/front_end/testcases/general/abstract_instantiation.dart 为例同目录下可以看到abstract_instantiation.dart.strong.expectabstract_instantiation.dart.strong.outline.expectabstract_instantiation.dart.strong.modular.expectabstract_instantiation.dart.strong.transformed.expectabstract_instantiation.dart.textual_outline.expectabstract_instantiation.dart.textual_outline_modelled.expect这种命名模式即测试名 配置标识 .expect。README 明确给出了两个配置的前缀约定outline 配置使用.outline.expectstrong 配置使用.strong.expect其余如.strong.modular.expect、.strong.transformed.expect、.textual_outline.expect则对应modular、transform 与textual_outline等套件的输出变体。打开 abstract_instantiation.dart.strong.expect 可以看到期望文件的典型结构文件以library;开始随后是以//注释形式呈现的 Problems in library 列表每条含文件路径、行号、错误类型与源码摘录再往下是编译产物的 Kernel AST 文本import self、import dart:core、类与方法定义以及invalid-expression占位符。这意味着 expectation 不仅校验有没有报错还精确记录了错误的位置与编译器的中间表示回归时任何一处偏差都会被捕获。四、更新 expectation 的三种粒度当编译器行为发生有意变更例如修复 bug、引入新语言特性时需要同步更新期望文件。README 提供了三个层级的命令全部以 pkg/front_end/tool/update_expectations.dart 为入口。1. 更新全部测试的 expectationdart pkg/front_end/tool/update_expectations.dart该命令遍历所有标准套件与特殊套件重新编译并重写期望文件。README 特别提醒该操作耗时很长只应在大量测试需要更新时使用日常改动应优先采用下面更精准的两种方式。2. 更新单个测试的 expectation按目录/测试名不含.dart与.expect后缀指定即可例如dart pkg/front_end/tool/update_expectations.dart general/abstract_instantiation3. 更新某个目录下全部测试的 expectation在目录名后追加省略号...例如更新pkg/front_end/testcases/general/整个目录dart pkg/front_end/tool/update_expectations.dart general/...底层分派逻辑从 update_expectations.dart 的源码可以确认这套命令的语义标准套件standardSuites为strong、outline、modular、textual_outline特殊套件specialSuites为expression、incremental、parser。无参数运行时先跑全部标准套件、再跑全部特殊套件。带参数运行时若参数以expression/、incremental/、parser/开头则归入特殊套件单独处理只传-DupdateExpectationstrue否则作为普通测试名分别追加到每个标准套件路径下处理。标准套件运行时会额外追加-DupdateCommentstrue -DupdateExpectationstrue两个 flag其中注释更新只对第一个套件strong生效源码注释明确说明这依赖于第一次编译必须是完整编译而非 outline 编译因为注释是在 body building 与类型推断阶段生成的。这解释了为什么 README 建议更新全部期望要谨慎它实际上是按strong → outline → modular → textual_outline → expression → incremental → parser的顺序对整个测试集做了多轮全量编译。五、Dart 3.0 Outlines 配置详解README 中关于 Outlines 的配置要点如下状态文件outline.status独立测试驱动pkg/front_end/test/outline_suite.dart期望文件前缀.outline.expect更新期望的命令./pkg/front_end/tool/cfe testing -DupdateExpectationstrue outline/test1 outline/test2 ...Outline 编译只生成类的声明骨架成员签名、类型参数等不进行函数体的构建与推断因此它是 Dart 3.0 语言特性验证中只关心接口形状的快速通道。从 outline_suite.dart 的源码看该套件的createContext直接调用FastaContext.create(suite, environment)没有额外设置编译模式与 strong 套件形成对比见下一节。从 outline.status 可以看到该配置下的状态声明格式例如general/hierarchy/conflict: TypeCheckError rasta/native_is_illegal: Pass # Issue 29763每行以测试路径: 状态声明该用例在此配置下的预期结果Pass表示期望通过TypeCheckError表示期望类型检查报错#后是说明原因。六、Dart 3.0 strong mode完整编译配置详解状态文件strong.status独立测试驱动pkg/front_end/test/strong_suite.dart期望文件前缀.strong.expect更新期望的命令./pkg/front_end/tool/cfe testing -DupdateExpectationstrue -DupdateCommentstrue strong/test1 strong/test2 ...strong mode 是完整编译模式它不仅解析并生成 outline还会构建函数体、执行类型推断与检查。从 strong_suite.dart 的源码可见两个关键设置environment[EnvironmentKeys.compilationMode] CompileMode.full.name; environment[EnvironmentKeys.semiFuzz] ?? true;即强制full编译模式并默认开启semiFuzz半模糊/一致性再编译检查通过重编译来暴露非确定性问题。这也与 strong.status 中大量SemiFuzzFailure、semiFuzzFailureOnForceRebuildBodies状态条目相互印证——这些条目正是对因隐私成员、sealed 类、exports 等原因无法在切分/强制重建场景下保持输出一致的用例的预期标记。README 还特别强调了一个差异点strong mode 配置会额外解析测试文件中的注释从而能够精确匹配编译器的内部细节例如某个表达式被推断出的具体类型在某个给定位置是否发出过警告。这正是-DupdateCommentstrue的作用把推断类型等注释写回期望文件使.strong.expect比纯错误检查更内省。而正如上一节所述注释更新只在 strong第一个套件中执行以保证其基于完整编译而非 outline 编译。状态值速查结合 strong.status 与 outline.status常见状态值包括状态含义依据源码注释与条目说明Pass期望测试通过Skip期望跳过TypeCheckError期望产生类型检查错误RuntimeError期望在运行时/校验阶段出错常用于刻意构造的非法输入SemiFuzzFailure期望在半模糊一致性检查中失败SemiFuzzCrash期望在半模糊检查中崩溃semiFuzzFailureOnForceRebuildBodies期望在强制重建函数体时因隐私/切分限制而失败如私有成员、sealed 类、无名扩展等状态行尾的# 注释通常给出 issue 编号或原因说明是排查已知失败最直接的入口。七、完整工作流从修改编译器到更新期望综合上述内容在 Dart SDK 前端编译器package:front_end/ Fasta上做一次涉及输出的改动标准工作流是定位受影响用例在 pkg/front_end/testcases 下按特性目录如inference/、patterns/、general/找到相关.dart测试阅读其现有.strong.expect、.outline.expect等期望文件确认当前行为。小范围更新对单个或少数用例使用dart pkg/front_end/tool/update_expectations.dart general/xxx更新涉及整个目录则用dart pkg/front_end/tool/update_expectations.dart general/...。验证配置变体跑 pkg/front_end/test/strong_suite.dart、pkg/front_end/test/outline_suite.dart 等独立套件确认新期望与编译输出完全一致。处理预期差异若某些用例因隐私成员、sealed 类等原因无法通过半模糊一致性检查应在对应.status文件如 strong.status中登记为semiFuzzFailureOnForceRebuildBodies等状态并注明原因。全量收尾只有大量用例需要批量刷新时才运行无参的dart pkg/front_end/tool/update_expectations.dart并预留充足的执行时间。结语pkg/front_end/testcases是一套以同一份源码驱动多种编译配置、以逐字期望文件锁定行为的黄金测试体系而 pkg/front_end/testing.json 是其配置中枢pkg/front_end/tool/update_expectations.dart 与./pkg/front_end/tool/cfe testing ...是其维护入口。理解.outline.expect与.strong.expect的差异骨架编译 vs 完整编译 注释内省、状态文件的语义TypeCheckError/SemiFuzzFailure等以及三种更新粒度就能在改动 Dart 前端编译器时快速、精准地同步测试基线避免大规模全量重跑带来的时间成本。赞分享编程语言编译器语言运行时标准库开发工具【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址https://gitcode.com/gh_mirrors/sdk1/sdk点击查看免费下载相关推荐Dart SDK Kernel 编译器开发者指南pkg/kernel 改动测试全流程静态检查、单元测试与端到端验证Dart SDK Kernel 编译器开发者指南pkg/kernel 改动测试全流程静态检查、单元测试与端到端验证 本文对应仓库文档 docs/Kerne编程语言编译器语言运行时标准库开发工具深入理解dzakwan-MoE-4x7b-Beta路由机制专家选择策略与prompt设计技巧深入理解dzakwan MoE 4x7b Beta路由机制专家选择策略与prompt设计技巧 dzakwan MoE 4x7b Beta 是一个基于Mixtu编程语言编译器语言运行时标准库开发工具为 Fuchsia 构建 Dart SDK环境配置、交叉编译与测试完整指南为 Fuchsia 构建 Dart SDK环境配置、交叉编译与测试完整指南 本指南基于 Dart SDK 官方构建文档 docs/Building for F编程语言编译器语言运行时标准库开发工具上一篇【亲测免费】 开源项目 nunif 使用教程下一篇【亲测免费】 AuthKit 开源项目教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
深入 Up 项目:从贡献指南到源码架构的完整开发手册 Serverless云原生DevOpsCLI 【免费下载链接】up Deploy infinitely scalable serverless apps, apis, and sites in seconds to AWS. 项目地址: https://gitcode.com/gh_mirrors/up/up 点击查看 免费下载 Up 是一个将无服务器应用、API 与静态站点在数秒内部署到 A… · 2026/9/25 6:02:17
解读网络热词“wwww”:从拼音输入法到通用情绪符号的进化史 如果你最近刷过微博、抖音评论区或者游戏公屏,大概率见过这样的回复:“wwwww”或者一长串“WWWWWWWWWWWWW”。第一次看到的人往往会愣一下:这是在替万维网打个卡?还是在给谁疯狂刷屏?其实都不是。这串字母是当下中文互… · 2026/9/25 6:01:59
泛微表单开发实战:明细表聚合赋值主表的三种技术路线与避坑指南 做过泛微表单开发的人应该都遇到过这种需求:主表上放一个“费用合计”或者“事项条数”,真正填数据的却在明细表里一行一行录。出差申请、费用报销、合同审批、设备领用,几乎每个项目都会碰到“明细值赋值主表”的活儿。这个需求听起来简单&a… · 2026/9/25 6:01:53
LVGL中文字体显示实战:从底层原理到生成优化全攻略 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:30:12
macOS上PyG报错Symbol not found?C++符号缺失原因与修复 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:30:12
Django+MySQL协同过滤推荐系统(毕设可用) /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:30:12
Simulink入门指南:安装、建模与首次仿真全流程 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:30:12
大麦盒子DM4036折腾全攻略:当贝桌面安装与三网通用DNS设置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:30:12
微信小程序商城布局实战:flex、grid与rpx核心适配技巧 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:30:06
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37