Migrate class_element_test

Change-Id: I73be4cd6d5bf218d6fa63a2ef1abdbfa2b063ac8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/400743
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
diff --git a/pkg/analyzer/analyzer_use_new_elements.txt b/pkg/analyzer/analyzer_use_new_elements.txt
index aa6eeb4..a387c4a 100644
--- a/pkg/analyzer/analyzer_use_new_elements.txt
+++ b/pkg/analyzer/analyzer_use_new_elements.txt
@@ -182,7 +182,6 @@
 test/src/dart/constant/evaluation_test.dart
 test/src/dart/constant/has_type_parameter_reference_test.dart
 test/src/dart/constant/value_test.dart
-test/src/dart/element/class_element_test.dart
 test/src/dart/element/display_string_test.dart
 test/src/dart/element/element_test.dart
 test/src/dart/element/function_type_test.dart
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 7e94b9b..3106251 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -662,6 +662,40 @@
   @override
   bool get isDartCoreObject => firstFragment.isDartCoreObject;
 
+  bool get isEnumLike {
+    // Must be a concrete class.
+    if (isAbstract) {
+      return false;
+    }
+
+    // With only private non-factory constructors.
+    for (var constructor in constructors) {
+      if (constructor.isPublic || constructor.isFactory) {
+        return false;
+      }
+    }
+
+    // With 2+ static const fields with the type of this class.
+    var numberOfElements = 0;
+    for (var field in fields) {
+      if (field.isStatic && field.isConst && field.type == thisType) {
+        numberOfElements++;
+      }
+    }
+    if (numberOfElements < 2) {
+      return false;
+    }
+
+    // No subclasses in the library.
+    for (var class_ in library2.classes) {
+      if (class_.supertype?.element3 == this) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
   @override
   bool get isExhaustive => firstFragment.isExhaustive;
 
@@ -5724,6 +5758,10 @@
     }
   }
 
+  Iterable<PropertyAccessorElement2> _implementationsOfGetter2(String name) {
+    return _implementationsOfGetter(name).map((e) => e.asElement2);
+  }
+
   /// Return an iterable containing all of the implementations of a method with
   /// the given [name] that are defined in this class and any superclass of this
   /// class (but not in interfaces).
@@ -5756,6 +5794,10 @@
     }
   }
 
+  Iterable<MethodElement2> _implementationsOfMethod2(String name) {
+    return _implementationsOfMethod(name).map((e) => e.asElement2);
+  }
+
   /// Return an iterable containing all of the implementations of a setter with
   /// the given [name] that are defined in this class and any superclass of this
   /// class (but not in interfaces).
@@ -5788,6 +5830,10 @@
       augmented = augmented.firstFragment.supertype?.element.augmented;
     }
   }
+
+  Iterable<PropertyAccessorElement2> _implementationsOfSetter2(String name) {
+    return _implementationsOfSetter(name).map((e) => e.asElement2);
+  }
 }
 
 abstract class InterfaceElementImpl extends InstanceElementImpl
@@ -6358,6 +6404,41 @@
       firstFragment.instantiate(
           typeArguments: typeArguments, nullabilitySuffix: nullabilitySuffix);
 
+  PropertyAccessorElement2? lookUpInheritedConcreteGetter(
+      String getterName, LibraryElement2 library) {
+    return _implementationsOfGetter2(getterName).firstWhereOrNull((getter) =>
+        !getter.isAbstract &&
+        !getter.isStatic &&
+        getter.isAccessibleIn2(library) &&
+        getter.enclosingElement2 != this);
+  }
+
+  MethodElement2? lookUpInheritedConcreteMethod(
+      String methodName, LibraryElement2 library) {
+    return _implementationsOfMethod2(methodName).firstWhereOrNull((method) =>
+        !method.isAbstract &&
+        !method.isStatic &&
+        method.isAccessibleIn2(library) &&
+        method.enclosingElement2 != this);
+  }
+
+  PropertyAccessorElement2? lookUpInheritedConcreteSetter(
+      String setterName, LibraryElement2 library) {
+    return _implementationsOfSetter2(setterName).firstWhereOrNull((setter) =>
+        !setter.isAbstract &&
+        !setter.isStatic &&
+        setter.isAccessibleIn2(library) &&
+        setter.enclosingElement2 != this);
+  }
+
+  MethodElement2? lookUpInheritedMethod(
+      String methodName, LibraryElement2 library) {
+    return _implementationsOfMethod2(methodName).firstWhereOrNull((method) =>
+        !method.isStatic &&
+        method.isAccessibleIn2(library) &&
+        method.enclosingElement2 != this);
+  }
+
   @override
   MethodElement2? lookUpInheritedMethod2({
     required String methodName,
diff --git a/pkg/analyzer/test/src/dart/element/class_element_test.dart b/pkg/analyzer/test/src/dart/element/class_element_test.dart
index 7270987..233634d 100644
--- a/pkg/analyzer/test/src/dart/element/class_element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/class_element_test.dart
@@ -2,7 +2,7 @@
 // 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/src/dart/element/element.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test/test.dart';
@@ -29,14 +29,14 @@
   A._foo();
 }
 ''');
-    _assertIsEnumLike(findElement.class_('A'), false);
+    _assertIsEnumLike(findElement2.class_('A'), false);
   }
 
   test_isEnumLike_false_constructors_hasPublic() async {
     await assertNoErrorsInCode('''
 class A {}
 ''');
-    _assertIsEnumLike(findElement.class_('A'), false);
+    _assertIsEnumLike(findElement2.class_('A'), false);
   }
 
   test_isEnumLike_false_fields_empty() async {
@@ -49,14 +49,14 @@
   A._();
 }
 ''');
-    _assertIsEnumLike(findElement.class_('A'), false);
+    _assertIsEnumLike(findElement2.class_('A'), false);
   }
 
   test_isEnumLike_false_isAbstract() async {
     await assertNoErrorsInCode('''
 abstract class A {}
 ''');
-    _assertIsEnumLike(findElement.class_('A'), false);
+    _assertIsEnumLike(findElement2.class_('A'), false);
   }
 
   test_isEnumLike_false_isExtended() async {
@@ -71,7 +71,7 @@
   B() : super._();
 }
 ''');
-    _assertIsEnumLike(findElement.class_('A'), false);
+    _assertIsEnumLike(findElement2.class_('A'), false);
   }
 
   test_isEnumLike_true() async {
@@ -82,7 +82,7 @@
   const A._();
 }
 ''');
-    _assertIsEnumLike(findElement.class_('A'), true);
+    _assertIsEnumLike(findElement2.class_('A'), true);
   }
 
   test_isEnumLike_true_hasInstanceField() async {
@@ -94,7 +94,7 @@
   const A._(this.f);
 }
 ''');
-    _assertIsEnumLike(findElement.class_('A'), true);
+    _assertIsEnumLike(findElement2.class_('A'), true);
   }
 
   test_isEnumLike_true_hasSuperclass() async {
@@ -109,7 +109,7 @@
   const B._();
 }
 ''');
-    _assertIsEnumLike(findElement.class_('B'), true);
+    _assertIsEnumLike(findElement2.class_('B'), true);
   }
 
   test_isEnumLike_true_hasSyntheticField() async {
@@ -121,7 +121,7 @@
   int get foo => 0;
 }
 ''');
-    _assertIsEnumLike(findElement.class_('A'), true);
+    _assertIsEnumLike(findElement2.class_('A'), true);
   }
 
   test_isEnumLike_true_isImplemented() async {
@@ -134,7 +134,7 @@
 
 class B implements A {}
 ''');
-    _assertIsEnumLike(findElement.class_('A'), true);
+    _assertIsEnumLike(findElement2.class_('A'), true);
   }
 
   test_lookUpInheritedConcreteGetter_declared() async {
@@ -143,7 +143,7 @@
   int get foo => 0;
 }
 ''');
-    var A = findElement.class_('A');
+    var A = findElement2.class_('A');
     assertElementNull(
       A._lookUpInheritedConcreteGetter('foo'),
     );
@@ -159,10 +159,10 @@
   int get foo => 0;
 }
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteGetter('foo'),
-      declaration: findElement.getter('foo', of: 'A'),
+      declaration: findElement2.getter('foo', of: 'A'),
     );
   }
 
@@ -180,7 +180,7 @@
   int get _foo => 0;
 }
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteGetter('_foo'),
     );
@@ -198,10 +198,10 @@
   int get _foo => 0;
 }
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteGetter('_foo'),
-      declaration: findElement.getter('_foo', of: 'A'),
+      declaration: findElement2.getter('_foo', of: 'A'),
     );
   }
 
@@ -215,7 +215,7 @@
   int get foo => 0;
 }
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteGetter('foo'),
     );
@@ -229,10 +229,10 @@
 
 class B extends A {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteGetter('foo'),
-      declaration: findElement.getter('foo', of: 'A'),
+      declaration: findElement2.getter('foo', of: 'A'),
     );
   }
 
@@ -244,7 +244,7 @@
 
 abstract class B extends A {}
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteGetter('foo'),
     );
@@ -262,10 +262,10 @@
 
 class B extends A with M {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteGetter('foo'),
-      declaration: findElement.getter('foo', of: 'M'),
+      declaration: findElement2.getter('foo', of: 'M'),
     );
   }
 
@@ -285,10 +285,10 @@
 
 class B extends A with M1, M2 {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteGetter('foo'),
-      declaration: findElement.getter('foo', of: 'M2'),
+      declaration: findElement2.getter('foo', of: 'M2'),
     );
   }
 
@@ -306,10 +306,10 @@
 
 class B extends A with M1, M2 {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteGetter('foo'),
-      declaration: findElement.getter('foo', of: 'M1'),
+      declaration: findElement2.getter('foo', of: 'M1'),
     );
   }
 
@@ -323,10 +323,10 @@
 
 class B extends A with M {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteGetter('foo'),
-      declaration: findElement.getter('foo', of: 'A'),
+      declaration: findElement2.getter('foo', of: 'A'),
     );
   }
 
@@ -344,10 +344,10 @@
 
 class B extends A with M1, M2 {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteGetter('foo'),
-      declaration: findElement.getter('foo', of: 'M1'),
+      declaration: findElement2.getter('foo', of: 'M1'),
     );
   }
 
@@ -363,10 +363,10 @@
 
 class B extends A with M {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteGetter('foo'),
-      declaration: findElement.getter('foo', of: 'A'),
+      declaration: findElement2.getter('foo', of: 'A'),
     );
   }
 
@@ -378,7 +378,7 @@
 
 class B extends A {}
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteGetter('foo'),
     );
@@ -396,10 +396,10 @@
 
 class C extends A implements B {}
 ''');
-    var C = findElement.class_('C');
-    assertElement2(
+    var C = findElement2.class_('C');
+    assertElement3(
       C._lookUpInheritedConcreteGetter('foo'),
-      declaration: findElement.getter('foo', of: 'A'),
+      declaration: findElement2.getter('foo', of: 'A'),
     );
   }
 
@@ -411,7 +411,7 @@
 
 abstract class B implements A {}
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteGetter('foo'),
     );
@@ -425,7 +425,7 @@
       error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, 6, 1),
       error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, 27, 1),
     ]);
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteGetter('foo'),
     );
@@ -435,7 +435,7 @@
     await assertNoErrorsInCode('''
 class A {}
 ''');
-    var A = findElement.class_('A');
+    var A = findElement2.class_('A');
     assertElementNull(
       A._lookUpInheritedConcreteGetter('foo'),
     );
@@ -447,7 +447,7 @@
   void foo() {}
 }
 ''');
-    var A = findElement.class_('A');
+    var A = findElement2.class_('A');
     assertElementNull(
       A._lookUpInheritedConcreteMethod('foo'),
     );
@@ -463,10 +463,10 @@
   void foo() {}
 }
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteMethod('foo'),
-      declaration: findElement.method('foo', of: 'A'),
+      declaration: findElement2.method('foo', of: 'A'),
     );
   }
 
@@ -484,7 +484,7 @@
   void _foo() {}
 }
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteMethod('_foo'),
     );
@@ -502,10 +502,10 @@
   void _foo() {}
 }
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteMethod('_foo'),
-      declaration: findElement.method('_foo', of: 'A'),
+      declaration: findElement2.method('_foo', of: 'A'),
     );
   }
 
@@ -519,7 +519,7 @@
   void foo() {}
 }
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteMethod('foo'),
     );
@@ -533,10 +533,10 @@
 
 class B extends A {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteMethod('foo'),
-      declaration: findElement.method('foo', of: 'A'),
+      declaration: findElement2.method('foo', of: 'A'),
     );
   }
 
@@ -548,7 +548,7 @@
 
 abstract class B extends A {}
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteMethod('foo'),
     );
@@ -566,10 +566,10 @@
 
 class B extends A with M {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteMethod('foo'),
-      declaration: findElement.method('foo', of: 'M'),
+      declaration: findElement2.method('foo', of: 'M'),
     );
   }
 
@@ -589,10 +589,10 @@
 
 class B extends A with M1, M2 {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteMethod('foo'),
-      declaration: findElement.method('foo', of: 'M2'),
+      declaration: findElement2.method('foo', of: 'M2'),
     );
   }
 
@@ -610,10 +610,10 @@
 
 class B extends A with M1, M2 {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteMethod('foo'),
-      declaration: findElement.method('foo', of: 'M1'),
+      declaration: findElement2.method('foo', of: 'M1'),
     );
   }
 
@@ -627,10 +627,10 @@
 
 class B extends A with M {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteMethod('foo'),
-      declaration: findElement.method('foo', of: 'A'),
+      declaration: findElement2.method('foo', of: 'A'),
     );
   }
 
@@ -648,10 +648,10 @@
 
 class B extends A with M1, M2 {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteMethod('foo'),
-      declaration: findElement.method('foo', of: 'M1'),
+      declaration: findElement2.method('foo', of: 'M1'),
     );
   }
 
@@ -667,10 +667,10 @@
 
 class B extends A with M {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteMethod('foo'),
-      declaration: findElement.method('foo', of: 'A'),
+      declaration: findElement2.method('foo', of: 'A'),
     );
   }
 
@@ -682,7 +682,7 @@
 
 class B extends A {}
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteMethod('foo'),
     );
@@ -700,10 +700,10 @@
 
 class C extends A implements B {}
 ''');
-    var C = findElement.class_('C');
-    assertElement2(
+    var C = findElement2.class_('C');
+    assertElement3(
       C._lookUpInheritedConcreteMethod('foo'),
-      declaration: findElement.method('foo', of: 'A'),
+      declaration: findElement2.method('foo', of: 'A'),
     );
   }
 
@@ -715,7 +715,7 @@
 
 abstract class B implements A {}
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteMethod('foo'),
     );
@@ -729,7 +729,7 @@
       error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, 6, 1),
       error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, 27, 1),
     ]);
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteMethod('foo'),
     );
@@ -739,7 +739,7 @@
     await assertNoErrorsInCode('''
 class A {}
 ''');
-    var A = findElement.class_('A');
+    var A = findElement2.class_('A');
     assertElementNull(
       A._lookUpInheritedConcreteMethod('foo'),
     );
@@ -751,7 +751,7 @@
   set foo(int _) {}
 }
 ''');
-    var A = findElement.class_('A');
+    var A = findElement2.class_('A');
     assertElementNull(
       A._lookUpInheritedConcreteSetter('foo'),
     );
@@ -767,10 +767,10 @@
   set foo(int _) {}
 }
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteSetter('foo'),
-      declaration: findElement.setter('foo', of: 'A'),
+      declaration: findElement2.setter('foo', of: 'A'),
     );
   }
 
@@ -788,7 +788,7 @@
   set _foo(int _) {}
 }
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteSetter('_foo'),
     );
@@ -806,10 +806,10 @@
   set _foo(int _) {}
 }
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteSetter('_foo'),
-      declaration: findElement.setter('_foo', of: 'A'),
+      declaration: findElement2.setter('_foo', of: 'A'),
     );
   }
 
@@ -823,7 +823,7 @@
   set foo(int _) {}
 }
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteSetter('foo'),
     );
@@ -837,10 +837,10 @@
 
 class B extends A {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteSetter('foo'),
-      declaration: findElement.setter('foo', of: 'A'),
+      declaration: findElement2.setter('foo', of: 'A'),
     );
   }
 
@@ -852,7 +852,7 @@
 
 abstract class B extends A {}
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteSetter('foo'),
     );
@@ -870,10 +870,10 @@
 
 class B extends A with M {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteSetter('foo'),
-      declaration: findElement.setter('foo', of: 'M'),
+      declaration: findElement2.setter('foo', of: 'M'),
     );
   }
 
@@ -893,10 +893,10 @@
 
 class B extends A with M1, M2 {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteSetter('foo'),
-      declaration: findElement.setter('foo', of: 'M2'),
+      declaration: findElement2.setter('foo', of: 'M2'),
     );
   }
 
@@ -914,10 +914,10 @@
 
 class B extends A with M1, M2 {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteSetter('foo'),
-      declaration: findElement.setter('foo', of: 'M1'),
+      declaration: findElement2.setter('foo', of: 'M1'),
     );
   }
 
@@ -931,10 +931,10 @@
 
 class B extends A with M {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteSetter('foo'),
-      declaration: findElement.setter('foo', of: 'A'),
+      declaration: findElement2.setter('foo', of: 'A'),
     );
   }
 
@@ -952,10 +952,10 @@
 
 class B extends A with M1, M2 {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteSetter('foo'),
-      declaration: findElement.setter('foo', of: 'M1'),
+      declaration: findElement2.setter('foo', of: 'M1'),
     );
   }
 
@@ -971,10 +971,10 @@
 
 class B extends A with M {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedConcreteSetter('foo'),
-      declaration: findElement.setter('foo', of: 'A'),
+      declaration: findElement2.setter('foo', of: 'A'),
     );
   }
 
@@ -986,7 +986,7 @@
 
 class B extends A {}
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteSetter('foo'),
     );
@@ -1004,10 +1004,10 @@
 
 class C extends A implements B {}
 ''');
-    var C = findElement.class_('C');
-    assertElement2(
+    var C = findElement2.class_('C');
+    assertElement3(
       C._lookUpInheritedConcreteSetter('foo'),
-      declaration: findElement.setter('foo', of: 'A'),
+      declaration: findElement2.setter('foo', of: 'A'),
     );
   }
 
@@ -1019,7 +1019,7 @@
 
 abstract class B implements A {}
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteSetter('foo'),
     );
@@ -1033,7 +1033,7 @@
       error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, 6, 1),
       error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, 27, 1),
     ]);
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedConcreteSetter('foo'),
     );
@@ -1043,7 +1043,7 @@
     await assertNoErrorsInCode('''
 class A {}
 ''');
-    var A = findElement.class_('A');
+    var A = findElement2.class_('A');
     assertElementNull(
       A._lookUpInheritedConcreteSetter('foo'),
     );
@@ -1055,7 +1055,7 @@
   void foo() {}
 }
 ''');
-    var A = findElement.class_('A');
+    var A = findElement2.class_('A');
     assertElementNull(
       A._lookUpInheritedMethod('foo'),
     );
@@ -1071,10 +1071,10 @@
   void foo() {}
 }
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedMethod('foo'),
-      declaration: findElement.method('foo', of: 'A'),
+      declaration: findElement2.method('foo', of: 'A'),
     );
   }
 
@@ -1092,7 +1092,7 @@
   void _foo() {}
 }
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedMethod('_foo'),
     );
@@ -1110,10 +1110,10 @@
   void _foo() {}
 }
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedMethod('_foo'),
-      declaration: findElement.method('_foo', of: 'A'),
+      declaration: findElement2.method('_foo', of: 'A'),
     );
   }
 
@@ -1127,7 +1127,7 @@
   void foo() {}
 }
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedMethod('foo'),
     );
@@ -1141,10 +1141,10 @@
 
 class B extends A {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedMethod('foo'),
-      declaration: findElement.method('foo', of: 'A'),
+      declaration: findElement2.method('foo', of: 'A'),
     );
   }
 
@@ -1160,10 +1160,10 @@
 
 class B extends A with M {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedMethod('foo'),
-      declaration: findElement.method('foo', of: 'M'),
+      declaration: findElement2.method('foo', of: 'M'),
     );
   }
 
@@ -1183,10 +1183,10 @@
 
 class B extends A with M1, M2 {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedMethod('foo'),
-      declaration: findElement.method('foo', of: 'M2'),
+      declaration: findElement2.method('foo', of: 'M2'),
     );
   }
 
@@ -1204,10 +1204,10 @@
 
 class B extends A with M1, M2 {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedMethod('foo'),
-      declaration: findElement.method('foo', of: 'M1'),
+      declaration: findElement2.method('foo', of: 'M1'),
     );
   }
 
@@ -1221,10 +1221,10 @@
 
 class B extends A with M {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedMethod('foo'),
-      declaration: findElement.method('foo', of: 'A'),
+      declaration: findElement2.method('foo', of: 'A'),
     );
   }
 
@@ -1240,10 +1240,10 @@
 
 class B extends A with M {}
 ''');
-    var B = findElement.class_('B');
-    assertElement2(
+    var B = findElement2.class_('B');
+    assertElement3(
       B._lookUpInheritedMethod('foo'),
-      declaration: findElement.method('foo', of: 'A'),
+      declaration: findElement2.method('foo', of: 'A'),
     );
   }
 
@@ -1255,7 +1255,7 @@
 
 class B extends A {}
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedMethod('foo'),
     );
@@ -1273,10 +1273,10 @@
 
 class C extends A implements B {}
 ''');
-    var C = findElement.class_('C');
-    assertElement2(
+    var C = findElement2.class_('C');
+    assertElement3(
       C._lookUpInheritedMethod('foo'),
-      declaration: findElement.method('foo', of: 'A'),
+      declaration: findElement2.method('foo', of: 'A'),
     );
   }
 
@@ -1288,7 +1288,7 @@
 
 abstract class B implements A {}
 ''');
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedMethod('foo'),
     );
@@ -1302,7 +1302,7 @@
       error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, 6, 1),
       error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, 27, 1),
     ]);
-    var B = findElement.class_('B');
+    var B = findElement2.class_('B');
     assertElementNull(
       B._lookUpInheritedMethod('foo'),
     );
@@ -1312,31 +1312,35 @@
     await assertNoErrorsInCode('''
 class A {}
 ''');
-    var A = findElement.class_('A');
+    var A = findElement2.class_('A');
     assertElementNull(
       A._lookUpInheritedMethod('foo'),
     );
   }
 
-  static void _assertIsEnumLike(ClassElement element, bool expected) {
-    expect((element as ClassElementImpl).isEnumLike, expected);
+  static void _assertIsEnumLike(ClassElement2 element, bool expected) {
+    expect((element as ClassElementImpl2).isEnumLike, expected);
   }
 }
 
-extension on ClassElement {
-  PropertyAccessorElement? _lookUpInheritedConcreteGetter(String name) {
-    return lookUpInheritedConcreteGetter(name, library);
+extension on ClassElement2 {
+  PropertyAccessorElement2? _lookUpInheritedConcreteGetter(String name) {
+    return (this as InterfaceElementImpl2)
+        .lookUpInheritedConcreteGetter(name, library2);
   }
 
-  MethodElement? _lookUpInheritedConcreteMethod(String name) {
-    return lookUpInheritedConcreteMethod(name, library);
+  MethodElement2? _lookUpInheritedConcreteMethod(String name) {
+    return (this as InterfaceElementImpl2)
+        .lookUpInheritedConcreteMethod(name, library2);
   }
 
-  PropertyAccessorElement? _lookUpInheritedConcreteSetter(String name) {
-    return lookUpInheritedConcreteSetter(name, library);
+  PropertyAccessorElement2? _lookUpInheritedConcreteSetter(String name) {
+    return (this as InterfaceElementImpl2)
+        .lookUpInheritedConcreteSetter(name, library2);
   }
 
-  MethodElement? _lookUpInheritedMethod(String name) {
-    return lookUpInheritedMethod(name, library);
+  MethodElement2? _lookUpInheritedMethod(String name) {
+    return (this as InterfaceElementImpl2)
+        .lookUpInheritedMethod(name, library2);
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index dea3f93..4af67a9 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/constant/value.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/error/error.dart';
@@ -167,6 +168,28 @@
     }
   }
 
+  void assertElement3(
+    Object? nodeOrElement, {
+    required Element2 declaration,
+    Map<String, String> substitution = const {},
+  }) {
+    Element2? element;
+    if (nodeOrElement is AstNode) {
+      element = getNodeElement2(nodeOrElement);
+    } else {
+      element = nodeOrElement as Element2?;
+    }
+
+    var actualDeclaration = element?.baseElement;
+    expect(actualDeclaration, same(declaration));
+
+    if (element is Member) {
+      assertSubstitution((element as Member).substitution, substitution);
+    } else if (substitution.isNotEmpty) {
+      fail('Expected to be a Member: (${element.runtimeType}) $element');
+    }
+  }
+
   void assertElementNull(Object? nodeOrElement) {
     Element? element;
     if (nodeOrElement is AstNode) {
@@ -466,6 +489,57 @@
     }
   }
 
+  Element2? getNodeElement2(AstNode node) {
+    if (node is Annotation) {
+      return node.element2;
+    } else if (node is AssignmentExpression) {
+      return node.element;
+    } else if (node is BinaryExpression) {
+      return node.element;
+    } else if (node is ConstructorReference) {
+      return node.constructorName.element;
+    } else if (node is Declaration) {
+      return node.declaredFragment?.element;
+    } else if (node is ExtensionOverride) {
+      return node.element2;
+    } else if (node is FormalParameter) {
+      return node.declaredFragment?.element;
+    } else if (node is FunctionExpressionInvocation) {
+      return node.element;
+    } else if (node is FunctionReference) {
+      var function = node.function.unParenthesized;
+      if (function is Identifier) {
+        return function.element;
+      } else if (function is PropertyAccess) {
+        return function.propertyName.element;
+      } else if (function is ConstructorReference) {
+        return function.constructorName.element;
+      } else {
+        fail('Unsupported node: (${function.runtimeType}) $function');
+      }
+    } else if (node is Identifier) {
+      return node.element;
+    } else if (node is ImplicitCallReference) {
+      return node.element;
+    } else if (node is IndexExpression) {
+      return node.element;
+    } else if (node is InstanceCreationExpression) {
+      return node.constructorName.element;
+    } else if (node is MethodInvocation) {
+      return node.methodName.element;
+    } else if (node is PostfixExpression) {
+      return node.element;
+    } else if (node is PrefixExpression) {
+      return node.element;
+    } else if (node is PropertyAccess) {
+      return node.propertyName.element;
+    } else if (node is NamedType) {
+      return node.element2;
+    } else {
+      fail('Unsupported node: (${node.runtimeType}) $node');
+    }
+  }
+
   ExpectedContextMessage message(File file, int offset, int length) =>
       ExpectedContextMessage(file, offset, length);