Upgrade package:lints to 2.0.0 (#3445)

diff --git a/lib/src/authentication/credential.dart b/lib/src/authentication/credential.dart
index e1dfc79..010d3f3 100644
--- a/lib/src/authentication/credential.dart
+++ b/lib/src/authentication/credential.dart
@@ -58,7 +58,7 @@
     /// doesn't contains [key].
     ///
     /// Throws [FormatException] if value type is not [String].
-    String? _string(String key) {
+    String? string(String key) {
       if (json.containsKey(key)) {
         if (json[key] is! String) {
           throw FormatException('Provided $key value should be string');
@@ -71,8 +71,8 @@
     return Credential._internal(
       url: hostedUrl,
       unknownFields: unknownFields,
-      token: _string('token'),
-      env: _string('env'),
+      token: string('token'),
+      env: string('env'),
     );
   }
 
diff --git a/lib/src/authentication/token_store.dart b/lib/src/authentication/token_store.dart
index 3ef948d..fbb208a 100644
--- a/lib/src/authentication/token_store.dart
+++ b/lib/src/authentication/token_store.dart
@@ -112,31 +112,31 @@
 
   /// Adds [token] into store and writes into disk.
   void addCredential(Credential token) {
-    final _credentials = _loadCredentials();
+    final credentials = _loadCredentials();
 
     // Remove duplicate tokens
-    _credentials.removeWhere((it) => it.url == token.url);
-    _credentials.add(token);
-    _saveCredentials(_credentials);
+    credentials.removeWhere((it) => it.url == token.url);
+    credentials.add(token);
+    _saveCredentials(credentials);
   }
 
   /// Removes tokens with matching [hostedUrl] from store. Returns whether or
   /// not there's a stored token with matching url.
   bool removeCredential(Uri hostedUrl) {
-    final _credentials = _loadCredentials();
+    final credentials = _loadCredentials();
 
     var i = 0;
     var found = false;
-    while (i < _credentials.length) {
-      if (_credentials[i].url == hostedUrl) {
-        _credentials.removeAt(i);
+    while (i < credentials.length) {
+      if (credentials[i].url == hostedUrl) {
+        credentials.removeAt(i);
         found = true;
       } else {
         i++;
       }
     }
 
-    _saveCredentials(_credentials);
+    _saveCredentials(credentials);
 
     return found;
   }
diff --git a/lib/src/command.dart b/lib/src/command.dart
index 240a15e..a1a8a2e 100644
--- a/lib/src/command.dart
+++ b/lib/src/command.dart
@@ -298,7 +298,7 @@
   ///
   /// For top-level commands, if an alias is used, the primary command name is
   /// returned. For instance `install` becomes `get`.
-  static late final String command = _command ?? '';
+  static final String command = _command ?? '';
 
   static void computeCommand(ArgResults argResults) {
     var list = <String?>[];
diff --git a/lib/src/command/add.dart b/lib/src/command/add.dart
index 196a7d6..d4c98ef 100644
--- a/lib/src/command/add.dart
+++ b/lib/src/command/add.dart
@@ -291,7 +291,7 @@
   /// If any of the other git options are defined when `--git-url` is not
   /// defined, an error will be thrown.
   _ParseResult _parsePackage(String package, LanguageVersion languageVersion) {
-    final _conflictingFlagSets = [
+    final conflictingFlagSets = [
       ['git-url', 'git-ref', 'git-path'],
       ['hosted-url'],
       ['path'],
@@ -299,8 +299,8 @@
     ];
 
     for (final flag
-        in _conflictingFlagSets.expand((s) => s).where(argResults.wasParsed)) {
-      final conflictingFlag = _conflictingFlagSets
+        in conflictingFlagSets.expand((s) => s).where(argResults.wasParsed)) {
+      final conflictingFlag = conflictingFlagSets
           .where((s) => !s.contains(flag))
           .expand((s) => s)
           .firstWhereOrNull(argResults.wasParsed);
diff --git a/lib/src/command/cache_repair.dart b/lib/src/command/cache_repair.dart
index 850b782..a4dccab 100644
--- a/lib/src/command/cache_repair.dart
+++ b/lib/src/command/cache_repair.dart
@@ -66,10 +66,10 @@
     if (globalRepairResults.last.isNotEmpty) {
       var packages = pluralize('package', globalRepairResults.last.length);
       log.message(
-          'Failed to reactivate ${log.red(globalRepairResults.last.length)} $packages:\n' +
-              globalRepairResults.last
-                  .map((name) => '- ${log.bold(name)}')
-                  .join('\n'));
+          'Failed to reactivate ${log.red(globalRepairResults.last.length)} $packages:');
+      log.message(globalRepairResults.last
+          .map((name) => '- ${log.bold(name)}')
+          .join('\n'));
     }
 
     if (successes.isEmpty && failures.isEmpty) {
diff --git a/lib/src/command/dependency_services.dart b/lib/src/command/dependency_services.dart
index 5b252ae..193f345 100644
--- a/lib/src/command/dependency_services.dart
+++ b/lib/src/command/dependency_services.dart
@@ -72,7 +72,7 @@
     final dependencies = <Object>[];
     final result = <String, Object>{'dependencies': dependencies};
 
-    Future<List<Object>> _computeUpgradeSet(
+    Future<List<Object>> computeUpgradeSet(
       Pubspec rootPubspec,
       PackageId? package, {
       required _UpgradeType upgradeType,
@@ -203,15 +203,15 @@
                 ?.versionOrHash(),
         'constraint':
             _constraintOf(compatiblePubspec, package.name)?.toString(),
-        'compatible': await _computeUpgradeSet(
+        'compatible': await computeUpgradeSet(
             compatiblePubspec, compatibleVersion,
             upgradeType: _UpgradeType.compatible),
         'singleBreaking': kind != 'transitive' && singleBreakingVersion == null
             ? []
-            : await _computeUpgradeSet(compatiblePubspec, singleBreakingVersion,
+            : await computeUpgradeSet(compatiblePubspec, singleBreakingVersion,
                 upgradeType: _UpgradeType.singleBreaking),
         'multiBreaking': kind != 'transitive' && multiBreakingVersion != null
-            ? await _computeUpgradeSet(compatiblePubspec, multiBreakingVersion,
+            ? await computeUpgradeSet(compatiblePubspec, multiBreakingVersion,
                 upgradeType: _UpgradeType.multiBreaking)
             : [],
       });
diff --git a/lib/src/command/lish.dart b/lib/src/command/lish.dart
index 092fcaf..69c1c7e 100644
--- a/lib/src/command/lish.dart
+++ b/lib/src/command/lish.dart
@@ -133,7 +133,7 @@
             '    pub token add $host\n';
       }
       if (error.serverMessage != null) {
-        msg += '\n' + error.serverMessage! + '\n';
+        msg += '\n${error.serverMessage!}\n';
       }
       dataError(msg + log.red('Authentication failed!'));
     } on PubHttpException catch (error) {
diff --git a/lib/src/command/outdated.dart b/lib/src/command/outdated.dart
index 5c275e4..601bdc8 100644
--- a/lib/src/command/outdated.dart
+++ b/lib/src/command/outdated.dart
@@ -114,7 +114,7 @@
 
   @override
   Future<void> runProtected() async {
-    final mode = <String, Mode>{
+    final mode = <String, _Mode>{
       'outdated': _OutdatedMode(),
       'null-safety': _NullSafetyMode(cache, entrypoint,
           shouldShowSpinner: _shouldShowSpinner),
@@ -385,7 +385,7 @@
 
 Future<void> _outputJson(
   List<_PackageDetails> rows,
-  Mode mode, {
+  _Mode mode, {
   required bool showAll,
   required bool includeDevDependencies,
 }) async {
@@ -422,7 +422,7 @@
 
 Future<void> _outputHuman(
   List<_PackageDetails> rows,
-  Mode mode, {
+  _Mode mode, {
   required bool showAll,
   required bool useColors,
   required bool includeDevDependencies,
@@ -435,7 +435,7 @@
   required String directory,
 }) async {
   final directoryDesc = directory == '.' ? '' : ' in $directory';
-  log.message(mode.explanation(directoryDesc) + '\n');
+  log.message('${mode.explanation(directoryDesc)}\n');
   final markedRows =
       Map.fromIterables(rows, await mode.markVersionDetails(rows));
 
@@ -596,7 +596,7 @@
   }
 }
 
-abstract class Mode {
+abstract class _Mode {
   /// Analyzes the [_PackageDetails] according to a --mode and outputs a
   /// corresponding list of the versions
   /// [current, upgradable, resolvable, latest].
@@ -613,7 +613,7 @@
   Future<Pubspec> resolvablePubspec(Pubspec pubspec);
 }
 
-class _OutdatedMode implements Mode {
+class _OutdatedMode implements _Mode {
   @override
   String explanation(String directoryDescription) => '''
 Showing outdated packages$directoryDescription.
@@ -690,7 +690,7 @@
   }
 }
 
-class _NullSafetyMode implements Mode {
+class _NullSafetyMode implements _Mode {
   final SystemCache cache;
   final Entrypoint entrypoint;
   final bool shouldShowSpinner;
diff --git a/lib/src/command/upgrade.dart b/lib/src/command/upgrade.dart
index af0c6e1..d6043c3 100644
--- a/lib/src/command/upgrade.dart
+++ b/lib/src/command/upgrade.dart
@@ -470,7 +470,7 @@
     final hasNoNullSafetyVersions = <String>{};
     final hasNullSafetyVersions = <String>{};
 
-    Future<Iterable<PackageRange>> _removeUpperConstraints(
+    Future<Iterable<PackageRange>> removeUpperConstraints(
       Iterable<PackageRange> dependencies,
     ) async =>
         await Future.wait(dependencies.map((dep) async {
@@ -500,8 +500,8 @@
           return dep.toRef().withConstraint(VersionConstraint.empty);
         }));
 
-    final deps = _removeUpperConstraints(original.dependencies.values);
-    final devDeps = _removeUpperConstraints(original.devDependencies.values);
+    final deps = removeUpperConstraints(original.dependencies.values);
+    final devDeps = removeUpperConstraints(original.devDependencies.values);
     await Future.wait([deps, devDeps]);
 
     if (hasNoNullSafetyVersions.isNotEmpty) {
diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart
index c17d7e8..3a51b2f 100644
--- a/lib/src/entrypoint.dart
+++ b/lib/src/entrypoint.dart
@@ -51,7 +51,7 @@
   // sdks:
   //   dart: ">=1.2.3 <2.0.0"
   // ```
-  var sdkNames = sdks.keys.map((name) => '  ' + name).join('|');
+  var sdkNames = sdks.keys.map((name) => '  $name').join('|');
   return RegExp(r'^(' + sdkNames + r'|sdk): "?([^"]*)"?$', multiLine: true);
 }();
 
diff --git a/lib/src/global_packages.dart b/lib/src/global_packages.dart
index 81c34f5..8bfe7cf 100644
--- a/lib/src/global_packages.dart
+++ b/lib/src/global_packages.dart
@@ -777,12 +777,12 @@
         invocation = '''
 if [ -f $snapshot ]; then
   dart "$snapshot" "\$@"
-  # The VM exits with code 253 if the snapshot version is out-of-date.	
-  # If it is, we need to delete it and run "pub global" manually.	
-  exit_code=\$?	
-  if [ \$exit_code != 253 ]; then	
-    exit \$exit_code	
-  fi	
+  # The VM exits with code 253 if the snapshot version is out-of-date.
+  # If it is, we need to delete it and run "pub global" manually.
+  exit_code=\$?
+  if [ \$exit_code != 253 ]; then
+    exit \$exit_code
+  fi
   dart pub global run ${package.name}:$script "\$@"
 else
   dart pub global run ${package.name}:$script "\$@"
@@ -858,7 +858,7 @@
     if (Platform.isWindows) {
       // See if the shell can find one of the binstubs.
       // "\q" means return exit code 0 if found or 1 if not.
-      var result = runProcessSync('where', [r'\q', installed + '.bat']);
+      var result = runProcessSync('where', [r'\q', '$installed.bat']);
       if (result.exitCode == 0) return;
 
       log.warning("${log.yellow('Warning:')} Pub installs executables into "
diff --git a/lib/src/io.dart b/lib/src/io.dart
index 0b382d1..6422f84 100644
--- a/lib/src/io.dart
+++ b/lib/src/io.dart
@@ -702,7 +702,7 @@
 /// [environment] is provided, that will be used to augment (not replace) the
 /// the inherited variables.
 @visibleForTesting
-Future<_PubProcess> startProcess(
+Future<PubProcess> startProcess(
   String executable,
   List<String> args, {
   String? workingDir,
@@ -721,7 +721,7 @@
           'Pub failed to run subprocess `$executable`: $e');
     }
 
-    var process = _PubProcess(ioProcess);
+    var process = PubProcess(ioProcess);
     unawaited(process.exitCode.whenComplete(resource.release));
     return process;
   });
@@ -752,7 +752,7 @@
 }
 
 /// A wrapper around [Process] that exposes `dart:async`-style APIs.
-class _PubProcess {
+class PubProcess {
   /// The underlying `dart:io` [Process].
   final Process _process;
 
@@ -811,8 +811,8 @@
   /// error handler unless nothing has handled it.
   Future<int> get exitCode => _exitCode;
 
-  /// Creates a new [_PubProcess] wrapping [process].
-  _PubProcess(Process process) : _process = process {
+  /// Creates a new [PubProcess] wrapping [process].
+  PubProcess(Process process) : _process = process {
     var errorGroup = ErrorGroup();
 
     var pair = _consumerToSink(process.stdin);
diff --git a/lib/src/lock_file.dart b/lib/src/lock_file.dart
index 0950de1..215ab92 100644
--- a/lib/src/lock_file.dart
+++ b/lib/src/lock_file.dart
@@ -224,7 +224,7 @@
     String? relativeFrom,
   }) {
     var header = '''
-This file is deprecated. Tools should instead consume 
+This file is deprecated. Tools should instead consume
 `.dart_tool/package_config.json`.
 
 For more info see: https://dart.dev/go/dot-packages-deprecation
@@ -305,7 +305,7 @@
       generatorVersion: sdk.version,
     );
 
-    return JsonEncoder.withIndent('  ').convert(packageConfig.toJson()) + '\n';
+    return '${JsonEncoder.withIndent('  ').convert(packageConfig.toJson())}\n';
   }
 
   /// Returns the serialized YAML text of the lock file.
diff --git a/lib/src/package_config.dart b/lib/src/package_config.dart
index d64808b..e5e5e7d 100644
--- a/lib/src/package_config.dart
+++ b/lib/src/package_config.dart
@@ -61,21 +61,23 @@
     }
     final root = data;
 
-    void _throw(String property, String mustBe) => throw FormatException(
-        '"$property" in .dart_tool/package_config.json $mustBe');
+    void throwFormatException(String property, String mustBe) =>
+        throw FormatException(
+            '"$property" in .dart_tool/package_config.json $mustBe');
 
     /// Read the 'configVersion' property
     final configVersion = root['configVersion'];
     if (configVersion is! int) {
-      _throw('configVersion', 'must be an integer');
+      throwFormatException('configVersion', 'must be an integer');
     }
     if (configVersion != 2) {
-      _throw('configVersion', 'must be 2 (the only supported version)');
+      throwFormatException(
+          'configVersion', 'must be 2 (the only supported version)');
     }
 
     final packagesRaw = root['packages'];
     if (packagesRaw is! List) {
-      _throw('packages', 'must be a list');
+      throwFormatException('packages', 'must be a list');
     }
     final packages = <PackageConfigEntry>[];
     for (final entry in packagesRaw) {
@@ -87,7 +89,7 @@
     final generatedRaw = root['generated'];
     if (generatedRaw != null) {
       if (generatedRaw is! String) {
-        _throw('generated', 'must be a string, if given');
+        throwFormatException('generated', 'must be a string, if given');
       }
       generated = DateTime.parse(generatedRaw);
     }
@@ -104,12 +106,12 @@
     final generatorVersionRaw = root['generatorVersion'];
     if (generatorVersionRaw != null) {
       if (generatorVersionRaw is! String) {
-        _throw('generatorVersion', 'must be a string, if given');
+        throwFormatException('generatorVersion', 'must be a string, if given');
       }
       try {
         generatorVersion = Version.parse(generatorVersionRaw);
       } on FormatException catch (e) {
-        _throw('generatorVersion',
+        throwFormatException('generatorVersion',
             'must be a semver version, if given, error: ${e.message}');
       }
     }
@@ -187,30 +189,31 @@
     }
     final root = data;
 
-    Never _throw(String property, String mustBe) => throw FormatException(
-        '"packages[].$property" in .dart_tool/package_config.json $mustBe');
+    Never throwFormatException(String property, String mustBe) =>
+        throw FormatException(
+            '"packages[].$property" in .dart_tool/package_config.json $mustBe');
 
     final name = root['name'];
     if (name is! String) {
-      _throw('name', 'must be a string');
+      throwFormatException('name', 'must be a string');
     }
 
     final Uri rootUri;
     final rootUriRaw = root['rootUri'];
     if (rootUriRaw is! String) {
-      _throw('rootUri', 'must be a string');
+      throwFormatException('rootUri', 'must be a string');
     }
     try {
       rootUri = Uri.parse(rootUriRaw);
     } on FormatException {
-      _throw('rootUri', 'must be a URI');
+      throwFormatException('rootUri', 'must be a URI');
     }
 
     Uri? packageUri;
     var packageUriRaw = root['packageUri'];
     if (packageUriRaw != null) {
       if (packageUriRaw is! String) {
-        _throw('packageUri', 'must be a string');
+        throwFormatException('packageUri', 'must be a string');
       }
       if (!packageUriRaw.endsWith('/')) {
         packageUriRaw = '$packageUriRaw/';
@@ -218,7 +221,7 @@
       try {
         packageUri = Uri.parse(packageUriRaw);
       } on FormatException {
-        _throw('packageUri', 'must be a URI');
+        throwFormatException('packageUri', 'must be a URI');
       }
     }
 
@@ -226,12 +229,13 @@
     final languageVersionRaw = root['languageVersion'];
     if (languageVersionRaw != null) {
       if (languageVersionRaw is! String) {
-        _throw('languageVersion', 'must be a string');
+        throwFormatException('languageVersion', 'must be a string');
       }
       try {
         languageVersion = LanguageVersion.parse(languageVersionRaw);
       } on FormatException {
-        _throw('languageVersion', 'must be on the form <major>.<minor>');
+        throwFormatException(
+            'languageVersion', 'must be on the form <major>.<minor>');
       }
     }
 
diff --git a/lib/src/packages_file.dart b/lib/src/packages_file.dart
index 6833ae8..d5c7989 100644
--- a/lib/src/packages_file.dart
+++ b/lib/src/packages_file.dart
@@ -80,7 +80,7 @@
       packageLocation = baseLocation.resolve(packageValue);
       if (!packageLocation.path.endsWith('/')) {
         packageLocation =
-            packageLocation.replace(path: packageLocation.path + "/");
+            packageLocation.replace(path: "${packageLocation.path}/");
       }
     }
     if (result.containsKey(packageName)) {
@@ -162,7 +162,7 @@
       uri = _relativize(uri, baseUri);
     }
     if (!uri.path.endsWith('/')) {
-      uri = uri.replace(path: uri.path + '/');
+      uri = uri.replace(path: '${uri.path}/');
     }
     output.write(uri);
     output.writeln();
@@ -251,7 +251,7 @@
     }
     assert(badIndex < packageName.length);
     var badCharCode = packageName.codeUnitAt(badIndex);
-    var badChar = "U+" + badCharCode.toRadixString(16).padLeft(4, '0');
+    var badChar = "U+${badCharCode.toRadixString(16).padLeft(4, '0')}";
     if (badCharCode >= 0x20 && badCharCode <= 0x7e) {
       // Printable character.
       badChar = "'${packageName[badIndex]}' ($badChar)";
diff --git a/lib/src/pubspec.dart b/lib/src/pubspec.dart
index e18fbc6..d06b025 100644
--- a/lib/src/pubspec.dart
+++ b/lib/src/pubspec.dart
@@ -86,8 +86,7 @@
   /// The registry of sources to use when parsing [dependencies] and
   /// [devDependencies].
   ///
-  /// This will be null if this was created using [new Pubspec] or [new
-  /// Pubspec.empty].
+  /// This will be null if this was created using [Pubspec] or [Pubspec.empty].
   final SourceRegistry _sources;
 
   /// The location from which the pubspec was loaded.
@@ -431,7 +430,7 @@
   /// This will return at most one error for each field.
   List<PubspecException> get allErrors {
     var errors = <PubspecException>[];
-    void _collectError(void Function() fn) {
+    void collectError(void Function() fn) {
       try {
         fn();
       } on PubspecException catch (e) {
@@ -439,14 +438,14 @@
       }
     }
 
-    _collectError(() => name);
-    _collectError(() => version);
-    _collectError(() => dependencies);
-    _collectError(() => devDependencies);
-    _collectError(() => publishTo);
-    _collectError(() => executables);
-    _collectError(() => falseSecrets);
-    _collectError(_ensureEnvironment);
+    collectError(() => name);
+    collectError(() => version);
+    collectError(() => dependencies);
+    collectError(() => devDependencies);
+    collectError(() => publishTo);
+    collectError(() => executables);
+    collectError(() => falseSecrets);
+    collectError(_ensureEnvironment);
     return errors;
   }
 }
diff --git a/lib/src/pubspec_parse.dart b/lib/src/pubspec_parse.dart
index 68f9ce7..62eaa13 100644
--- a/lib/src/pubspec_parse.dart
+++ b/lib/src/pubspec_parse.dart
@@ -136,7 +136,7 @@
       final falseSecrets = <String>[];
 
       // Throws a [PubspecException]
-      void _falseSecretsError(SourceSpan span) => _error(
+      void falseSecretsError(SourceSpan span) => _error(
             '"false_secrets" field must be a list of git-ignore style patterns',
             span,
           );
@@ -147,12 +147,12 @@
           for (final node in falseSecretsNode.nodes) {
             final value = node.value;
             if (value is! String) {
-              _falseSecretsError(node.span);
+              falseSecretsError(node.span);
             }
             falseSecrets.add(value);
           }
         } else {
-          _falseSecretsError(falseSecretsNode.span);
+          falseSecretsError(falseSecretsNode.span);
         }
       }
 
diff --git a/lib/src/pubspec_utils.dart b/lib/src/pubspec_utils.dart
index cd28e21..71e30c4 100644
--- a/lib/src/pubspec_utils.dart
+++ b/lib/src/pubspec_utils.dart
@@ -108,7 +108,7 @@
   ArgumentError.checkNotNull(original, 'original');
   stripOnly ??= [];
 
-  List<PackageRange> _stripUpperBounds(
+  List<PackageRange> stripUpperBounds(
     Map<String, PackageRange> constrained,
   ) {
     final result = <PackageRange>[];
@@ -133,8 +133,8 @@
     original.name,
     version: original.version,
     sdkConstraints: original.sdkConstraints,
-    dependencies: _stripUpperBounds(original.dependencies),
-    devDependencies: _stripUpperBounds(original.devDependencies),
+    dependencies: stripUpperBounds(original.dependencies),
+    devDependencies: stripUpperBounds(original.devDependencies),
     dependencyOverrides: original.dependencyOverrides.values,
   );
 }
diff --git a/lib/src/rate_limited_scheduler.dart b/lib/src/rate_limited_scheduler.dart
index 85d73cd..078acbb 100644
--- a/lib/src/rate_limited_scheduler.dart
+++ b/lib/src/rate_limited_scheduler.dart
@@ -110,7 +110,7 @@
       return await callback((jobId) {
         if (_started.contains(jobId)) return;
         final task = _Task(jobId, Zone.current);
-        _cache.putIfAbsent(jobId, () => Completer());
+        _cache.putIfAbsent(jobId, Completer.new);
         _queue.addLast(task);
         prescheduled.add(task);
 
@@ -127,7 +127,7 @@
   /// If [jobId] is not yet running, it will go to the front of the work queue
   /// to be scheduled next when there are free resources.
   Future<V> schedule(J jobId) {
-    final completer = _cache.putIfAbsent(jobId, () => Completer());
+    final completer = _cache.putIfAbsent(jobId, Completer.new);
     if (!_started.contains(jobId)) {
       final task = _Task(jobId, Zone.current);
       _queue.addFirst(task);
diff --git a/lib/src/solver/failure.dart b/lib/src/solver/failure.dart
index 23b2e2f..5af4015 100644
--- a/lib/src/solver/failure.dart
+++ b/lib/src/solver/failure.dart
@@ -201,12 +201,8 @@
       var conflictLine = _lineNumbers[conflictClause.conflict];
       var otherLine = _lineNumbers[conflictClause.other];
       if (conflictLine != null && otherLine != null) {
-        _write(
-            incompatibility,
-            'Because ' +
-                conflictClause.conflict.andToString(conflictClause.other,
-                    detailsForCause, conflictLine, otherLine) +
-                ', $incompatibilityString.',
+        _write(incompatibility,
+            'Because ${conflictClause.conflict.andToString(conflictClause.other, detailsForCause, conflictLine, otherLine)}, $incompatibilityString.',
             numbered: numbered);
       } else if (conflictLine != null || otherLine != null) {
         Incompatibility withLine;
@@ -264,11 +260,8 @@
 
       var derivedLine = _lineNumbers[derived];
       if (derivedLine != null) {
-        _write(
-            incompatibility,
-            'Because ' +
-                ext.andToString(derived, detailsForCause, null, derivedLine) +
-                ', $incompatibilityString.',
+        _write(incompatibility,
+            'Because ${ext.andToString(derived, detailsForCause, null, derivedLine)}, $incompatibilityString.',
             numbered: numbered);
       } else if (_isCollapsible(derived)) {
         var derivedCause = derived.cause as ConflictCause;
diff --git a/lib/src/solver/incompatibility.dart b/lib/src/solver/incompatibility.dart
index 9e39865..04c7c3f 100644
--- a/lib/src/solver/incompatibility.dart
+++ b/lib/src/solver/incompatibility.dart
@@ -126,7 +126,7 @@
       if (!cause.sdk.isAvailable) {
         buffer.write('the ${cause.sdk.name} SDK');
       } else {
-        if (cause.sdk.name != 'Dart') buffer.write(cause.sdk.name + ' ');
+        if (cause.sdk.name != 'Dart') buffer.write('${cause.sdk.name} ');
         buffer.write('SDK version ${cause.constraint}');
       }
       return buffer.toString();
@@ -262,7 +262,7 @@
         .join(' or ');
 
     var buffer =
-        StringBuffer(_terse(thisPositive, details, allowEvery: true) + ' ');
+        StringBuffer('${_terse(thisPositive, details, allowEvery: true)} ');
     var isDependency = cause == IncompatibilityCause.dependency &&
         other.cause == IncompatibilityCause.dependency;
     buffer.write(isDependency ? 'depends on' : 'requires');
@@ -414,7 +414,7 @@
       if (!cause.sdk.isAvailable) {
         buffer.write('the ${cause.sdk.name} SDK');
       } else {
-        if (cause.sdk.name != 'Dart') buffer.write(cause.sdk.name + ' ');
+        if (cause.sdk.name != 'Dart') buffer.write('${cause.sdk.name} ');
         buffer.write('SDK version ${cause.constraint}');
       }
     } else if (latter.cause == IncompatibilityCause.noVersions) {
diff --git a/lib/src/source/hosted.dart b/lib/src/source/hosted.dart
index f403c60..e7dc870 100644
--- a/lib/src/source/hosted.dart
+++ b/lib/src/source/hosted.dart
@@ -77,7 +77,7 @@
   }
   // If there is a path, and it doesn't end in a slash we normalize to slash
   if (u.path.isNotEmpty && !u.path.endsWith('/')) {
-    u = u.replace(path: u.path + '/');
+    u = u.replace(path: '${u.path}/');
   }
   // pub.dev and pub.dartlang.org are identical.
   //
diff --git a/lib/src/source/sdk.dart b/lib/src/source/sdk.dart
index fe10eb4..da492f5 100644
--- a/lib/src/source/sdk.dart
+++ b/lib/src/source/sdk.dart
@@ -118,7 +118,7 @@
       // [PackageNotFoundException]s are uncapitalized and unpunctuated because
       // they're used within other sentences by the version solver, but
       // [ApplicationException]s should be full sentences.
-      throw ApplicationException(capitalize(error.message) + '.');
+      throw ApplicationException('${capitalize(error.message)}.');
     }
   }
 }
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index 2a5768e..3e1cf48 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -186,7 +186,7 @@
 /// commas and/or [conjunction] (`"and"` by default) where appropriate.
 String toSentence(Iterable iter, {String conjunction = 'and'}) {
   if (iter.length == 1) return iter.first.toString();
-  return iter.take(iter.length - 1).join(', ') + ' $conjunction ${iter.last}';
+  return '${iter.take(iter.length - 1).join(', ')} $conjunction ${iter.last}';
 }
 
 /// Returns [name] if [number] is 1, or the plural of [name] otherwise.
@@ -447,7 +447,7 @@
 String yamlToString(data) {
   var buffer = StringBuffer();
 
-  void _stringify(bool isMapValue, String indent, data) {
+  void stringify(bool isMapValue, String indent, data) {
     // TODO(nweiz): Serialize using the YAML library once it supports
     // serialization.
 
@@ -473,7 +473,7 @@
         }
 
         buffer.write('$indent$keyString:');
-        _stringify(true, indent, data[key]);
+        stringify(true, indent, data[key]);
       }
 
       return;
@@ -495,7 +495,7 @@
     }
   }
 
-  _stringify(false, '', data);
+  stringify(false, '', data);
   return buffer.toString();
 }
 
diff --git a/lib/src/validator/dependency.dart b/lib/src/validator/dependency.dart
index 40e9c2a..fa01b45 100644
--- a/lib/src/validator/dependency.dart
+++ b/lib/src/validator/dependency.dart
@@ -27,11 +27,11 @@
   @override
   Future validate() async {
     /// Whether any dependency has a caret constraint.
-    var _hasCaretDep = false;
+    var hasCaretDep = false;
 
     /// Emit an error for dependencies from unknown SDKs or without appropriate
     /// constraints on the Dart SDK.
-    void _warnAboutSdkSource(PackageRange dep) {
+    void warnAboutSdkSource(PackageRange dep) {
       var identifier = (dep.description as SdkDescription).sdk;
       var sdk = sdks[identifier];
       if (sdk == null) {
@@ -44,7 +44,7 @@
     }
 
     /// Warn that dependencies should use the hosted source.
-    Future _warnAboutSource(PackageRange dep) async {
+    Future warnAboutSource(PackageRange dep) async {
       List<Version> versions;
       try {
         var ids = await entrypoint.cache
@@ -78,9 +78,9 @@
     }
 
     /// Warn about improper dependencies on Flutter.
-    void _warnAboutFlutterSdk(PackageRange dep) {
+    void warnAboutFlutterSdk(PackageRange dep) {
       if (dep.source is SdkSource) {
-        _warnAboutSdkSource(dep);
+        warnAboutSdkSource(dep);
         return;
       }
 
@@ -95,7 +95,7 @@
     }
 
     /// Warn that dependencies should have version constraints.
-    void _warnAboutNoConstraint(PackageRange dep) {
+    void warnAboutNoConstraint(PackageRange dep) {
       var message = 'Your dependency on "${dep.name}" should have a version '
           'constraint.';
       var locked = entrypoint.lockFile.packages[dep.name];
@@ -111,7 +111,7 @@
     }
 
     /// Warn that dependencies should allow more than a single version.
-    void _warnAboutSingleVersionConstraint(PackageRange dep) {
+    void warnAboutSingleVersionConstraint(PackageRange dep) {
       warnings.add(
           'Your dependency on "${dep.name}" should allow more than one version. '
           'For example:\n'
@@ -125,7 +125,7 @@
     }
 
     /// Warn that dependencies should have lower bounds on their constraints.
-    void _warnAboutNoConstraintLowerBound(PackageRange dep) {
+    void warnAboutNoConstraintLowerBound(PackageRange dep) {
       var message =
           'Your dependency on "${dep.name}" should have a lower bound.';
       var locked = entrypoint.lockFile.packages[dep.name];
@@ -148,7 +148,7 @@
     }
 
     /// Warn that dependencies should have upper bounds on their constraints.
-    void _warnAboutNoConstraintUpperBound(PackageRange dep) {
+    void warnAboutNoConstraintUpperBound(PackageRange dep) {
       String constraint;
       if ((dep.constraint as VersionRange).includeMin) {
         constraint = '^${(dep.constraint as VersionRange).min}';
@@ -169,7 +169,7 @@
           '${log.bold("all")} future versions of ${dep.name}.');
     }
 
-    void _warnAboutPrerelease(String dependencyName, VersionRange constraint) {
+    void warnAboutPrerelease(String dependencyName, VersionRange constraint) {
       final packageVersion = entrypoint.root.version;
       if (constraint.min != null &&
           constraint.min!.isPreRelease &&
@@ -184,15 +184,15 @@
     }
 
     /// Validates all dependencies in [dependencies].
-    Future _validateDependencies(Iterable<PackageRange> dependencies) async {
+    Future validateDependencies(Iterable<PackageRange> dependencies) async {
       for (var dependency in dependencies) {
         var constraint = dependency.constraint;
         if (dependency.name == 'flutter') {
-          _warnAboutFlutterSdk(dependency);
+          warnAboutFlutterSdk(dependency);
         } else if (dependency.source is SdkSource) {
-          _warnAboutSdkSource(dependency);
+          warnAboutSdkSource(dependency);
         } else if (dependency.source is! HostedSource) {
-          await _warnAboutSource(dependency);
+          await warnAboutSource(dependency);
 
           final description = dependency.description;
           if (description is GitDescription && description.path != '.') {
@@ -201,28 +201,27 @@
           }
         } else {
           if (constraint.isAny) {
-            _warnAboutNoConstraint(dependency);
+            warnAboutNoConstraint(dependency);
           } else if (constraint is VersionRange) {
             if (constraint is Version) {
-              _warnAboutSingleVersionConstraint(dependency);
+              warnAboutSingleVersionConstraint(dependency);
             } else {
-              _warnAboutPrerelease(dependency.name, constraint);
+              warnAboutPrerelease(dependency.name, constraint);
               if (constraint.min == null) {
-                _warnAboutNoConstraintLowerBound(dependency);
+                warnAboutNoConstraintLowerBound(dependency);
               } else if (constraint.max == null) {
-                _warnAboutNoConstraintUpperBound(dependency);
+                warnAboutNoConstraintUpperBound(dependency);
               }
             }
-            _hasCaretDep =
-                _hasCaretDep || constraint.toString().startsWith('^');
+            hasCaretDep = hasCaretDep || constraint.toString().startsWith('^');
           }
         }
       }
     }
 
-    await _validateDependencies(entrypoint.root.pubspec.dependencies.values);
+    await validateDependencies(entrypoint.root.pubspec.dependencies.values);
 
-    if (_hasCaretDep) {
+    if (hasCaretDep) {
       validateSdkConstraint(_firstCaretVersion,
           "Older versions of pub don't support ^ version constraints.");
     }
diff --git a/pubspec.yaml b/pubspec.yaml
index f39e27a..e44e0e7 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,7 +1,7 @@
 name: pub
 
 environment:
-  sdk: '>=2.12.0 <3.0.0'
+  sdk: '>=2.17.0 <3.0.0'
 
 dependencies:
   # Note: Pub's test infrastructure assumes that any dependencies used in tests
@@ -15,6 +15,7 @@
   frontend_server_client: ^2.0.0
   http: ^0.13.3
   http_multi_server: ^3.0.1
+  http_parser: ^4.0.1
   meta: ^1.3.0
   oauth2: ^2.0.0
   path: ^1.8.0
@@ -28,7 +29,7 @@
   yaml_edit: ^2.0.0
 
 dev_dependencies:
-  lints: ^1.0.1
+  lints: ^2.0.0
   shelf_test_handler: ^2.0.0
   test: ^1.17.3
   test_descriptor: ^2.0.0
diff --git a/test/dependency_services/dependency_services_test.dart b/test/dependency_services/dependency_services_test.dart
index 08542ea..7228b36 100644
--- a/test/dependency_services/dependency_services_test.dart
+++ b/test/dependency_services/dependency_services_test.dart
@@ -82,7 +82,7 @@
   return filterUnstableLines(s.split('\n'));
 }
 
-Future<void> listReportApply(
+Future<void> _listReportApply(
   GoldenTestContext context,
   List<_PackageVersion> upgrades, {
   void Function(Map)? reportAssertions,
@@ -132,7 +132,7 @@
     ]).create();
     await pubGet();
     server.dontAllowDownloads();
-    await listReportApply(context, [
+    await _listReportApply(context, [
       _PackageVersion('foo', '2.2.3'),
       _PackageVersion('transitive', null)
     ], reportAssertions: (report) {
@@ -168,7 +168,7 @@
     ]).create();
 
     server.dontAllowDownloads();
-    await listReportApply(
+    await _listReportApply(
       context,
       [
         _PackageVersion('foo', '2.2.3'),
@@ -201,7 +201,7 @@
 
     server.dontAllowDownloads();
 
-    await listReportApply(context, [
+    await _listReportApply(context, [
       _PackageVersion('foo', '1.2.4'),
     ], reportAssertions: (report) {
       expect(
@@ -228,7 +228,7 @@
     await pubGet();
     server.dontAllowDownloads();
 
-    await listReportApply(context, [
+    await _listReportApply(context, [
       _PackageVersion('foo', '2.2.3'),
       _PackageVersion('transitive', '1.0.0')
     ], reportAssertions: (report) {
@@ -271,7 +271,7 @@
 
     server.dontAllowDownloads();
 
-    await listReportApply(context, [
+    await _listReportApply(context, [
       _PackageVersion('foo', '3.0.1',
           constraint: VersionConstraint.parse('^3.0.0')),
       _PackageVersion('bar', '2.0.0')
@@ -298,7 +298,7 @@
     }).create();
     await pubGet();
     server.serve('foo', '2.0.0');
-    await listReportApply(context, [
+    await _listReportApply(context, [
       _PackageVersion('foo', '2.0.0',
           constraint: VersionConstraint.parse('^2.0.0')),
     ], reportAssertions: (report) {
@@ -331,7 +331,7 @@
     final barSecondVersion = d.git('bar.git', [d.libPubspec('bar', '2.0.0')]);
     await barSecondVersion.commit();
 
-    await listReportApply(context, [
+    await _listReportApply(context, [
       _PackageVersion('foo', newRef),
     ], reportAssertions: (report) {
       expect(
diff --git a/test/descriptor/packages.dart b/test/descriptor/packages.dart
index b670322..e728f7c 100644
--- a/test/descriptor/packages.dart
+++ b/test/descriptor/packages.dart
@@ -133,7 +133,7 @@
     final packageConfigFile = File(p.join(parent ?? sandbox, name));
     await packageConfigFile.parent.create();
     await packageConfigFile.writeAsString(
-      const JsonEncoder.withIndent('  ').convert(_config.toJson()) + '\n',
+      '${const JsonEncoder.withIndent('  ').convert(_config.toJson())}\n',
     );
   }
 
diff --git a/test/embedding/get_executable_for_command_test.dart b/test/embedding/get_executable_for_command_test.dart
index 0edfa72..7f395a7 100644
--- a/test/embedding/get_executable_for_command_test.dart
+++ b/test/embedding/get_executable_for_command_test.dart
@@ -23,7 +23,7 @@
   errorMessage,
   CommandResolutionIssue? issue,
 }) async {
-  final _cachePath = getPubTestEnvironment()['PUB_CACHE'];
+  final cachePath = getPubTestEnvironment()['PUB_CACHE'];
   final oldVerbosity = log.verbosity;
   log.verbosity = log.Verbosity.none;
   if (executable == null) {
@@ -31,7 +31,7 @@
       () => getExecutableForCommand(
         command,
         root: root,
-        pubCacheDir: _cachePath,
+        pubCacheDir: cachePath,
         allowSnapshot: allowSnapshot,
       ),
       throwsA(
@@ -44,7 +44,7 @@
     final e = await getExecutableForCommand(
       command,
       root: root,
-      pubCacheDir: _cachePath,
+      pubCacheDir: cachePath,
       allowSnapshot: allowSnapshot,
     );
     expect(
diff --git a/test/golden_file.dart b/test/golden_file.dart
index b8b7eaa..c4baefe 100644
--- a/test/golden_file.dart
+++ b/test/golden_file.dart
@@ -60,7 +60,7 @@
       'goldens',
       rel,
       // Sanitize the name, and add .txt
-      _testName.replaceAll(RegExp(r'[<>:"/\|?*%#]'), '~') + '.txt',
+      '${_testName.replaceAll(RegExp(r'[<>:"/\|?*%#]'), '~')}.txt',
     );
     _goldenFile = File(_goldenFilePath);
     _header = '# GENERATED BY: ${p.relative(_currentTestFile)}\n\n';
diff --git a/test/hosted/will_normalize_hosted_url_test.dart b/test/hosted/will_normalize_hosted_url_test.dart
index 6cc3888..904d3d8 100644
--- a/test/hosted/will_normalize_hosted_url_test.dart
+++ b/test/hosted/will_normalize_hosted_url_test.dart
@@ -42,7 +42,7 @@
       await d.dir(appPath, [
         d.appPubspec({
           'foo': {
-            'hosted': {'name': 'foo', 'url': globalServer.url + '/'},
+            'hosted': {'name': 'foo', 'url': '${globalServer.url}/'},
           },
         }),
       ]).create();
@@ -65,7 +65,7 @@
       await d.dir(appPath, [
         d.appPubspec({
           'foo': {
-            'hosted': {'name': 'foo', 'url': globalServer.url + '//'},
+            'hosted': {'name': 'foo', 'url': '${globalServer.url}//'},
           },
         }),
       ]).create();
@@ -81,7 +81,7 @@
     ///
     /// This is a bit of a hack, to easily test if hosted pub URLs with a path
     /// segment works and if the slashes are normalized.
-    void _proxyMyFolderToRoot() {
+    void proxyMyFolderToRoot() {
       globalServer.handle(
         RegExp('/my-folder/.*'),
         (r) async {
@@ -90,7 +90,7 @@
           }
           final path = r.requestedUri.path.substring('/my-folder/'.length);
           final res = await http.get(
-            Uri.parse(globalServer.url + '/$path'),
+            Uri.parse('${globalServer.url}/$path'),
           );
           return Response(res.statusCode, body: res.bodyBytes, headers: {
             'Content-Type': res.headers['content-type']!,
@@ -102,11 +102,11 @@
     test('will use normalized url with path', () async {
       final server = await servePackages();
       server.serve('foo', '1.2.3');
-      _proxyMyFolderToRoot();
+      proxyMyFolderToRoot();
 
       // testing with a normalized URL
-      final testUrl = globalServer.url + '/my-folder/';
-      final normalizedUrl = globalServer.url + '/my-folder/';
+      final testUrl = '${globalServer.url}/my-folder/';
+      final normalizedUrl = '${globalServer.url}/my-folder/';
 
       await d.dir(appPath, [
         d.appPubspec({
@@ -126,11 +126,11 @@
     test('will normalize url with path by adding slash', () async {
       final server = await servePackages();
       server.serve('foo', '1.2.3');
-      _proxyMyFolderToRoot();
+      proxyMyFolderToRoot();
 
       // Testing with a URL that is missing the slash.
-      final testUrl = globalServer.url + '/my-folder';
-      final normalizedUrl = globalServer.url + '/my-folder/';
+      final testUrl = '${globalServer.url}/my-folder';
+      final normalizedUrl = '${globalServer.url}/my-folder/';
 
       await d.dir(appPath, [
         d.appPubspec({
diff --git a/test/ignore_test.dart b/test/ignore_test.dart
index a8ab8ac..9d80c5b 100644
--- a/test/ignore_test.dart
+++ b/test/ignore_test.dart
@@ -20,7 +20,7 @@
   });
 
   group('pub', () {
-    void _testIgnorePath(
+    void testIgnorePath(
       TestData c,
       String path,
       bool expected,
@@ -87,10 +87,10 @@
       c.paths.forEach((path, expected) {
         var ignoreCase = c.ignoreCase;
         if (ignoreCase == null) {
-          _testIgnorePath(c, path, expected, false);
-          _testIgnorePath(c, path, expected, true);
+          testIgnorePath(c, path, expected, false);
+          testIgnorePath(c, path, expected, true);
         } else {
-          _testIgnorePath(c, path, expected, ignoreCase);
+          testIgnorePath(c, path, expected, ignoreCase);
         }
       });
     }
@@ -124,7 +124,7 @@
       runGit(['clean', '-f', '-d', '-x'], workingDirectory: tmp!.path);
     });
 
-    void _testIgnorePath(
+    void testIgnorePath(
       TestData c,
       String path,
       bool expected,
@@ -144,12 +144,12 @@
 
         for (final directory in c.patterns.keys) {
           final resolvedDirectory =
-              directory == '' ? tmp!.uri : tmp!.uri.resolve(directory + '/');
+              directory == '' ? tmp!.uri : tmp!.uri.resolve('$directory/');
           Directory.fromUri(resolvedDirectory).createSync(recursive: true);
           final gitIgnore =
               File.fromUri(resolvedDirectory.resolve('.gitignore'));
           gitIgnore.writeAsStringSync(
-            c.patterns[directory]!.join('\n') + '\n',
+            '${c.patterns[directory]!.join('\n')}\n',
           );
         }
         final process = runGit(
@@ -173,10 +173,10 @@
       c.paths.forEach((path, expected) {
         var ignoreCase = c.ignoreCase;
         if (ignoreCase == null) {
-          _testIgnorePath(c, path, expected, false);
-          _testIgnorePath(c, path, expected, true);
+          testIgnorePath(c, path, expected, false);
+          testIgnorePath(c, path, expected, true);
         } else {
-          _testIgnorePath(c, path, expected, ignoreCase);
+          testIgnorePath(c, path, expected, ignoreCase);
         }
       });
     }
diff --git a/test/lish/archives_and_uploads_a_package_test.dart b/test/lish/archives_and_uploads_a_package_test.dart
index b033e28..41db57c 100644
--- a/test/lish/archives_and_uploads_a_package_test.dart
+++ b/test/lish/archives_and_uploads_a_package_test.dart
@@ -67,7 +67,7 @@
     await d.tokensFile({
       'version': 1,
       'hosted': [
-        {'url': globalServer.url + '/sub/folder', 'env': 'TOKEN'},
+        {'url': '${globalServer.url}/sub/folder', 'env': 'TOKEN'},
       ]
     }).create();
     var pub = await startPublish(
diff --git a/test/package_server.dart b/test/package_server.dart
index 952c189..6aaea68 100644
--- a/test/package_server.dart
+++ b/test/package_server.dart
@@ -186,7 +186,7 @@
     contents ??= [d.libDir(name, '$name $version')];
     contents = [d.file('pubspec.yaml', yaml(pubspecFields)), ...contents];
 
-    var package = _packages.putIfAbsent(name, () => _ServedPackage());
+    var package = _packages.putIfAbsent(name, _ServedPackage.new);
     package.versions[version] = _ServedPackageVersion(
       pubspecFields,
       contents: () {
diff --git a/test/utils_test.dart b/test/utils_test.dart
index c416951..78ccbaf 100644
--- a/test/utils_test.dart
+++ b/test/utils_test.dart
@@ -128,7 +128,7 @@
     test('is stable', () async {
       {
         final completers = <String, Completer>{};
-        Completer completer(k) => completers.putIfAbsent(k, () => Completer());
+        Completer completer(k) => completers.putIfAbsent(k, Completer.new);
         Future<int> lengthWhenComplete(String s) async {
           await completer(s).future;
           return s.length;
@@ -145,7 +145,7 @@
       }
       {
         final completers = <String, Completer>{};
-        Completer completer(k) => completers.putIfAbsent(k, () => Completer());
+        Completer completer(k) => completers.putIfAbsent(k, Completer.new);
         Future<int> lengthWhenComplete(String s) async {
           await completer(s).future;
           return s.length;
diff --git a/test/validator/pubspec_test.dart b/test/validator/pubspec_test.dart
index ea0f5af..c7e1272 100644
--- a/test/validator/pubspec_test.dart
+++ b/test/validator/pubspec_test.dart
@@ -13,7 +13,7 @@
   test('should consider a package valid if it has a pubspec', () async {
     await d.validPackage.create();
 
-    await expectValidation(() => PubspecValidator());
+    await expectValidation(PubspecValidator.new);
   });
 
   test('should consider a package invalid if it has a .gitignored pubspec',
@@ -22,6 +22,6 @@
     await d.validPackage.create();
     await repo.create();
 
-    await expectValidation(() => PubspecValidator(), errors: isNotEmpty);
+    await expectValidation(PubspecValidator.new, errors: isNotEmpty);
   });
 }
diff --git a/test/validator/size_test.dart b/test/validator/size_test.dart
index ba5151d..0773bc1 100644
--- a/test/validator/size_test.dart
+++ b/test/validator/size_test.dart
@@ -13,7 +13,7 @@
 
 Future<void> expectSizeValidationError(Matcher matcher) async {
   await expectValidation(
-    () => SizeValidator(),
+    SizeValidator.new,
     size: 100 * (1 << 20) + 1,
     errors: contains(matcher),
   );
@@ -23,8 +23,8 @@
   test('considers a package valid if it is <= 100 MB', () async {
     await d.validPackage.create();
 
-    await expectValidation(() => SizeValidator(), size: 100);
-    await expectValidation(() => SizeValidator(), size: 100 * (1 << 20));
+    await expectValidation(SizeValidator.new, size: 100);
+    await expectValidation(SizeValidator.new, size: 100 * (1 << 20));
   });
 
   group('considers a package invalid if it is more than 100 MB', () {
diff --git a/tool/extract_all_pub_dev.dart b/tool/extract_all_pub_dev.dart
index f96dc5a..323c05c 100644
--- a/tool/extract_all_pub_dev.dart
+++ b/tool/extract_all_pub_dev.dart
@@ -84,7 +84,7 @@
                     .send(http.Request('GET', Uri.parse(archiveUrl)));
                 await extractTarGz(response.stream, tempDir);
                 print('Extracted $archiveUrl');
-              } catch (e, _) {
+              } catch (e) {
                 print('Failed to get and extract $archiveUrl $e');
                 failures.add({'archive': archiveUrl, 'error': e.toString()});
                 allVersionsGood = false;
diff --git a/tool/test-bin/pub_command_runner.dart b/tool/test-bin/pub_command_runner.dart
index e438aae..3c1bef9 100644
--- a/tool/test-bin/pub_command_runner.dart
+++ b/tool/test-bin/pub_command_runner.dart
@@ -14,7 +14,7 @@
 import 'package:pub/src/log.dart' as log;
 import 'package:usage/usage.dart';
 
-final _LoggingAnalytics loggingAnalytics = _LoggingAnalytics();
+final Analytics loggingAnalytics = _LoggingAnalytics();
 
 // A command for explicitly throwing an exception, to test the handling of
 // unexpected eceptions.