Repository navigation
[flutter_tools] Fix crash when migrating flow-style exclude lists in analysis_options.yaml - #191269
Conversation
…analysis_options.yaml Avoid a crash in the `yaml_edit` package when migrating `analysis_options.yaml` where the `exclude` list is formatted in flow style (e.g. `[ ... ]`) and contains newlines and trailing commas. The `yaml_edit` package (version 2.2.4) has a bug when appending to such lists via `appendToList`, which results in invalid YAML generation and triggers a `_YamlAssertionError`. To work around this, `AnalysisOptionsMigration` now checks if the `exclude` list's style is `CollectionStyle.FLOW`. If it is, it updates the entire list using `editor.update` instead of appending. This converts the list to block style (which is preferred anyway) and avoids the crash. Invalid types in the list are preserved for consistency with block-style migration. Fixes flutter#191060
…sisOptionsMigration
There was a problem hiding this comment.
Code Review
This pull request adds a workaround in the analysis options migration to handle flow-style exclude lists, rewriting them as block lists to avoid a YamlEditor crash, and includes a corresponding test. The review feedback suggests filtering out duplicate entries when merging the missing excludes into the flow-style list to ensure consistency with the block-style migration path.
| // Workaround for https://github.com/dart-lang/tools/issues/2532. | ||
| // Appending to a multiline flow-style list with a trailing comma crashes YamlEditor. | ||
| // Instead, rewrite the entire exclude list as a block list. | ||
| final newExcludes = <Object?>[...exclude, ...missingExcludes]; |
There was a problem hiding this comment.
Unconditionally appending missingExcludes to exclude can introduce duplicate entries if some of the missing excludes are already present in the existing flow-style list. To maintain consistency with the block-style migration path (which checks !exclude.contains(missingExclude)), we should filter out any elements that are already present in exclude.
final newExcludes = <Object?>[
...exclude,
...missingExcludes.where((Object? item) => !exclude.contains(item)),
];There was a problem hiding this comment.
Done. Updated to filter out existing excludes before merging.
Roll Flutter from c2437523d308 to 65c9a8dc60bc (195 revisions) flutter/flutter@c243752...65c9a8d 2026-08-22 [email protected] Roll ICU from d578f2e8b7bd to 8cc91d9b6ab9 (1 revision) (flutter/flutter#191542) 2026-08-22 [email protected] Roll Skia from 666a9b3d5cf0 to ad2106c0bb64 (3 revisions) (flutter/flutter#191527) 2026-08-22 [email protected] Roll Fuchsia Test Scripts from KaOq3EE4qJ9fnaaaK... to 0iCv10IlKfiilEBOU... (flutter/flutter#191524) 2026-08-22 [email protected] [flutter_tools] Add tests for negative lookahead regex in test runner and batch entrypoints (flutter/flutter#191438) 2026-08-22 [email protected] Roll Skia from 0c37868737fa to 666a9b3d5cf0 (2 revisions) (flutter/flutter#191518) 2026-08-21 [email protected] Revert "[input] Migrate fuchsia.ui.pointerinjector to TouchSource (#190855) (flutter/flutter#191509) 2026-08-21 [email protected] Fixes windows gallery benchmarks by forcing mobile layout (flutter/flutter#191507) 2026-08-21 [email protected] [flutter_tools] Restrict WebAssetServer source resolution to source map extensions (flutter/flutter#191501) 2026-08-21 [email protected] Roll Skia from f6900c5b8439 to 0c37868737fa (2 revisions) (flutter/flutter#191504) 2026-08-21 [email protected] Refactor `FlutterDevice.connect` and VM service discovery (flutter/flutter#191221) 2026-08-21 [email protected] [flutter_tools] Fix crash when migrating flow-style exclude lists in analysis_options.yaml (flutter/flutter#191269) 2026-08-21 [email protected] [rules] Add packages/flutter_tools/gradle/AGENTS.md rules (flutter/flutter#191486) 2026-08-21 [email protected] [flutter_tools] refactor CLI argument architecture with typed option descriptors and bundles (PoC) (flutter/flutter#191018) 2026-08-21 [email protected] tools: Extract Dart SDK to temp directory before moving to final location (flutter/flutter#191263) 2026-08-21 [email protected] [web] Move CanvasKit fragment shader classes to canvaskit/fragment_shader.dart (flutter/flutter#191451) 2026-08-21 [email protected] Roll Fuchsia Linux SDK from GCQlmt6h-esJsNubS... to ic6GjOSn-KN508XyK... (flutter/flutter#191485) 2026-08-21 [email protected] [Widget Preview] Isolate PageStorage scope in widget preview group expansion tile (flutter/flutter#191378) 2026-08-21 [email protected] [flutter_tools] Deprecate --build and --no-build flags on flutter run (flutter/flutter#191358) 2026-08-21 [email protected] Roll Skia from 70988bed1b3b to f6900c5b8439 (2 revisions) (flutter/flutter#191481) 2026-08-21 [email protected] Roll Packages from 1785501 to 252bb33 (6 revisions) (flutter/flutter#191480) 2026-08-21 [email protected] Roll Fuchsia Linux SDK from 20IJas24bZiNmCZTK... to GCQlmt6h-esJsNubS... (flutter/flutter#191415) 2026-08-21 [email protected] Roll Skia from 2ba6971bd0d1 to 70988bed1b3b (2 revisions) (flutter/flutter#191476) 2026-08-21 [email protected] Roll Skia from 1d5f72537ba6 to 2ba6971bd0d1 (2 revisions) (flutter/flutter#191473) 2026-08-21 [email protected] Roll Skia from 2c25efd2e369 to 1d5f72537ba6 (1 revision) (flutter/flutter#191472) 2026-08-21 [email protected] Roll Skia from 09b1b810850a to 2c25efd2e369 (9 revisions) (flutter/flutter#191470) 2026-08-21 [email protected] [Impeller] fix position of cached single glyph text shadows (flutter/flutter#191325) 2026-08-21 [email protected] Roll Skia from abdf8821f313 to 09b1b810850a (15 revisions) (flutter/flutter#191458) 2026-08-21 [email protected] Document that programmatic TextEditingController changes do not run input formatters (flutter/flutter#190166) 2026-08-21 [email protected] Adds new gallery benchmarks to windows (skia and impeller) (flutter/flutter#191454) 2026-08-21 [email protected] iOS: Deprecate FlutterEngine.isGpuDisabled (flutter/flutter#191393) 2026-08-21 [email protected] Revert: [web] Unskip decoration image lerp tests (flutter/flutter#191462) 2026-08-20 [email protected] android_hardware_smoke_test: Improve reliability (flutter/flutter#191374) 2026-08-20 [email protected] Don't size or offset the Android platform view before it is laid out (flutter/flutter#190895) 2026-08-20 [email protected] [iOS][add2app] Skip building SwiftPM plugins when generating CocoaPods artifacts (flutter/flutter#190736) 2026-08-20 [email protected] Optimize JSONMessageCodec UTF-8 conversion (flutter/flutter#190529) 2026-08-20 [email protected] [FML] Replace deprecated wstring_convert with Win32 APIs (flutter/flutter#191394) 2026-08-20 [email protected] SliverFillRemaining extends beyond viewport size when fillOverscroll is true (flutter/flutter#191236) 2026-08-20 [email protected] [flutter_tools] Update argParser usageLineLength when --wrap-column is passed (flutter/flutter#191264) 2026-08-20 [email protected] [flutter_tools] Fix UNC path resolution in depfile parsing on Windows (flutter/flutter#191265) 2026-08-20 [email protected] [web] Unskip decoration image lerp tests (flutter/flutter#191426) 2026-08-20 [email protected] Do not inject 'type' and 'method' into service extension responses (flutter/flutter#190946) 2026-08-20 [email protected] [flutter_tools] Fix crash in symbolize command on stream error (flutter/flutter#191273) 2026-08-20 [email protected] [flutter_tools] Prevent deletion of shared native asset hooks outputs as stale (flutter/flutter#191272) 2026-08-20 [email protected] [flutter_tools] Support package wildcard assets in app pubspec (flutter/flutter#191266) 2026-08-20 [email protected] Add SliverClipRect and SliverClipRRect (flutter/flutter#179003) 2026-08-20 [email protected] [flutter_tools] Implement Diagnostics extension slice and doctor integration (flutter/flutter#191162) ...
Description
Avoids a crash in the
yaml_editpackage when migratinganalysis_options.yamlwhere theexcludelist is formatted in flow style (e.g.[ ... ]) and contains internal newlines and trailing commas.The
yaml_editpackage (version 2.2.4) has a bug when appending to such lists viaappendToList, which results in invalid YAML generation and triggers a_YamlAssertionError(tracked upstream in dart-lang/tools#2532).To work around this,
AnalysisOptionsMigrationchecks if theexcludelist's style isCollectionStyle.FLOW. If it is, it updates the entire list usingeditor.updateinstead of appending. This converts the list to block style (which is preferred inanalysis_options.yaml) and avoids the crash. Invalid types within the list are preserved for consistency with block-style migration.Related Issues
Fixes #191060
Upstream issue: dart-lang/tools#2532
Tests
migrates and merges excludes when list is in flow style with newlinestopackages/flutter_tools/test/general.shard/migrations/analysis_options_migration_test.dart.