Tidy code in dartdev

Just code I was tidying while investigating a dartdev bug. Complies
better with Effective Dart.

* https://dart.dev/guides/language/effective-dart/design#dont-redundantly-type-annotate-initialized-local-variables
* https://dart.dev/guides/language/effective-dart/design#avoid-abbreviations

Also restrict a utility function to accept a non-nullable String and
return a non-nullable String.

Change-Id: I465a320cbd4fe9f7625119e873f67425b4caf8e2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/234680
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
diff --git a/pkg/dartdev/lib/src/analysis_server.dart b/pkg/dartdev/lib/src/analysis_server.dart
index c02c75c..c9fe68b0 100644
--- a/pkg/dartdev/lib/src/analysis_server.dart
+++ b/pkg/dartdev/lib/src/analysis_server.dart
@@ -84,7 +84,7 @@
 
   Future<void> start({bool setAnalysisRoots = true}) async {
     preAnalysisServerStart?.call(commandName, analysisRoots, argResults);
-    final List<String> command = <String>[
+    final command = [
       sdk.analysisServerSnapshot,
       '--${Driver.SUPPRESS_ANALYTICS_FLAG}',
       '--${Driver.CLIENT_ID}=dart-$commandName',
@@ -121,14 +121,15 @@
     // protocol throws an error (INVALID_FILE_PATH_FORMAT) if there is a
     // trailing slash.
     //
-    // The call to absolute.resolveSymbolicLinksSync() canonicalizes the path to
-    // be passed to the analysis server.
-    List<String> analysisRootPaths = analysisRoots.map((root) {
-      return trimEnd(
-          root.absolute.resolveSymbolicLinksSync(), path.context.separator)!;
-    }).toList();
+    // The call to `absolute.resolveSymbolicLinksSync()` canonicalizes the path
+    // to be passed to the analysis server.
+    final analysisRootPaths = [
+      for (final root in analysisRoots)
+        trimEnd(
+            root.absolute.resolveSymbolicLinksSync(), path.context.separator),
+    ];
 
-    onAnalyzing.listen((bool isAnalyzing) {
+    onAnalyzing.listen((isAnalyzing) {
       if (isAnalyzing && _analysisFinished.isCompleted) {
         // Start a new completer, to be completed when we receive the
         // corresponding analysis complete event.
@@ -139,9 +140,9 @@
     });
 
     if (setAnalysisRoots) {
-      await _sendCommand('analysis.setAnalysisRoots', params: <String, dynamic>{
+      await _sendCommand('analysis.setAnalysisRoots', params: {
         'included': analysisRootPaths,
-        'excluded': <String>[]
+        'excluded': [],
       });
     }
   }
diff --git a/pkg/dartdev/lib/src/utils.dart b/pkg/dartdev/lib/src/utils.dart
index f4c5676..a80f7bd 100644
--- a/pkg/dartdev/lib/src/utils.dart
+++ b/pkg/dartdev/lib/src/utils.dart
@@ -31,8 +31,8 @@
 }
 
 /// String utility to trim some suffix from the end of a [String].
-String? trimEnd(String? s, String? suffix) {
-  if (s != null && suffix != null && suffix.isNotEmpty && s.endsWith(suffix)) {
+String trimEnd(String s, String? suffix) {
+  if (suffix != null && suffix.isNotEmpty && s.endsWith(suffix)) {
     return s.substring(0, s.length - suffix.length);
   }
   return s;
diff --git a/pkg/dartdev/test/commands/analyze_test.dart b/pkg/dartdev/test/commands/analyze_test.dart
index 04fc049..a75b441 100644
--- a/pkg/dartdev/test/commands/analyze_test.dart
+++ b/pkg/dartdev/test/commands/analyze_test.dart
@@ -172,15 +172,13 @@
 }
 
 void defineAnalyze() {
-  TestProject? p;
+  late TestProject p;
 
-  setUp(() => p = null);
-
-  tearDown(() async => await p?.dispose());
+  tearDown(() async => await p.dispose());
 
   test('--help', () async {
     p = project();
-    var result = await p!.run(['analyze', '--help']);
+    var result = await p.run(['analyze', '--help']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -190,7 +188,7 @@
 
   test('--help --verbose', () async {
     p = project();
-    var result = await p!.run(['analyze', '--help', '--verbose']);
+    var result = await p.run(['analyze', '--help', '--verbose']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -206,8 +204,7 @@
     test('folder and file', () async {
       p = project(mainSrc: "int get foo => 'str';\n");
       secondProject = project(mainSrc: "int get foo => 'str';\n");
-      var result =
-          await p!.run(['analyze', p!.dirPath, secondProject.mainPath]);
+      var result = await p.run(['analyze', p.dirPath, secondProject.mainPath]);
 
       expect(result.exitCode, 3);
       expect(result.stderr, isEmpty);
@@ -220,7 +217,7 @@
     test('two folders', () async {
       p = project(mainSrc: "int get foo => 'str';\n");
       secondProject = project(mainSrc: "int get foo => 'str';\n");
-      var result = await p!.run(['analyze', p!.dirPath, secondProject.dirPath]);
+      var result = await p.run(['analyze', p.dirPath, secondProject.dirPath]);
 
       expect(result.exitCode, 3);
       expect(result.stderr, isEmpty);
@@ -233,7 +230,7 @@
 
   test('no such directory', () async {
     p = project();
-    var result = await p!.run(['analyze', '/no/such/dir1/']);
+    var result = await p.run(['analyze', '/no/such/dir1/']);
 
     expect(result.exitCode, 64);
     expect(result.stdout, isEmpty);
@@ -245,7 +242,7 @@
   test('current working directory', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
 
-    var result = await p!.run(['analyze'], workingDir: p!.dirPath);
+    var result = await p.run(['analyze'], workingDir: p.dirPath);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -255,7 +252,7 @@
   group('single directory', () {
     test('no errors', () async {
       p = project(mainSrc: 'int get foo => 1;\n');
-      var result = await p!.run(['analyze', p!.dirPath]);
+      var result = await p.run(['analyze', p.dirPath]);
 
       expect(result.exitCode, 0);
       expect(result.stderr, isEmpty);
@@ -264,7 +261,7 @@
 
     test('one error', () async {
       p = project(mainSrc: "int get foo => 'str';\n");
-      var result = await p!.run(['analyze', p!.dirPath]);
+      var result = await p.run(['analyze', p.dirPath]);
 
       expect(result.exitCode, 3);
       expect(result.stderr, isEmpty);
@@ -276,7 +273,7 @@
 
     test('two errors', () async {
       p = project(mainSrc: "int get foo => 'str';\nint get bar => 'str';\n");
-      var result = await p!.run(['analyze', p!.dirPath]);
+      var result = await p.run(['analyze', p.dirPath]);
 
       expect(result.exitCode, 3);
       expect(result.stderr, isEmpty);
@@ -287,7 +284,7 @@
   group('single file', () {
     test('no errors', () async {
       p = project(mainSrc: 'int get foo => 1;\n');
-      var result = await p!.run(['analyze', p!.mainPath]);
+      var result = await p.run(['analyze', p.mainPath]);
 
       expect(result.exitCode, 0);
       expect(result.stderr, isEmpty);
@@ -296,7 +293,7 @@
 
     test('one error', () async {
       p = project(mainSrc: "int get foo => 'str';\n");
-      var result = await p!.run(['analyze', p!.mainPath]);
+      var result = await p.run(['analyze', p.mainPath]);
 
       expect(result.exitCode, 3);
       expect(result.stderr, isEmpty);
@@ -311,7 +308,7 @@
     p = project(
         mainSrc: _unusedImportCodeSnippet,
         analysisOptions: _unusedImportAnalysisOptions);
-    var result = await p!.run(['analyze', '--fatal-warnings', p!.dirPath]);
+    var result = await p.run(['analyze', '--fatal-warnings', p.dirPath]);
 
     expect(result.exitCode, equals(2));
     expect(result.stderr, isEmpty);
@@ -322,7 +319,7 @@
     p = project(
         mainSrc: _unusedImportCodeSnippet,
         analysisOptions: _unusedImportAnalysisOptions);
-    var result = await p!.run(['analyze', p!.dirPath]);
+    var result = await p.run(['analyze', p.dirPath]);
 
     expect(result.exitCode, equals(2));
     expect(result.stderr, isEmpty);
@@ -333,7 +330,7 @@
     p = project(
         mainSrc: _unusedImportCodeSnippet,
         analysisOptions: _unusedImportAnalysisOptions);
-    var result = await p!.run(['analyze', '--no-fatal-warnings', p!.dirPath]);
+    var result = await p.run(['analyze', '--no-fatal-warnings', p.dirPath]);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -342,7 +339,7 @@
 
   test('info implicit no --fatal-infos', () async {
     p = project(mainSrc: dartVersionFilePrefix2_9 + 'String foo() {}');
-    var result = await p!.run(['analyze', p!.dirPath]);
+    var result = await p.run(['analyze', p.dirPath]);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -351,7 +348,7 @@
 
   test('info --fatal-infos', () async {
     p = project(mainSrc: dartVersionFilePrefix2_9 + 'String foo() {}');
-    var result = await p!.run(['analyze', '--fatal-infos', p!.dirPath]);
+    var result = await p.run(['analyze', '--fatal-infos', p.dirPath]);
 
     expect(result.exitCode, 1);
     expect(result.stderr, isEmpty);
@@ -365,7 +362,7 @@
   var one = 1;
   return result;
 }''');
-    var result = await p!.run(['analyze', '--verbose', p!.dirPath]);
+    var result = await p.run(['analyze', '--verbose', p.dirPath]);
 
     expect(result.exitCode, 3);
     expect(result.stderr, isEmpty);
@@ -387,7 +384,7 @@
 void f() {
   my_foo;
 }''');
-      p!.file('my_packages.json', '''
+      p.file('my_packages.json', '''
 {
   "configVersion": 2,
   "packages": [
@@ -400,10 +397,10 @@
   ]
 }
 ''');
-      var result = await p!.run([
+      var result = await p.run([
         'analyze',
-        '--packages=${p!.findFile('my_packages.json')!.path}',
-        p!.dirPath,
+        '--packages=${p.findFile('my_packages.json')!.path}',
+        p.dirPath,
       ]);
 
       expect(result.exitCode, 0);
@@ -413,10 +410,10 @@
 
     test('not existing', () async {
       p = project();
-      var result = await p!.run([
+      var result = await p.run([
         'analyze',
         '--packages=no.such.file',
-        p!.dirPath,
+        p.dirPath,
       ]);
 
       expect(result.exitCode, 64);
@@ -429,10 +426,10 @@
     var cache = project(name: 'cache');
 
     p = project(mainSrc: 'var v = 0;');
-    var result = await p!.run([
+    var result = await p.run([
       'analyze',
       '--cache=${cache.dirPath}',
-      p!.mainPath,
+      p.mainPath,
     ]);
 
     expect(result.exitCode, 0);
diff --git a/pkg/dartdev/test/utils.dart b/pkg/dartdev/test/utils.dart
index 996b98b..e77686f 100644
--- a/pkg/dartdev/test/utils.dart
+++ b/pkg/dartdev/test/utils.dart
@@ -126,7 +126,7 @@
     List<String> arguments, {
     String? workingDir,
   }) async {
-    _process = await Process.start(
+    final process = await Process.start(
         Platform.resolvedExecutable,
         [
           '--no-analytics',
@@ -137,12 +137,12 @@
           if (logAnalytics) '_DARTDEV_LOG_ANALYTICS': 'true',
           'PUB_CACHE': pubCachePath,
         });
-    final proc = _process!;
-    final stdoutContents = proc.stdout.transform(utf8.decoder).join();
-    final stderrContents = proc.stderr.transform(utf8.decoder).join();
-    final code = await proc.exitCode;
+    _process = process;
+    final stdoutContents = process.stdout.transform(utf8.decoder).join();
+    final stderrContents = process.stderr.transform(utf8.decoder).join();
+    final code = await process.exitCode;
     return ProcessResult(
-      proc.pid,
+      process.pid,
       code,
       await stdoutContents,
       await stderrContents,
diff --git a/pkg/dartdev/test/utils_test.dart b/pkg/dartdev/test/utils_test.dart
index 83f2567..811a0a5 100644
--- a/pkg/dartdev/test/utils_test.dart
+++ b/pkg/dartdev/test/utils_test.dart
@@ -37,10 +37,6 @@
   });
 
   group('trimEnd', () {
-    test('null string', () {
-      expect(trimEnd(null, 'suffix'), null);
-    });
-
     test('null suffix', () {
       expect(trimEnd('string', null), 'string');
     });