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>
This commit is contained in:
Brian Wilkerson
2024-12-16 09:36:20 -08:00
committed by Commit Queue
parent de1662c292
commit f6ecfba1ec
4 changed files with 329 additions and 171 deletions
@@ -182,7 +182,6 @@ test/src/dart/ast/element_locator_test.dart
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
@@ -662,6 +662,40 @@ class ClassElementImpl2 extends InterfaceElementImpl2
@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 @@ abstract class InstanceElementImpl2 extends ElementImpl2
}
}
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 @@ abstract class InstanceElementImpl2 extends ElementImpl2
}
}
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 @@ abstract class InstanceElementImpl2 extends ElementImpl2
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 @@ abstract class InterfaceElementImpl2 extends InstanceElementImpl2
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,
@@ -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 @@ void f() {
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 @@ void f() {
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 @@ class B extends A {
B() : super._();
}
''');
_assertIsEnumLike(findElement.class_('A'), false);
_assertIsEnumLike(findElement2.class_('A'), false);
}
test_isEnumLike_true() async {
@@ -82,7 +82,7 @@ class A {
const A._();
}
''');
_assertIsEnumLike(findElement.class_('A'), true);
_assertIsEnumLike(findElement2.class_('A'), true);
}
test_isEnumLike_true_hasInstanceField() async {
@@ -94,7 +94,7 @@ class A {
const A._(this.f);
}
''');
_assertIsEnumLike(findElement.class_('A'), true);
_assertIsEnumLike(findElement2.class_('A'), true);
}
test_isEnumLike_true_hasSuperclass() async {
@@ -109,7 +109,7 @@ class B extends A {
const B._();
}
''');
_assertIsEnumLike(findElement.class_('B'), true);
_assertIsEnumLike(findElement2.class_('B'), true);
}
test_isEnumLike_true_hasSyntheticField() async {
@@ -121,7 +121,7 @@ class A {
int get foo => 0;
}
''');
_assertIsEnumLike(findElement.class_('A'), true);
_assertIsEnumLike(findElement2.class_('A'), true);
}
test_isEnumLike_true_isImplemented() async {
@@ -134,7 +134,7 @@ class A {
class B implements A {}
''');
_assertIsEnumLike(findElement.class_('A'), true);
_assertIsEnumLike(findElement2.class_('A'), true);
}
test_lookUpInheritedConcreteGetter_declared() async {
@@ -143,7 +143,7 @@ class A {
int get foo => 0;
}
''');
var A = findElement.class_('A');
var A = findElement2.class_('A');
assertElementNull(
A._lookUpInheritedConcreteGetter('foo'),
);
@@ -159,10 +159,10 @@ class B extends A {
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 @@ class B extends A {
int get _foo => 0;
}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedConcreteGetter('_foo'),
);
@@ -198,10 +198,10 @@ class B extends A {
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 @@ class B extends A {
int get foo => 0;
}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedConcreteGetter('foo'),
);
@@ -229,10 +229,10 @@ class A {
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 A {
abstract class B extends A {}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedConcreteGetter('foo'),
);
@@ -262,10 +262,10 @@ mixin M {
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 @@ mixin M2 {
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 @@ mixin M2 {}
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 @@ mixin M {}
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 @@ mixin M2 {
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 @@ mixin M {
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 A {
class B extends A {}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedConcreteGetter('foo'),
);
@@ -396,10 +396,10 @@ class B {
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 @@ class A {
abstract class B implements A {}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedConcreteGetter('foo'),
);
@@ -425,7 +425,7 @@ class B extends A {}
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 @@ class B extends A {}
await assertNoErrorsInCode('''
class A {}
''');
var A = findElement.class_('A');
var A = findElement2.class_('A');
assertElementNull(
A._lookUpInheritedConcreteGetter('foo'),
);
@@ -447,7 +447,7 @@ class A {
void foo() {}
}
''');
var A = findElement.class_('A');
var A = findElement2.class_('A');
assertElementNull(
A._lookUpInheritedConcreteMethod('foo'),
);
@@ -463,10 +463,10 @@ class B extends A {
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 @@ class B extends A {
void _foo() {}
}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedConcreteMethod('_foo'),
);
@@ -502,10 +502,10 @@ class B extends A {
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 @@ class B extends A {
void foo() {}
}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedConcreteMethod('foo'),
);
@@ -533,10 +533,10 @@ class A {
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 A {
abstract class B extends A {}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedConcreteMethod('foo'),
);
@@ -566,10 +566,10 @@ mixin M {
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 @@ mixin M2 {
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 @@ mixin M2 {}
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 @@ mixin M {}
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 @@ mixin M2 {
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 @@ mixin M {
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 A {
class B extends A {}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedConcreteMethod('foo'),
);
@@ -700,10 +700,10 @@ class B {
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 @@ class A {
abstract class B implements A {}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedConcreteMethod('foo'),
);
@@ -729,7 +729,7 @@ class B extends A {}
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 @@ class B extends A {}
await assertNoErrorsInCode('''
class A {}
''');
var A = findElement.class_('A');
var A = findElement2.class_('A');
assertElementNull(
A._lookUpInheritedConcreteMethod('foo'),
);
@@ -751,7 +751,7 @@ class A {
set foo(int _) {}
}
''');
var A = findElement.class_('A');
var A = findElement2.class_('A');
assertElementNull(
A._lookUpInheritedConcreteSetter('foo'),
);
@@ -767,10 +767,10 @@ class B extends A {
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 @@ class B extends A {
set _foo(int _) {}
}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedConcreteSetter('_foo'),
);
@@ -806,10 +806,10 @@ class B extends A {
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 @@ class B extends A {
set foo(int _) {}
}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedConcreteSetter('foo'),
);
@@ -837,10 +837,10 @@ class A {
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 A {
abstract class B extends A {}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedConcreteSetter('foo'),
);
@@ -870,10 +870,10 @@ mixin M {
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 @@ mixin M2 {
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 @@ mixin M2 {}
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 @@ mixin M {}
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 @@ mixin M2 {
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 @@ mixin M {
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 A {
class B extends A {}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedConcreteSetter('foo'),
);
@@ -1004,10 +1004,10 @@ class B {
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 @@ class A {
abstract class B implements A {}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedConcreteSetter('foo'),
);
@@ -1033,7 +1033,7 @@ class B extends A {}
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 @@ class B extends A {}
await assertNoErrorsInCode('''
class A {}
''');
var A = findElement.class_('A');
var A = findElement2.class_('A');
assertElementNull(
A._lookUpInheritedConcreteSetter('foo'),
);
@@ -1055,7 +1055,7 @@ class A {
void foo() {}
}
''');
var A = findElement.class_('A');
var A = findElement2.class_('A');
assertElementNull(
A._lookUpInheritedMethod('foo'),
);
@@ -1071,10 +1071,10 @@ class B extends A {
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 @@ class B extends A {
void _foo() {}
}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedMethod('_foo'),
);
@@ -1110,10 +1110,10 @@ class B extends A {
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 @@ class B extends A {
void foo() {}
}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedMethod('foo'),
);
@@ -1141,10 +1141,10 @@ class A {
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 @@ mixin M {
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 @@ mixin M2 {
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 @@ mixin M2 {}
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 @@ mixin M {}
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 @@ mixin M {
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 A {
class B extends A {}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedMethod('foo'),
);
@@ -1273,10 +1273,10 @@ class B {
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 @@ class A {
abstract class B implements A {}
''');
var B = findElement.class_('B');
var B = findElement2.class_('B');
assertElementNull(
B._lookUpInheritedMethod('foo'),
);
@@ -1302,7 +1302,7 @@ class B extends A {}
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 @@ class B extends A {}
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);
}
}
@@ -7,6 +7,7 @@ import 'package:analyzer/dart/analysis/results.dart';
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 @@ mixin ResolutionTest implements ResourceProviderMixin {
}
}
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 @@ mixin ResolutionTest implements ResourceProviderMixin {
}
}
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);