Version 2.18.0-143.0.dev

Merge commit 'e1a73506d96ab9e820a4260b57bc30ff193e4def' into 'dev'
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index 5f2e759..7164122 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -1019,9 +1019,18 @@
   }
 
   bool _shouldSendError(protocol.AnalysisError error) {
+    // Non-TODOs are always shown.
     if (error.type.name != ErrorType.TODO.name) {
       return true;
     }
+
+    // TODOs that are upgraded from INFO are always shown.
+    if (error.severity.name != ErrorSeverity.INFO.name) {
+      return true;
+    }
+
+    // Otherwise, show TODOs based on client configuration (either showing all,
+    // or specific types of TODOs).
     if (analysisServer.clientConfiguration.global.showAllTodos) {
       return true;
     }
diff --git a/pkg/analysis_server/test/lsp/diagnostic_test.dart b/pkg/analysis_server/test/lsp/diagnostic_test.dart
index a825b00..994943f 100644
--- a/pkg/analysis_server/test/lsp/diagnostic_test.dart
+++ b/pkg/analysis_server/test/lsp/diagnostic_test.dart
@@ -444,6 +444,31 @@
     await verifyDiagnostics('final dynamicbar;');
   }
 
+  Future<void> test_todos_asWarnings() async {
+    newFile(analysisOptionsPath, '''
+analyzer:
+  errors:
+    # Increase the severity of TODOs.
+    todo: warning
+    fixme: warning
+''');
+
+    const contents = '''
+    // TODO: This
+    // FIXME: This
+    String a = "";
+    ''';
+    newFile(mainFilePath, contents);
+
+    final firstDiagnosticsUpdate = waitForDiagnostics(mainFileUri);
+    // Don't set showTodos in config, because they should show even without this
+    // setting if they are upgraded to warnings/errors.
+    await initialize();
+    final initialDiagnostics = await firstDiagnosticsUpdate;
+    expect(initialDiagnostics, hasLength(2));
+    expect(initialDiagnostics!.map((d) => d.code).toSet(), {'todo', 'fixme'});
+  }
+
   Future<void> test_todos_boolean() async {
     // TODOs only show up if there's also some code in the file.
     const contents = '''
diff --git a/pkg/dartdev/lib/src/commands/analyze.dart b/pkg/dartdev/lib/src/commands/analyze.dart
index 3756ce2..b5ff3d4 100644
--- a/pkg/dartdev/lib/src/commands/analyze.dart
+++ b/pkg/dartdev/lib/src/commands/analyze.dart
@@ -147,9 +147,10 @@
     );
 
     server.onErrors.listen((FileAnalysisErrors fileErrors) {
-      // Record the issues found (but filter out to do comments).
-      errors.addAll(fileErrors.errors
-          .where((AnalysisError error) => error.type != 'TODO'));
+      // Record the issues found (but filter out to do comments unless they've
+      // been upgraded from INFO).
+      errors.addAll(fileErrors.errors.where((AnalysisError error) =>
+          error.type != 'TODO' || error.severity != 'INFO'));
     });
 
     await server.start();
diff --git a/pkg/dartdev/test/commands/analyze_test.dart b/pkg/dartdev/test/commands/analyze_test.dart
index 0513849..31a4dd4 100644
--- a/pkg/dartdev/test/commands/analyze_test.dart
+++ b/pkg/dartdev/test/commands/analyze_test.dart
@@ -38,6 +38,21 @@
 }
 ''';
 
+const String _todoAsWarningAnalysisOptions = '''
+analyzer:
+  errors:
+    # Increase the severity of TODOs.
+    todo: warning
+    fixme: warning
+''';
+
+const String _todoAsWarningCodeSnippet = '''
+void main() {
+  // TODO: Implement this
+  // FIXME: Fix this
+}
+''';
+
 void defineAnalysisError() {
   group('contextMessages', () {
     test('none', () {
@@ -356,6 +371,33 @@
     expect(result.stdout, contains('1 issue found.'));
   });
 
+  test('TODOs hidden by default', () async {
+    p = project(
+      mainSrc: _todoAsWarningCodeSnippet,
+    );
+    var result = await p.run(['analyze', p.dirPath]);
+
+    expect(result.exitCode, equals(0));
+    expect(result.stderr, isEmpty);
+    expect(result.stdout, contains('No issues found!'));
+  });
+
+  test('TODOs shown if > INFO', () async {
+    p = project(
+      mainSrc: _todoAsWarningCodeSnippet,
+      analysisOptions: _todoAsWarningAnalysisOptions,
+    );
+    var result = await p.run(['analyze', p.dirPath]);
+
+    expect(result.exitCode, equals(0));
+    expect(result.stderr, isEmpty);
+    expect(result.stdout, contains('lib/main.dart:2:6 '));
+    expect(result.stdout, contains('TODO: Implement this - todo'));
+    expect(result.stdout, contains('lib/main.dart:3:6 '));
+    expect(result.stdout, contains('FIXME: Fix this - fixme'));
+    expect(result.stdout, contains('2 issues found.'));
+  });
+
   test('--sdk-path value does not exist', () async {
     p = project();
     var result = await p.run(['analyze', '--sdk-path=bad']);
diff --git a/tools/VERSION b/tools/VERSION
index 5affc37..0355602 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 142
+PRERELEASE 143
 PRERELEASE_PATCH 0
\ No newline at end of file