Try no implicit casts in pkg/analyzer_cli.

Change-Id: Ied093d1d988e944b497121e654956e93e61ee52d
Reviewed-on: https://dart-review.googlesource.com/69002
Commit-Queue: Devon Carew <devoncarew@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
diff --git a/pkg/analyzer_cli/analysis_options.yaml b/pkg/analyzer_cli/analysis_options.yaml
index b8b8389..4341996 100644
--- a/pkg/analyzer_cli/analysis_options.yaml
+++ b/pkg/analyzer_cli/analysis_options.yaml
@@ -1,4 +1,6 @@
 analyzer:
+  strong-mode:
+    implicit-casts: false
   exclude:
     - test/data/**
 linter:
diff --git a/pkg/analyzer_cli/lib/src/context_cache.dart b/pkg/analyzer_cli/lib/src/context_cache.dart
index ed0e892..9354f84 100644
--- a/pkg/analyzer_cli/lib/src/context_cache.dart
+++ b/pkg/analyzer_cli/lib/src/context_cache.dart
@@ -85,7 +85,7 @@
   /// The actual calculation to get the [AnalysisOptionsImpl], with no caching.
   /// This should not be used except behind the getter which caches this result
   /// automatically.
-  AnalysisOptions _getAnalysisOptions() {
+  AnalysisOptionsImpl _getAnalysisOptions() {
     AnalysisOptionsImpl contextOptions = builder.getAnalysisOptions(
         requestedSourceDirectory,
         verbosePrint: clOptions.verbose ? verbosePrint : null);
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index bc1731a..bf39031 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -655,7 +655,7 @@
 
   /// Return whether [a] and [b] options are equal for the purpose of
   /// command line analysis.
-  bool _equalAnalysisOptions(AnalysisOptionsImpl a, AnalysisOptions b) {
+  bool _equalAnalysisOptions(AnalysisOptions a, AnalysisOptions b) {
     return a.enableLazyAssignmentOperators == b.enableLazyAssignmentOperators &&
         a.enableSuperMixins == b.enableSuperMixins &&
         a.enableTiming == b.enableTiming &&
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index 9f3ffd2..b95df0d 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -160,49 +160,50 @@
 
   /// Initialize options from the given parsed [args].
   CommandLineOptions._fromArgs(ArgResults args)
-      : buildAnalysisOutput = args['build-analysis-output'],
-        buildMode = args['build-mode'],
-        buildModePersistentWorker = args['persistent_worker'],
+      : buildAnalysisOutput = cast(args['build-analysis-output']),
+        buildMode = cast(args['build-mode']),
+        buildModePersistentWorker = cast(args['persistent_worker']),
         buildSummaryInputs =
             (args['build-summary-input'] as List).cast<String>(),
         buildSummaryUnlinkedInputs =
             (args['build-summary-unlinked-input'] as List).cast<String>(),
-        buildSummaryOnly = args['build-summary-only'],
-        buildSummaryOnlyUnlinked = args['build-summary-only-unlinked'],
-        buildSummaryOutput = args['build-summary-output'],
-        buildSummaryOutputSemantic = args['build-summary-output-semantic'],
-        buildSuppressExitCode = args['build-suppress-exit-code'],
+        buildSummaryOnly = cast(args['build-summary-only']),
+        buildSummaryOnlyUnlinked = cast(args['build-summary-only-unlinked']),
+        buildSummaryOutput = cast(args['build-summary-output']),
+        buildSummaryOutputSemantic =
+            cast(args['build-summary-output-semantic']),
+        buildSuppressExitCode = cast(args['build-suppress-exit-code']),
         contextBuilderOptions = createContextBuilderOptions(args),
-        dartSdkPath = args['dart-sdk'],
-        dartSdkSummaryPath = args['dart-sdk-summary'],
+        dartSdkPath = cast(args['dart-sdk']),
+        dartSdkSummaryPath = cast(args['dart-sdk-summary']),
         declarationCasts = args.wasParsed(declarationCastsFlag)
-            ? args[declarationCastsFlag]
-            : args[implicitCastsFlag],
-        disableCacheFlushing = args['disable-cache-flushing'],
-        disableHints = args['no-hints'],
-        displayVersion = args['version'],
-        ignoreUnrecognizedFlags = args['ignore-unrecognized-flags'],
-        lints = args[lintsFlag],
-        log = args['log'],
+            ? cast(args[declarationCastsFlag])
+            : cast(args[implicitCastsFlag]),
+        disableCacheFlushing = cast(args['disable-cache-flushing']),
+        disableHints = cast(args['no-hints']),
+        displayVersion = cast(args['version']),
+        ignoreUnrecognizedFlags = cast(args['ignore-unrecognized-flags']),
+        lints = cast(args[lintsFlag]),
+        log = cast(args['log']),
         machineFormat = args['format'] == 'machine',
-        perfReport = args['x-perf-report'],
-        useCFE = args['use-cfe'],
-        useFastaParser = args['use-fasta-parser'],
-        previewDart2 = args['preview-dart-2'],
-        batchMode = args['batch'],
-        showPackageWarnings = args['show-package-warnings'] ||
-            args['package-warnings'] ||
+        perfReport = cast(args['x-perf-report']),
+        useCFE = cast(args['use-cfe']),
+        useFastaParser = cast(args['use-fasta-parser']),
+        previewDart2 = cast(args['preview-dart-2']),
+        batchMode = cast(args['batch']),
+        showPackageWarnings = cast(args['show-package-warnings']) ||
+            cast(args['package-warnings']) ||
             args['x-package-warnings-prefix'] != null,
-        showPackageWarningsPrefix = args['x-package-warnings-prefix'],
-        showSdkWarnings = args['sdk-warnings'],
+        showPackageWarningsPrefix = cast(args['x-package-warnings-prefix']),
+        showSdkWarnings = cast(args['sdk-warnings']),
         _sourceFiles = args.rest,
-        infosAreFatal = args['fatal-infos'] || args['fatal-hints'],
-        warningsAreFatal = args['fatal-warnings'],
-        lintsAreFatal = args['fatal-lints'],
-        implicitCasts = args[implicitCastsFlag],
-        implicitDynamic = !args['no-implicit-dynamic'],
-        verbose = args['verbose'],
-        color = args['color'];
+        infosAreFatal = cast(args['fatal-infos']) || cast(args['fatal-hints']),
+        warningsAreFatal = cast(args['fatal-warnings']),
+        lintsAreFatal = cast(args['fatal-lints']),
+        implicitCasts = cast(args[implicitCastsFlag]),
+        implicitDynamic = !cast<bool>(args['no-implicit-dynamic']),
+        verbose = cast(args['verbose']),
+        color = cast(args['color']);
 
   /// The path to an analysis options file
   String get analysisOptionsFile =>
@@ -541,7 +542,7 @@
       }
 
       // Help requests.
-      if (results['help']) {
+      if (cast(results['help'])) {
         _showUsage(parser, analytics, fromHelp: true);
         exitHandler(0);
         return null; // Only reachable in testing.
@@ -550,7 +551,7 @@
       // Enable / disable analytics.
       if (telemetry.SHOW_ANALYTICS_UI) {
         if (results.wasParsed('analytics')) {
-          analytics.enabled = results['analytics'];
+          analytics.enabled = cast(results['analytics']);
           outSink.writeln(
               telemetry.createAnalyticsStatusMessage(analytics.enabled));
           exitHandler(0);
@@ -559,14 +560,14 @@
       }
 
       // Batch mode and input files.
-      if (results['batch']) {
+      if (cast(results['batch'])) {
         if (results.rest.isNotEmpty) {
           errorSink.writeln('No source files expected in the batch mode.');
           _showUsage(parser, analytics);
           exitHandler(15);
           return null; // Only reachable in testing.
         }
-      } else if (results['persistent_worker']) {
+      } else if (cast(results['persistent_worker'])) {
         if (results.rest.isNotEmpty) {
           errorSink.writeln(
               'No source files expected in the persistent worker mode.');
@@ -574,12 +575,12 @@
           exitHandler(15);
           return null; // Only reachable in testing.
         }
-      } else if (results['version']) {
+      } else if (cast(results['version'])) {
         outSink.writeln('$_binaryName version ${_getVersion()}');
         exitHandler(0);
         return null; // Only reachable in testing.
       } else {
-        if (results.rest.isEmpty && !results['build-mode']) {
+        if (results.rest.isEmpty && !cast<bool>(results['build-mode'])) {
           _showUsage(parser, analytics, fromHelp: true);
           exitHandler(15);
           return null; // Only reachable in testing.
@@ -642,3 +643,5 @@
 For more information, see https://www.dartlang.org/tools/analyzer.\n''');
   }
 }
+
+T cast<T>(dynamic value) => value as T;
diff --git a/pkg/analyzer_cli/lib/src/perf_report.dart b/pkg/analyzer_cli/lib/src/perf_report.dart
index 110fa0f..e9227a9 100644
--- a/pkg/analyzer_cli/lib/src/perf_report.dart
+++ b/pkg/analyzer_cli/lib/src/perf_report.dart
@@ -13,17 +13,6 @@
 
 const _JSON = const JsonEncoder.withIndent("  ");
 
-bool _isCheckedMode = () {
-  bool x = true;
-  try {
-    // Trigger an exception if we're in checked mode.
-    x = "" as dynamic;
-    return x != ""; // return false; suppress unused variable warning
-  } catch (e) {
-    return true;
-  }
-}();
-
 String _osType = () {
   if (Platform.isLinux) {
     return "linux";
@@ -46,7 +35,6 @@
   var platformJson = <String, dynamic>{
     'osType': _osType,
     'dartSdkVersion': Platform.version,
-    'checkedMode': _isCheckedMode,
   };
 
   var optionsJson = <String, dynamic>{
diff --git a/pkg/analyzer_cli/test/embedder_test.dart b/pkg/analyzer_cli/test/embedder_test.dart
index 95285ba..a5d5f04 100644
--- a/pkg/analyzer_cli/test/embedder_test.dart
+++ b/pkg/analyzer_cli/test/embedder_test.dart
@@ -60,7 +60,7 @@
 }
 
 /// Wrap a function call to dump stdout and stderr in case of an exception.
-Function wrap(Function f) {
+dynamic Function() wrap(dynamic Function() f) {
   return () async {
     try {
       await f();
diff --git a/pkg/analyzer_cli/test/utils.dart b/pkg/analyzer_cli/test/utils.dart
index cff2486..fd431a2 100644
--- a/pkg/analyzer_cli/test/utils.dart
+++ b/pkg/analyzer_cli/test/utils.dart
@@ -58,7 +58,7 @@
 /// completes, the temporary directory and all its contents will be deleted.
 ///
 /// Returns the return value of [fn].
-dynamic withTempDir(fn(String path)) {
+T withTempDir<T>(T fn(String path)) {
   var tempDir = Directory.systemTemp.createTempSync('analyzer_').path;
   try {
     return fn(tempDir);