[frontend_server] Support --verbosity argument

Adds support for the --verbosity argument in the frontend server to
control the printing level.

Closes #44867

Change-Id: I0f4e535c2e30e4d34cb8bc1d3fb4ac21d4009834
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/245161
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
diff --git a/pkg/frontend_server/lib/frontend_server.dart b/pkg/frontend_server/lib/frontend_server.dart
index ca5700a..b2489b6 100644
--- a/pkg/frontend_server/lib/frontend_server.dart
+++ b/pkg/frontend_server/lib/frontend_server.dart
@@ -203,7 +203,12 @@
       defaultsTo: false)
   ..addFlag('print-incremental-dependencies',
       help: 'Print list of sources added and removed from compilation',
-      defaultsTo: true);
+      defaultsTo: true)
+  ..addOption('verbosity',
+      help: 'Sets the verbosity level of the compilation',
+      defaultsTo: Verbosity.defaultValue,
+      allowed: Verbosity.allowedValues,
+      allowedHelp: Verbosity.allowedValuesHelp);
 
 String usage = '''
 Usage: server [options] [input.dart]
@@ -395,26 +400,19 @@
   final List<String> errors = <String>[];
 
   _onDiagnostic(DiagnosticMessage message) {
-    // TODO(https://dartbug.com/44867): The frontend server should take a
-    // verbosity argument and put that in CompilerOptions and use it here.
-    bool printMessage;
     switch (message.severity) {
       case Severity.error:
       case Severity.internalProblem:
-        printMessage = true;
         errors.addAll(message.plainTextFormatted);
         break;
       case Severity.warning:
-        printMessage = true;
-        break;
       case Severity.info:
-        printMessage = false;
         break;
       case Severity.context:
       case Severity.ignored:
         throw 'Unexpected severity: ${message.severity}';
     }
-    if (printMessage) {
+    if (Verbosity.shouldPrint(_compilerOptions.verbosity, message)) {
       printDiagnosticMessage(message, _outputStream.writeln);
     }
   }
@@ -466,7 +464,10 @@
           parseExperimentalArguments(options['enable-experiment']),
           onError: (msg) => errors.add(msg))
       ..nnbdMode = (nullSafety == true) ? NnbdMode.Strong : NnbdMode.Weak
-      ..onDiagnostic = _onDiagnostic;
+      ..onDiagnostic = _onDiagnostic
+      ..verbosity = Verbosity.parseArgument(options['verbosity'],
+          onError: (msg) => errors.add(msg));
+    _compilerOptions = compilerOptions;
 
     if (options.wasParsed('libraries-spec')) {
       compilerOptions.librariesSpecificationUri =
@@ -554,7 +555,6 @@
       ];
     }
 
-    _compilerOptions = compilerOptions;
     _processedOptions = ProcessedOptions(options: compilerOptions);
 
     KernelCompilationResults results;
diff --git a/pkg/frontend_server/test/frontend_server_test.dart b/pkg/frontend_server/test/frontend_server_test.dart
index 46457d0..4c7fca1 100644
--- a/pkg/frontend_server/test/frontend_server_test.dart
+++ b/pkg/frontend_server/test/frontend_server_test.dart
@@ -3062,6 +3062,61 @@
         inputStreamController.close();
       }
     }, timeout: Timeout.factor(8));
+
+    test('compile with(out) warning', () async {
+      Future runTest({bool hideWarnings}) async {
+        var file = File('${tempDir.path}/foo.dart')..createSync();
+        file.writeAsStringSync("""
+main() {}
+method(int i) => i?.isEven;
+""");
+        var package_config =
+            File('${tempDir.path}/.dart_tool/package_config.json')
+              ..createSync(recursive: true)
+              ..writeAsStringSync('''
+  {
+    "configVersion": 2,
+    "packages": [
+      {
+        "name": "hello",
+        "rootUri": "../",
+        "packageUri": "./"
+      }
+    ]
+  }
+  ''');
+        var dillFile = File('${tempDir.path}/app.dill');
+
+        expect(dillFile.existsSync(), false);
+
+        final List<String> args = <String>[
+          '--sdk-root=${sdkRoot.toFilePath()}',
+          '--incremental',
+          '--platform=${ddcPlatformKernel.path}',
+          '--output-dill=${dillFile.path}',
+          '--packages=${package_config.path}',
+          '--target=dartdevc',
+          if (hideWarnings) '--verbosity=error',
+          file.path,
+        ];
+        StringBuffer output = new StringBuffer();
+        expect(await starter(args, output: output), 0);
+        String result = output.toString();
+        Matcher matcher =
+            contains("Warning: Operand of null-aware operation '?.' "
+                "has type 'int' which excludes null.");
+        if (hideWarnings) {
+          matcher = isNot(matcher);
+        }
+        expect(result, matcher);
+
+        file.deleteSync();
+        dillFile.deleteSync();
+      }
+
+      await runTest(hideWarnings: false);
+      await runTest(hideWarnings: true);
+    });
   });
 }