Version 3.7.0-173.0.dev

Merge 53844a6ba03da914e43d663e152687f2c0b026ae into dev
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_extension_override.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_extension_override.dart
index f8b9976..a39a858 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_extension_override.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_extension_override.dart
@@ -18,8 +18,14 @@
     var node = this.node;
     if (node is! SimpleIdentifier) return const [];
     var parent = node.parent;
-    if (parent is! PropertyAccess) return const [];
-    var target = parent.target;
+    Expression? target;
+    if (parent is MethodInvocation) {
+      target = parent.target;
+    } else if (parent is PropertyAccess) {
+      target = parent.target;
+    } else {
+      return const [];
+    }
     if (target == null) return const [];
     var dartFixContext = context.dartFixContext;
     if (dartFixContext == null) return const [];
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_extension_override_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_extension_override_test.dart
index 00acc08..ca3b70e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_extension_override_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_extension_override_test.dart
@@ -20,6 +20,39 @@
   @override
   FixKind get kind => DartFixKind.ADD_EXTENSION_OVERRIDE;
 
+  Future<void> test_method() async {
+    await resolveTestCode('''
+extension E on int {
+  void foo() {}
+}
+extension E2 on int {
+  void foo() {}
+}
+f() {
+  0.foo();
+}
+''');
+    await assertHasFix('''
+extension E on int {
+  void foo() {}
+}
+extension E2 on int {
+  void foo() {}
+}
+f() {
+  E(0).foo();
+}
+''', matchFixMessage: "Add an extension override for 'E'");
+
+    await assertHasFixesWithoutApplying(
+      expectedNumberOfFixesForKind: 2,
+      matchFixMessages: [
+        "Add an extension override for 'E'",
+        "Add an extension override for 'E2'",
+      ],
+    );
+  }
+
   Future<void> test_no_name() async {
     await resolveTestCode('''
 extension E on int {
diff --git a/pkg/analyzer/analyzer_use_new_elements.txt b/pkg/analyzer/analyzer_use_new_elements.txt
index 832176b..2937379 100644
--- a/pkg/analyzer/analyzer_use_new_elements.txt
+++ b/pkg/analyzer/analyzer_use_new_elements.txt
@@ -225,7 +225,6 @@
 test/src/dart/resolution/scope_test.dart
 test/src/dart/resolution/super_formal_parameter_test.dart
 test/src/lint/lint_rule_test.dart
-test/src/lint/linter/linter_context_impl_test.dart
 test/src/services/top_level_declarations_test.dart
 test/src/summary/element_text.dart
 test/src/summary/elements/class_test.dart
diff --git a/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
index 6255d0d..c96a0bd 100644
--- a/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
+++ b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
@@ -42,9 +42,9 @@
       unit: result.unit,
     );
 
-    var libraryElement = result.libraryElement;
+    var libraryElement = result.libraryElement2;
     var analysisContext = libraryElement.session.analysisContext;
-    var libraryPath = libraryElement.source.fullName;
+    var libraryPath = libraryElement.firstFragment.source.fullName;
     var workspace = analysisContext.contextRoot.workspace;
     var workspacePackage = workspace.findPackageFor(libraryPath);
 
diff --git a/pkg/linter/analyzer_use_new_elements.txt b/pkg/linter/analyzer_use_new_elements.txt
index b8e84eb..4f42ee6 100644
--- a/pkg/linter/analyzer_use_new_elements.txt
+++ b/pkg/linter/analyzer_use_new_elements.txt
@@ -10,5 +10,4 @@
 lib/src/rules/use_build_context_synchronously.dart
 lib/src/rules/use_late_for_private_fields_and_variables.dart
 lib/src/util/dart_type_utilities.dart
-lib/src/util/flutter_utils.dart
 test/rules/use_build_context_synchronously_test.dart
diff --git a/pkg/linter/lib/src/rules/use_build_context_synchronously.dart b/pkg/linter/lib/src/rules/use_build_context_synchronously.dart
index 657206a..8deed4e 100644
--- a/pkg/linter/lib/src/rules/use_build_context_synchronously.dart
+++ b/pkg/linter/lib/src/rules/use_build_context_synchronously.dart
@@ -10,6 +10,8 @@
 import 'package:analyzer/src/dart/resolver/exit_detector.dart';
 // ignore: implementation_imports
 import 'package:analyzer/src/lint/constants.dart';
+// ignore: implementation_imports
+import 'package:analyzer/src/utilities/extensions/element.dart';
 import 'package:collection/collection.dart';
 import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
@@ -1338,7 +1340,8 @@
 
     if (self is PropertyAccessorElement) {
       var enclosingElement = self.enclosingElement3;
-      if (enclosingElement is InterfaceElement && isState(enclosingElement)) {
+      if (enclosingElement is InterfaceElement &&
+          isState(enclosingElement.asElement2)) {
         // The BuildContext object is the field on Flutter's State class.
         // This object can only be guarded by async gaps with a mounted
         // check on the State.
diff --git a/pkg/linter/lib/src/util/flutter_utils.dart b/pkg/linter/lib/src/util/flutter_utils.dart
index adf98af..3ac5bbe 100644
--- a/pkg/linter/lib/src/util/flutter_utils.dart
+++ b/pkg/linter/lib/src/util/flutter_utils.dart
@@ -2,7 +2,6 @@
 // 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/element/element.dart';
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -33,13 +32,13 @@
 
 _Flutter get _flutter => _flutterInstance;
 
-bool hasWidgetAsAscendant(ClassElement element) =>
+bool hasWidgetAsAscendant(ClassElement2 element) =>
     _flutter.hasWidgetAsAscendant(element);
 
 bool isBuildContext(DartType? type, {bool skipNullable = false}) =>
     _flutter.isBuildContext(type, skipNullable: skipNullable);
 
-bool isExactWidget(ClassElement element) => _flutter.isExactWidget(element);
+bool isExactWidget(ClassElement2 element) => _flutter.isExactWidget(element);
 
 bool isExactWidgetTypeContainer(DartType? type) =>
     _flutter.isExactWidgetTypeContainer(type);
@@ -49,9 +48,7 @@
 
 bool isKDebugMode(Element2? element) => _flutter.isKDebugMode(element);
 
-bool isState(InterfaceElement element) => _flutter.isState(element);
-
-bool isState2(InterfaceElement2 element) => _flutter.isState2(element);
+bool isState(InterfaceElement2 element) => _flutter.isState(element);
 
 bool isStatefulWidget(ClassElement2? element) =>
     element != null && _flutter.isStatefulWidget(element);
@@ -62,7 +59,7 @@
   }
   if (type is InterfaceType &&
       type.implementsAnyInterface(_collectionInterfaces)) {
-    return type.element.typeParameters.length == 1 &&
+    return type.element3.typeParameters2.length == 1 &&
         isWidgetProperty(type.typeArguments.first);
   }
   return false;
@@ -90,8 +87,8 @@
         _uriFramework = Uri.parse('$uriPrefix/src/widgets/framework.dart'),
         _uriFoundation = Uri.parse('$uriPrefix/src/foundation/constants.dart');
 
-  bool hasWidgetAsAscendant(InterfaceElement? element,
-      [Set<InterfaceElement>? alreadySeen]) {
+  bool hasWidgetAsAscendant(InterfaceElement2? element,
+      [Set<InterfaceElement2>? alreadySeen]) {
     if (element == null) return false;
 
     if (isExactly(element, _nameWidget, _uriFramework)) return true;
@@ -99,9 +96,10 @@
     alreadySeen ??= {};
     if (!alreadySeen.add(element)) return false;
 
-    var type =
-        element.isAugmentation ? element.augmented.thisType : element.supertype;
-    return hasWidgetAsAscendant(type?.element, alreadySeen);
+    var type = element.firstFragment.isAugmentation
+        ? element.thisType
+        : element.supertype;
+    return hasWidgetAsAscendant(type?.element3, alreadySeen);
   }
 
   bool isBuildContext(DartType? type, {bool skipNullable = false}) {
@@ -111,58 +109,45 @@
     if (skipNullable && type.nullabilitySuffix == NullabilitySuffix.question) {
       return false;
     }
-    return isExactly(type.element, _nameBuildContext, _uriFramework);
+    return isExactly(type.element3, _nameBuildContext, _uriFramework);
   }
 
   /// Whether [element] is exactly the element named [type], from Flutter.
-  bool isExactly(InterfaceElement element, String type, Uri uri) =>
-      element.name == type && element.source.uri == uri;
+  bool isExactly(InterfaceElement2 element, String type, Uri uri) =>
+      element.name3 == type && element.library2.firstFragment.source.uri == uri;
 
-  /// Whether [element] is exactly the element named [type], from Flutter.
-  bool isExactly2(InterfaceElement2 element, String type, Uri uri) =>
-      element.name3 == type &&
-      element.firstFragment.libraryFragment.source.uri == uri;
-
-  bool isExactWidget(ClassElement element) =>
+  bool isExactWidget(ClassElement2 element) =>
       isExactly(element, _nameWidget, _uriFramework);
 
-  bool isExactWidget2(ClassElement2 element) =>
-      isExactly2(element, _nameWidget, _uriFramework);
-
   bool isExactWidgetTypeContainer(DartType? type) =>
       type is InterfaceType &&
-      isExactly(type.element, _nameContainer, _uriContainer);
+      isExactly(type.element3, _nameContainer, _uriContainer);
 
   bool isExactWidgetTypeSizedBox(DartType? type) =>
       type is InterfaceType &&
-      isExactly(type.element, _nameSizedBox, _uriBasic);
+      isExactly(type.element3, _nameSizedBox, _uriBasic);
 
   bool isKDebugMode(Element2? element) =>
       element != null &&
       element.name3 == 'kDebugMode' &&
       element.library2?.uri == _uriFoundation;
 
-  bool isState(InterfaceElement element) =>
+  bool isState(InterfaceElement2 element) =>
       isExactly(element, _nameState, _uriFramework) ||
       element.allSupertypes
-          .any((type) => isExactly(type.element, _nameState, _uriFramework));
-
-  bool isState2(InterfaceElement2 element) =>
-      isExactly2(element, _nameState, _uriFramework) ||
-      element.allSupertypes
-          .any((type) => isExactly2(type.element3, _nameState, _uriFramework));
+          .any((type) => isExactly(type.element3, _nameState, _uriFramework));
 
   bool isStatefulWidget(ClassElement2 element) =>
-      isExactly2(element, _nameStatefulWidget, _uriFramework) ||
+      isExactly(element, _nameStatefulWidget, _uriFramework) ||
       element.allSupertypes.any((type) =>
-          isExactly(type.element, _nameStatefulWidget, _uriFramework));
+          isExactly(type.element3, _nameStatefulWidget, _uriFramework));
 
   bool isWidget(InterfaceElement2 element) {
-    if (isExactly2(element, _nameWidget, _uriFramework)) {
+    if (isExactly(element, _nameWidget, _uriFramework)) {
       return true;
     }
     for (var type in element.allSupertypes) {
-      if (isExactly2(type.element3, _nameWidget, _uriFramework)) {
+      if (isExactly(type.element3, _nameWidget, _uriFramework)) {
         return true;
       }
     }
diff --git a/tools/VERSION b/tools/VERSION
index 34a9717..bf0a92d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 3
 MINOR 7
 PATCH 0
-PRERELEASE 172
+PRERELEASE 173
 PRERELEASE_PATCH 0