Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 00fbc2c

Browse files
srawlinsCommit Queue
authored and
Commit Queue
committedMay 13, 2025
analyzer: Stop using InheritanceManager3 in BestPracticesVisitor
This migration includes a fix for `InheritanceManager3.getInheritedConcreteMap2`: when trying to get inherited signatures on Object, this method would crash. The fix is copied verbatim from `InheritanceManager3.getMember2`. Change-Id: Ie33918f8ab7bbee6d9cf9dfbdc4ce2f0cfbed11b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/428300 Reviewed-by: Paul Berry <paulberry@google.com> Commit-Queue: Samuel Rawlins <srawlins@google.com>
1 parent b75b5dc commit 00fbc2c

File tree

3 files changed

+26
-49
lines changed

3 files changed

+26
-49
lines changed
 

‎pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,6 @@ class LibraryAnalyzer {
513513
_libraryElement,
514514
unit,
515515
typeSystem: _typeSystem,
516-
inheritanceManager: _inheritance,
517516
analysisOptions: _analysisOptions,
518517
workspacePackage: _library.file.workspacePackage,
519518
),

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,12 @@ class InheritanceManager3 {
208208
}
209209

210210
var interface = getInterface(element);
211-
return interface.superImplemented.last;
211+
if (interface.superImplemented.isNotEmpty) {
212+
return interface.superImplemented.last;
213+
} else {
214+
assert(element.name == 'Object');
215+
return const {};
216+
}
212217
}
213218

214219
/// Returns the mapping from names to most specific signatures of members

‎pkg/analyzer/lib/src/error/best_practices_verifier.dart

Lines changed: 20 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import 'package:analyzer/src/dart/ast/ast.dart';
2121
import 'package:analyzer/src/dart/ast/extensions.dart';
2222
import 'package:analyzer/src/dart/element/element.dart';
2323
import 'package:analyzer/src/dart/element/extensions.dart';
24-
import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
2524
import 'package:analyzer/src/dart/element/member.dart' show ExecutableMember;
2625
import 'package:analyzer/src/dart/element/type_provider.dart';
2726
import 'package:analyzer/src/dart/element/type_system.dart';
@@ -60,9 +59,6 @@ class BestPracticesVerifier extends RecursiveAstVisitor<void> {
6059
/// The type system primitives.
6160
final TypeSystemImpl _typeSystem;
6261

63-
/// The inheritance manager to access interface type hierarchy.
64-
final InheritanceManager3 _inheritanceManager;
65-
6662
/// The current library.
6763
final LibraryElementImpl _currentLibrary;
6864

@@ -101,13 +97,11 @@ class BestPracticesVerifier extends RecursiveAstVisitor<void> {
10197
this._currentLibrary,
10298
CompilationUnit unit, {
10399
required TypeSystemImpl typeSystem,
104-
required InheritanceManager3 inheritanceManager,
105100
required AnalysisOptions analysisOptions,
106101
required WorkspacePackage? workspacePackage,
107102
}) : _nullType = typeProvider.nullType,
108103
_typeSystem = typeSystem,
109104
_strictInference = analysisOptions.strictInference,
110-
_inheritanceManager = inheritanceManager,
111105
_annotationVerifier = AnnotationVerifier(
112106
_errorReporter,
113107
_currentLibrary,
@@ -393,38 +387,26 @@ class BestPracticesVerifier extends RecursiveAstVisitor<void> {
393387
try {
394388
super.visitFieldDeclaration(node);
395389
for (var field in node.fields.variables) {
396-
ExecutableElement? getOverriddenPropertyAccessor() {
397-
var element = field.declaredFragment!.element;
398-
if (element is PropertyAccessorElement || element is FieldElement) {
399-
var name = element.name3;
400-
if (name == null) {
401-
return null;
402-
}
403-
var nameObj = Name(_currentLibrary.source.uri, name);
404-
var enclosingElement = element.enclosingElement2!;
405-
var enclosingDeclaration = enclosingElement;
406-
if (enclosingDeclaration is InterfaceElement) {
407-
var overridden = _inheritanceManager.getMember4(
408-
enclosingDeclaration,
409-
nameObj,
410-
forSuper: true,
411-
);
412-
// Check for a setter.
413-
if (overridden == null) {
414-
var setterName = Name(_currentLibrary.source.uri, '$name=');
415-
overridden = _inheritanceManager.getMember4(
416-
enclosingDeclaration,
417-
setterName,
418-
forSuper: true,
419-
);
420-
}
421-
return overridden;
422-
}
423-
}
424-
return null;
390+
if (!_invalidAccessVerifier._inTestDirectory) {
391+
_checkForAssignmentOfDoNotStore(field.initializer);
392+
}
393+
394+
var element = field.declaredFragment!.element;
395+
var enclosingElement = element.enclosingElement2!;
396+
if (enclosingElement is! InterfaceElement) {
397+
continue;
398+
}
399+
400+
ExecutableElement? overriddenElement;
401+
if (element
402+
case PropertyAccessorElement(name3: var name?) ||
403+
FieldElement(name3: var name?)) {
404+
var nameObj = Name(_currentLibrary.source.uri, name);
405+
overriddenElement =
406+
enclosingElement.getInheritedConcreteMember(nameObj) ??
407+
enclosingElement.getInheritedConcreteMember(nameObj.forSetter);
425408
}
426409

427-
var overriddenElement = getOverriddenPropertyAccessor();
428410
if (overriddenElement != null &&
429411
_hasNonVirtualAnnotation(overriddenElement)) {
430412
// Overridden members are always inside classes or mixins, which are
@@ -439,9 +421,6 @@ class BestPracticesVerifier extends RecursiveAstVisitor<void> {
439421
],
440422
);
441423
}
442-
if (!_invalidAccessVerifier._inTestDirectory) {
443-
_checkForAssignmentOfDoNotStore(field.initializer);
444-
}
445424
}
446425
} finally {
447426
_deprecatedVerifier.popInDeprecated();
@@ -619,9 +598,7 @@ class BestPracticesVerifier extends RecursiveAstVisitor<void> {
619598
var elementIsOverride = false;
620599
if (enclosingElement is InterfaceElement) {
621600
if (element is MethodElement || element is PropertyAccessorElement) {
622-
elementIsOverride =
623-
_inheritanceManager.getOverridden4(enclosingElement, name) !=
624-
null;
601+
elementIsOverride = enclosingElement.getOverridden(name) != null;
625602
}
626603
}
627604

@@ -638,11 +615,7 @@ class BestPracticesVerifier extends RecursiveAstVisitor<void> {
638615

639616
var overriddenElement =
640617
enclosingElement is InterfaceElement
641-
? _inheritanceManager.getMember4(
642-
enclosingElement,
643-
name,
644-
forSuper: true,
645-
)
618+
? enclosingElement.getInheritedConcreteMember(name)
646619
: null;
647620

648621
if (overriddenElement != null &&

0 commit comments

Comments
 (0)
Failed to load comments.