[vm/frontend-server] Include errors count into compile expression response.

Change-Id: Ifc42ff221eb5a0d95f7ed0f29f410ab18740b0e6
Reviewed-on: https://dart-review.googlesource.com/56140
Reviewed-by: Siva Annamalai <asiva@google.com>
Commit-Queue: Alexander Aprelev <aam@google.com>
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index 1c7c2f8..0bf5ffb 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -441,7 +441,8 @@
       final IOSink sink = new File(_kernelBinaryFilename).openWrite();
       sink.add(serializeProcedure(procedure));
       await sink.close();
-      _outputStream.writeln('$boundaryKey $_kernelBinaryFilename');
+      _outputStream
+          .writeln('$boundaryKey $_kernelBinaryFilename ${errors.length}');
       _kernelBinaryFilename = _kernelBinaryFilenameIncremental;
     } else {
       _outputStream.writeln(boundaryKey);
diff --git a/pkg/vm/test/frontend_server_test.dart b/pkg/vm/test/frontend_server_test.dart
index ba2cf03..2a35304 100644
--- a/pkg/vm/test/frontend_server_test.dart
+++ b/pkg/vm/test/frontend_server_test.dart
@@ -519,16 +519,12 @@
       receivedResults.stream.listen((String outputFilenameAndErrorCount) {
         if (count == 0) {
           // First request is to 'compile', which results in full kernel file.
-          int delim = outputFilenameAndErrorCount.lastIndexOf(' ');
-          expect(delim > 0, equals(true));
-          String outputFilename =
-              outputFilenameAndErrorCount.substring(0, delim);
-          int errorsCount = int
-              .parse(outputFilenameAndErrorCount.substring(delim + 1).trim());
+          CompilationResult result =
+              new CompilationResult.parse(outputFilenameAndErrorCount);
 
           expect(dillFile.existsSync(), equals(true));
-          expect(outputFilename, dillFile.path);
-          expect(errorsCount, equals(0));
+          expect(result.filename, dillFile.path);
+          expect(result.errorsCount, equals(0));
           streamController.add('accept\n'.codeUnits);
 
           // 'compile-expression <boundarykey>
@@ -558,7 +554,11 @@
           // Second request is to 'compile-expression', which results in
           // kernel file with a function that wraps compiled expression.
           expect(outputFilenameAndErrorCount, isNotNull);
-          File outputFile = new File(outputFilenameAndErrorCount);
+          CompilationResult result =
+              new CompilationResult.parse(outputFilenameAndErrorCount);
+
+          expect(result.errorsCount, equals(0));
+          File outputFile = new File(result.filename);
           expect(outputFile.existsSync(), equals(true));
           expect(outputFile.lengthSync(), isPositive);
 
@@ -567,11 +567,10 @@
         } else {
           expect(count, 3);
           // Third request is to 'compile' non-existent file, that should fail.
-          int delim = outputFilenameAndErrorCount.lastIndexOf(' ');
-          expect(delim > 0, equals(true));
-          int errorsCount = int
-              .parse(outputFilenameAndErrorCount.substring(delim + 1).trim());
-          expect(errorsCount, greaterThan(0));
+          expect(outputFilenameAndErrorCount, isNotNull);
+          CompilationResult result =
+              new CompilationResult.parse(outputFilenameAndErrorCount);
+          expect(result.errorsCount, greaterThan(0));
           allDone.complete(true);
         }
       });
@@ -623,16 +622,13 @@
       int count = 0;
       Completer<bool> allDone = new Completer<bool>();
       receivedResults.stream.listen((String outputFilenameAndErrorCount) {
-        int delim = outputFilenameAndErrorCount.lastIndexOf(' ');
-        expect(delim > 0, equals(true));
-        String outputFilename = outputFilenameAndErrorCount.substring(0, delim);
-        int errorsCount =
-            int.parse(outputFilenameAndErrorCount.substring(delim + 1).trim());
+        CompilationResult result =
+            new CompilationResult.parse(outputFilenameAndErrorCount);
         if (count == 0) {
           // First request is to 'compile', which results in full kernel file.
           expect(dillFile.existsSync(), equals(true));
-          expect(outputFilename, dillFile.path);
-          expect(errorsCount, 0);
+          expect(result.filename, dillFile.path);
+          expect(result.errorsCount, 0);
           count += 1;
           streamController.add('accept\n'.codeUnits);
           var file2 = new File('${tempDir.path}/bar.dart')..createSync();
@@ -646,8 +642,8 @@
           // Second request is to 'recompile', which results in incremental
           // kernel file.
           var dillIncFile = new File('${dillFile.path}.incremental.dill');
-          expect(outputFilename, dillIncFile.path);
-          expect(errorsCount, 0);
+          expect(result.filename, dillIncFile.path);
+          expect(result.errorsCount, 0);
           expect(dillIncFile.existsSync(), equals(true));
           allDone.complete(true);
         }
@@ -699,16 +695,13 @@
       int count = 0;
       Completer<bool> allDone = new Completer<bool>();
       receivedResults.stream.listen((String outputFilenameAndErrorCount) {
-        int delim = outputFilenameAndErrorCount.lastIndexOf(' ');
-        expect(delim > 0, equals(true));
-        String outputFilename = outputFilenameAndErrorCount.substring(0, delim);
-        int errorsCount =
-            int.parse(outputFilenameAndErrorCount.substring(delim + 1).trim());
+        CompilationResult result =
+            new CompilationResult.parse(outputFilenameAndErrorCount);
         switch (count) {
           case 0:
             expect(dillFile.existsSync(), equals(true));
-            expect(outputFilename, dillFile.path);
-            expect(errorsCount, 2);
+            expect(result.filename, dillFile.path);
+            expect(result.errorsCount, 2);
             count += 1;
             streamController.add('accept\n'.codeUnits);
             var file2 = new File('${tempDir.path}/bar.dart')..createSync();
@@ -720,8 +713,8 @@
             break;
           case 1:
             var dillIncFile = new File('${dillFile.path}.incremental.dill');
-            expect(outputFilename, dillIncFile.path);
-            expect(errorsCount, 1);
+            expect(result.filename, dillIncFile.path);
+            expect(result.errorsCount, 1);
             count += 1;
             streamController.add('accept\n'.codeUnits);
             var file2 = new File('${tempDir.path}/bar.dart')..createSync();
@@ -733,8 +726,8 @@
             break;
           case 2:
             var dillIncFile = new File('${dillFile.path}.incremental.dill');
-            expect(outputFilename, dillIncFile.path);
-            expect(errorsCount, 0);
+            expect(result.filename, dillIncFile.path);
+            expect(result.errorsCount, 0);
             expect(dillIncFile.existsSync(), equals(true));
             allDone.complete(true);
         }
@@ -811,3 +804,15 @@
     return vmDirectory;
   }
 }
+
+class CompilationResult {
+  String filename;
+  int errorsCount;
+
+  CompilationResult.parse(String filenameAndErrorCount) {
+    int delim = filenameAndErrorCount.lastIndexOf(' ');
+    expect(delim > 0, equals(true));
+    filename = filenameAndErrorCount.substring(0, delim);
+    errorsCount = int.parse(filenameAndErrorCount.substring(delim + 1).trim());
+  }
+}