Skip to content

Commit ba73144

Browse files
committed
Elements. Migrate src/error/inheritance_override.dart
Change-Id: I8080c6dd961ad92c983c3b53cd048bbbe31f822b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/416020 Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Phil Quitslund <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 641ec4c commit ba73144

File tree

3 files changed

+59
-81
lines changed

3 files changed

+59
-81
lines changed

pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class CreateMissingOverrides extends ResolvedCorrectionProducer {
4242
return;
4343
}
4444
var signatures = [
45-
...InheritanceOverrideVerifier.missingOverrides2(targetDeclaration),
45+
...InheritanceOverrideVerifier.missingOverrides(targetDeclaration),
4646
...InheritanceOverrideVerifier.missingMustBeOverridden(targetDeclaration),
4747
];
4848
// Sort by name, getters before setters.

pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ class InheritanceManager3 {
185185
ExecutableElement2OrMember? getInherited4(
186186
InterfaceElement2 element, Name name) {
187187
element as InterfaceElementImpl2; // TODO(scheglov): remove cast
188-
var oldElement = getInheritedMap2(element.asElement)[name];
188+
var oldElement = getInherited2(element.asElement, name);
189189
return oldElement?.asElement2;
190190
}
191191

@@ -757,8 +757,7 @@ class InheritanceManager3 {
757757
return MapEntry(key, result);
758758
});
759759

760-
var implemented2 = implemented.map<Name, ExecutableElement2>(
761-
(key, value) => MapEntry(key, value.asElement2));
760+
var implemented2 = implemented.mapValue((value) => value.asElement2);
762761

763762
var namedCandidates2 = namedCandidates.map<Name, List<ExecutableElement2>>(
764763
(key, value) => MapEntry(key, value.map((e) => e.asElement2).toList()));
@@ -968,8 +967,7 @@ class InheritanceManager3 {
968967
}
969968
}
970969

971-
var implemented2 = implemented.map<Name, ExecutableElement2>(
972-
(key, value) => MapEntry(key, value.asElement2));
970+
var implemented2 = implemented.mapValue((value) => value.asElement2);
973971

974972
return Interface._(
975973
map: implemented,
@@ -1033,15 +1031,13 @@ class InheritanceManager3 {
10331031
var implemented = <Name, ExecutableElementOrMember>{};
10341032
_addImplemented(implemented, fragment, element);
10351033

1036-
var implemented2 = implemented.map<Name, ExecutableElement2>(
1037-
(key, value) => MapEntry(key, value.asElement2));
1034+
var implemented2 = implemented.mapValue((value) => value.asElement2);
10381035

10391036
var interfaceCandidates2 =
10401037
interfaceCandidates.map<Name, List<ExecutableElement2>>((key, value) =>
10411038
MapEntry(key, value.map((e) => e.asElement2).toList()));
10421039

1043-
var superInterface2 = superInterface.map<Name, ExecutableElement2>(
1044-
(key, value) => MapEntry(key, value.asElement2));
1040+
var superInterface2 = superInterface.mapValue((value) => value.asElement2);
10451041

10461042
return Interface._(
10471043
map: interface,
@@ -1295,7 +1291,7 @@ class Interface {
12951291
final Map<Name, ExecutableElementOrMember> implemented;
12961292

12971293
/// The map of names to their concrete implementations.
1298-
final Map<Name, ExecutableElement2> implemented2;
1294+
final Map<Name, ExecutableElement2OrMember> implemented2;
12991295

13001296
/// The set of names that are `noSuchMethod` forwarders in [implemented].
13011297
final Set<Name> noSuchMethodForwarders;

pkg/analyzer/lib/src/error/inheritance_override.dart

Lines changed: 52 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
// ignore_for_file: analyzer_use_new_elements
6-
75
import 'package:analyzer/dart/analysis/features.dart';
86
import 'package:analyzer/dart/ast/syntactic_entity.dart';
97
import 'package:analyzer/dart/ast/token.dart';
10-
import 'package:analyzer/dart/element/element.dart';
118
import 'package:analyzer/dart/element/element2.dart';
129
import 'package:analyzer/dart/element/type.dart';
1310
import 'package:analyzer/dart/element/type_provider.dart';
@@ -26,7 +23,7 @@ import 'package:analyzer/src/error/inference_error.dart';
2623
import 'package:analyzer/src/utilities/extensions/element.dart';
2724

2825
final _missingMustBeOverridden = Expando<List<ExecutableElement2>>();
29-
final _missingOverrides = Expando<List<ExecutableElement>>();
26+
final _missingOverrides = Expando<List<ExecutableElement2OrMember>>();
3027

3128
class InheritanceOverrideVerifier {
3229
final TypeSystemImpl _typeSystem;
@@ -133,25 +130,18 @@ class InheritanceOverrideVerifier {
133130
}
134131
}
135132

136-
/// Returns [Element] members that are in the interface of the
133+
/// Returns [ExecutableElement2] members that are in the interface of the
137134
/// given class with `@mustBeOverridden`, but don't have implementations.
138135
static List<ExecutableElement2> missingMustBeOverridden(
139136
NamedCompilationUnitMember node) {
140137
return _missingMustBeOverridden[node.name] ?? const [];
141138
}
142139

143-
/// Returns [ExecutableElement] members that are in the interface of the
144-
/// given class, but don't have concrete implementations.
145-
static List<ExecutableElement> missingOverrides(
146-
NamedCompilationUnitMember node) {
147-
return _missingOverrides[node.name] ?? const [];
148-
}
149-
150140
/// Returns [ExecutableElement2] members that are in the interface of the
151141
/// given class, but don't have concrete implementations.
152-
static List<ExecutableElement2> missingOverrides2(
142+
static List<ExecutableElement2> missingOverrides(
153143
NamedCompilationUnitMember node) {
154-
return _missingOverrides[node.name].asElement2;
144+
return _missingOverrides[node.name] ?? const [];
155145
}
156146
}
157147

@@ -263,7 +253,7 @@ class _ClassVerifier {
263253
field.name, libraryUri, fieldElement.getter?.asElement2);
264254
_checkDeclaredMember(
265255
field.name, libraryUri, fieldElement.setter?.asElement2);
266-
if (!member.isStatic && firstFragment is! EnumElement) {
256+
if (!member.isStatic && firstFragment is! EnumElementImpl) {
267257
_checkIllegalEnumValuesDeclaration(field.name);
268258
}
269259
if (!member.isStatic) {
@@ -282,7 +272,7 @@ class _ClassVerifier {
282272
if (!(member.isStatic || member.isAbstract || member.isSetter)) {
283273
_checkIllegalConcreteEnumMemberDeclaration(member.name);
284274
}
285-
if (!member.isStatic && firstFragment is! EnumElement) {
275+
if (!member.isStatic && firstFragment is! EnumElementImpl) {
286276
_checkIllegalEnumValuesDeclaration(member.name);
287277
}
288278
}
@@ -298,26 +288,26 @@ class _ClassVerifier {
298288

299289
if (firstFragment is ClassElementImpl && !firstFragment.isAbstract ||
300290
firstFragment is EnumElementImpl) {
301-
List<ExecutableElement>? inheritedAbstract;
291+
List<ExecutableElement2OrMember>? inheritedAbstract;
302292

303293
for (var name in interface.map.keys) {
304294
if (!name.isAccessibleFor(libraryUri)) {
305295
continue;
306296
}
307297

308-
var interfaceElement = interface.map[name]!;
309-
var concreteElement = interface.implemented[name];
298+
var interfaceElement = interface.map[name]!.asElement2;
299+
var concreteElement = interface.implemented2[name];
310300

311301
// No concrete implementation of the name.
312302
if (concreteElement == null) {
313303
if (_reportConcreteClassWithAbstractMember(name.name)) {
314304
continue;
315305
}
316-
if (_isNotImplementedInConcreteSuperClass(firstFragment, name)) {
306+
if (_isNotImplementedInConcreteSuperClass(name)) {
317307
continue;
318308
}
319309
// We already reported ILLEGAL_ENUM_VALUES_INHERITANCE.
320-
if (firstFragment is EnumElement &&
310+
if (firstFragment is EnumElementImpl &&
321311
const {'values', 'values='}.contains(name.name)) {
322312
continue;
323313
}
@@ -348,13 +338,12 @@ class _ClassVerifier {
348338
// overriding method. The classNameNode is always wrong.
349339
CorrectOverrideHelper(
350340
typeSystem: typeSystem,
351-
thisMember: concreteElement.asElement2,
341+
thisMember: concreteElement,
352342
).verify(
353-
superMember: interfaceElement.asElement2,
343+
superMember: interfaceElement,
354344
errorReporter: reporter,
355345
errorNode: classNameToken,
356-
errorCode: concreteElement is PropertyAccessorElementOrMember &&
357-
concreteElement.isSetter
346+
errorCode: concreteElement is SetterElement2OrMember
358347
? CompileTimeErrorCode.INVALID_IMPLEMENTATION_OVERRIDE_SETTER
359348
: CompileTimeErrorCode.INVALID_IMPLEMENTATION_OVERRIDE,
360349
);
@@ -541,7 +530,7 @@ class _ClassVerifier {
541530
)) {
542531
hasError = true;
543532
}
544-
if (classElement is EnumElement && _checkMixinOfEnum(namedType)) {
533+
if (classElement is EnumElementImpl && _checkMixinOfEnum(namedType)) {
545534
hasError = true;
546535
}
547536
}
@@ -558,7 +547,7 @@ class _ClassVerifier {
558547
/// [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_IMPLEMENTS],
559548
/// [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_ON],
560549
/// [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_WITH].
561-
bool _checkForRecursiveInterfaceInheritance(InterfaceElement2 element,
550+
bool _checkForRecursiveInterfaceInheritance(InterfaceElementImpl2 element,
562551
[List<InterfaceElement2>? path]) {
563552
path ??= <InterfaceElement2>[];
564553

@@ -616,7 +605,7 @@ class _ClassVerifier {
616605
}
617606
}
618607

619-
if (element is MixinElement2) {
608+
if (element is MixinElementImpl2) {
620609
for (var type in element.superclassConstraints) {
621610
if (_checkForRecursiveInterfaceInheritance(type.element3, path)) {
622611
return true;
@@ -656,7 +645,7 @@ class _ClassVerifier {
656645
// We ignore mixins because they don't inherit and members.
657646
// But to support `super.foo()` invocations we put members from superclass
658647
// constraints into the `superImplemented` bucket, the same we look below.
659-
if (classElement is MixinElement) {
648+
if (classElement is MixinElementImpl) {
660649
return;
661650
}
662651

@@ -665,17 +654,19 @@ class _ClassVerifier {
665654

666655
void checkSingle(
667656
String memberName,
668-
bool Function(ClassElement enclosingClass) filter,
657+
bool Function(ClassElement2 enclosingClass) filter,
669658
) {
670659
var member = concreteMap[Name(libraryUri, memberName)];
671660
if (member != null) {
672-
var enclosingClass = member.enclosingElement3 as InterfaceElement;
673-
if (enclosingClass is! ClassElement || filter(enclosingClass)) {
674-
reporter.atToken(
675-
classNameToken,
676-
CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE,
677-
arguments: [memberName, enclosingClass.name],
678-
);
661+
var enclosingClass = member.asElement2.enclosingElement2;
662+
if (enclosingClass != null) {
663+
if (enclosingClass is! ClassElement2 || filter(enclosingClass)) {
664+
reporter.atToken(
665+
classNameToken,
666+
CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE,
667+
arguments: [memberName, enclosingClass.name3!],
668+
);
669+
}
679670
}
680671
}
681672
}
@@ -697,20 +688,20 @@ class _ClassVerifier {
697688

698689
void _checkIllegalEnumValuesInheritance() {
699690
if (implementsDartCoreEnum) {
700-
var getter = inheritance.getInherited2(
701-
classElement,
691+
var getter = inheritance.getInherited4(
692+
classElement.asElement2,
702693
Name(libraryUri, 'values'),
703694
);
704-
var setter = inheritance.getInherited2(
705-
classElement,
695+
var setter = inheritance.getInherited4(
696+
classElement.asElement2,
706697
Name(libraryUri, 'values='),
707698
);
708699
var inherited = getter ?? setter;
709700
if (inherited != null) {
710701
reporter.atToken(
711702
classNameToken,
712703
CompileTimeErrorCode.ILLEGAL_ENUM_VALUES_INHERITANCE,
713-
arguments: [inherited.enclosingElement3.name!],
704+
arguments: [inherited.enclosingElement2!.name3!],
714705
);
715706
}
716707
}
@@ -742,20 +733,20 @@ class _ClassVerifier {
742733
/// Return the error code that should be used when the given class [element]
743734
/// references itself directly.
744735
ErrorCode _getRecursiveErrorCode(InterfaceElement2 element) {
745-
if (element.supertype?.element3.asElement == classElement) {
736+
if (element.supertype?.element3 == classElement.asElement2) {
746737
return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_EXTENDS;
747738
}
748739

749740
if (element is MixinElement2) {
750741
for (var type in element.superclassConstraints) {
751-
if (type.element3.asElement == classElement) {
742+
if (type.element3 == classElement.asElement2) {
752743
return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_ON;
753744
}
754745
}
755746
}
756747

757748
for (var type in element.mixins) {
758-
if (type.element3.asElement == classElement) {
749+
if (type.element3 == classElement.asElement2) {
759750
return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_WITH;
760751
}
761752
}
@@ -764,9 +755,8 @@ class _ClassVerifier {
764755
}
765756

766757
/// If [name] is not implemented in the extended concrete class, the
767-
/// issue should be fixed there, and then [element] will not have it too.
758+
/// issue should be fixed there, and then [classElement] will not have it too.
768759
bool _isNotImplementedInConcreteSuperClass(
769-
InterfaceElement element,
770760
Name name,
771761
) {
772762
var superElement = classElement.supertype?.element3;
@@ -787,7 +777,7 @@ class _ClassVerifier {
787777
if (memberName == name) {
788778
reporter.atNode(
789779
member,
790-
classElement is EnumElement
780+
classElement.asElement2 is EnumElement2
791781
? CompileTimeErrorCode.ENUM_WITH_ABSTRACT_MEMBER
792782
: CompileTimeErrorCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
793783
arguments: [displayName, classElement.name],
@@ -832,13 +822,13 @@ class _ClassVerifier {
832822
CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD,
833823
arguments: [
834824
name.name,
835-
conflict.getter.enclosingElement3.name!,
836-
conflict.method.enclosingElement3.name!
825+
conflict.getter2.enclosingElement2!.name3!,
826+
conflict.method2.enclosingElement2!.name3!
837827
],
838828
);
839829
} else if (conflict is CandidatesConflict) {
840-
var candidatesStr = conflict.candidates.map((candidate) {
841-
var className = candidate.enclosingElement3.name;
830+
var candidatesStr = conflict.candidates2.map((candidate) {
831+
var className = candidate.enclosingElement2!.name3;
842832
var typeStr = candidate.type.getDisplayString();
843833
return '$className.${name.name} ($typeStr)';
844834
}).join(', ');
@@ -853,7 +843,8 @@ class _ClassVerifier {
853843
}
854844
}
855845

856-
void _reportInheritedAbstractMembers(List<ExecutableElement>? elements) {
846+
void _reportInheritedAbstractMembers(
847+
List<ExecutableElement2OrMember>? elements) {
857848
if (elements == null) {
858849
return;
859850
}
@@ -862,18 +853,15 @@ class _ClassVerifier {
862853

863854
var descriptions = <String>[];
864855
for (var element in elements) {
865-
var prefix = '';
866-
if (element is PropertyAccessorElement) {
867-
if (element.isGetter) {
868-
prefix = 'getter ';
869-
} else {
870-
prefix = 'setter ';
871-
}
872-
}
856+
var prefix = switch (element) {
857+
GetterElement() => 'getter ',
858+
SetterElement() => 'setter ',
859+
_ => '',
860+
};
873861

874862
var elementName = element.displayName;
875-
var enclosingElement = element.enclosingElement3;
876-
var enclosingName = enclosingElement.displayName;
863+
var enclosingElement = element.enclosingElement2!;
864+
var enclosingName = enclosingElement.displayString2();
877865
var description = "$prefix$enclosingName.$elementName";
878866

879867
descriptions.add(description);
@@ -957,7 +945,7 @@ class _ClassVerifier {
957945
}
958946

959947
var noSuchMethodDeclaration =
960-
classElement.getMethod2(FunctionElement.NO_SUCH_METHOD_METHOD_NAME);
948+
classElement.getMethod2(MethodElement2.NO_SUCH_METHOD_METHOD_NAME);
961949
if (noSuchMethodDeclaration != null &&
962950
!noSuchMethodDeclaration.isAbstract) {
963951
return;
@@ -1055,9 +1043,3 @@ class _ClassVerifier {
10551043
}
10561044
}
10571045
}
1058-
1059-
extension on List<ExecutableElement>? {
1060-
List<ExecutableElement2> get asElement2 {
1061-
return this?.map((element) => element.asElement2).toList() ?? const [];
1062-
}
1063-
}

0 commit comments

Comments
 (0)