[ddc] Use typed ArgResults helper methods

Change-Id: I906c3cc5d9b80b5d6818cf0af779cc2de56d4db7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/449364
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Nicholas Shahan <nshahan@google.com>
diff --git a/pkg/dev_compiler/lib/src/command/command.dart b/pkg/dev_compiler/lib/src/command/command.dart
index f3e1bce..77d20ca 100644
--- a/pkg/dev_compiler/lib/src/command/command.dart
+++ b/pkg/dev_compiler/lib/src/command/command.dart
@@ -107,7 +107,7 @@
     return CompilerResult(64);
   }
   if (argResults.wasParsed('sound-null-safety')) {
-    var soundNullSafety = argResults['sound-null-safety'] as bool;
+    var soundNullSafety = argResults.flag('sound-null-safety');
     print(
       'Dart 3 only supports sound null safety, '
       'see https://dart.dev/null-safety.\n'
@@ -119,7 +119,7 @@
     }
   }
 
-  var outPaths = argResults['out'] as List<String>;
+  var outPaths = argResults.multiOption('out');
   var moduleFormats = parseModuleFormatOption(argResults);
   if (outPaths.isEmpty) {
     print(
@@ -135,7 +135,7 @@
     return CompilerResult(64);
   }
 
-  if (argResults['help'] as bool || args.isEmpty) {
+  if (argResults.flag('help') || args.isEmpty) {
     print(_usageMessage(argParser));
     return CompilerResult(0);
   }
@@ -172,7 +172,8 @@
   // lib folder). The following [FileSystem] will resolve those references to
   // the correct location and keeps the real file location hidden from the
   // front end.
-  var multiRootPaths = (argResults['multi-root'] as Iterable<String>)
+  var multiRootPaths = argResults
+      .multiOption('multi-root')
       .map(Uri.base.resolve)
       .toList();
   var multiRootOutputPath = options.multiRootOutputPath;
@@ -198,9 +199,9 @@
     summaryPaths.map(sourcePathToUri).cast<Uri>(),
     options.summaryModules.values,
   );
-  var sdkSummaryPath = argResults['dart-sdk-summary'] as String?;
-  var librarySpecPath = argResults['libraries-file'] as String?;
-  var compileSdk = argResults['compile-sdk'] == true;
+  var sdkSummaryPath = argResults.option('dart-sdk-summary');
+  var librarySpecPath = argResults.option('libraries-file');
+  var compileSdk = argResults.flag('compile-sdk');
   if (sdkSummaryPath == null) {
     if (!compileSdk) {
       sdkSummaryPath = defaultSdkSummaryPath;
@@ -251,8 +252,7 @@
   // .dart_tool/package_config.json file to resolve package URIs that are in the
   // input summaries, but it seems to.
   // This needs further investigation.
-  var packageFile =
-      argResults['packages'] as String? ?? _findPackagesFilePath();
+  var packageFile = argResults.option('packages') ?? _findPackagesFilePath();
 
   var succeeded = true;
   void diagnosticMessageHandler(fe.CfeDiagnosticMessage message) {
@@ -268,9 +268,9 @@
     onWarning: print,
   );
 
-  var trackWidgetCreation = argResults['track-widget-creation'] as bool;
+  var trackWidgetCreation = argResults.flag('track-widget-creation');
   var oldCompilerState = compilerState;
-  var recordUsedInputs = argResults['used-inputs-file'] != null;
+  var recordUsedInputs = argResults.option('used-inputs-file') != null;
   var additionalDills = summaryModules.keys.toList();
   fe.DdcResult? result;
 
@@ -402,7 +402,7 @@
 
   // Output files can be written in parallel, so collect the futures.
   var outFiles = <Future>[];
-  if (argResults['summarize'] as bool) {
+  if (argResults.flag('summarize')) {
     if (outPaths.length > 1) {
       print(
         'If multiple output files (found ${outPaths.length}) are specified, '
@@ -426,7 +426,7 @@
     outFiles.add(sink.flush().then((_) => sink.close()));
   }
   String? fullDillUri;
-  if (argResults['experimental-output-compiled-kernel'] as bool) {
+  if (argResults.flag('experimental-output-compiled-kernel')) {
     if (outPaths.length > 1) {
       print(
         'If multiple output files (found ${outPaths.length}) are specified, '
@@ -448,7 +448,7 @@
     kernel.BinaryPrinter(sink).writeComponentFile(compiledLibraries);
     outFiles.add(sink.flush().then((_) => sink.close()));
   }
-  if (argResults['summarize-text'] as bool) {
+  if (argResults.flag('summarize-text')) {
     if (outPaths.length > 1) {
       print(
         'If multiple output files (found ${outPaths.length}) are specified, '
@@ -589,7 +589,7 @@
       usedOutlines.addAll(summaryModules.keys);
     }
 
-    var outputUsedFile = File(argResults['used-inputs-file'] as String);
+    var outputUsedFile = File(argResults.option('used-inputs-file')!);
     outputUsedFile.createSync(recursive: true);
     outputUsedFile.writeAsStringSync(usedOutlines.join('\n'));
   }
@@ -629,7 +629,7 @@
     return CompilerResult(64);
   }
 
-  var outPaths = argResults['out'] as List<String>;
+  var outPaths = argResults.multiOption('out');
   var moduleFormats = parseModuleFormatOption(argResults);
   if (outPaths.isEmpty) {
     print(
diff --git a/pkg/dev_compiler/lib/src/command/options.dart b/pkg/dev_compiler/lib/src/command/options.dart
index 5a9e686..7ee463a 100644
--- a/pkg/dev_compiler/lib/src/command/options.dart
+++ b/pkg/dev_compiler/lib/src/command/options.dart
@@ -127,33 +127,31 @@
 
   Options.fromArguments(ArgResults args)
     : this(
-        sourceMap: args['source-map'] as bool,
-        inlineSourceMap: args['inline-source-map'] as bool,
-        summarizeApi: args['summarize'] as bool,
-        enableAsserts: args['enable-asserts'] as bool,
-        replCompile: args['repl-compile'] as bool,
-        emitDebugMetadata: args['experimental-emit-debug-metadata'] as bool,
-        emitDebugSymbols: args['emit-debug-symbols'] as bool,
-        emitFullCompiledKernel:
-            args['experimental-output-compiled-kernel'] as bool,
-        reloadLastAcceptedKernel:
-            args['reload-last-accepted-kernel'] as String?,
-        reloadDeltaKernel: args['reload-delta-kernel'] as String?,
-        summaryModules: _parseCustomSummaryModules(
-          args['summary'] as List<String>,
+        sourceMap: args.flag('source-map'),
+        inlineSourceMap: args.flag('inline-source-map'),
+        summarizeApi: args.flag('summarize'),
+        enableAsserts: args.flag('enable-asserts'),
+        replCompile: args.flag('repl-compile'),
+        emitDebugMetadata: args.flag('experimental-emit-debug-metadata'),
+        emitDebugSymbols: args.flag('emit-debug-symbols'),
+        emitFullCompiledKernel: args.flag(
+          'experimental-output-compiled-kernel',
         ),
+        reloadLastAcceptedKernel: args.option('reload-last-accepted-kernel'),
+        reloadDeltaKernel: args.option('reload-delta-kernel'),
+        summaryModules: _parseCustomSummaryModules(args.multiOption('summary')),
         nonHotReloadablePackages: Set.from(
-          args['non-hot-reloadable-package'] as List<String>,
+          args.multiOption('non-hot-reloadable-package'),
         ),
         moduleFormats: parseModuleFormatOption(args),
         moduleName: _getModuleName(args),
-        multiRootScheme: args['multi-root-scheme'] as String,
-        multiRootOutputPath: args['multi-root-output-path'] as String?,
+        multiRootScheme: args.option('multi-root-scheme')!,
+        multiRootOutputPath: args.option('multi-root-output-path'),
         experiments: parseExperimentalArguments(
-          args['enable-experiment'] as List<String>,
+          args.multiOption('enable-experiment'),
         ),
-        canaryFeatures: args['canary'] as bool,
-        dynamicModule: args['dynamic-module'] as bool,
+        canaryFeatures: args.flag('canary'),
+        dynamicModule: args.flag('dynamic-module'),
       );
 
   Options.fromSdkRequiredArguments(ArgResults args)
@@ -162,15 +160,15 @@
         moduleFormats: parseModuleFormatOption(args),
         // When compiling the SDK use dart_sdk as the default. This is the
         // assumed name in various places around the build systems.
-        moduleName: args['module-name'] != null
+        moduleName: args.option('module-name') != null
             ? _getModuleName(args)
             : 'dart_sdk',
-        multiRootScheme: args['multi-root-scheme'] as String,
-        multiRootOutputPath: args['multi-root-output-path'] as String?,
+        multiRootScheme: args.option('multi-root-scheme')!,
+        multiRootOutputPath: args.option('multi-root-output-path'),
         experiments: parseExperimentalArguments(
-          args['enable-experiment'] as List<String>,
+          args.multiOption('enable-experiment'),
         ),
-        canaryFeatures: args['canary'] as bool,
+        canaryFeatures: args.flag('canary'),
       );
 
   static void addArguments(ArgParser parser, {bool hide = true}) {
@@ -330,9 +328,9 @@
   }
 
   static String _getModuleName(ArgResults args) {
-    var moduleName = args['module-name'] as String?;
+    var moduleName = args.option('module-name');
     if (moduleName == null) {
-      var outPaths = args['out'] as List<String>;
+      var outPaths = args.multiOption('out');
       if (outPaths.isEmpty) {
         throw UnsupportedError(
           'No module name provided and unable to synthesize one without any '
diff --git a/pkg/dev_compiler/lib/src/compiler/module_builder.dart b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
index 3136be5..6e8f750 100644
--- a/pkg/dev_compiler/lib/src/compiler/module_builder.dart
+++ b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
@@ -59,7 +59,7 @@
 
 /// Parse the module format option added by [addModuleFormatOptions].
 List<ModuleFormat> parseModuleFormatOption(ArgResults args) {
-  return (args['modules'] as List<String>).map(parseModuleFormat).toList();
+  return args.multiOption('modules').map(parseModuleFormat).toList();
 }
 
 /// Adds an option to the [argParser] for choosing the module format, optionally
diff --git a/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart b/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
index 880b5cb..a9eaee0 100644
--- a/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
+++ b/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
@@ -168,16 +168,17 @@
     var parsedArgs = argParser.parse(args);
 
     FileSystem fileSystem = StandardFileSystem.instance;
-    var multiRoots = (parsedArgs['multi-root'] as Iterable<String>)
+    var multiRoots = parsedArgs
+        .multiOption('multi-root')
         .map(Uri.base.resolve)
         .toList();
-    var multiRootScheme = parsedArgs['multi-root-scheme'] as String;
+    var multiRootScheme = parsedArgs.option('multi-root-scheme')!;
     if (multiRoots.isNotEmpty) {
       fileSystem = MultiRootFileSystem(multiRootScheme, multiRoots, fileSystem);
     }
-    var assetServerAddress = parsedArgs['asset-server-address'] as String?;
+    var assetServerAddress = parsedArgs.option('asset-server-address');
     if (assetServerAddress != null) {
-      var assetServerPort = parsedArgs['asset-server-port'] as String?;
+      var assetServerPort = parsedArgs.option('asset-server-port');
       fileSystem = AssetFileSystem(
         fileSystem,
         assetServerAddress,
@@ -185,29 +186,25 @@
       );
     }
     var explicitExperimentalFlags = parseExperimentalFlags(
-      parseExperimentalArguments(
-        parsedArgs['enable-experiment'] as List<String>,
-      ),
+      parseExperimentalArguments(parsedArgs.multiOption('enable-experiment')),
       onError: (e) => throw e,
     );
 
-    var moduleFormat = parseModuleFormat(parsedArgs['module-format'] as String);
+    var moduleFormat = parseModuleFormat(parsedArgs.option('module-format')!);
 
     return create(
-      librariesSpecificationUri: _argToUri(
-        parsedArgs['libraries-file'] as String?,
-      ),
-      packagesFile: _argToUri(parsedArgs['packages-file'] as String?),
-      sdkSummary: _argToUri(parsedArgs['dart-sdk-summary'] as String?),
+      librariesSpecificationUri: _argToUri(parsedArgs.option('libraries-file')),
+      packagesFile: _argToUri(parsedArgs.option('packages-file')),
+      sdkSummary: _argToUri(parsedArgs.option('dart-sdk-summary')),
       fileSystem: fileSystem,
       environmentDefines: environmentDefines,
       explicitExperimentalFlags: explicitExperimentalFlags,
-      sdkRoot: _argToUri(parsedArgs['sdk-root'] as String?),
-      trackWidgetCreation: parsedArgs['track-widget-creation'] as bool,
+      sdkRoot: _argToUri(parsedArgs.option('sdk-root')),
+      trackWidgetCreation: parsedArgs.flag('track-widget-creation'),
       moduleFormat: moduleFormat,
-      canaryFeatures: parsedArgs['canary'] as bool,
-      enableAsserts: parsedArgs['enable-asserts'] as bool,
-      verbose: parsedArgs['verbose'] as bool,
+      canaryFeatures: parsedArgs.flag('canary'),
+      enableAsserts: parsedArgs.flag('enable-asserts'),
+      verbose: parsedArgs.flag('verbose'),
       requestStream: requestStream,
       sendResponse: sendResponse,
       onDone: () {
diff --git a/pkg/dev_compiler/tool/ddb b/pkg/dev_compiler/tool/ddb
index 129c1ff..a5d23bd 100755
--- a/pkg/dev_compiler/tool/ddb
+++ b/pkg/dev_compiler/tool/ddb
@@ -102,37 +102,38 @@
     ..addOption('vm-service-port',
         help: 'Specify the observatory port. Implied --observe.');
 
-  var options = parser.parse(args);
-  if (options['help'] as bool) {
+  var parsedArgs = parser.parse(args);
+  if (parsedArgs.flag('help')) {
     printUsage();
     print('Available options:');
     print(parser.usage);
     exit(0);
   }
-  if (options.rest.isEmpty) {
+  if (parsedArgs.rest.isEmpty) {
     print('Dart script file required.\n');
     printUsage();
     exit(1);
   }
-  var arch = options['arch'] as String?;
-  var debug = options['debug'] as bool ||
-      options['observe'] as bool ||
-      options.wasParsed('vm-service-port');
-  var summarizeText = options['summarize-text'] as bool;
-  var binary = options['binary'] as String?;
-  var experiments = options['enable-experiment'] as List<String>;
-  var summaries = options['summary'] as List<String>;
-  var port = int.parse(options['port'] as String);
-  var mode = options['mode'] as String;
+  var arch = parsedArgs.option('arch');
+  var debug =
+      parsedArgs.flag('debug') ||
+      parsedArgs.flag('observe') ||
+      parsedArgs.wasParsed('vm-service-port');
+  var summarizeText = parsedArgs.flag('summarize-text');
+  var binary = parsedArgs.option('binary');
+  var experiments = parsedArgs.multiOption('enable-experiment');
+  var summaries = parsedArgs.multiOption('summary');
+  var port = int.parse(parsedArgs.option('port')!);
+  var mode = parsedArgs.option('mode')!;
   var compile = mode == 'compile' || mode == 'all';
   var run = mode == 'run' || mode == 'all';
-  var verbose = options['verbose'] as bool;
-  var emitDebugSymbols = options['emit-debug-symbols'] as bool;
-  var nativeNonNullAsserts = options['native-null-assertions'] as bool;
-  var jsInteropNonNullAsserts = options['interop-null-assertions'] as bool;
-  var ddcModules = options['ddc-modules'] as bool;
-  var canaryFeatures = options['canary'] as bool;
-  var sourceFiles = options.rest.map(p.canonicalize);
+  var verbose = parsedArgs.flag('verbose');
+  var emitDebugSymbols = parsedArgs.flag('emit-debug-symbols');
+  var nativeNonNullAsserts = parsedArgs.flag('native-null-assertions');
+  var jsInteropNonNullAsserts = parsedArgs.flag('interop-null-assertions');
+  var ddcModules = parsedArgs.flag('ddc-modules');
+  var canaryFeatures = parsedArgs.flag('canary');
+  var sourceFiles = parsedArgs.rest.map(p.canonicalize);
   var entryPoint = sourceFiles.last;
   var libRoot = p.dirname(entryPoint);
   var basename = p.basenameWithoutExtension(entryPoint);
@@ -186,11 +187,11 @@
 
   Future<void> runDdc(List<String> ddcArgs) async {
     var observe =
-        options.wasParsed('vm-service-port') || options['observe'] as bool;
-    var vmServicePort = options.wasParsed('vm-service-port')
-        ? '=${options['vm-service-port']}'
+        parsedArgs.wasParsed('vm-service-port') || parsedArgs.flag('observe');
+    var vmServicePort = parsedArgs.wasParsed('vm-service-port')
+        ? '=${parsedArgs.option('vm-service-port')!}'
         : '';
-    var vmOptions = options['compile-vm-options'] as String?;
+    var vmOptions = parsedArgs.option('compile-vm-options');
     var args = <String>[
       ...?vmOptions?.split(' '),
       if (debug) ...[
@@ -214,7 +215,7 @@
   var chrome = false;
   var node = false;
   var d8 = false;
-  var runtime = options['runtime'] as String?;
+  var runtime = parsedArgs.option('runtime');
   switch (runtime) {
     case 'node':
       // TODO(nshahan): Cleanup after the ddc module format is used everywhere.
@@ -254,13 +255,14 @@
   }
   var outputs = <String>[];
   if (compile) {
+    var packages = parsedArgs.option('packages');
     var ddcArgs = [
       if (summarizeText) '--summarize-text',
       '--modules=$mod',
       '--dart-sdk-summary=$sdkOutlineDill',
       for (var summary in summaries) '--summary=$summary',
       for (var experiment in experiments) '--enable-experiment=$experiment',
-      if (options['packages'] != null) '--packages=${options['packages']}',
+      if (packages != null) '--packages=$packages',
       if (emitDebugSymbols) '--emit-debug-symbols',
       if (canaryFeatures) '--canary',
       // Provide predictable library URIs for all libraries when using the