add a --use-cfe option to flutter analyze (#20742)

* add a --use-cfe option to flutter analyze

* useCFE ==> useCfe
diff --git a/packages/flutter_tools/lib/src/commands/analyze.dart b/packages/flutter_tools/lib/src/commands/analyze.dart
index c79ba29..915eb8b 100644
--- a/packages/flutter_tools/lib/src/commands/analyze.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze.dart
@@ -34,6 +34,10 @@
         valueHelp: 'path-to-sdk',
         help: 'The path to the Dart SDK.',
         hide: !verboseHelp);
+    argParser.addFlag('use-cfe',
+        help: 'Run the analysis server with the --use-cfe option. This is a '
+            'temporary flag for use while the analyzer migrates to the CFE.',
+        hide: !verboseHelp);
 
     // Hidden option to enable a benchmarking mode.
     argParser.addFlag('benchmark',
diff --git a/packages/flutter_tools/lib/src/commands/analyze_once.dart b/packages/flutter_tools/lib/src/commands/analyze_once.dart
index 5d49ee6..610c319 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_once.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_once.dart
@@ -73,7 +73,11 @@
 
     final String sdkPath = argResults['dart-sdk'] ?? sdk.dartSdkPath;
 
-    final AnalysisServer server = new AnalysisServer(sdkPath, directories.toList());
+    final AnalysisServer server = new AnalysisServer(
+      sdkPath,
+      directories.toList(),
+      useCfe: argResults.wasParsed('use-cfe') ? argResults['use-cfe'] : null,
+    );
 
     StreamSubscription<bool> subscription;
     subscription = server.onAnalyzing.listen((bool isAnalyzing) {
diff --git a/packages/flutter_tools/lib/src/dart/analysis.dart b/packages/flutter_tools/lib/src/dart/analysis.dart
index ce13ccf..8c07f09 100644
--- a/packages/flutter_tools/lib/src/dart/analysis.dart
+++ b/packages/flutter_tools/lib/src/dart/analysis.dart
@@ -14,10 +14,11 @@
 import '../globals.dart';
 
 class AnalysisServer {
-  AnalysisServer(this.sdkPath, this.directories);
+  AnalysisServer(this.sdkPath, this.directories, { this.useCfe });
 
   final String sdkPath;
   final List<String> directories;
+  final bool useCfe;
 
   Process _process;
   final StreamController<bool> _analyzingController =
@@ -37,6 +38,10 @@
       sdkPath,
     ];
 
+    if (useCfe != null) {
+      command.add(useCfe ? '--use-cfe' : '--no-use-cfe');
+    }
+
     printTrace('dart ${command.skip(1).join(' ')}');
     _process = await processManager.start(command);
     // This callback hookup can't throw.
diff --git a/packages/flutter_tools/test/commands/analyze_once_test.dart b/packages/flutter_tools/test/commands/analyze_once_test.dart
index 28ed74f..61cd9fe 100644
--- a/packages/flutter_tools/test/commands/analyze_once_test.dart
+++ b/packages/flutter_tools/test/commands/analyze_once_test.dart
@@ -178,6 +178,23 @@
         tryToDelete(tempDir);
       }
     });
+
+    testUsingContext('use-cfe flag is recognized', () async {
+      const String contents = '''
+StringBuffer bar = StringBuffer('baz');
+''';
+      final Directory tempDir = fs.systemTempDirectory.createTempSync();
+      tempDir.childFile('main.dart').writeAsStringSync(contents);
+      try {
+        await runCommand(
+          command: new AnalyzeCommand(workingDirectory: fs.directory(tempDir)),
+          arguments: <String>['analyze', '--no-use-cfe'],
+          statusTextContains: <String>['No issues found!'],
+        );
+      } finally {
+        tempDir.deleteSync(recursive: true);
+      }
+    });
   });
 }