Add reset method to reset incremental compiler. (#4187)

* Add reset method to reset incremental compiler.

This is needed to support Flutter app restart request.

* Indent constructor calls
diff --git a/frontend_server/lib/server.dart b/frontend_server/lib/server.dart
index 2e0d27c..e301757 100644
--- a/frontend_server/lib/server.dart
+++ b/frontend_server/lib/server.dart
@@ -82,6 +82,10 @@
 
   /// This let's compiler know that source file identifed by `uri` was changed.
   void invalidate(Uri uri);
+
+  /// Resets incremental compiler accept/reject status so that next time
+  /// recompile is requested, complete kernel file is produced.
+  void resetIncrementalCompiler();
 }
 
 /// Class that for test mocking purposes encapsulates creation of [BinaryPrinter].
@@ -191,6 +195,11 @@
     _generator.invalidate(uri);
   }
 
+  @override
+  void resetIncrementalCompiler() {
+    _generator.reset();
+  }
+
   Uri _ensureFolderPath(String path) {
     // This is a URI, not a file path, so the forward slash is correct even
     // on Windows.
@@ -257,6 +266,8 @@
           compiler.acceptLastDelta();
         else if (string == 'reject')
           compiler.rejectLastDelta();
+        else if (string == 'reset')
+          compiler.resetIncrementalCompiler();
         else if (string == 'quit')
           exit(0);
         break;
diff --git a/frontend_server/test/server_test.dart b/frontend_server/test/server_test.dart
index 40b1882..078fdd7 100644
--- a/frontend_server/test/server_test.dart
+++ b/frontend_server/test/server_test.dart
@@ -59,7 +59,7 @@
 
     test('compile one file', () async {
       final StreamController<List<int>> inputStreamController =
-      new StreamController<List<int>>();
+        new StreamController<List<int>>();
       final ReceivePort compileCalled = new ReceivePort();
       when(compiler.compile(any, any, generator: any)).thenAnswer(
         (Invocation invocation) {
@@ -80,7 +80,7 @@
 
     test('compile few files', () async {
       final StreamController<List<int>> streamController =
-      new StreamController<List<int>>();
+        new StreamController<List<int>>();
       final ReceivePort compileCalled = new ReceivePort();
       int counter = 1;
       when(compiler.compile(any, any, generator: any)).thenAnswer(
@@ -154,7 +154,7 @@
 
     test('reject', () async {
       final StreamController<List<int>> inputStreamController =
-      new StreamController<List<int>>();
+        new StreamController<List<int>>();
       final ReceivePort rejectCalled = new ReceivePort();
       when(compiler.rejectLastDelta()).thenAnswer((Invocation invocation) {
         rejectCalled.sendPort.send(true);
@@ -168,9 +168,25 @@
       inputStreamController.close();
     });
 
+    test('reset', () async {
+      final StreamController<List<int>> inputStreamController =
+        new StreamController<List<int>>();
+      final ReceivePort resetCalled = new ReceivePort();
+      when(compiler.resetIncrementalCompiler()).thenAnswer((Invocation invocation) {
+        resetCalled.sendPort.send(true);
+      });
+      final int exitcode = await starter(args, compiler: compiler,
+        input: inputStreamController.stream,
+      );
+      expect(exitcode, equals(0));
+      inputStreamController.add('reset\n'.codeUnits);
+      await resetCalled.first;
+      inputStreamController.close();
+    });
+
     test('compile then recompile', () async {
       final StreamController<List<int>> streamController =
-      new StreamController<List<int>>();
+        new StreamController<List<int>>();
       final ReceivePort recompileCalled = new ReceivePort();
 
       when(compiler.recompileDelta()).thenAnswer((Invocation invocation) {