[dartdev] some refactoring to the ArgParser handling code in dartdev

Change-Id: I727561cf542023426aa4f8a31427d951127c4f66
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/160703
Reviewed-by: Jaime Wren <jwren@google.com>
Commit-Queue: Devon Carew <devoncarew@google.com>
diff --git a/pkg/dartdev/analysis_options.yaml b/pkg/dartdev/analysis_options.yaml
index b1e4858..4416a89 100644
--- a/pkg/dartdev/analysis_options.yaml
+++ b/pkg/dartdev/analysis_options.yaml
@@ -37,7 +37,6 @@
     - prefer_asserts_in_initializer_lists
     - prefer_const_constructors
     - prefer_const_declarations
-    - prefer_expression_function_bodies
     - prefer_function_declarations_over_variables
     - prefer_initializing_formals
     - prefer_inlined_adds
diff --git a/pkg/dartdev/lib/dartdev.dart b/pkg/dartdev/lib/dartdev.dart
index 5c4c9b7..275c8c2 100644
--- a/pkg/dartdev/lib/dartdev.dart
+++ b/pkg/dartdev/lib/dartdev.dart
@@ -180,9 +180,8 @@
 
 class DartdevRunner<int> extends CommandRunner {
   @override
-  final ArgParser argParser = ArgParser(
-    usageLineLength: dartdevUsageLineLength,
-  );
+  final ArgParser argParser =
+      ArgParser(usageLineLength: dartdevUsageLineLength);
 
   static const String dartdevDescription =
       'A command-line utility for Dart development';
diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart
index 33d07c9..4b94bcf 100644
--- a/pkg/dartdev/lib/src/commands/compile.dart
+++ b/pkg/dartdev/lib/src/commands/compile.dart
@@ -5,14 +5,11 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:args/args.dart';
-import 'package:args/command_runner.dart';
 import 'package:dart2native/generate.dart';
 import 'package:path/path.dart' as path;
 
 import '../core.dart';
 import '../sdk.dart';
-import '../utils.dart';
 import '../vm_interop_handler.dart';
 
 const int compileErrorExitCode = 64;
@@ -230,22 +227,8 @@
   }
 }
 
-class CompileCommand extends Command {
-  // TODO(mit/jwren) Investigate and document why this command isn't a subtype
-  // of DartdevCommand, or change it to be a subtype, removing the requirement
-  // to have the following override.
-  @override
-  final ArgParser argParser = ArgParser(
-    usageLineLength: dartdevUsageLineLength,
-  );
-
-  @override
-  String get description => 'Compile Dart to various formats.';
-
-  @override
-  String get name => 'compile';
-
-  CompileCommand() {
+class CompileCommand extends DartdevCommand {
+  CompileCommand() : super('compile', 'Compile Dart to various formats.') {
     addSubcommand(CompileJSCommand());
     addSubcommand(CompileSnapshotCommand(
       commandName: 'jit-snapshot',
diff --git a/pkg/dartdev/lib/src/commands/fix.dart b/pkg/dartdev/lib/src/commands/fix.dart
index b0c09b0..36a8579 100644
--- a/pkg/dartdev/lib/src/commands/fix.dart
+++ b/pkg/dartdev/lib/src/commands/fix.dart
@@ -14,12 +14,8 @@
 import 'analyze_impl.dart';
 
 class FixCommand extends DartdevCommand {
-  FixCommand()
-      : super(
-          'fix', 'Fix Dart source code.',
-          // Experimental.
-          hidden: true,
-        );
+  // This command is hidden as its currently experimental.
+  FixCommand() : super('fix', 'Fix Dart source code.', hidden: true);
 
   @override
   FutureOr<int> run() async {
diff --git a/pkg/dartdev/lib/src/commands/pub.dart b/pkg/dartdev/lib/src/commands/pub.dart
index 7d91085..6b40ebc 100644
--- a/pkg/dartdev/lib/src/commands/pub.dart
+++ b/pkg/dartdev/lib/src/commands/pub.dart
@@ -15,7 +15,7 @@
   PubCommand() : super('pub', 'Work with packages.');
 
   @override
-  final ArgParser argParser = ArgParser.allowAnything();
+  ArgParser createArgParser() => ArgParser.allowAnything();
 
   @override
   void printUsage() {
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index a76009c..fe2f67a 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -26,11 +26,13 @@
   // provided before any command and to provide a more consistent help message
   // with the rest of the tool.
   @override
-  final ArgParser argParser = ArgParser(
-    // Don't parse flags after script name.
-    allowTrailingOptions: false,
-    usageLineLength: dartdevUsageLineLength,
-  );
+  ArgParser createArgParser() {
+    return ArgParser(
+      // Don't parse flags after script name.
+      allowTrailingOptions: false,
+      usageLineLength: dartdevUsageLineLength,
+    );
+  }
 
   @override
   final bool verbose;
diff --git a/pkg/dartdev/lib/src/core.dart b/pkg/dartdev/lib/src/core.dart
index 70ac250..9a05bee 100644
--- a/pkg/dartdev/lib/src/core.dart
+++ b/pkg/dartdev/lib/src/core.dart
@@ -37,9 +37,12 @@
   ArgParser _argParser;
 
   @override
-  ArgParser get argParser => _argParser ??= _createArgParser();
+  ArgParser get argParser => _argParser ??= createArgParser();
 
-  ArgParser _createArgParser() =>
+  /// Create the ArgParser instance for this command.
+  ///
+  /// Subclasses can override this in order to create a customized ArgParser.
+  ArgParser createArgParser() =>
       ArgParser(usageLineLength: dartdevUsageLineLength);
 
   Project get project => _project ??= Project();