Add some validation tests for quick fixes and fix a violation

Change-Id: I3e9d049938140600a4dbd9669c9781c50a0c2c75
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/201041
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_is_not.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_is_not.dart
index b81db26..4381b83 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_is_not.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_is_not.dart
@@ -4,12 +4,14 @@
 
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/precedence.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 class ConvertIntoIsNot extends CorrectionProducer {
@@ -17,6 +19,12 @@
   AssistKind get assistKind => DartAssistKind.CONVERT_INTO_IS_NOT;
 
   @override
+  FixKind get fixKind => DartFixKind.CONVERT_TO_IS_NOT;
+
+  @override
+  FixKind get multiFixKind => DartFixKind.CONVERT_TO_IS_NOT_MULTI;
+
+  @override
   Future<void> compute(ChangeBuilder builder) async {
     // Find the is expression
     var isExpression = node.thisOrAncestorOfType<IsExpression>();
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 365dc29..661861a 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -311,6 +311,10 @@
       'dart.fix.convert.toIntLiteral.multi',
       DartFixKindPriority.IN_FILE,
       'Convert to int literals everywhere in file');
+  static const CONVERT_TO_IS_NOT = FixKind(
+      'dart.fix.convert.isNot', DartFixKindPriority.DEFAULT, 'Convert to is!');
+  static const CONVERT_TO_IS_NOT_MULTI = FixKind('dart.fix.convert.isNot.multi',
+      DartFixKindPriority.IN_FILE, 'Convert to is! everywhere in file');
   static const CONVERT_TO_LINE_COMMENT = FixKind(
       'dart.fix.convert.toLineComment',
       DartFixKindPriority.DEFAULT,
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 2ff9ef9..6359410 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -805,11 +805,9 @@
         ],
       )
     ],
-    // todo (pq): note this is not in lintProducerMap
     LintNames.prefer_is_not_operator: [
       FixInfo(
-        // todo (pq): consider enabling
-        canBeAppliedToFile: false,
+        canBeAppliedToFile: true,
         canBeBulkApplied: true,
         generators: [
           ConvertIntoIsNot.newInstance,
diff --git a/pkg/analysis_server/test/src/services/correction/fix/fix_processor_map_test.dart b/pkg/analysis_server/test/src/services/correction/fix/fix_processor_map_test.dart
new file mode 100644
index 0000000..3f86540
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/fix_processor_map_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FixProcessorMapTest);
+  });
+}
+
+@reflectiveTest
+class FixProcessorMapTest {
+  void test_lintProducerMap() {
+    _testMap(FixProcessor.lintProducerMap.values);
+  }
+
+  void test_nonLintProducerMap() {
+    _testMap(FixProcessor.nonLintProducerMap.values);
+  }
+
+  void _testInfo(FixInfo info) {
+    for (var generator in info.generators) {
+      var producer = generator();
+      var className = producer.runtimeType.toString();
+      expect(producer.fixKind, isNotNull, reason: '$className.fixKind');
+      if (info.canBeAppliedToFile) {
+        expect(producer.multiFixKind, isNotNull,
+            reason: '$className.multiFixKind');
+      }
+    }
+  }
+
+  void _testMap(Iterable<List<FixInfo>> values) {
+    for (var list in values) {
+      for (var info in list) {
+        _testInfo(info);
+      }
+    }
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index e520510..acc1caf 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -83,6 +83,7 @@
 import 'data_driven/test_all.dart' as data_driven;
 import 'extend_class_for_mixin_test.dart' as extend_class_for_mixin;
 import 'fix_in_file_test.dart' as fix_in_file;
+import 'fix_processor_map_test.dart' as fix_processor_map;
 import 'fix_test.dart' as fix;
 import 'import_async_test.dart' as import_async;
 import 'import_library_prefix_test.dart' as import_library_prefix;
@@ -250,6 +251,7 @@
     extend_class_for_mixin.main();
     fix.main();
     fix_in_file.main();
+    fix_processor_map.main();
     import_async.main();
     import_library_prefix.main();
     import_library_project.main();