diff --git a/pkgs/test_descriptor/.github/workflows/test-package.yml b/pkgs/test_descriptor/.github/workflows/test-package.yml
index 38089b6..0de63d5 100644
--- a/pkgs/test_descriptor/.github/workflows/test-package.yml
+++ b/pkgs/test_descriptor/.github/workflows/test-package.yml
@@ -49,7 +49,7 @@
       matrix:
         # Add macos-latest and/or windows-latest if relevant for this package.
         os: [ubuntu-latest]
-        sdk: [2.12.0, dev]
+        sdk: [2.17.0, dev]
     steps:
       - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
       - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d
diff --git a/pkgs/test_descriptor/CHANGELOG.md b/pkgs/test_descriptor/CHANGELOG.md
index abe849a..aad67bf 100644
--- a/pkgs/test_descriptor/CHANGELOG.md
+++ b/pkgs/test_descriptor/CHANGELOG.md
@@ -1,3 +1,5 @@
+## 2.0.2-dev
+
 ## 2.0.1
 
 * Populate the pubspec `repository` field.
diff --git a/pkgs/test_descriptor/README.md b/pkgs/test_descriptor/README.md
index 94422ea..d50e776 100644
--- a/pkgs/test_descriptor/README.md
+++ b/pkgs/test_descriptor/README.md
@@ -21,25 +21,22 @@
 ```dart
 import 'dart:io';
 
+import 'package:test/test.dart';
 import 'package:test_descriptor/test_descriptor.dart' as d;
 
 void main() {
-  test("Directory.rename", () async {
-    await d.dir("parent", [
-      d.file("sibling", "sibling-contents"),
-      d.dir("old-name", [
-        d.file("child", "child-contents")
-      ])
+  test('Directory.rename', () async {
+    await d.dir('parent', [
+      d.file('sibling', 'sibling-contents'),
+      d.dir('old-name', [d.file('child', 'child-contents')])
     ]).create();
 
-    await new Directory("${d.sandbox}/parent/old-name")
-        .rename("${d.sandbox}/parent/new-name");
+    await Directory('${d.sandbox}/parent/old-name')
+        .rename('${d.sandbox}/parent/new-name');
 
-    await d.dir("parent", [
-      d.file("sibling", "sibling-contents"),
-      d.dir("new-name", [
-        d.file("child", "child-contents")
-      ])
+    await d.dir('parent', [
+      d.file('sibling', 'sibling-contents'),
+      d.dir('new-name', [d.file('child', 'child-contents')])
     ]).validate();
   });
 }
diff --git a/pkgs/test_descriptor/analysis_options.yaml b/pkgs/test_descriptor/analysis_options.yaml
index 200a3d4..7806fc0 100644
--- a/pkgs/test_descriptor/analysis_options.yaml
+++ b/pkgs/test_descriptor/analysis_options.yaml
@@ -1,62 +1,57 @@
+# https://dart.dev/guides/language/analysis-options
 include: package:lints/recommended.yaml
 
 analyzer:
-  strong-mode:
-    implicit-casts: false
+  language:
+    strict-casts: true
+    strict-inference: true
+    strict-raw-types: true
 
 linter:
   rules:
-    - annotate_overrides
+    - always_declare_return_types
+    - avoid_bool_literals_in_conditional_expressions
+    - avoid_catching_errors
+    - avoid_classes_with_only_static_members
     - avoid_dynamic_calls
-    - avoid_function_literals_in_foreach_calls
-    - avoid_init_to_null
-    - avoid_null_checks_in_equality_operators
-    - avoid_relative_lib_imports
+    - avoid_private_typedef_functions
+    - avoid_redundant_argument_values
     - avoid_returning_null
+    - avoid_returning_null_for_future
+    - avoid_returning_this
     - avoid_unused_constructor_parameters
-    - await_only_futures
-    - camel_case_types
+    - avoid_void_async
     - cancel_subscriptions
     - comment_references
-    - constant_identifier_names
-    - control_flow_in_finally
     - directives_ordering
-    - empty_catches
-    - empty_constructor_bodies
-    - empty_statements
-    - hash_and_equals
-    - implementation_imports
-    - iterable_contains_unrelated_type
-    - library_names
-    - library_prefixes
-    - list_remove_unrelated_type
+    - join_return_with_assignment
+    - lines_longer_than_80_chars
+    - literal_only_boolean_expressions
+    - missing_whitespace_between_adjacent_strings
     - no_adjacent_strings_in_list
-    - non_constant_identifier_names
+    - no_runtimeType_toString
     - omit_local_variable_types
     - only_throw_errors
-    - overridden_fields
     - package_api_docs
-    - package_names
-    - package_prefixed_library_names
-    - prefer_adjacent_string_concatenation
-    - prefer_collection_literals
-    - prefer_conditional_assignment
+    - prefer_asserts_in_initializer_lists
     - prefer_const_constructors
-    - prefer_final_fields
-    - prefer_generic_function_type_aliases
-    - prefer_initializing_formals
-    - prefer_interpolation_to_compose_strings
+    - prefer_const_declarations
+    - prefer_expression_function_bodies
+    - prefer_final_locals
+    - prefer_relative_imports
     - prefer_single_quotes
-    - prefer_typing_uninitialized_variables
-    - slash_for_doc_comments
+    - sort_pub_dependencies
     - test_types_in_equals
     - throw_in_finally
-    - type_init_formals
-    - unnecessary_brace_in_string_interps
-    - unnecessary_const
-    - unnecessary_getters_setters
+    - type_annotate_public_apis
+    - unawaited_futures
+    - unnecessary_await_in_return
     - unnecessary_lambdas
-    - unnecessary_new
-    - unnecessary_null_aware_assignments
+    - unnecessary_parenthesis
+    - unnecessary_raw_strings
     - unnecessary_statements
-    - unnecessary_this
+    - use_if_null_to_convert_nulls_to_bools
+    - use_raw_strings
+    - use_string_buffers
+    - use_super_parameters
+    - require_trailing_commas
diff --git a/pkgs/test_descriptor/example/example.dart b/pkgs/test_descriptor/example/example.dart
new file mode 100644
index 0000000..ef5917e
--- /dev/null
+++ b/pkgs/test_descriptor/example/example.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:test/test.dart';
+import 'package:test_descriptor/test_descriptor.dart' as d;
+
+void main() {
+  test('Directory.rename', () async {
+    await d.dir('parent', [
+      d.file('sibling', 'sibling-contents'),
+      d.dir('old-name', [d.file('child', 'child-contents')])
+    ]).create();
+
+    await Directory('${d.sandbox}/parent/old-name')
+        .rename('${d.sandbox}/parent/new-name');
+
+    await d.dir('parent', [
+      d.file('sibling', 'sibling-contents'),
+      d.dir('new-name', [d.file('child', 'child-contents')])
+    ]).validate();
+  });
+}
diff --git a/pkgs/test_descriptor/lib/src/directory_descriptor.dart b/pkgs/test_descriptor/lib/src/directory_descriptor.dart
index e4f7b80..c4f2694 100644
--- a/pkgs/test_descriptor/lib/src/directory_descriptor.dart
+++ b/pkgs/test_descriptor/lib/src/directory_descriptor.dart
@@ -29,14 +29,13 @@
   /// [sandbox].
   Directory get io => Directory(p.join(sandbox, name));
 
-  DirectoryDescriptor(String name, Iterable<Descriptor> contents)
-      : contents = contents.toList(),
-        super(name);
+  DirectoryDescriptor(super.name, Iterable<Descriptor> contents)
+      : contents = contents.toList();
 
   /// Creates a directory descriptor named [name] that describes the physical
   /// directory at [path].
-  factory DirectoryDescriptor.fromFilesystem(String name, String path) {
-    return DirectoryDescriptor(
+  factory DirectoryDescriptor.fromFilesystem(String name, String path) =>
+      DirectoryDescriptor(
         name,
         Directory(path).listSync().map((entity) {
           // Ignore hidden files.
@@ -44,32 +43,37 @@
 
           if (entity is Directory) {
             return DirectoryDescriptor.fromFilesystem(
-                p.basename(entity.path), entity.path);
+              p.basename(entity.path),
+              entity.path,
+            );
           } else if (entity is File) {
             return FileDescriptor(
-                p.basename(entity.path), entity.readAsBytesSync());
+              p.basename(entity.path),
+              entity.readAsBytesSync(),
+            );
           }
           // Ignore broken symlinks.
           return null;
-        }).whereType<Descriptor>());
-  }
+        }).whereType<Descriptor>(),
+      );
 
   @override
   Future<void> create([String? parent]) async {
-    var fullPath = p.join(parent ?? sandbox, name);
+    final fullPath = p.join(parent ?? sandbox, name);
     await Directory(fullPath).create(recursive: true);
     await Future.wait(contents.map((entry) => entry.create(fullPath)));
   }
 
   @override
   Future<void> validate([String? parent]) async {
-    var fullPath = p.join(parent ?? sandbox, name);
+    final fullPath = p.join(parent ?? sandbox, name);
     if (!(await Directory(fullPath).exists())) {
       fail('Directory not found: "${prettyPath(fullPath)}".');
     }
 
     await waitAndReportErrors(
-        contents.map((entry) => entry.validate(fullPath)));
+      contents.map((entry) => entry.validate(fullPath)),
+    );
   }
 
   /// Treats this descriptor as a virtual filesystem and loads the binary
@@ -80,35 +84,47 @@
   Stream<List<int>> _load(String path, [String? parents]) {
     if (!p.url.isWithin('.', path)) {
       throw ArgumentError.value(
-          path, 'path', 'must be relative and beneath the base URL.');
+        path,
+        'path',
+        'must be relative and beneath the base URL.',
+      );
     }
 
-    return StreamCompleter.fromFuture(Future.sync(() {
-      var split = p.url.split(p.url.normalize(path));
-      var file = split.length == 1;
-      var matchingEntries = contents.where((entry) {
-        return entry.name == split.first &&
-            (file ? entry is FileDescriptor : entry is DirectoryDescriptor);
-      }).toList();
+    return StreamCompleter.fromFuture(
+      Future.sync(() {
+        final split = p.url.split(p.url.normalize(path));
+        final file = split.length == 1;
+        final matchingEntries = contents
+            .where(
+              (entry) =>
+                  entry.name == split.first &&
+                  (file
+                      ? entry is FileDescriptor
+                      : entry is DirectoryDescriptor),
+            )
+            .toList();
 
-      var type = file ? 'file' : 'directory';
-      var parentsAndSelf = parents == null ? name : p.url.join(parents, name);
-      if (matchingEntries.isEmpty) {
-        fail('Couldn\'t find a $type descriptor named "${split.first}" within '
-            '"$parentsAndSelf".');
-      } else if (matchingEntries.length > 1) {
-        fail('Found multiple $type descriptors named "${split.first}" within '
-            '"$parentsAndSelf".');
-      } else {
-        var remainingPath = split.sublist(1);
-        if (remainingPath.isEmpty) {
-          return (matchingEntries.first as FileDescriptor).readAsBytes();
+        final type = file ? 'file' : 'directory';
+        final parentsAndSelf =
+            parents == null ? name : p.url.join(parents, name);
+        if (matchingEntries.isEmpty) {
+          fail(
+              'Couldn\'t find a $type descriptor named "${split.first}" within '
+              '"$parentsAndSelf".');
+        } else if (matchingEntries.length > 1) {
+          fail('Found multiple $type descriptors named "${split.first}" within '
+              '"$parentsAndSelf".');
         } else {
-          return (matchingEntries.first as DirectoryDescriptor)
-              ._load(p.url.joinAll(remainingPath), parentsAndSelf);
+          final remainingPath = split.sublist(1);
+          if (remainingPath.isEmpty) {
+            return (matchingEntries.first as FileDescriptor).readAsBytes();
+          } else {
+            return (matchingEntries.first as DirectoryDescriptor)
+                ._load(p.url.joinAll(remainingPath), parentsAndSelf);
+          }
         }
-      }
-    }));
+      }),
+    );
   }
 
   @override
diff --git a/pkgs/test_descriptor/lib/src/file_descriptor.dart b/pkgs/test_descriptor/lib/src/file_descriptor.dart
index b9eae6e..2daedd5 100644
--- a/pkgs/test_descriptor/lib/src/file_descriptor.dart
+++ b/pkgs/test_descriptor/lib/src/file_descriptor.dart
@@ -33,8 +33,8 @@
   /// If [contents] isn't passed, [create] creates an empty file and [validate]
   /// verifies that the file is empty.
   ///
-  /// To match a [Matcher] against a file's binary contents, use [new
-  /// FileDescriptor.binaryMatcher] instead.
+  /// To match a [Matcher] against a file's binary contents, use
+  /// [FileDescriptor.binaryMatcher] instead.
   factory FileDescriptor(String name, Object? contents) {
     if (contents is String) return _StringFileDescriptor(name, contents);
     if (contents is List) {
@@ -57,15 +57,15 @@
       _MatcherFileDescriptor(name, matcher, isBinary: true);
 
   /// A protected constructor that's only intended for subclasses.
-  FileDescriptor.protected(String name) : super(name);
+  FileDescriptor.protected(super.name);
 
   @override
   Future<void> create([String? parent]) async {
     // Create the stream before we call [File.openWrite] because it may fail
     // fast (e.g. if this is a matcher file).
-    var file = File(p.join(parent ?? sandbox, name)).openWrite();
+    final file = File(p.join(parent ?? sandbox, name)).openWrite();
     try {
-      await readAsBytes().listen(file.add).asFuture();
+      await readAsBytes().forEach(file.add);
     } finally {
       await file.close();
     }
@@ -73,8 +73,8 @@
 
   @override
   Future<void> validate([String? parent]) async {
-    var fullPath = p.join(parent ?? sandbox, name);
-    var pretty = prettyPath(fullPath);
+    final fullPath = p.join(parent ?? sandbox, name);
+    final pretty = prettyPath(fullPath);
     if (!(await File(fullPath).exists())) {
       fail('File not found: "$pretty".');
     }
@@ -107,14 +107,14 @@
   /// The contents of this descriptor's file.
   final List<int> _contents;
 
-  _BinaryFileDescriptor(String name, this._contents) : super.protected(name);
+  _BinaryFileDescriptor(super.name, this._contents) : super.protected();
 
   @override
   Stream<List<int>> readAsBytes() => Stream.fromIterable([_contents]);
 
   @override
   Future<void> _validate(String prettPath, List<int> actualContents) async {
-    if (const IterableEquality().equals(_contents, actualContents)) return;
+    if (const IterableEquality<int>().equals(_contents, actualContents)) return;
     // TODO(nweiz): show a hex dump here if the data is small enough.
     fail('File "$prettPath" didn\'t contain the expected binary data.');
   }
@@ -124,7 +124,7 @@
   /// The contents of this descriptor's file.
   final String _contents;
 
-  _StringFileDescriptor(String name, this._contents) : super.protected(name);
+  _StringFileDescriptor(super.name, this._contents) : super.protected();
 
   @override
   Future<String> read() async => _contents;
@@ -135,20 +135,23 @@
 
   @override
   void _validate(String prettyPath, List<int> actualContents) {
-    var actualContentsText = utf8.decode(actualContents);
+    final actualContentsText = utf8.decode(actualContents);
     if (_contents == actualContentsText) return;
     fail(_textMismatchMessage(prettyPath, _contents, actualContentsText));
   }
 
   String _textMismatchMessage(
-      String prettyPath, String expected, String actual) {
+    String prettyPath,
+    String expected,
+    String actual,
+  ) {
     final expectedLines = expected.split('\n');
     final actualLines = actual.split('\n');
 
-    var results = [];
+    final results = <String>[];
 
     // Compare them line by line to see which ones match.
-    var length = math.max(expectedLines.length, actualLines.length);
+    final length = math.max(expectedLines.length, actualLines.length);
     for (var i = 0; i < length; i++) {
       if (i >= actualLines.length) {
         // Missing output.
@@ -157,8 +160,8 @@
         // Unexpected extra output.
         results.add('X ${actualLines[i]}');
       } else {
-        var expectedLine = expectedLines[i];
-        var actualLine = actualLines[i];
+        final expectedLine = expectedLines[i];
+        final actualLine = actualLines[i];
 
         if (expectedLine != actualLine) {
           // Mismatched lines.
@@ -185,9 +188,9 @@
   /// contents.
   final bool _isBinary;
 
-  _MatcherFileDescriptor(String name, this._matcher, {bool isBinary = false})
+  _MatcherFileDescriptor(super.name, this._matcher, {bool isBinary = false})
       : _isBinary = isBinary,
-        super.protected(name);
+        super.protected();
 
   @override
   Stream<List<int>> readAsBytes() =>
@@ -197,7 +200,9 @@
   Future<void> _validate(String prettyPath, List<int> actualContents) async {
     try {
       expect(
-          _isBinary ? actualContents : utf8.decode(actualContents), _matcher);
+        _isBinary ? actualContents : utf8.decode(actualContents),
+        _matcher,
+      );
     } on TestFailure catch (error) {
       fail('Invalid contents for file "$prettyPath":\n${error.message}');
     }
diff --git a/pkgs/test_descriptor/lib/src/nothing_descriptor.dart b/pkgs/test_descriptor/lib/src/nothing_descriptor.dart
index 22e7bc8..da9e2a2 100644
--- a/pkgs/test_descriptor/lib/src/nothing_descriptor.dart
+++ b/pkgs/test_descriptor/lib/src/nothing_descriptor.dart
@@ -15,15 +15,15 @@
 ///
 /// Calling [create] does nothing.
 class NothingDescriptor extends Descriptor {
-  NothingDescriptor(String name) : super(name);
+  NothingDescriptor(super.name);
 
   @override
   Future<void> create([String? parent]) async {}
 
   @override
   Future<void> validate([String? parent]) async {
-    var fullPath = p.join(parent ?? sandbox, name);
-    var pretty = prettyPath(fullPath);
+    final fullPath = p.join(parent ?? sandbox, name);
+    final pretty = prettyPath(fullPath);
     if (File(fullPath).existsSync()) {
       fail('Expected nothing to exist at "$pretty", but found a file.');
     } else if (Directory(fullPath).existsSync()) {
diff --git a/pkgs/test_descriptor/lib/src/pattern_descriptor.dart b/pkgs/test_descriptor/lib/src/pattern_descriptor.dart
index ed1b556..d55afc0 100644
--- a/pkgs/test_descriptor/lib/src/pattern_descriptor.dart
+++ b/pkgs/test_descriptor/lib/src/pattern_descriptor.dart
@@ -13,11 +13,6 @@
 import 'sandbox.dart';
 import 'utils.dart';
 
-/// A function that takes a name for a [Descriptor] and returns a [Descriptor].
-/// This is used for [PatternDescriptor]s, where the name isn't known
-/// ahead-of-time.
-typedef _EntryCreator = Descriptor Function(String name);
-
 /// A descriptor that matches filesystem entity names by [Pattern] rather than
 /// by exact [String].
 ///
@@ -29,7 +24,7 @@
 
   /// The function used to generate the [Descriptor] for filesystem entities
   /// matching [pattern].
-  final _EntryCreator _fn;
+  final Descriptor Function(String) _fn;
 
   PatternDescriptor(this.pattern, Descriptor Function(String basename) child)
       : _fn = child,
@@ -42,39 +37,44 @@
   /// `this` is considered valid.
   @override
   Future<void> validate([String? parent]) async {
-    var inSandbox = parent == null;
+    final inSandbox = parent == null;
     parent ??= sandbox;
-    var matchingEntries = await Directory(parent)
+    final matchingEntries = await Directory(parent)
         .list()
-        .map((entry) =>
-            entry is File ? entry.resolveSymbolicLinksSync() : entry.path)
+        .map(
+          (entry) =>
+              entry is File ? entry.resolveSymbolicLinksSync() : entry.path,
+        )
         .where((entry) => matchesAll(pattern, p.basename(entry)))
         .toList();
     matchingEntries.sort();
 
-    var location = inSandbox ? 'sandbox' : '"${prettyPath(parent)}"';
+    final location = inSandbox ? 'sandbox' : '"${prettyPath(parent)}"';
     if (matchingEntries.isEmpty) {
       fail('No entries found in $location matching $_patternDescription.');
     }
 
-    var results = await Future.wait(matchingEntries
-        .map((entry) {
-          var basename = p.basename(entry);
-          return runZonedGuarded(() {
-            return Result.capture(Future.sync(() async {
-              await _fn(basename).validate(parent);
-              return basename;
-            }));
-          }, (_, __) {
-            // Validate may produce multiple errors, but we ignore all but the first
-            // to avoid cluttering the user with many different errors from many
-            // different un-matched entries.
-          });
-        })
-        .whereType<Future<Result<String>>>()
-        .toList());
+    final results = await Future.wait(
+      matchingEntries
+          .map((entry) {
+            final basename = p.basename(entry);
+            return runZonedGuarded(
+                () => Result.capture(
+                      Future.sync(() async {
+                        await _fn(basename).validate(parent);
+                        return basename;
+                      }),
+                    ), (_, __) {
+              // Validate may produce multiple errors, but we ignore all but the
+              // first to avoid cluttering the user with many different errors
+              // from many different un-matched entries.
+            });
+          })
+          .whereType<Future<Result<String>>>()
+          .toList(),
+    );
 
-    var successes = results.where((result) => result.isValue).toList();
+    final successes = results.where((result) => result.isValue).toList();
     if (successes.isEmpty) {
       await waitAndReportErrors(results.map((result) => result.asFuture));
     } else if (successes.length > 1) {
@@ -91,8 +91,8 @@
     if (pattern is String) return '"$pattern"';
     if (pattern is! RegExp) return '$pattern';
 
-    var regExp = pattern as RegExp;
-    var flags = StringBuffer();
+    final regExp = pattern as RegExp;
+    final flags = StringBuffer();
     if (!regExp.isCaseSensitive) flags.write('i');
     if (regExp.isMultiLine) flags.write('m');
     return '/${regExp.pattern}/$flags';
diff --git a/pkgs/test_descriptor/lib/src/sandbox.dart b/pkgs/test_descriptor/lib/src/sandbox.dart
index 1f5847f..128b6a9 100644
--- a/pkgs/test_descriptor/lib/src/sandbox.dart
+++ b/pkgs/test_descriptor/lib/src/sandbox.dart
@@ -16,12 +16,12 @@
   if (_sandbox != null) return _sandbox!;
   // Resolve symlinks so we don't end up with inconsistent paths on Mac OS where
   // /tmp is symlinked.
-  var sandbox = _sandbox = Directory.systemTemp
+  final sandbox = _sandbox = Directory.systemTemp
       .createTempSync('dart_test_')
       .resolveSymbolicLinksSync();
 
   addTearDown(() async {
-    var sandbox = _sandbox!;
+    final sandbox = _sandbox!;
     _sandbox = null;
     await Directory(sandbox).delete(recursive: true);
   });
diff --git a/pkgs/test_descriptor/lib/src/utils.dart b/pkgs/test_descriptor/lib/src/utils.dart
index 26fd3ab..f3542bd 100644
--- a/pkgs/test_descriptor/lib/src/utils.dart
+++ b/pkgs/test_descriptor/lib/src/utils.dart
@@ -12,11 +12,16 @@
 import 'sandbox.dart';
 
 /// A UTF-8 codec that allows malformed byte sequences.
-final utf8 = const Utf8Codec(allowMalformed: true);
+const utf8 = Utf8Codec(allowMalformed: true);
 
 /// Prepends a vertical bar to [text].
-String addBar(String text) => prefixLines(text, '${glyph.verticalLine} ',
-    first: '${glyph.downEnd} ', last: '${glyph.upEnd} ', single: '| ');
+String addBar(String text) => prefixLines(
+      text,
+      '${glyph.verticalLine} ',
+      first: '${glyph.downEnd} ',
+      last: '${glyph.upEnd} ',
+      single: '| ',
+    );
 
 /// Indents [text], and adds a bullet at the beginning.
 String addBullet(String text) =>
@@ -30,18 +35,24 @@
 String describeDirectory(String name, List<Descriptor> contents) {
   if (contents.isEmpty) return name;
 
-  var buffer = StringBuffer();
+  final buffer = StringBuffer();
   buffer.writeln(name);
   for (var entry in contents.take(contents.length - 1)) {
-    var entryString = prefixLines(entry.describe(), '${glyph.verticalLine}   ',
-        first: '${glyph.teeRight}${glyph.horizontalLine}'
-            '${glyph.horizontalLine} ');
+    final entryString = prefixLines(
+      entry.describe(),
+      '${glyph.verticalLine}   ',
+      first: '${glyph.teeRight}${glyph.horizontalLine}'
+          '${glyph.horizontalLine} ',
+    );
     buffer.writeln(entryString);
   }
 
-  var lastEntryString = prefixLines(contents.last.describe(), '    ',
-      first: '${glyph.bottomLeftCorner}${glyph.horizontalLine}'
-          '${glyph.horizontalLine} ');
+  final lastEntryString = prefixLines(
+    contents.last.describe(),
+    '    ',
+    first: '${glyph.bottomLeftCorner}${glyph.horizontalLine}'
+        '${glyph.horizontalLine} ',
+  );
   buffer.write(lastEntryString);
   return buffer.toString();
 }
@@ -52,16 +63,21 @@
 /// prefixed with those instead. If [single] is passed, it's used if there's
 /// only a single line; otherwise, [first], [last], or [prefix] is used, in that
 /// order of precedence.
-String prefixLines(String text, String prefix,
-    {String? first, String? last, String? single}) {
+String prefixLines(
+  String text,
+  String prefix, {
+  String? first,
+  String? last,
+  String? single,
+}) {
   single ??= first ?? last ?? prefix;
   first ??= prefix;
   last ??= prefix;
 
-  var lines = text.split('\n');
+  final lines = text.split('\n');
   if (lines.length == 1) return '$single$text';
 
-  var buffer = StringBuffer('$first${lines.first}\n');
+  final buffer = StringBuffer('$first${lines.first}\n');
   for (var line in lines.skip(1).take(lines.length - 2)) {
     buffer.writeln('$prefix$line');
   }
@@ -90,16 +106,22 @@
 /// first using [registerException] rather than silently ignoring them.
 Future<List<T>> waitAndReportErrors<T>(Iterable<Future<T>> futures) {
   var errored = false;
-  return Future.wait(futures.map((future) {
-    // Avoid async/await so that we synchronously add error handlers for the
-    // futures to keep them from top-leveling.
-    return future.catchError((Object error, StackTrace stackTrace) {
-      if (!errored) {
-        errored = true;
-        throw error; // ignore: only_throw_errors
-      } else {
-        registerException(error, stackTrace);
-      }
-    });
-  }));
+  return Future.wait(
+    futures.map(
+      (future) =>
+          // Avoid async/await so that we synchronously add error handlers for the
+          // futures to keep them from top-leveling.
+          future.catchError(
+        // ignore: body_might_complete_normally_catch_error
+        (Object error, StackTrace stackTrace) {
+          if (!errored) {
+            errored = true;
+            throw error; // ignore: only_throw_errors
+          } else {
+            registerException(error, stackTrace);
+          }
+        },
+      ),
+    ),
+  );
 }
diff --git a/pkgs/test_descriptor/lib/test_descriptor.dart b/pkgs/test_descriptor/lib/test_descriptor.dart
index cf5e07f..b302910 100644
--- a/pkgs/test_descriptor/lib/test_descriptor.dart
+++ b/pkgs/test_descriptor/lib/test_descriptor.dart
@@ -30,9 +30,10 @@
 /// If [contents] isn't passed, [Descriptor.create] creates an empty file and
 /// [Descriptor.validate] verifies that the file is empty.
 ///
-/// To match a [Matcher] against a file's binary contents, use [new
-/// FileDescriptor.binaryMatcher] instead.
-FileDescriptor file(String name, [contents]) => FileDescriptor(name, contents);
+/// To match a [Matcher] against a file's binary contents, use
+/// [FileDescriptor.binaryMatcher] instead.
+FileDescriptor file(String name, [Object? contents]) =>
+    FileDescriptor(name, contents);
 
 /// Creates a new [DirectoryDescriptor] descriptor with [name] and [contents].
 ///
@@ -60,12 +61,14 @@
 ///
 /// [Descriptor.create] is not supported for this descriptor.
 PatternDescriptor pattern(
-        Pattern name, Descriptor Function(String basename) child) =>
+  Pattern name,
+  Descriptor Function(String basename) child,
+) =>
     PatternDescriptor(name, child);
 
 /// A convenience method for creating a [PatternDescriptor] descriptor that
 /// constructs a [FileDescriptor] descriptor.
-PatternDescriptor filePattern(Pattern name, [contents]) =>
+PatternDescriptor filePattern(Pattern name, [Object? contents]) =>
     pattern(name, (realName) => file(realName, contents));
 
 /// A convenience method for creating a [PatternDescriptor] descriptor that
diff --git a/pkgs/test_descriptor/pubspec.yaml b/pkgs/test_descriptor/pubspec.yaml
index 0f3836c..1e01da0 100644
--- a/pkgs/test_descriptor/pubspec.yaml
+++ b/pkgs/test_descriptor/pubspec.yaml
@@ -1,19 +1,17 @@
 name: test_descriptor
-version: 2.0.1
-description: An API for defining and verifying directory structures.
+version: 2.0.2-dev
+description: An API for defining and verifying files and directory structures.
 repository: https://github.com/dart-lang/test_descriptor
 
 environment:
-  sdk: '>=2.12.0 <3.0.0'
+  sdk: '>=2.17.0 <3.0.0'
 
 dependencies:
   async: ^2.5.0
   collection: ^1.15.0
-  matcher: ^0.12.10
-  meta: ^1.3.0
   path: ^1.8.0
   term_glyph: ^1.2.0
   test: ^1.16.0
 
 dev_dependencies:
-  lints: ^1.0.0
+  lints: ^2.0.0
diff --git a/pkgs/test_descriptor/test/directory_test.dart b/pkgs/test_descriptor/test/directory_test.dart
index c669be8..b0b2a22 100644
--- a/pkgs/test_descriptor/test/directory_test.dart
+++ b/pkgs/test_descriptor/test/directory_test.dart
@@ -11,7 +11,6 @@
 import 'package:path/path.dart' as p;
 import 'package:term_glyph/term_glyph.dart' as term_glyph;
 import 'package:test/test.dart';
-
 import 'package:test_descriptor/test_descriptor.dart' as d;
 
 import 'utils.dart';
@@ -28,34 +27,40 @@
         d.file('file2.txt', 'contents2')
       ]).create();
 
-      expect(File(p.join(d.sandbox, 'dir', 'file1.txt')).readAsString(),
-          completion(equals('contents1')));
-      expect(File(p.join(d.sandbox, 'dir', 'file2.txt')).readAsString(),
-          completion(equals('contents2')));
       expect(
-          File(p.join(d.sandbox, 'dir', 'subdir', 'subfile1.txt'))
-              .readAsString(),
-          completion(equals('subcontents1')));
+        File(p.join(d.sandbox, 'dir', 'file1.txt')).readAsString(),
+        completion(equals('contents1')),
+      );
       expect(
-          File(p.join(d.sandbox, 'dir', 'subdir', 'subfile2.txt'))
-              .readAsString(),
-          completion(equals('subcontents2')));
+        File(p.join(d.sandbox, 'dir', 'file2.txt')).readAsString(),
+        completion(equals('contents2')),
+      );
+      expect(
+        File(p.join(d.sandbox, 'dir', 'subdir', 'subfile1.txt')).readAsString(),
+        completion(equals('subcontents1')),
+      );
+      expect(
+        File(p.join(d.sandbox, 'dir', 'subdir', 'subfile2.txt')).readAsString(),
+        completion(equals('subcontents2')),
+      );
     });
 
     test('works if the directory already exists', () async {
       await d.dir('dir').create();
       await d.dir('dir', [d.file('name.txt', 'contents')]).create();
 
-      expect(File(p.join(d.sandbox, 'dir', 'name.txt')).readAsString(),
-          completion(equals('contents')));
+      expect(
+        File(p.join(d.sandbox, 'dir', 'name.txt')).readAsString(),
+        completion(equals('contents')),
+      );
     });
   });
 
   group('validate()', () {
     test('completes successfully if the filesystem matches the descriptor',
         () async {
-      var dirPath = p.join(d.sandbox, 'dir');
-      var subdirPath = p.join(dirPath, 'subdir');
+      final dirPath = p.join(d.sandbox, 'dir');
+      final subdirPath = p.join(dirPath, 'subdir');
       await Directory(subdirPath).create(recursive: true);
       await File(p.join(dirPath, 'file1.txt')).writeAsString('contents1');
       await File(p.join(dirPath, 'file2.txt')).writeAsString('contents2');
@@ -75,35 +80,12 @@
     });
 
     test("fails if the directory doesn't exist", () async {
-      var dirPath = p.join(d.sandbox, 'dir');
+      final dirPath = p.join(d.sandbox, 'dir');
       await Directory(dirPath).create();
       await File(p.join(dirPath, 'file1.txt')).writeAsString('contents1');
       await File(p.join(dirPath, 'file2.txt')).writeAsString('contents2');
 
       expect(
-          d.dir('dir', [
-            d.dir('subdir', [
-              d.file('subfile1.txt', 'subcontents1'),
-              d.file('subfile2.txt', 'subcontents2')
-            ]),
-            d.file('file1.txt', 'contents1'),
-            d.file('file2.txt', 'contents2')
-          ]).validate(),
-          throwsA(toString(
-              equals('Directory not found: "${p.join('dir', 'subdir')}".'))));
-    });
-
-    test('emits an error for each child that fails to validate', () async {
-      var dirPath = p.join(d.sandbox, 'dir');
-      var subdirPath = p.join(dirPath, 'subdir');
-      await Directory(subdirPath).create(recursive: true);
-      await File(p.join(dirPath, 'file1.txt')).writeAsString('contents1');
-      await File(p.join(subdirPath, 'subfile2.txt'))
-          .writeAsString('subwrongtents2');
-
-      var errors = 0;
-      var controller = StreamController<String>();
-      runZonedGuarded(() {
         d.dir('dir', [
           d.dir('subdir', [
             d.file('subfile1.txt', 'subcontents1'),
@@ -111,49 +93,94 @@
           ]),
           d.file('file1.txt', 'contents1'),
           d.file('file2.txt', 'contents2')
-        ]).validate();
-      },
-          expectAsync2((error, _) {
+        ]).validate(),
+        throwsA(
+          toString(
+            equals('Directory not found: "${p.join('dir', 'subdir')}".'),
+          ),
+        ),
+      );
+    });
+
+    test('emits an error for each child that fails to validate', () async {
+      final dirPath = p.join(d.sandbox, 'dir');
+      final subdirPath = p.join(dirPath, 'subdir');
+      await Directory(subdirPath).create(recursive: true);
+      await File(p.join(dirPath, 'file1.txt')).writeAsString('contents1');
+      await File(p.join(subdirPath, 'subfile2.txt'))
+          .writeAsString('subwrongtents2');
+
+      var errors = 0;
+      final controller = StreamController<String>();
+      runZonedGuarded(
+        () {
+          d.dir('dir', [
+            d.dir('subdir', [
+              d.file('subfile1.txt', 'subcontents1'),
+              d.file('subfile2.txt', 'subcontents2')
+            ]),
+            d.file('file1.txt', 'contents1'),
+            d.file('file2.txt', 'contents2')
+          ]).validate();
+        },
+        expectAsync2(
+          (error, _) {
             errors++;
             controller.add(error.toString());
             if (errors == 3) controller.close();
-          }, count: 3));
+          },
+          count: 3,
+        ),
+      );
 
       expect(
-          controller.stream.toList(),
-          completion(allOf([
+        controller.stream.toList(),
+        completion(
+          allOf([
             contains(
-                'File not found: "${p.join('dir', 'subdir', 'subfile1.txt')}".'),
+              'File not found: "${p.join('dir', 'subdir', 'subfile1.txt')}".',
+            ),
             contains('File not found: "${p.join('dir', 'file2.txt')}".'),
             contains(
-                startsWith('File "${p.join('dir', 'subdir', 'subfile2.txt')}" '
-                    'should contain:')),
-          ])));
+              startsWith('File "${p.join('dir', 'subdir', 'subfile2.txt')}" '
+                  'should contain:'),
+            ),
+          ]),
+        ),
+      );
     });
   });
 
   group('load()', () {
     test('loads a file', () {
-      var dir = d.dir('dir',
-          [d.file('name.txt', 'contents'), d.file('other.txt', 'wrong')]);
-      expect(utf8.decodeStream(dir.load('name.txt')),
-          completion(equals('contents')));
+      final dir = d.dir(
+        'dir',
+        [d.file('name.txt', 'contents'), d.file('other.txt', 'wrong')],
+      );
+      expect(
+        utf8.decodeStream(dir.load('name.txt')),
+        completion(equals('contents')),
+      );
     });
 
     test('loads a deeply-nested file', () {
-      var dir = d.dir('dir', [
-        d.dir('subdir',
-            [d.file('name.txt', 'subcontents'), d.file('other.txt', 'wrong')]),
+      final dir = d.dir('dir', [
+        d.dir(
+          'subdir',
+          [d.file('name.txt', 'subcontents'), d.file('other.txt', 'wrong')],
+        ),
         d.dir('otherdir', [d.file('other.txt', 'wrong')]),
         d.file('name.txt', 'contents')
       ]);
 
-      expect(utf8.decodeStream(dir.load('subdir/name.txt')),
-          completion(equals('subcontents')));
+      expect(
+        utf8.decodeStream(dir.load('subdir/name.txt')),
+        completion(equals('subcontents')),
+      );
     });
 
     test('fails to load a nested directory', () {
-      var dir = d.dir('dir', [
+      final dir = d.dir('dir', [
         d.dir('subdir', [
           d.dir('subsubdir', [d.file('name.txt', 'subcontents')])
         ]),
@@ -161,52 +188,71 @@
       ]);
 
       expect(
-          dir.load('subdir/subsubdir').toList(),
-          throwsA(toString(equals('Couldn\'t find a file descriptor named '
-              '"subsubdir" within "dir/subdir".'))));
+        dir.load('subdir/subsubdir').toList(),
+        throwsA(
+          toString(
+            equals('Couldn\'t find a file descriptor named '
+                '"subsubdir" within "dir/subdir".'),
+          ),
+        ),
+      );
     });
 
     test('fails to load an absolute path', () {
-      var dir = d.dir('dir', [d.file('name.txt', 'contents')]);
+      final dir = d.dir('dir', [d.file('name.txt', 'contents')]);
       expect(() => dir.load('/name.txt'), throwsArgumentError);
     });
 
     test("fails to load '..'", () {
-      var dir = d.dir('dir', [d.file('name.txt', 'contents')]);
+      final dir = d.dir('dir', [d.file('name.txt', 'contents')]);
       expect(() => dir.load('..'), throwsArgumentError);
     });
 
     test("fails to load a file that doesn't exist", () {
-      var dir = d.dir('dir', [
+      final dir = d.dir('dir', [
         d.dir('subdir', [d.file('name.txt', 'contents')])
       ]);
 
       expect(
-          dir.load('subdir/not-name.txt').toList(),
-          throwsA(toString(equals('Couldn\'t find a file descriptor named '
-              '"not-name.txt" within "dir/subdir".'))));
+        dir.load('subdir/not-name.txt').toList(),
+        throwsA(
+          toString(
+            equals('Couldn\'t find a file descriptor named '
+                '"not-name.txt" within "dir/subdir".'),
+          ),
+        ),
+      );
     });
 
     test('fails to load a file that exists multiple times', () {
-      var dir = d.dir('dir', [
-        d.dir('subdir',
-            [d.file('name.txt', 'contents'), d.file('name.txt', 'contents')])
+      final dir = d.dir('dir', [
+        d.dir(
+          'subdir',
+          [d.file('name.txt', 'contents'), d.file('name.txt', 'contents')],
+        )
       ]);
 
       expect(
-          dir.load('subdir/name.txt').toList(),
-          throwsA(toString(equals('Found multiple file descriptors named '
-              '"name.txt" within "dir/subdir".'))));
+        dir.load('subdir/name.txt').toList(),
+        throwsA(
+          toString(
+            equals('Found multiple file descriptors named '
+                '"name.txt" within "dir/subdir".'),
+          ),
+        ),
+      );
     });
 
     test('loads a file next to a subdirectory with the same name', () {
-      var dir = d.dir('dir', [
+      final dir = d.dir('dir', [
         d.file('name', 'contents'),
         d.dir('name', [d.file('subfile', 'contents')])
       ]);
 
       expect(
-          utf8.decodeStream(dir.load('name')), completion(equals('contents')));
+        utf8.decodeStream(dir.load('name')),
+        completion(equals('contents')),
+      );
     });
   });
 
@@ -222,18 +268,21 @@
     });
 
     test('lists the contents of the directory', () {
-      var dir = d.dir('dir',
-          [d.file('file1.txt', 'contents1'), d.file('file2.txt', 'contents2')]);
+      final dir = d.dir(
+        'dir',
+        [d.file('file1.txt', 'contents1'), d.file('file2.txt', 'contents2')],
+      );
 
       expect(
-          dir.describe(),
-          equals('dir\n'
-              '+-- file1.txt\n'
-              "'-- file2.txt"));
+        dir.describe(),
+        equals('dir\n'
+            '+-- file1.txt\n'
+            "'-- file2.txt"),
+      );
     });
 
     test('lists the contents of nested directories', () {
-      var dir = d.dir('dir', [
+      final dir = d.dir('dir', [
         d.file('file1.txt', 'contents1'),
         d.dir('subdir', [
           d.file('subfile1.txt', 'subcontents1'),
@@ -244,15 +293,16 @@
       ]);
 
       expect(
-          dir.describe(),
-          equals('dir\n'
-              '+-- file1.txt\n'
-              '+-- subdir\n'
-              '|   +-- subfile1.txt\n'
-              '|   +-- subfile2.txt\n'
-              "|   '-- subsubdir\n"
-              "|       '-- subsubfile.txt\n"
-              "'-- file2.txt"));
+        dir.describe(),
+        equals('dir\n'
+            '+-- file1.txt\n'
+            '+-- subdir\n'
+            '|   +-- subfile1.txt\n'
+            '|   +-- subfile2.txt\n'
+            "|   '-- subsubdir\n"
+            "|       '-- subsubfile.txt\n"
+            "'-- file2.txt"),
+      );
     });
 
     test('with no contents returns the directory name', () {
@@ -262,7 +312,7 @@
 
   group('fromFilesystem()', () {
     test('creates a descriptor based on the physical filesystem', () async {
-      var dir = d.dir('dir', [
+      final dir = d.dir('dir', [
         d.dir('subdir', [
           d.file('subfile1.txt', 'subcontents1'),
           d.file('subfile2.txt', 'subcontents2')
@@ -272,7 +322,7 @@
       ]);
 
       await dir.create();
-      var descriptor =
+      final descriptor =
           d.DirectoryDescriptor.fromFilesystem('dir', p.join(d.sandbox, 'dir'));
       await descriptor.create(p.join(d.sandbox, 'dir2'));
       await dir.validate(p.join(d.sandbox, 'dir2'));
@@ -288,13 +338,17 @@
         d.file('.DS_Store', 'contents2')
       ]).create();
 
-      var descriptor = d.DirectoryDescriptor.fromFilesystem(
-          'dir2', p.join(d.sandbox, 'dir'));
+      final descriptor = d.DirectoryDescriptor.fromFilesystem(
+        'dir2',
+        p.join(d.sandbox, 'dir'),
+      );
       await descriptor.create();
 
       await d.dir('dir2', [
-        d.dir('subdir',
-            [d.file('subfile1.txt', 'subcontents1'), d.nothing('.hidden')]),
+        d.dir(
+          'subdir',
+          [d.file('subfile1.txt', 'subcontents1'), d.nothing('.hidden')],
+        ),
         d.file('file1.txt', 'contents1'),
         d.nothing('.DS_Store')
       ]).validate();
diff --git a/pkgs/test_descriptor/test/file_test.dart b/pkgs/test_descriptor/test/file_test.dart
index 13b7597..26a4528 100644
--- a/pkgs/test_descriptor/test/file_test.dart
+++ b/pkgs/test_descriptor/test/file_test.dart
@@ -18,28 +18,36 @@
     test('creates a text file', () async {
       await d.file('name.txt', 'contents').create();
 
-      expect(File(p.join(d.sandbox, 'name.txt')).readAsString(),
-          completion(equals('contents')));
+      expect(
+        File(p.join(d.sandbox, 'name.txt')).readAsString(),
+        completion(equals('contents')),
+      );
     });
 
     test('creates a binary file', () async {
       await d.file('name.txt', [0, 1, 2, 3]).create();
 
-      expect(File(p.join(d.sandbox, 'name.txt')).readAsBytes(),
-          completion(equals([0, 1, 2, 3])));
+      expect(
+        File(p.join(d.sandbox, 'name.txt')).readAsBytes(),
+        completion(equals([0, 1, 2, 3])),
+      );
     });
 
     test('fails to create a matcher file', () async {
       expect(
-          d.file('name.txt', contains('foo')).create(), throwsUnsupportedError);
+        d.file('name.txt', contains('foo')).create(),
+        throwsUnsupportedError,
+      );
     });
 
     test('overwrites an existing file', () async {
       await d.file('name.txt', 'contents1').create();
       await d.file('name.txt', 'contents2').create();
 
-      expect(File(p.join(d.sandbox, 'name.txt')).readAsString(),
-          completion(equals('contents2')));
+      expect(
+        File(p.join(d.sandbox, 'name.txt')).readAsString(),
+        completion(equals('contents2')),
+      );
     });
   });
 
@@ -72,62 +80,85 @@
     test("fails if the text contents don't match", () async {
       await File(p.join(d.sandbox, 'name.txt')).writeAsString('wrong');
 
-      expect(d.file('name.txt', 'contents').validate(),
-          throwsA(toString(startsWith('File "name.txt" should contain:'))));
+      expect(
+        d.file('name.txt', 'contents').validate(),
+        throwsA(toString(startsWith('File "name.txt" should contain:'))),
+      );
     });
 
     test("fails if the binary contents don't match", () async {
       await File(p.join(d.sandbox, 'name.txt')).writeAsBytes([5, 4, 3, 2]);
 
       expect(
-          d.file('name.txt', [0, 1, 2, 3]).validate(),
-          throwsA(toString(equals(
-              'File "name.txt" didn\'t contain the expected binary data.'))));
+        d.file('name.txt', [0, 1, 2, 3]).validate(),
+        throwsA(
+          toString(
+            equals(
+              'File "name.txt" didn\'t contain the expected binary data.',
+            ),
+          ),
+        ),
+      );
     });
 
     test("fails if the text contents don't match the matcher", () async {
       await File(p.join(d.sandbox, 'name.txt')).writeAsString('wrong');
 
       expect(
-          d.file('name.txt', contains('ent')).validate(),
-          throwsA(
-              toString(startsWith('Invalid contents for file "name.txt":'))));
+        d.file('name.txt', contains('ent')).validate(),
+        throwsA(
+          toString(startsWith('Invalid contents for file "name.txt":')),
+        ),
+      );
     });
 
     test("fails if the binary contents don't match the matcher", () async {
       await File(p.join(d.sandbox, 'name.txt')).writeAsBytes([5, 4, 3, 2]);
 
       expect(
-          d.FileDescriptor.binaryMatcher('name.txt', contains(1)).validate(),
-          throwsA(
-              toString(startsWith('Invalid contents for file "name.txt":'))));
+        d.FileDescriptor.binaryMatcher('name.txt', contains(1)).validate(),
+        throwsA(
+          toString(startsWith('Invalid contents for file "name.txt":')),
+        ),
+      );
     });
 
     test("fails if invalid UTF-8 doesn't match a text matcher", () async {
       await File(p.join(d.sandbox, 'name.txt')).writeAsBytes([0xC3, 0x28]);
       expect(
-          d.file('name.txt', isEmpty).validate(),
-          throwsA(toString(allOf([
-            startsWith('Invalid contents for file "name.txt":'),
-            contains('�')
-          ]))));
+        d.file('name.txt', isEmpty).validate(),
+        throwsA(
+          toString(
+            allOf([
+              startsWith('Invalid contents for file "name.txt":'),
+              contains('�')
+            ]),
+          ),
+        ),
+      );
     });
 
     test("fails if there's no file", () {
-      expect(d.file('name.txt', 'contents').validate(),
-          throwsA(toString(equals('File not found: "name.txt".'))));
+      expect(
+        d.file('name.txt', 'contents').validate(),
+        throwsA(toString(equals('File not found: "name.txt".'))),
+      );
     });
   });
 
   group('reading', () {
     test('read() returns the contents of a text file as a string', () {
-      expect(d.file('name.txt', 'contents').read(),
-          completion(equals('contents')));
+      expect(
+        d.file('name.txt', 'contents').read(),
+        completion(equals('contents')),
+      );
     });
 
     test('read() returns the contents of a binary file as a string', () {
-      expect(d.file('name.txt', [0x68, 0x65, 0x6c, 0x6c, 0x6f]).read(),
-          completion(equals('hello')));
+      expect(
+        d.file('name.txt', [0x68, 0x65, 0x6c, 0x6c, 0x6f]).read(),
+        completion(equals('hello')),
+      );
     });
 
     test('read() fails for a matcher file', () {
@@ -136,19 +167,25 @@
 
     test('readAsBytes() returns the contents of a text file as a byte stream',
         () {
-      expect(utf8.decodeStream(d.file('name.txt', 'contents').readAsBytes()),
-          completion(equals('contents')));
+      expect(
+        utf8.decodeStream(d.file('name.txt', 'contents').readAsBytes()),
+        completion(equals('contents')),
+      );
     });
 
     test('readAsBytes() returns the contents of a binary file as a byte stream',
         () {
-      expect(byteStreamToList(d.file('name.txt', [0, 1, 2, 3]).readAsBytes()),
-          completion(equals([0, 1, 2, 3])));
+      expect(
+        byteStreamToList(d.file('name.txt', [0, 1, 2, 3]).readAsBytes()),
+        completion(equals([0, 1, 2, 3])),
+      );
     });
 
     test('readAsBytes() fails for a matcher file', () {
-      expect(d.file('name.txt', contains('hi')).readAsBytes,
-          throwsUnsupportedError);
+      expect(
+        d.file('name.txt', contains('hi')).readAsBytes,
+        throwsUnsupportedError,
+      );
     });
   });
 
diff --git a/pkgs/test_descriptor/test/nothing_test.dart b/pkgs/test_descriptor/test/nothing_test.dart
index a192087..23d91ff 100644
--- a/pkgs/test_descriptor/test/nothing_test.dart
+++ b/pkgs/test_descriptor/test/nothing_test.dart
@@ -28,25 +28,43 @@
     test("fails if there's a file", () async {
       await d.file('name.txt', 'contents').create();
       expect(
-          d.nothing('name.txt').validate(),
-          throwsA(toString(equals(
-              'Expected nothing to exist at "name.txt", but found a file.'))));
+        d.nothing('name.txt').validate(),
+        throwsA(
+          toString(
+            equals(
+              'Expected nothing to exist at "name.txt", but found a file.',
+            ),
+          ),
+        ),
+      );
     });
 
     test("fails if there's a directory", () async {
       await d.dir('dir').create();
       expect(
-          d.nothing('dir').validate(),
-          throwsA(toString(equals(
-              'Expected nothing to exist at "dir", but found a directory.'))));
+        d.nothing('dir').validate(),
+        throwsA(
+          toString(
+            equals(
+              'Expected nothing to exist at "dir", but found a directory.',
+            ),
+          ),
+        ),
+      );
     });
 
     test("fails if there's a broken link", () async {
       await Link(p.join(d.sandbox, 'link')).create('nonexistent');
       expect(
-          d.nothing('link').validate(),
-          throwsA(toString(equals(
-              'Expected nothing to exist at "link", but found a link.'))));
+        d.nothing('link').validate(),
+        throwsA(
+          toString(
+            equals(
+              'Expected nothing to exist at "link", but found a link.',
+            ),
+          ),
+        ),
+      );
     });
   });
 }
diff --git a/pkgs/test_descriptor/test/pattern_test.dart b/pkgs/test_descriptor/test/pattern_test.dart
index eb7b815..3963fc0 100644
--- a/pkgs/test_descriptor/test/pattern_test.dart
+++ b/pkgs/test_descriptor/test/pattern_test.dart
@@ -15,14 +15,14 @@
     test("succeeds if there's a file matching the pattern and the child",
         () async {
       await d.file('foo', 'blap').create();
-      await d.filePattern(RegExp(r'f..'), 'blap').validate();
+      await d.filePattern(RegExp('f..'), 'blap').validate();
     });
 
     test("succeeds if there's a directory matching the pattern and the child",
         () async {
       await d.dir('foo', [d.file('bar', 'baz')]).create();
 
-      await d.dirPattern(RegExp(r'f..'), [d.file('bar', 'baz')]).validate();
+      await d.dirPattern(RegExp('f..'), [d.file('bar', 'baz')]).validate();
     });
 
     test(
@@ -32,29 +32,35 @@
       await d.file('fee', 'blak').create();
       await d.file('faa', 'blut').create();
 
-      await d.filePattern(RegExp(r'f..'), 'blap').validate();
+      await d.filePattern(RegExp('f..'), 'blap').validate();
     });
 
     test("fails if there's no file matching the pattern", () {
       expect(
-          d.filePattern(RegExp(r'f..'), 'bar').validate(),
-          throwsA(
-              toString(equals('No entries found in sandbox matching /f../.'))));
+        d.filePattern(RegExp('f..'), 'bar').validate(),
+        throwsA(
+          toString(equals('No entries found in sandbox matching /f../.')),
+        ),
+      );
     });
 
     test("fails if there's a file matching the pattern but not the entry",
         () async {
       await d.file('foo', 'bap').create();
-      expect(d.filePattern(RegExp(r'f..'), 'bar').validate(),
-          throwsA(toString(startsWith('File "foo" should contain:'))));
+      expect(
+        d.filePattern(RegExp('f..'), 'bar').validate(),
+        throwsA(toString(startsWith('File "foo" should contain:'))),
+      );
     });
 
     test("fails if there's a dir matching the pattern but not the entry",
         () async {
       await d.dir('foo', [d.file('bar', 'bap')]).create();
 
-      expect(d.dirPattern(RegExp(r'f..'), [d.file('bar', 'baz')]).validate(),
-          throwsA(toString(startsWith('File "foo/bar" should contain:'))));
+      expect(
+        d.dirPattern(RegExp('f..'), [d.file('bar', 'baz')]).validate(),
+        throwsA(toString(startsWith('File "foo/bar" should contain:'))),
+      );
     });
 
     test(
@@ -64,9 +70,15 @@
       await d.file('fee', 'bar').create();
       await d.file('faa', 'bar').create();
       expect(
-          d.filePattern(RegExp(r'f..'), 'bar').validate(),
-          throwsA(toString(startsWith(
-              'Multiple valid entries found in sandbox matching /f../:'))));
+        d.filePattern(RegExp('f..'), 'bar').validate(),
+        throwsA(
+          toString(
+            startsWith(
+              'Multiple valid entries found in sandbox matching /f../:',
+            ),
+          ),
+        ),
+      );
     });
   });
 }
diff --git a/pkgs/test_descriptor/test/utils.dart b/pkgs/test_descriptor/test/utils.dart
index 5eb84f7..8b07e8c 100644
--- a/pkgs/test_descriptor/test/utils.dart
+++ b/pkgs/test_descriptor/test/utils.dart
@@ -5,18 +5,18 @@
 import 'package:test/test.dart';
 
 /// Converts a [Stream<List<int>>] to a flat byte future.
-Future<List<int>> byteStreamToList(Stream<List<int>> stream) {
-  return stream.fold(<int>[], (buffer, chunk) {
-    buffer.addAll(chunk);
-    return buffer;
-  });
-}
+Future<List<int>> byteStreamToList(Stream<List<int>> stream) =>
+    stream.fold(<int>[], (buffer, chunk) {
+      buffer.addAll(chunk);
+      return buffer;
+    });
 
 /// Returns a matcher that verifies that the result of calling `toString()`
 /// matches [matcher].
-Matcher toString(matcher) {
-  return predicate((object) {
-    expect(object.toString(), matcher);
-    return true;
-  }, 'toString() matches $matcher');
-}
+Matcher toString(Object? matcher) => predicate(
+      (object) {
+        expect(object.toString(), matcher);
+        return true;
+      },
+      'toString() matches $matcher',
+    );
