Enable and fix a number of lints
diff --git a/pkgs/pubspec_parse/analysis_options.yaml b/pkgs/pubspec_parse/analysis_options.yaml
index ed170c1..b959116 100644
--- a/pkgs/pubspec_parse/analysis_options.yaml
+++ b/pkgs/pubspec_parse/analysis_options.yaml
@@ -20,12 +20,13 @@
     - avoid_renaming_method_parameters
     - avoid_return_types_on_setters
     - avoid_returning_null
+    - avoid_returning_null_for_future
+    - avoid_shadowing_type_parameters
     - avoid_types_as_parameter_names
     - avoid_unused_constructor_parameters
     - await_only_futures
     - camel_case_types
     - cancel_subscriptions
-    #- cascade_invocations
     - comment_references
     - constant_identifier_names
     - control_flow_in_finally
@@ -44,10 +45,11 @@
     - no_adjacent_strings_in_list
     - no_duplicate_case_values
     - non_constant_identifier_names
+    - null_closures
     - omit_local_variable_types
     - only_throw_errors
     - overridden_fields
-    #- package_api_docs
+    - package_api_docs
     - package_names
     - package_prefixed_library_names
     - prefer_adjacent_string_concatenation
@@ -57,6 +59,7 @@
     - prefer_contains
     - prefer_equal_for_default_values
     - prefer_final_fields
+    - prefer_final_locals
     - prefer_initializing_formals
     - prefer_interpolation_to_compose_strings
     - prefer_is_empty
@@ -70,14 +73,17 @@
     - throw_in_finally
     - type_init_formals
     - unawaited_futures
+    - unnecessary_await_in_return
     - unnecessary_brace_in_string_interps
     - unnecessary_const
     - unnecessary_getters_setters
     - unnecessary_lambdas
     - unnecessary_new
     - unnecessary_null_aware_assignments
+    - unnecessary_parenthesis
     - unnecessary_statements
     - unnecessary_this
     - unrelated_type_equality_checks
+    - use_function_type_syntax_for_parameters
     - use_rethrow_when_possible
     - valid_regexps
diff --git a/pkgs/pubspec_parse/lib/src/dependency.dart b/pkgs/pubspec_parse/lib/src/dependency.dart
index 0fb761c..cba01dc 100644
--- a/pkgs/pubspec_parse/lib/src/dependency.dart
+++ b/pkgs/pubspec_parse/lib/src/dependency.dart
@@ -12,7 +12,7 @@
 
 Map<String, Dependency> parseDeps(Map source) =>
     source?.map((k, v) {
-      var key = k as String;
+      final key = k as String;
       Dependency value;
       try {
         value = _fromJson(v);
@@ -23,7 +23,7 @@
           // extract the associated error information.
 
           var message = e.message;
-          var innerError = e.innerError;
+          final innerError = e.innerError;
           // json_annotation should handle FormatException...
           // https://github.com/dart-lang/json_serializable/issues/233
           if (innerError is FormatException) {
@@ -51,13 +51,13 @@
   }
 
   if (data is Map) {
-    var matchedKeys =
+    final matchedKeys =
         data.keys.cast<String>().where((key) => key != 'version').toList();
 
     if (data.isEmpty || (matchedKeys.isEmpty && data.containsKey('version'))) {
       return _$HostedDependencyFromJson(data);
     } else {
-      var weirdKey = matchedKeys.firstWhere((k) => !_sourceKeys.contains(k),
+      final weirdKey = matchedKeys.firstWhere((k) => !_sourceKeys.contains(k),
           orElse: () => null);
 
       if (weirdKey != null) {
@@ -69,7 +69,7 @@
             'A dependency may only have one source.');
       }
 
-      var key = matchedKeys.single;
+      final key = matchedKeys.single;
 
       try {
         switch (key) {
@@ -146,7 +146,7 @@
 /// Supports URIs like `[user@]host.xz:path/to/repo.git/`
 /// See https://git-scm.com/docs/git-clone#_git_urls_a_id_urls_a
 Uri _tryParseScpUri(String value) {
-  var colonIndex = value.indexOf(':');
+  final colonIndex = value.indexOf(':');
 
   if (colonIndex < 0) {
     return null;
@@ -154,7 +154,7 @@
     // If the first colon is part of a scheme, it's not an scp-like URI
     return null;
   }
-  var slashIndex = value.indexOf('/');
+  final slashIndex = value.indexOf('/');
 
   if (slashIndex >= 0 && slashIndex < colonIndex) {
     // Per docs: This syntax is only recognized if there are no slashes before
@@ -164,11 +164,11 @@
     return null;
   }
 
-  var atIndex = value.indexOf('@');
+  final atIndex = value.indexOf('@');
   if (colonIndex > atIndex) {
-    var user = atIndex >= 0 ? value.substring(0, atIndex) : null;
-    var host = value.substring(atIndex + 1, colonIndex);
-    var path = value.substring(colonIndex + 1);
+    final user = atIndex >= 0 ? value.substring(0, atIndex) : null;
+    final host = value.substring(atIndex + 1, colonIndex);
+    final path = value.substring(colonIndex + 1);
     return Uri(scheme: 'ssh', userInfo: user, host: host, path: path);
   }
   return null;
diff --git a/pkgs/pubspec_parse/lib/src/errors.dart b/pkgs/pubspec_parse/lib/src/errors.dart
index 637c5a8..aba6970 100644
--- a/pkgs/pubspec_parse/lib/src/errors.dart
+++ b/pkgs/pubspec_parse/lib/src/errors.dart
@@ -10,13 +10,13 @@
 
 ParsedYamlException parsedYamlExceptionFromError(
     CheckedFromJsonException error, StackTrace stack) {
-  var innerError = error.innerError;
+  final innerError = error.innerError;
   if (innerError is InvalidKeyException) {
-    var map = innerError.map;
+    final map = innerError.map;
     if (map is YamlMap) {
       // if the associated key exists, use that as the error node,
       // otherwise use the map itself
-      var node = map.nodes.keys.cast<YamlNode>().singleWhere((key) {
+      final node = map.nodes.keys.cast<YamlNode>().singleWhere((key) {
         return key.value == innerError.key;
       }, orElse: () => map);
 
@@ -27,7 +27,7 @@
     return innerError;
   }
 
-  var yamlMap = error.map as YamlMap;
+  final yamlMap = error.map as YamlMap;
   var yamlNode = yamlMap.nodes[error.key];
 
   String message;
diff --git a/pkgs/pubspec_parse/lib/src/pubspec.dart b/pkgs/pubspec_parse/lib/src/pubspec.dart
index a8ef2fe..df71262 100644
--- a/pkgs/pubspec_parse/lib/src/pubspec.dart
+++ b/pkgs/pubspec_parse/lib/src/pubspec.dart
@@ -78,7 +78,7 @@
   factory Pubspec.fromJson(Map json) => _$PubspecFromJson(json);
 
   factory Pubspec.parse(String yaml, {sourceUrl}) {
-    var item = loadYaml(yaml, sourceUrl: sourceUrl);
+    final item = loadYaml(yaml, sourceUrl: sourceUrl);
 
     if (item == null) {
       throw ArgumentError.notNull('yaml');
@@ -100,7 +100,7 @@
   }
 
   static List<String> _normalizeAuthors(String author, List<String> authors) {
-    var value = Set<String>();
+    final value = Set<String>();
     if (author != null) {
       value.add(author);
     }
@@ -115,7 +115,7 @@
 
 Map<String, VersionConstraint> _environmentMap(Map source) =>
     source.map((k, value) {
-      var key = k as String;
+      final key = k as String;
       if (key == 'dart') {
         // github.com/dart-lang/pub/blob/d84173eeb03c3/lib/src/pubspec.dart#L342
         // 'dart' is not allowed as a key!
diff --git a/pkgs/pubspec_parse/test/dependency_test.dart b/pkgs/pubspec_parse/test/dependency_test.dart
index 3bc890a..6c7d968 100644
--- a/pkgs/pubspec_parse/test/dependency_test.dart
+++ b/pkgs/pubspec_parse/test/dependency_test.dart
@@ -4,8 +4,8 @@
 
 import 'dart:io';
 
-import 'package:pubspec_parse/pubspec_parse.dart';
 import 'package:pub_semver/pub_semver.dart';
+import 'package:pubspec_parse/pubspec_parse.dart';
 import 'package:test/test.dart';
 
 import 'test_utils.dart';
@@ -49,20 +49,20 @@
 
 void _hostedDependency() {
   test('null', () {
-    var dep = _dependency<HostedDependency>(null);
+    final dep = _dependency<HostedDependency>(null);
     expect(dep.version.toString(), 'any');
     expect(dep.hosted, isNull);
     expect(dep.toString(), 'HostedDependency: any');
   });
 
   test('empty map', () {
-    var dep = _dependency<HostedDependency>({});
+    final dep = _dependency<HostedDependency>({});
     expect(dep.hosted, isNull);
     expect(dep.toString(), 'HostedDependency: any');
   });
 
   test('string version', () {
-    var dep = _dependency<HostedDependency>('^1.0.0');
+    final dep = _dependency<HostedDependency>('^1.0.0');
     expect(dep.version.toString(), '^1.0.0');
     expect(dep.hosted, isNull);
     expect(dep.toString(), 'HostedDependency: ^1.0.0');
@@ -76,14 +76,14 @@
   });
 
   test('map w/ just version', () {
-    var dep = _dependency<HostedDependency>({'version': '^1.0.0'});
+    final dep = _dependency<HostedDependency>({'version': '^1.0.0'});
     expect(dep.version.toString(), '^1.0.0');
     expect(dep.hosted, isNull);
     expect(dep.toString(), 'HostedDependency: ^1.0.0');
   });
 
   test('map w/ version and hosted as Map', () {
-    var dep = _dependency<HostedDependency>({
+    final dep = _dependency<HostedDependency>({
       'version': '^1.0.0',
       'hosted': {'name': 'hosted_name', 'url': 'hosted_url'}
     });
@@ -115,7 +115,7 @@
   });
 
   test('map w/ version and hosted as String', () {
-    var dep = _dependency<HostedDependency>(
+    final dep = _dependency<HostedDependency>(
         {'version': '^1.0.0', 'hosted': 'hosted_name'});
     expect(dep.version.toString(), '^1.0.0');
     expect(dep.hosted.name, 'hosted_name');
@@ -124,7 +124,7 @@
   });
 
   test('map w/ hosted as String', () {
-    var dep = _dependency<HostedDependency>({'hosted': 'hosted_name'});
+    final dep = _dependency<HostedDependency>({'hosted': 'hosted_name'});
     expect(dep.version, VersionConstraint.any);
     expect(dep.hosted.name, 'hosted_name');
     expect(dep.hosted.url, isNull);
@@ -139,7 +139,7 @@
   });
 
   test('map w/ null version is fine', () {
-    var dep = _dependency<HostedDependency>({'version': null});
+    final dep = _dependency<HostedDependency>({'version': null});
     expect(dep.version, VersionConstraint.any);
     expect(dep.hosted, isNull);
     expect(dep.toString(), 'HostedDependency: any');
@@ -148,14 +148,14 @@
 
 void _sdkDependency() {
   test('without version', () {
-    var dep = _dependency<SdkDependency>({'sdk': 'flutter'});
+    final dep = _dependency<SdkDependency>({'sdk': 'flutter'});
     expect(dep.sdk, 'flutter');
     expect(dep.version, isNull);
     expect(dep.toString(), 'SdkDependency: flutter');
   });
 
   test('with version', () {
-    var dep = _dependency<SdkDependency>(
+    final dep = _dependency<SdkDependency>(
         {'sdk': 'flutter', 'version': '>=1.2.3 <2.0.0'});
     expect(dep.sdk, 'flutter');
     expect(dep.version.toString(), '>=1.2.3 <2.0.0');
@@ -179,7 +179,7 @@
 
 void _gitDependency() {
   test('string', () {
-    var dep = _dependency<GitDependency>({'git': 'url'});
+    final dep = _dependency<GitDependency>({'git': 'url'});
     expect(dep.url.toString(), 'url');
     expect(dep.path, isNull);
     expect(dep.ref, isNull);
@@ -188,7 +188,7 @@
 
   test('string with version key is ignored', () {
     // Regression test for https://github.com/dart-lang/pubspec_parse/issues/13
-    var dep = _dependency<GitDependency>({'git': 'url', 'version': '^1.2.3'});
+    final dep = _dependency<GitDependency>({'git': 'url', 'version': '^1.2.3'});
     expect(dep.url.toString(), 'url');
     expect(dep.path, isNull);
     expect(dep.ref, isNull);
@@ -196,11 +196,11 @@
   });
 
   test('string with user@ URL', () {
-    var skipTryParse = Platform.environment.containsKey('TRAVIS');
+    final skipTryParse = Platform.environment.containsKey('TRAVIS');
     if (skipTryParse) {
       print('FYI: not validating git@ URI on travis due to failure');
     }
-    var dep = _dependency<GitDependency>({'git': 'git@localhost:dep.git'},
+    final dep = _dependency<GitDependency>({'git': 'git@localhost:dep.git'},
         skipTryPub: skipTryParse);
     expect(dep.url.toString(), 'ssh://git@localhost/dep.git');
     expect(dep.path, isNull);
@@ -216,7 +216,7 @@
   });
 
   test('map', () {
-    var dep = _dependency<GitDependency>({
+    final dep = _dependency<GitDependency>({
       'git': {'url': 'url', 'path': 'path', 'ref': 'ref'}
     });
     expect(dep.url.toString(), 'url');
@@ -267,13 +267,13 @@
 
 void _pathDependency() {
   test('valid', () {
-    var dep = _dependency<PathDependency>({'path': '../path'});
+    final dep = _dependency<PathDependency>({'path': '../path'});
     expect(dep.path, '../path');
     expect(dep.toString(), 'PathDependency: path@../path');
   });
 
   test('valid with version key is ignored', () {
-    var dep =
+    final dep =
         _dependency<PathDependency>({'path': '../path', 'version': '^1.2.3'});
     expect(dep.path, '../path');
     expect(dep.toString(), 'PathDependency: path@../path');
@@ -309,14 +309,14 @@
 }
 
 T _dependency<T extends Dependency>(Object content, {bool skipTryPub = false}) {
-  var value = parse({
+  final value = parse({
     'name': 'sample',
     'dependencies': {'dep': content}
   }, skipTryPub: skipTryPub);
   expect(value.name, 'sample');
   expect(value.dependencies, hasLength(1));
 
-  var entry = value.dependencies.entries.single;
+  final entry = value.dependencies.entries.single;
   expect(entry.key, 'dep');
 
   return entry.value as T;
diff --git a/pkgs/pubspec_parse/test/git_uri_test.dart b/pkgs/pubspec_parse/test/git_uri_test.dart
index a1cfdf9..36e55a8 100644
--- a/pkgs/pubspec_parse/test/git_uri_test.dart
+++ b/pkgs/pubspec_parse/test/git_uri_test.dart
@@ -1,6 +1,5 @@
-import 'package:test/test.dart';
-
 import 'package:pubspec_parse/src/dependency.dart';
+import 'package:test/test.dart';
 
 void main() {
   for (var item in {
@@ -14,7 +13,7 @@
     'file:///path/to/repo.git/': 'file:///path/to/repo.git/',
   }.entries) {
     test(item.key, () {
-      var uri = parseGitUri(item.key);
+      final uri = parseGitUri(item.key);
 
       printOnFailure(
           [uri.scheme, uri.userInfo, uri.host, uri.port, uri.path].join('\n'));
diff --git a/pkgs/pubspec_parse/test/parse_test.dart b/pkgs/pubspec_parse/test/parse_test.dart
index 3ed73a5..df2475b 100644
--- a/pkgs/pubspec_parse/test/parse_test.dart
+++ b/pkgs/pubspec_parse/test/parse_test.dart
@@ -9,7 +9,7 @@
 
 void main() {
   test('minimal set values', () {
-    var value = parse({'name': 'sample'});
+    final value = parse({'name': 'sample'});
     expect(value.name, 'sample');
     expect(value.version, isNull);
     expect(value.description, isNull);
@@ -25,9 +25,9 @@
   });
 
   test('all fields set', () {
-    var version = Version.parse('1.2.3');
-    var sdkConstraint = VersionConstraint.parse('>=2.0.0-dev.54 <3.0.0');
-    var value = parse({
+    final version = Version.parse('1.2.3');
+    final sdkConstraint = VersionConstraint.parse('>=2.0.0-dev.54 <3.0.0');
+    final value = parse({
       'name': 'sample',
       'version': version.toString(),
       'author': 'name@example.com',
@@ -52,7 +52,7 @@
   });
 
   test('environment values can be null', () {
-    var value = parse({
+    final value = parse({
       'name': 'sample',
       'environment': {'sdk': null}
     });
@@ -63,14 +63,14 @@
 
   group('author, authors', () {
     test('one author', () {
-      var value = parse({'name': 'sample', 'author': 'name@example.com'});
+      final value = parse({'name': 'sample', 'author': 'name@example.com'});
       // ignore: deprecated_member_use
       expect(value.author, 'name@example.com');
       expect(value.authors, ['name@example.com']);
     });
 
     test('one author, via authors', () {
-      var value = parse({
+      final value = parse({
         'name': 'sample',
         'authors': ['name@example.com']
       });
@@ -80,7 +80,7 @@
     });
 
     test('many authors', () {
-      var value = parse({
+      final value = parse({
         'name': 'sample',
         'authors': ['name@example.com', 'name2@example.com']
       });
@@ -90,7 +90,7 @@
     });
 
     test('author and authors', () {
-      var value = parse({
+      final value = parse({
         'name': 'sample',
         'author': 'name@example.com',
         'authors': ['name2@example.com']
@@ -101,7 +101,7 @@
     });
 
     test('duplicate author values', () {
-      var value = parse({
+      final value = parse({
         'name': 'sample',
         'author': 'name@example.com',
         'authors': ['name@example.com', 'name@example.com']
diff --git a/pkgs/pubspec_parse/test/pub_utils.dart b/pkgs/pubspec_parse/test/pub_utils.dart
index f9e2f0c..1ebb9c7 100644
--- a/pkgs/pubspec_parse/test/pub_utils.dart
+++ b/pkgs/pubspec_parse/test/pub_utils.dart
@@ -13,10 +13,10 @@
 Future<ProcResult> tryPub(String content) async {
   await d.file('pubspec.yaml', content).create();
 
-  var proc = await TestProcess.start(_pubPath, ['get', '--offline'],
+  final proc = await TestProcess.start(_pubPath, ['get', '--offline'],
       workingDirectory: d.sandbox);
 
-  var result = await ProcResult.fromTestProcess(proc);
+  final result = await ProcResult.fromTestProcess(proc);
 
   printOnFailure([
     '-----BEGIN pub output-----',
@@ -25,7 +25,7 @@
   ].join('\n'));
 
   if (result.exitCode == 0) {
-    var lockContent =
+    final lockContent =
         File(p.join(d.sandbox, 'pubspec.lock')).readAsStringSync();
 
     printOnFailure([
@@ -47,9 +47,9 @@
   ProcResult(this.exitCode, this.lines);
 
   static Future<ProcResult> fromTestProcess(TestProcess proc) async {
-    var items = <ProcLine>[];
+    final items = <ProcLine>[];
 
-    var values = await Future.wait([
+    final values = await Future.wait([
       proc.exitCode,
       proc.stdoutStream().forEach((line) => items.add(ProcLine(false, line))),
       proc.stderrStream().forEach((line) => items.add(ProcLine(true, line))),
@@ -60,7 +60,7 @@
 
   @override
   String toString() {
-    var buffer = StringBuffer('Exit code: $exitCode');
+    final buffer = StringBuffer('Exit code: $exitCode');
     for (var line in lines) {
       buffer.write('\n$line');
     }
@@ -79,13 +79,13 @@
 }
 
 /// The path to the root directory of the SDK.
-final String _sdkDir = (() {
+final String _sdkDir = () {
   // The Dart executable is in "/path/to/sdk/bin/dart", so two levels up is
   // "/path/to/sdk".
-  var aboveExecutable = p.dirname(p.dirname(Platform.resolvedExecutable));
+  final aboveExecutable = p.dirname(p.dirname(Platform.resolvedExecutable));
   assert(FileSystemEntity.isFileSync(p.join(aboveExecutable, 'version')));
   return aboveExecutable;
-})();
+}();
 
 final String _pubPath =
     p.join(_sdkDir, 'bin', Platform.isWindows ? 'pub.bat' : 'pub');
diff --git a/pkgs/pubspec_parse/test/test_utils.dart b/pkgs/pubspec_parse/test/test_utils.dart
index d5254db..9750bfa 100644
--- a/pkgs/pubspec_parse/test/test_utils.dart
+++ b/pkgs/pubspec_parse/test/test_utils.dart
@@ -17,7 +17,7 @@
 
 Matcher _throwsParsedYamlException(String prettyValue) =>
     throwsA(const TypeMatcher<ParsedYamlException>().having((e) {
-      var message = e.formattedMessage;
+      final message = e.formattedMessage;
       printOnFailure("Actual error format:\nr'''\n$message'''");
       _printDebugParsedYamlException(e);
       return message;
@@ -28,7 +28,7 @@
   var innerStack = e.innerStack;
 
   if (e.innerError is CheckedFromJsonException) {
-    var cfje = e.innerError as CheckedFromJsonException;
+    final cfje = e.innerError as CheckedFromJsonException;
     if (cfje.innerError != null) {
       innerError = cfje.innerError;
       innerStack = cfje.innerStack;
@@ -36,12 +36,12 @@
   }
 
   if (innerError != null) {
-    var items = [innerError];
+    final items = [innerError];
     if (innerStack != null) {
       items.add(Trace.format(innerStack, terse: true));
     }
 
-    var content =
+    final content =
         LineSplitter.split(items.join('\n')).map((e) => '  $e').join('\n');
 
     printOnFailure('Inner error details:\n$content');
@@ -53,7 +53,7 @@
   quietOnError ??= false;
   skipTryPub ??= false;
 
-  var encoded = _encodeJson(content);
+  final encoded = _encodeJson(content);
 
   ProcResult pubResult;
   if (!skipTryPub) {
@@ -62,7 +62,7 @@
   }
 
   try {
-    var value = Pubspec.parse(encoded);
+    final value = Pubspec.parse(encoded);
 
     if (pubResult != null) {
       addTearDown(() {