Update to latest lints, Require Dart 3.2 (#145)

diff --git a/.github/workflows/test-package.yml b/.github/workflows/test-package.yml
index 2aa74df..2e47591 100644
--- a/.github/workflows/test-package.yml
+++ b/.github/workflows/test-package.yml
@@ -47,7 +47,7 @@
       matrix:
         # Add macos-latest and/or windows-latest if relevant for this package.
         os: [ubuntu-latest]
-        sdk: [3.0.0, dev]
+        sdk: [3.2, dev]
     steps:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
       - uses: dart-lang/setup-dart@b64355ae6ca0b5d484f0106a033dd1388965d06d
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d084d85..a682bc3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,6 @@
 ## 2.1.1-wip
 
-- Require Dart 3.0
+- Require Dart 3.2
 
 ## 2.1.0
 
diff --git a/lib/package_config.dart b/lib/package_config.dart
index 8f40a8b..194fe89 100644
--- a/lib/package_config.dart
+++ b/lib/package_config.dart
@@ -102,7 +102,7 @@
 /// then the parent directories are checked recursively,
 /// all the way to the root directory, to check if those contains
 /// a package configuration.
-/// If [recurse] is set to [false], this parent directory check is not
+/// If [recurse] is set to `false`, this parent directory check is not
 /// performed.
 ///
 /// If [onError] is provided, the configuration file parsing will report errors
@@ -140,7 +140,7 @@
 /// then the parent directories are checked recursively,
 /// all the way to the root directory, to check if those contains
 /// a package configuration.
-/// If [recurse] is set to [false], this parent directory check is not
+/// If [recurse] is set to `false`, this parent directory check is not
 /// performed.
 ///
 /// If [loader] is provided, URIs are loaded using that function.
diff --git a/lib/src/errors.dart b/lib/src/errors.dart
index 69c4137..a66fef7 100644
--- a/lib/src/errors.dart
+++ b/lib/src/errors.dart
@@ -12,8 +12,9 @@
 
 class PackageConfigArgumentError extends ArgumentError
     implements PackageConfigError {
-  PackageConfigArgumentError(Object? value, String name, String message)
-      : super.value(value, name, message);
+  PackageConfigArgumentError(
+      Object? super.value, String super.name, String super.message)
+      : super.value();
 
   PackageConfigArgumentError.from(ArgumentError error)
       : super.value(error.invalidValue, error.name, error.message);
@@ -21,8 +22,8 @@
 
 class PackageConfigFormatException extends FormatException
     implements PackageConfigError {
-  PackageConfigFormatException(String message, Object? source, [int? offset])
-      : super(message, source, offset);
+  PackageConfigFormatException(super.message, Object? super.source,
+      [super.offset]);
 
   PackageConfigFormatException.from(FormatException exception)
       : super(exception.message, exception.source, exception.offset);
diff --git a/lib/src/package_config.dart b/lib/src/package_config.dart
index ba52c14..c00ac67 100644
--- a/lib/src/package_config.dart
+++ b/lib/src/package_config.dart
@@ -32,7 +32,7 @@
   /// absolute directory URIs, valid language version, if any),
   /// and there must not be two packages with the same name.
   ///
-  /// The package's root ([Package.rootUri]) and package-root
+  /// The package's root ([Package.root]) and package-root
   /// ([Package.packageUriRoot]) paths must satisfy a number of constraints
   /// We say that one path (which we know ends with a `/` charater)
   /// is inside another path, if the latter path is a prefix of the former path,
@@ -95,7 +95,7 @@
 
   /// Parses the JSON data of a package configuration file.
   ///
-  /// The [configuration] must be a JSON-like Dart data structure,
+  /// The [jsonData] must be a JSON-like Dart data structure,
   /// like the one provided by parsing JSON text using `dart:convert`,
   /// containing a valid package configuration.
   ///
@@ -167,7 +167,7 @@
   /// Provides the associated package for a specific [file] (or directory).
   ///
   /// Returns a [Package] which contains the [file]'s path, if any.
-  /// That is, the [Package.rootUri] directory is a parent directory
+  /// That is, the [Package.root] directory is a parent directory
   /// of the [file]'s location.
   ///
   /// Returns `null` if the file does not belong to any package.
@@ -247,7 +247,7 @@
   /// Is always an absolute URI with no query or fragment parts,
   /// and with a path ending in `/`.
   ///
-  /// All files in the [rootUri] directory are considered
+  /// All files in the [root] directory are considered
   /// part of the package for purposes where that that matters.
   Uri get root;
 
diff --git a/lib/src/package_config_impl.dart b/lib/src/package_config_impl.dart
index f832d6a..d8e8d49 100644
--- a/lib/src/package_config_impl.dart
+++ b/lib/src/package_config_impl.dart
@@ -141,12 +141,6 @@
   @override
   Package? operator [](String packageName) => _packages[packageName];
 
-  /// Provides the associated package for a specific [file] (or directory).
-  ///
-  /// Returns a [Package] which contains the [file]'s path.
-  /// That is, the [Package.rootUri] directory is a parent directory
-  /// of the [file]'s location.
-  /// Returns `null` if the file does not belong to any package.
   @override
   Package? packageOf(Uri file) => _packageTree.packageOf(file);
 
@@ -270,7 +264,7 @@
   }
 }
 
-/// Checks whether [version] is a valid Dart language version string.
+/// Checks whether [source] is a valid Dart language version string.
 ///
 /// The format is (as RegExp) `^(0|[1-9]\d+)\.(0|[1-9]\d+)$`.
 ///
@@ -553,9 +547,8 @@
 /// Conflict between packages added to the same configuration.
 ///
 /// The [package] conflicts with [existingPackage] if it has
-/// the same root path ([isRootConflict]) or the package URI root path
-/// of [existingPackage] is inside the root path of [package]
-/// ([isPackageRootConflict]).
+/// the same root path or the package URI root path
+/// of [existingPackage] is inside the root path of [package].
 class ConflictException {
   /// The existing package that [package] conflicts with.
   final SimplePackage existingPackage;
diff --git a/lib/src/package_config_io.dart b/lib/src/package_config_io.dart
index 9aed621..8c5773b 100644
--- a/lib/src/package_config_io.dart
+++ b/lib/src/package_config_io.dart
@@ -38,7 +38,7 @@
 /// If the [file] is a `.packages` file and [preferNewest] is true,
 /// first checks whether there is an adjacent `.dart_tool/package_config.json`
 /// file, and if so, reads that instead.
-/// If [preferNewset] is false, the specified file is loaded even if it is
+/// If [preferNewest] is false, the specified file is loaded even if it is
 /// a `.packages` file and there is an available `package_config.json` file.
 ///
 /// The file must exist and be a normal file.
diff --git a/lib/src/package_config_json.dart b/lib/src/package_config_json.dart
index 47e7e96..65560a0 100644
--- a/lib/src/package_config_json.dart
+++ b/lib/src/package_config_json.dart
@@ -75,10 +75,8 @@
 ///     where the integer numeral cannot have a sign, and can only have a
 ///     leading zero if the entire numeral is a single zero.
 ///
-/// All other properties are stored in [extraData].
-///
 /// The [baseLocation] is used as base URI to resolve the "rootUri"
-/// URI referencestring.
+/// URI reference string.
 PackageConfig parsePackageConfigJson(
     Object? json, Uri baseLocation, void Function(Object error) onError) {
   if (!baseLocation.hasScheme || baseLocation.isScheme('package')) {
@@ -93,7 +91,7 @@
   String typeName<T>() {
     if (0 is T) return 'int';
     if ('' is T) return 'string';
-    if (const [] is T) return 'array';
+    if (const <Object?>[] is T) return 'array';
     return 'object';
   }
 
@@ -239,7 +237,7 @@
     PackageConfig config, Uri? baseUri, StringSink output) {
   // Can be optimized.
   var data = packageConfigToJson(config, baseUri);
-  output.write(JsonEncoder.withIndent('  ').convert(data));
+  output.write(const JsonEncoder.withIndent('  ').convert(data));
 }
 
 Map<String, Object?> packageConfigToJson(PackageConfig config, Uri? baseUri) =>
diff --git a/lib/src/packages_file.dart b/lib/src/packages_file.dart
index 5d14677..f84db10 100644
--- a/lib/src/packages_file.dart
+++ b/lib/src/packages_file.dart
@@ -148,12 +148,6 @@
 ///
 /// If [baseUri] is provided, package locations will be made relative
 /// to the base URI, if possible, before writing.
-///
-/// If [allowDefaultPackage] is `true`, the [packageMapping] may contain an
-/// empty string mapping to the _default package name_.
-///
-/// All the keys of [packageMapping] must be valid package names,
-/// and the values must be URIs that do not have the `package:` scheme.
 void write(StringSink output, PackageConfig config,
     {Uri? baseUri, String? comment}) {
   if (baseUri != null && !baseUri.isAbsolute) {
diff --git a/pubspec.yaml b/pubspec.yaml
index e121ab0..b713079 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -4,7 +4,7 @@
 repository: https://github.com/dart-lang/package_config
 
 environment:
-  sdk: ^3.0.0
+  sdk: ^3.2.0
 
 dependencies:
   path: ^1.8.0
@@ -13,5 +13,5 @@
   build_runner: ^2.0.0
   build_test: ^2.1.2
   build_web_compilers: ^4.0.0
-  dart_flutter_team_lints: ^1.0.0
+  dart_flutter_team_lints: ^2.0.0
   test: ^1.16.0
diff --git a/test/discovery_test.dart b/test/discovery_test.dart
index 3eb0ea1..ee77559 100644
--- a/test/discovery_test.dart
+++ b/test/discovery_test.dart
@@ -59,7 +59,7 @@
     fileTest('package_config.json', {
       '.packages': 'invalid .packages file',
       'script.dart': 'main(){}',
-      'packages': {'shouldNotBeFound': {}},
+      'packages': {'shouldNotBeFound': <Never>{}},
       '.dart_tool': {
         'package_config.json': packageConfigFile,
       }
@@ -73,7 +73,7 @@
     fileTest('.packages', {
       '.packages': packagesFile,
       'script.dart': 'main(){}',
-      'packages': {'shouldNotBeFound': {}}
+      'packages': {'shouldNotBeFound': <Object, Object>{}}
     }, (Directory directory) async {
       var config = (await findPackageConfig(directory))!;
       expect(config.version, 1); // Found .packages file.
@@ -108,7 +108,7 @@
     // Does not find a packages/ directory, and returns null if nothing found.
     fileTest('package directory packages not supported', {
       'packages': {
-        'foo': {},
+        'foo': <String, dynamic>{},
       }
     }, (Directory directory) async {
       var config = await findPackageConfig(directory);
@@ -119,15 +119,13 @@
       fileTest('invalid .packages', {
         '.packages': 'not a .packages file',
       }, (Directory directory) {
-        expect(findPackageConfig(directory),
-            throwsA(TypeMatcher<FormatException>()));
+        expect(findPackageConfig(directory), throwsA(isA<FormatException>()));
       });
 
       fileTest('invalid .packages as JSON', {
         '.packages': packageConfigFile,
       }, (Directory directory) {
-        expect(findPackageConfig(directory),
-            throwsA(TypeMatcher<FormatException>()));
+        expect(findPackageConfig(directory), throwsA(isA<FormatException>()));
       });
 
       fileTest('invalid .packages', {
@@ -135,8 +133,7 @@
           'package_config.json': 'not a JSON file',
         }
       }, (Directory directory) {
-        expect(findPackageConfig(directory),
-            throwsA(TypeMatcher<FormatException>()));
+        expect(findPackageConfig(directory), throwsA(isA<FormatException>()));
       });
 
       fileTest('invalid .packages as INI', {
@@ -144,8 +141,7 @@
           'package_config.json': packagesFile,
         }
       }, (Directory directory) {
-        expect(findPackageConfig(directory),
-            throwsA(TypeMatcher<FormatException>()));
+        expect(findPackageConfig(directory), throwsA(isA<FormatException>()));
       });
     });
 
@@ -304,8 +300,8 @@
 
     fileTest('no config found', {}, (Directory directory) {
       var file = dirFile(directory, 'anyname');
-      expect(() => loadPackageConfig(file),
-          throwsA(TypeMatcher<FileSystemException>()));
+      expect(
+          () => loadPackageConfig(file), throwsA(isA<FileSystemException>()));
     });
 
     fileTest('no config found, handled', {}, (Directory directory) async {
diff --git a/test/discovery_uri_test.dart b/test/discovery_uri_test.dart
index c8fbcb8..b71ed51 100644
--- a/test/discovery_uri_test.dart
+++ b/test/discovery_uri_test.dart
@@ -56,7 +56,7 @@
     loaderTest('package_config.json', {
       '.packages': 'invalid .packages file',
       'script.dart': 'main(){}',
-      'packages': {'shouldNotBeFound': {}},
+      'packages': {'shouldNotBeFound': <String, dynamic>{}},
       '.dart_tool': {
         'package_config.json': packageConfigFile,
       }
@@ -70,7 +70,7 @@
     loaderTest('.packages', {
       '.packages': packagesFile,
       'script.dart': 'main(){}',
-      'packages': {'shouldNotBeFound': {}}
+      'packages': {'shouldNotBeFound': <String, dynamic>{}}
     }, (directory, loader) async {
       var config = (await findPackageConfigUri(directory, loader: loader))!;
       expect(config.version, 1); // Found .packages file.
@@ -107,7 +107,7 @@
     // Does not find a packages/ directory, and returns null if nothing found.
     loaderTest('package directory packages not supported', {
       'packages': {
-        'foo': {},
+        'foo': <String, dynamic>{},
       }
     }, (Uri directory, loader) async {
       var config = await findPackageConfigUri(directory, loader: loader);
@@ -118,14 +118,14 @@
       '.packages': 'not a .packages file',
     }, (Uri directory, loader) {
       expect(() => findPackageConfigUri(directory, loader: loader),
-          throwsA(TypeMatcher<FormatException>()));
+          throwsA(isA<FormatException>()));
     });
 
     loaderTest('invalid .packages as JSON', {
       '.packages': packageConfigFile,
     }, (Uri directory, loader) {
       expect(() => findPackageConfigUri(directory, loader: loader),
-          throwsA(TypeMatcher<FormatException>()));
+          throwsA(isA<FormatException>()));
     });
 
     loaderTest('invalid .packages', {
@@ -134,7 +134,7 @@
       }
     }, (Uri directory, loader) {
       expect(() => findPackageConfigUri(directory, loader: loader),
-          throwsA(TypeMatcher<FormatException>()));
+          throwsA(isA<FormatException>()));
     });
 
     loaderTest('invalid .packages as INI', {
@@ -143,7 +143,7 @@
       }
     }, (Uri directory, loader) {
       expect(() => findPackageConfigUri(directory, loader: loader),
-          throwsA(TypeMatcher<FormatException>()));
+          throwsA(isA<FormatException>()));
     });
 
     // Does not find .packages if no package_config.json and minVersion > 1.
diff --git a/test/package_config_impl_test.dart b/test/package_config_impl_test.dart
index cef1217..87d1fd4 100644
--- a/test/package_config_impl_test.dart
+++ b/test/package_config_impl_test.dart
@@ -36,7 +36,7 @@
     void failParse(String name, String input) {
       test('$name - error', () {
         expect(() => LanguageVersion.parse(input),
-            throwsA(TypeMatcher<PackageConfigError>()));
+            throwsA(isA<PackageConfigError>()));
         expect(() => LanguageVersion.parse(input), throwsFormatException);
         var failed = false;
         var actual = LanguageVersion.parse(input, onError: (_) {
diff --git a/test/parse_test.dart b/test/parse_test.dart
index ad4c749..402fe8c 100644
--- a/test/parse_test.dart
+++ b/test/parse_test.dart
@@ -53,7 +53,7 @@
         test(name, () {
           expect(
               () => packages.parse(utf8.encode(content), baseFile, throwError),
-              throwsA(TypeMatcher<FormatException>()));
+              throwsA(isA<FormatException>()));
         });
         test('$name, handle error', () {
           var hadError = false;
@@ -308,7 +308,7 @@
               // ignore: unnecessary_cast
               () => parsePackageConfigBytes(utf8.encode(source) as Uint8List,
                   Uri.parse('file:///tmp/.dart_tool/file.dart'), throwError),
-              throwsA(TypeMatcher<FormatException>()));
+              throwsA(isA<FormatException>()));
         });
       }
 
diff --git a/test/src/util.dart b/test/src/util.dart
index 246e129..780ee80 100644
--- a/test/src/util.dart
+++ b/test/src/util.dart
@@ -28,7 +28,7 @@
 }
 """;
 
-/// Mimics a directory structure of [description] and runs [fileTest].
+/// Mimics a directory structure of [description] and runs [loaderTest].
 ///
 /// Description is a map, each key is a file entry. If the value is a map,
 /// it's a subdirectory, otherwise it's a file and the value is the content