Version 3.7.0-23.0.dev

Merge 4a80b6d88bd87bcbbc8e84942f12a2ea3a71bdd4 into dev
diff --git a/DEPS b/DEPS
index 6040b9a..1c696d6 100644
--- a/DEPS
+++ b/DEPS
@@ -146,6 +146,7 @@
   "dart_style_rev": "5d35f4d829ffb8532d345d95d3e9504ae6cd839e", # disable tools/rev_sdk_deps.dart
   "dartdoc_rev": "80c6f18f34b387d4b9ce89ddd2e3049093335f9d",
   "ecosystem_rev": "2d58550f9e3fd8ecbc3b2e4444095fcb204a66c6",
+  "file_rev": "6842feaef1c4e06239bd30f8d3ef722838b1c97e",
   "fixnum_rev": "83293b8ed86ccd574a94fcf4a2da43f31c1b43e0",
   "flute_rev": "a531c96a8b43d015c6bfbbfe3ab54867b0763b8b",
   "glob_rev": "00a9c82d31c01ae88ec9ae4021d842e9b832aa52",
@@ -161,7 +162,7 @@
   "markdown_rev": "d53feae0760a4f0aae5ffdfb12d8e6acccf14b40",
   "matcher_rev": "31f13583630e093731c8cf2b843c14196d748c5c",
   "material_color_utilities_rev": "799b6ba2f3f1c28c67cc7e0b4f18e0c7d7f3c03e",
-  "mockito_rev": "3de67548e833a8eef66a2a49070b197c2c08b3ab",
+  "mockito_rev": "57d484f9b8e7f6a504966a901174358a42fa932a",
   "native_rev": "659511886501bcce638c3966590df04984909ef0", # dart-native-interop-team@ is rolling breaking changes manually while the assets features are in experimental.
   "package_config_rev": "bafff8e90be25e1985f7e3ee40ea1d22571a93e6",
   "path_rev": "e969f42ed112dd702a9453beb9df6c12ae2d3805",
@@ -175,7 +176,7 @@
   "sse_rev": "af2c5c572a8da6d2f7551b80d75121f2a38a4c79",
   "stack_trace_rev": "115bcd9591d251dab7a5ad518655c2124a1cc525",
   "stream_channel_rev": "f4407168b275fcde9187baefd7dbce76d0992825",
-  "string_scanner_rev": "2139417ffcd0392bde3ba9bc83ee13eaa5fbed01",
+  "string_scanner_rev": "084b201c54b168aced178fff41fce71e3869ae42",
   "sync_http_rev": "91c0dd5ef9a008f0277aadcfd83036f82e572d09",
   "tar_rev": "5a1ea943e70cdf3fa5e1102cdbb9418bd9b4b81a",
   "term_glyph_rev": "19d8c08a4e81122639129c62049896021910c932",
@@ -183,7 +184,7 @@
   "test_descriptor_rev": "a3db1efe3dc725dcae9ee61647d3bfc19b3231ac",
   "test_process_rev": "52ee3f5ab70ed965bb7122c1d499081fbccd0bde",
   "test_reflective_loader_rev": "598af2f503955020af0eaa82558d574a03934078",
-  "tools_rev": "3f7a46606496f826c2f60586ab71c2b7a9bfbf15",
+  "tools_rev": "f882de9ba86712003728d4663e1b73a620d352b1",
   "typed_data_rev": "6abfafdcf661cd8a814619d7e2a3e99edb3a3862",
   "vector_math_rev": "2cfbe2c115a57b368ccbc3c89ebd38a06764d3d1",
   "watcher_rev": "3b850778ad0b62db3aa2cfe48832870c2461db30",
@@ -421,6 +422,9 @@
     "url": Var("dart_git") + "flute.git" + "@" + Var("flute_rev"),
     "condition": "checkout_flute",
   },
+  Var("dart_root") + "/third_party/pkg/file":
+      Var("dart_git") + "external/github.com/google/file.dart"
+      + "@" + Var("file_rev"),
   Var("dart_root") + "/third_party/pkg/glob":
       Var("dart_git") + "glob.git" + "@" + Var("glob_rev"),
   Var("dart_root") + "/third_party/pkg/html":
diff --git a/benchmarks/analysis_options.yaml b/benchmarks/analysis_options.yaml
index 2e8f09b..16ed5a3 100644
--- a/benchmarks/analysis_options.yaml
+++ b/benchmarks/analysis_options.yaml
@@ -49,7 +49,6 @@
     #- omit_local_variable_types
     #- only_throw_errors
     - overridden_fields
-    - package_api_docs
     - package_names
     - package_prefixed_library_names
     - prefer_adjacent_string_concatenation
diff --git a/pkg/_fe_analyzer_shared/analysis_options.yaml b/pkg/_fe_analyzer_shared/analysis_options.yaml
index 3fe6296..2a7e821 100644
--- a/pkg/_fe_analyzer_shared/analysis_options.yaml
+++ b/pkg/_fe_analyzer_shared/analysis_options.yaml
@@ -15,7 +15,6 @@
     - avoid_empty_else
     - empty_statements
     - valid_regexps
-    - package_api_docs
     - lines_longer_than_80_chars
     # - always_specify_types
     - use_super_parameters
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_comparison.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_comparison.dart
index a6a7e7d..e0cc673 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_comparison.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_comparison.dart
@@ -12,7 +12,6 @@
 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';
-import 'package:linter/src/lint_codes.dart';
 
 class RemoveComparison extends ResolvedCorrectionProducer {
   @override
@@ -51,8 +50,7 @@
     return errorCode == WarningCode.UNNECESSARY_NAN_COMPARISON_TRUE ||
         errorCode == WarningCode.UNNECESSARY_NULL_COMPARISON_ALWAYS_NULL_TRUE ||
         errorCode == WarningCode.UNNECESSARY_NULL_COMPARISON_NEVER_NULL_TRUE ||
-        errorCode == WarningCode.UNNECESSARY_TYPE_CHECK_TRUE ||
-        errorCode == LinterLintCode.avoid_null_checks_in_equality_operators;
+        errorCode == WarningCode.UNNECESSARY_TYPE_CHECK_TRUE;
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
index 1fcdf41..ce059ef 100644
--- a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
+++ b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
@@ -1923,8 +1923,6 @@
   status: noFix
 LintCode.avoid_multiple_declarations_per_line:
   status: hasFix
-LintCode.avoid_null_checks_in_equality_operators:
-  status: hasFix
 LintCode.avoid_positional_boolean_parameters:
   status: noFix
   notes: |-
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 60b1a65..73c1701 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -313,9 +313,6 @@
   LinterLintCode.avoid_multiple_declarations_per_line: [
     SplitMultipleDeclarations.new,
   ],
-  LinterLintCode.avoid_null_checks_in_equality_operators: [
-    RemoveComparison.new,
-  ],
   LinterLintCode.avoid_print: [
     MakeConditionalOnDebugMode.new,
     RemovePrint.new,
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart
index 4efed80..56f09a9 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart
@@ -12,10 +12,10 @@
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(RemoveComparisonTest);
-    defineReflectiveTests(RemoveTypeCheckTest);
-    defineReflectiveTests(RemoveTypeCheckBulkTest);
-    defineReflectiveTests(RemoveNullCheckComparisonTest);
     defineReflectiveTests(RemoveNullCheckComparisonBulkTest);
+    defineReflectiveTests(RemoveNullCheckComparisonTest);
+    defineReflectiveTests(RemoveTypeCheckBulkTest);
+    defineReflectiveTests(RemoveTypeCheckTest);
   });
 }
 
@@ -610,7 +610,7 @@
   final String name = '';
 
   @override
-  operator ==(Object? other) =>
+  operator ==(Object other) =>
           other != null &&
           other is Person &&
           name == other.name;
@@ -620,7 +620,7 @@
   final String name = '';
 
   @override
-  operator ==(Object? other) =>
+  operator ==(Object other) =>
           other != null &&
           other is Person &&
           name == other.name;
@@ -631,7 +631,7 @@
   final String name = '';
 
   @override
-  operator ==(Object? other) =>
+  operator ==(Object other) =>
           other is Person &&
           name == other.name;
 }
@@ -640,7 +640,7 @@
   final String name = '';
 
   @override
-  operator ==(Object? other) =>
+  operator ==(Object other) =>
           other is Person &&
           name == other.name;
 }
diff --git a/pkg/dev_compiler/test/hot_reload_suite.dart b/pkg/dev_compiler/test/hot_reload_suite.dart
index 05eba1e..e66996c 100644
--- a/pkg/dev_compiler/test/hot_reload_suite.dart
+++ b/pkg/dev_compiler/test/hot_reload_suite.dart
@@ -13,6 +13,7 @@
 import 'package:dev_compiler/dev_compiler.dart' as ddc_names
     show libraryUriToJsIdentifier;
 import 'package:front_end/src/api_unstable/ddc.dart' as fe;
+import 'package:path/path.dart' as p;
 import 'package:reload_test/ddc_helpers.dart' as ddc_helpers;
 import 'package:reload_test/frontend_server_controller.dart';
 import 'package:reload_test/hot_reload_memory_filesystem.dart';
@@ -232,9 +233,10 @@
     // Report results for this test's sources' diff validations.
     void reportDiffOutcome(Uri fileUri, String testOutput, bool testPassed) {
       final filePath = fileUri.path;
+      final relativeFilePath = p.relative(filePath, from: allTestsUri.path);
       var outcome = TestResultOutcome(
         configuration: argResults['named-configuration'] as String,
-        testName: '$filePath-diff',
+        testName: '$relativeFilePath-diff',
         testOutput: testOutput,
       );
       outcome.elapsedTime = stopwatch.elapsed;
diff --git a/pkg/front_end/analysis_options.yaml b/pkg/front_end/analysis_options.yaml
index ffe3431..1f73667 100644
--- a/pkg/front_end/analysis_options.yaml
+++ b/pkg/front_end/analysis_options.yaml
@@ -19,7 +19,6 @@
     - avoid_empty_else
     - empty_statements
     - valid_regexps
-    - package_api_docs
     - lines_longer_than_80_chars
     - unrelated_type_equality_checks
     - annotate_overrides
diff --git a/pkg/frontend_server/analysis_options.yaml b/pkg/frontend_server/analysis_options.yaml
index fd71b86..9ff1bcb 100644
--- a/pkg/frontend_server/analysis_options.yaml
+++ b/pkg/frontend_server/analysis_options.yaml
@@ -13,7 +13,6 @@
     - avoid_empty_else
     - empty_statements
     - valid_regexps
-    - package_api_docs
     - lines_longer_than_80_chars
     - unrelated_type_equality_checks
     - annotate_overrides
diff --git a/pkg/kernel/analysis_options.yaml b/pkg/kernel/analysis_options.yaml
index e1e580d9..5e69d0b 100644
--- a/pkg/kernel/analysis_options.yaml
+++ b/pkg/kernel/analysis_options.yaml
@@ -14,7 +14,6 @@
     - avoid_empty_else
     - empty_statements
     - valid_regexps
-    - package_api_docs
     - lines_longer_than_80_chars
     - unrelated_type_equality_checks
     - annotate_overrides
diff --git a/pkg/linter/analysis_options.yaml b/pkg/linter/analysis_options.yaml
index 88b2aa6..14263f4 100644
--- a/pkg/linter/analysis_options.yaml
+++ b/pkg/linter/analysis_options.yaml
@@ -38,7 +38,6 @@
     - no_adjacent_strings_in_list
     - noop_primitive_operations
     - only_throw_errors
-    - package_api_docs
     - parameter_assignments
     - prefer_asserts_in_initializer_lists
     - prefer_const_constructors_in_immutables
diff --git a/pkg/linter/analyzer_use_new_elements.txt b/pkg/linter/analyzer_use_new_elements.txt
index f09005c..e3e70b1 100644
--- a/pkg/linter/analyzer_use_new_elements.txt
+++ b/pkg/linter/analyzer_use_new_elements.txt
@@ -31,6 +31,7 @@
 lib/src/rules/avoid_return_types_on_setters.dart
 lib/src/rules/avoid_returning_null.dart
 lib/src/rules/avoid_returning_null_for_future.dart
+lib/src/rules/avoid_returning_this.dart
 lib/src/rules/avoid_shadowing_type_parameters.dart
 lib/src/rules/avoid_single_cascade_in_expression_statements.dart
 lib/src/rules/avoid_slow_async_io.dart
@@ -346,6 +347,8 @@
 test/rules/prefer_int_literals_test.dart
 test/rules/prefer_interpolation_to_compose_strings_test.dart
 test/rules/prefer_is_empty_test.dart
+test/rules/prefer_is_not_empty_test.dart
+test/rules/prefer_is_not_operator_test.dart
 test/rules/prefer_iterable_whereType_test.dart
 test/rules/prefer_mixin_test.dart
 test/rules/prefer_null_aware_method_calls_test.dart
@@ -442,9 +445,6 @@
 test_data/rules/no_default_cases.dart
 test_data/rules/overridden_fields.dart
 test_data/rules/prefer_const_declarations.dart
-test_data/rules/prefer_final_fields.dart
-test_data/rules/prefer_is_not_empty.dart
-test_data/rules/prefer_is_not_operator.dart
 test_data/rules/prefer_void_to_null.dart
 test_data/rules/require_trailing_commas.dart
 test_data/rules/type_init_formals.dart
diff --git a/pkg/linter/example/all.yaml b/pkg/linter/example/all.yaml
index 9ce6437..a1b6f45 100644
--- a/pkg/linter/example/all.yaml
+++ b/pkg/linter/example/all.yaml
@@ -27,7 +27,6 @@
     - avoid_init_to_null
     - avoid_js_rounded_ints
     - avoid_multiple_declarations_per_line
-    - avoid_null_checks_in_equality_operators
     - avoid_positional_boolean_parameters
     - avoid_print
     - avoid_private_typedef_functions
diff --git a/pkg/linter/lib/src/lint_codes.g.dart b/pkg/linter/lib/src/lint_codes.g.dart
index ab85246..d149d98 100644
--- a/pkg/linter/lib/src/lint_codes.g.dart
+++ b/pkg/linter/lib/src/lint_codes.g.dart
@@ -240,13 +240,6 @@
         "Try splitting the variable declarations into multiple lines.",
   );
 
-  static const LintCode avoid_null_checks_in_equality_operators =
-      LinterLintCode(
-    LintNames.avoid_null_checks_in_equality_operators,
-    "Unnecessary null comparison in implementation of '=='.",
-    correctionMessage: "Try removing the comparison.",
-  );
-
   static const LintCode avoid_positional_boolean_parameters = LinterLintCode(
     LintNames.avoid_positional_boolean_parameters,
     "'bool' parameters should be named parameters.",
diff --git a/pkg/linter/lib/src/rules/avoid_null_checks_in_equality_operators.dart b/pkg/linter/lib/src/rules/avoid_null_checks_in_equality_operators.dart
index da8ed02..6d58b24 100644
--- a/pkg/linter/lib/src/rules/avoid_null_checks_in_equality_operators.dart
+++ b/pkg/linter/lib/src/rules/avoid_null_checks_in_equality_operators.dart
@@ -2,113 +2,19 @@
 // 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:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/nullability_suffix.dart';
+import 'package:pub_semver/pub_semver.dart';
 
 import '../analyzer.dart';
-import '../extensions.dart';
 
 const _desc = r"Don't check for `null` in custom `==` operators.";
 
-bool _isComparingEquality(TokenType tokenType) =>
-    tokenType == TokenType.BANG_EQ || tokenType == TokenType.EQ_EQ;
-
-bool _isComparingParameterWithNull(BinaryExpression node, Element? parameter) =>
-    _isComparingEquality(node.operator.type) &&
-    ((node.leftOperand.isNullLiteral &&
-            _isParameter(node.rightOperand, parameter)) ||
-        (node.rightOperand.isNullLiteral &&
-            _isParameter(node.leftOperand, parameter)));
-
-bool _isParameter(Expression expression, Element? parameter) =>
-    expression.canonicalElement == parameter;
-
-bool _isParameterWithQuestionQuestion(
-        BinaryExpression node, Element? parameter) =>
-    node.operator.type == TokenType.QUESTION_QUESTION &&
-    _isParameter(node.leftOperand, parameter);
-
 class AvoidNullChecksInEqualityOperators extends LintRule {
   AvoidNullChecksInEqualityOperators()
       : super(
-          name: LintNames.avoid_null_checks_in_equality_operators,
-          description: _desc,
-        );
+            name: LintNames.avoid_null_checks_in_equality_operators,
+            description: _desc,
+            state: State.removed(since: Version(3, 7, 0)));
 
   @override
-  LintCode get lintCode =>
-      LinterLintCode.avoid_null_checks_in_equality_operators;
-
-  @override
-  void registerNodeProcessors(
-      NodeLintRegistry registry, LinterContext context) {
-    var visitor = _Visitor(this);
-    registry.addMethodDeclaration(this, visitor);
-  }
-}
-
-class _BodyVisitor extends RecursiveAstVisitor<void> {
-  final Element? parameter;
-  final LintRule rule;
-
-  _BodyVisitor(this.parameter, this.rule);
-
-  @override
-  visitBinaryExpression(BinaryExpression node) {
-    if (_isParameterWithQuestionQuestion(node, parameter) ||
-        _isComparingParameterWithNull(node, parameter)) {
-      rule.reportLint(node);
-    }
-    super.visitBinaryExpression(node);
-  }
-
-  @override
-  visitMethodInvocation(MethodInvocation node) {
-    if (node.operator?.type == TokenType.QUESTION_PERIOD &&
-        node.target.canonicalElement == parameter) {
-      rule.reportLint(node);
-    }
-    super.visitMethodInvocation(node);
-  }
-
-  @override
-  visitPropertyAccess(PropertyAccess node) {
-    if (node.operator.type == TokenType.QUESTION_PERIOD &&
-        node.target.canonicalElement == parameter) {
-      rule.reportLint(node);
-    }
-    super.visitPropertyAccess(node);
-  }
-}
-
-class _Visitor extends SimpleAstVisitor<void> {
-  final LintRule rule;
-
-  _Visitor(this.rule);
-
-  @override
-  void visitMethodDeclaration(MethodDeclaration node) {
-    var parameters = node.parameters?.parameters;
-    if (parameters == null) {
-      return;
-    }
-
-    if (node.name.type != TokenType.EQ_EQ || parameters.length != 1) {
-      return;
-    }
-
-    var parameter = parameters.first.declaredElement?.canonicalElement;
-
-    // Analyzer will produce UNNECESSARY_NULL_COMPARISON_FALSE|TRUE
-    // See: https://github.com/dart-lang/linter/issues/2864
-    if (parameter is VariableElement &&
-        parameter.type.nullabilitySuffix != NullabilitySuffix.question) {
-      return;
-    }
-
-    node.body.accept(_BodyVisitor(parameter, rule));
-  }
+  LintCode get lintCode => LinterLintCode.removed_lint;
 }
diff --git a/pkg/linter/lib/src/rules/avoid_returning_this.dart b/pkg/linter/lib/src/rules/avoid_returning_this.dart
index 9f2d909..ef77d4d 100644
--- a/pkg/linter/lib/src/rules/avoid_returning_this.dart
+++ b/pkg/linter/lib/src/rules/avoid_returning_this.dart
@@ -2,9 +2,9 @@
 // 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:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/ast/ast.dart'; // ignore: implementation_imports
 
 import '../analyzer.dart';
 import '../extensions.dart';
@@ -79,10 +79,11 @@
         return;
       }
 
-      var returnType = node.declaredElement?.returnType;
+      var returnType = node.declaredFragment?.element.returnType;
       if (returnType is InterfaceType &&
-          // ignore: cast_nullable_to_non_nullable
-          returnType.element == (parent as Declaration).declaredElement) {
+          returnType.element3 ==
+              // ignore: cast_nullable_to_non_nullable
+              (parent as FragmentDeclaration).declaredFragment?.element) {
       } else {
         return;
       }
diff --git a/pkg/linter/lib/src/rules/prefer_constructors_over_static_methods.dart b/pkg/linter/lib/src/rules/prefer_constructors_over_static_methods.dart
index 642a3340..85c0008 100644
--- a/pkg/linter/lib/src/rules/prefer_constructors_over_static_methods.dart
+++ b/pkg/linter/lib/src/rules/prefer_constructors_over_static_methods.dart
@@ -80,10 +80,12 @@
 
 extension on AstNode? {
   InterfaceType? typeToCheckOrNull() => switch (this) {
-        ExtensionTypeDeclaration e =>
-          e.typeParameters == null ? e.declaredElement?.thisType : null,
-        ClassDeclaration c =>
-          c.typeParameters == null ? c.declaredElement?.thisType : null,
+        ExtensionTypeDeclaration e => e.typeParameters == null
+            ? e.declaredFragment?.element.thisType
+            : null,
+        ClassDeclaration c => c.typeParameters == null
+            ? c.declaredFragment?.element.thisType
+            : null,
         _ => null
       };
 }
diff --git a/pkg/linter/lib/src/rules/recursive_getters.dart b/pkg/linter/lib/src/rules/recursive_getters.dart
index a7ce0c0..d2c0a3e 100644
--- a/pkg/linter/lib/src/rules/recursive_getters.dart
+++ b/pkg/linter/lib/src/rules/recursive_getters.dart
@@ -4,7 +4,7 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 
 import '../analyzer.dart';
 
@@ -31,11 +31,11 @@
 
 class _BodyVisitor extends RecursiveAstVisitor<void> {
   final LintRule rule;
-  final ExecutableElement element;
+  final ExecutableElement2 element;
   _BodyVisitor(this.element, this.rule);
 
   bool isSelfReference(SimpleIdentifier node) {
-    if (node.staticElement != element) return false;
+    if (node.element != element) return false;
     var parent = node.parent;
     if (parent is PrefixedIdentifier) return false;
     if (parent is PropertyAccess && parent.target is! ThisExpression) {
@@ -76,7 +76,7 @@
     // getters have null arguments, methods have parameters, could be empty.
     if (node.functionExpression.parameters != null) return;
 
-    _verifyElement(node.functionExpression, node.declaredElement);
+    _verifyElement(node.functionExpression, node.declaredFragment?.element);
   }
 
   @override
@@ -84,10 +84,10 @@
     // getters have null arguments, methods have parameters, could be empty.
     if (node.parameters != null) return;
 
-    _verifyElement(node.body, node.declaredElement);
+    _verifyElement(node.body, node.declaredFragment?.element);
   }
 
-  void _verifyElement(AstNode node, ExecutableElement? element) {
+  void _verifyElement(AstNode node, ExecutableElement2? element) {
     if (element == null) return;
     node.accept(_BodyVisitor(element, rule));
   }
diff --git a/pkg/linter/messages.yaml b/pkg/linter/messages.yaml
index 0e3c327..1400550 100644
--- a/pkg/linter/messages.yaml
+++ b/pkg/linter/messages.yaml
@@ -1455,6 +1455,7 @@
     addedIn: "2.0"
     categories: [style]
     hasPublishedDocs: false
+    removedIn: "3.7"
     deprecatedDetails: |-
       **DON'T** check for `null` in custom `==` operators.
 
@@ -1482,6 +1483,8 @@
         operator ==(Object? other) => other is Person && name == other.name;
       }
       ```
+
+      This rule has been removed.
   avoid_positional_boolean_parameters:
     problemMessage: "'bool' parameters should be named parameters."
     correctionMessage: "Try converting the parameter to a named parameter."
diff --git a/pkg/linter/test/rules/all.dart b/pkg/linter/test/rules/all.dart
index 5bda8b6..402d92c 100644
--- a/pkg/linter/test/rules/all.dart
+++ b/pkg/linter/test/rules/all.dart
@@ -43,8 +43,6 @@
 import 'avoid_js_rounded_ints_test.dart' as avoid_js_rounded_ints;
 import 'avoid_multiple_declarations_per_line_test.dart'
     as avoid_multiple_declarations_per_line;
-import 'avoid_null_checks_in_equality_operators_test.dart'
-    as avoid_null_checks_in_equality_operators;
 import 'avoid_positional_boolean_parameters_test.dart'
     as avoid_positional_boolean_parameters;
 import 'avoid_print_test.dart' as avoid_print;
@@ -346,7 +344,6 @@
   avoid_init_to_null.main();
   avoid_js_rounded_ints.main();
   avoid_multiple_declarations_per_line.main();
-  avoid_null_checks_in_equality_operators.main();
   avoid_positional_boolean_parameters.main();
   avoid_print.main();
   avoid_private_typedef_functions.main();
diff --git a/pkg/linter/test/rules/avoid_null_checks_in_equality_operators_test.dart b/pkg/linter/test/rules/avoid_null_checks_in_equality_operators_test.dart
deleted file mode 100644
index ff5600c..0000000
--- a/pkg/linter/test/rules/avoid_null_checks_in_equality_operators_test.dart
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (c) 2024, 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:test_reflective_loader/test_reflective_loader.dart';
-
-import '../rule_test_support.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(AvoidNullChecksInEqualityOperatorsTest);
-  });
-}
-
-@reflectiveTest
-class AvoidNullChecksInEqualityOperatorsTest extends LintRuleTest {
-  @override
-  String get lintRule => LintNames.avoid_null_checks_in_equality_operators;
-
-  test_dynamicParameter_neNull() async {
-    // https://github.com/dart-lang/linter/issues/2864
-    await assertDiagnostics(r'''
-class C {
-  String foo = '';
-  @override
-  operator ==(dynamic other) {
-    return other != null && other is C && foo == other.foo;
-  }
-}
-''', [
-      error(WarningCode.NON_NULLABLE_EQUALS_PARAMETER, 52, 2),
-    ]);
-  }
-
-  test_dynamicParameter_propertyAccess() async {
-    await assertDiagnostics(r'''
-class C {
-  String foo = '';
-  @override
-  operator ==(dynamic other) => other is C && foo == other.foo;
-}
-''', [
-      error(WarningCode.NON_NULLABLE_EQUALS_PARAMETER, 52, 2),
-    ]);
-  }
-
-  test_nonNullableParameter_neNull() async {
-    // https://github.com/dart-lang/linter/issues/2864
-    await assertDiagnostics(r'''
-class C {
-  String foo = '';
-  @override
-  operator ==(Object other) {
-    return other != null && other is C && foo == other.foo;
-  }
-}
-''', [
-      error(WarningCode.UNNECESSARY_NULL_COMPARISON_NEVER_NULL_TRUE, 88, 7),
-    ]);
-  }
-
-  test_nullableParameter_eqeqNull_not() async {
-    await assertDiagnostics(r'''
-class C {
-  String foo = '';
-  @override
-  operator ==(Object? other) =>
-          !(other == null) && other is C && foo == other.foo;
-}
-''', [
-      error(WarningCode.NON_NULLABLE_EQUALS_PARAMETER, 52, 2),
-      lint(85, 13),
-    ]);
-  }
-
-  test_nullableParameter_fieldComparisonOnLocal() async {
-    await assertDiagnostics(r'''
-class C {
-  String foo;
-  C(this.foo);
-  @override
-  operator ==(Object? other) {
-    if (other is C) {
-      var toCompare = other ?? C("");
-      return toCompare.foo == foo;
-    }
-    return false;
-  }
-
-}
-''', [
-      error(WarningCode.NON_NULLABLE_EQUALS_PARAMETER, 62, 2),
-      lint(126, 14),
-      error(StaticWarningCode.DEAD_NULL_AWARE_EXPRESSION, 135, 5),
-    ]);
-  }
-
-  test_nullableParameter_neNull() async {
-    await assertDiagnostics(r'''
-class C {
-  String foo = '';
-  @override
-  operator ==(Object? other) =>
-          other != null && other is C && foo == other.foo;
-}
-''', [
-      error(WarningCode.NON_NULLABLE_EQUALS_PARAMETER, 52, 2),
-      lint(83, 13),
-    ]);
-  }
-
-  test_nullableParameter_nullAwarePropertyAccess() async {
-    await assertDiagnostics(r'''
-class C {
-  String foo = '';
-  @override
-  operator ==(Object? other) => other is C && foo == other?.foo;
-}
-''', [
-      error(WarningCode.NON_NULLABLE_EQUALS_PARAMETER, 52, 2),
-      lint(94, 10),
-      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR, 99, 2),
-    ]);
-  }
-}
diff --git a/pkg/reload_test/lib/test_helpers.dart b/pkg/reload_test/lib/test_helpers.dart
index a205399..ace1aed 100644
--- a/pkg/reload_test/lib/test_helpers.dart
+++ b/pkg/reload_test/lib/test_helpers.dart
@@ -18,7 +18,7 @@
 
   TestResultOutcome({
     required this.configuration,
-    this.suiteName = 'tests/reload',
+    this.suiteName = 'hot_reload',
     required this.testName,
     this.expectedResult = 'Pass',
     this.testOutput = '',
diff --git a/pkg/test_runner/analysis_options.yaml b/pkg/test_runner/analysis_options.yaml
index 2d96f81..a2884c0 100644
--- a/pkg/test_runner/analysis_options.yaml
+++ b/pkg/test_runner/analysis_options.yaml
@@ -15,7 +15,6 @@
     - comment_references
     - directives_ordering
     - omit_local_variable_types
-    - package_api_docs
     - prefer_const_constructors
     - throw_in_finally
     - unnecessary_lambdas
diff --git a/pkg/testing/analysis_options.yaml b/pkg/testing/analysis_options.yaml
index 2bd5500..d37843c 100644
--- a/pkg/testing/analysis_options.yaml
+++ b/pkg/testing/analysis_options.yaml
@@ -14,5 +14,4 @@
     - always_declare_return_types
     - avoid_void_async
     - lines_longer_than_80_chars
-    - package_api_docs
     - unawaited_futures
diff --git a/tools/VERSION b/tools/VERSION
index de9a871..77a3a6f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 3
 MINOR 7
 PATCH 0
-PRERELEASE 22
+PRERELEASE 23
 PRERELEASE_PATCH 0
diff --git a/tools/generate_package_config.dart b/tools/generate_package_config.dart
index 67a6268..4e2cd4a 100644
--- a/tools/generate_package_config.dart
+++ b/tools/generate_package_config.dart
@@ -9,9 +9,7 @@
 import 'dart:io';
 
 // Important! Do not add package: imports to this file.
-//
 // Do not add relative deps for libraries that themselves use package deps.
-//
 // This tool runs before the .dart_tool/package_config.json file is created, so
 // can not itself use package references.
 
@@ -90,6 +88,14 @@
   ];
   packages.sort((a, b) => a.name.compareTo(b.name));
 
+  // TODO(devoncarew): Temporarily ignore the second package:file and
+  // package:file_testing locations.
+  packages.removeWhere((p) {
+    final path = posix(p.rootUri);
+    return path == 'third_party/pkg/file/packages/file' ||
+        path == 'third_party/pkg/file/packages/file_testing';
+  });
+
   // Remove any packages with identical names.
   final uniqueNames = packages.map((p) => p.name).toSet();
 
diff --git a/tools/package_deps/bin/package_deps.dart b/tools/package_deps/bin/package_deps.dart
index ba3099c..a2815be 100644
--- a/tools/package_deps/bin/package_deps.dart
+++ b/tools/package_deps/bin/package_deps.dart
@@ -453,6 +453,8 @@
     _findPackages(Directory('pkg'));
     _findPackages(Directory(path.join('third_party', 'devtools')));
     _findPackages(Directory(path.join('third_party', 'pkg')));
+    _findPackages(
+        Directory(path.join('third_party', 'pkg', 'file', 'packages')));
 
     if (verbose) {
       print('Package versions in the SDK:');