chore: adopt Dart 3.9 toolchain — honest floor + tall-style reformat (T-353)

Raise the declared minimums in pubspec.yaml to what our deps already
require: Flutter >=3.35.0 / Dart >=3.9.0 (was 3.19.0 / 3.5.0). alchemist
0.12 needs Flutter 3.32; Dart 3.9 first ships in Flutter 3.35, so 3.35 is
the binding floor. Pin the exact build toolchain in .fvmrc (Flutter
3.44.1).

Moving to the Dart 3.9 language level switches `dart format` to the new
"tall" style and enables two new lints. This commit is the resulting
mechanical churn, isolated from any behaviour change:
  - whole-tree `dart format` reformat (tall style)
  - `dart fix` for unnecessary_underscores + use_null_aware_elements

No runtime behaviour change; `make test` green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-11 12:11:53 +02:00
co-authored by Claude Opus 4.8
parent bcea5f15b7
commit 6d0ebab721
444 changed files with 7587 additions and 12849 deletions
@@ -17,21 +17,23 @@ void main() {
// Resolves only the one known repo path; everything else is "not a file".
String? resolve(String p) => p == 'lib/app.dart' ? '/repo/lib/app.dart' : null;
ClideMarkdown md(String src, {void Function(String, int?)? onOpen}) => ClideMarkdown(
src,
resolveFileRef: resolve,
onOpenFile: onOpen ?? (_, __) {},
);
ClideMarkdown md(String src, {void Function(String, int?)? onOpen}) => ClideMarkdown(src, resolveFileRef: resolve, onOpenFile: onOpen ?? (_, _) {});
testWidgets('a bare repo path in prose is tappable and opens with no line', (tester) async {
String? path;
int? line = -1;
await tester.pumpWidget(harness(
await tester.pumpWidget(
harness(
f,
md('see lib/app.dart for the entry point', onOpen: (p, l) {
path = p;
line = l;
})));
md(
'see lib/app.dart for the entry point',
onOpen: (p, l) {
path = p;
line = l;
},
),
),
);
await tester.pump();
await tester.tap(find.text('lib/app.dart'));
@@ -43,12 +45,18 @@ void main() {
testWidgets('a path:line ref opens at the line', (tester) async {
String? path;
int? line;
await tester.pumpWidget(harness(
await tester.pumpWidget(
harness(
f,
md('crash at lib/app.dart:42 today', onOpen: (p, l) {
path = p;
line = l;
})));
md(
'crash at lib/app.dart:42 today',
onOpen: (p, l) {
path = p;
line = l;
},
),
),
);
await tester.pump();
await tester.tap(find.text('lib/app.dart:42'));
@@ -70,12 +78,18 @@ void main() {
testWidgets('a backticked path is clickable', (tester) async {
String? path;
int? line;
await tester.pumpWidget(harness(
await tester.pumpWidget(
harness(
f,
md('open `lib/app.dart:7`', onOpen: (p, l) {
path = p;
line = l;
})));
md(
'open `lib/app.dart:7`',
onOpen: (p, l) {
path = p;
line = l;
},
),
),
);
await tester.pump();
await tester.tap(find.text('lib/app.dart:7'));
@@ -96,7 +110,7 @@ void main() {
testWidgets('a path that does not resolve stays literal (no link, no fire)', (tester) async {
var calls = 0;
await tester.pumpWidget(harness(f, md('nothing at lib/ghost.dart here', onOpen: (_, __) => calls++)));
await tester.pumpWidget(harness(f, md('nothing at lib/ghost.dart here', onOpen: (_, _) => calls++)));
await tester.pumpAndSettle();
// Rendered as plain text — tapping it does nothing.
@@ -107,7 +121,7 @@ void main() {
testWidgets('dotted prose (a version number) does not linkify', (tester) async {
var calls = 0;
await tester.pumpWidget(harness(f, md('shipped version 2.2.0 today', onOpen: (_, __) => calls++)));
await tester.pumpWidget(harness(f, md('shipped version 2.2.0 today', onOpen: (_, _) => calls++)));
await tester.pumpAndSettle();
await tester.tap(find.textContaining('2.2.0'), warnIfMissed: false);