Skip to content

Commit 0fa3d79

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Move applying LEGACY_ERASURE to isCorrectOverrideOf().
Change-Id: Ic9ebd89be8dbbb560b47ae9f96988b552b75ddaa Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/135482 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
1 parent e0621b6 commit 0fa3d79

5 files changed

Lines changed: 31 additions & 12 deletions

File tree

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import 'package:analyzer/dart/element/type.dart';
77
import 'package:analyzer/dart/element/type_system.dart';
88
import 'package:analyzer/src/dart/element/member.dart';
99
import 'package:analyzer/src/error/correct_override.dart';
10-
import 'package:analyzer/src/generated/type_system.dart' show TypeSystemImpl;
1110
import 'package:analyzer/src/generated/utilities_general.dart';
1211
import 'package:meta/meta.dart';
1312

@@ -71,7 +70,7 @@ class InheritanceManager3 {
7170
if (interface._inheritedMap == null) {
7271
interface._inheritedMap = {};
7372
_findMostSpecificFromNamedCandidates(
74-
type.element.library.typeSystem,
73+
type.element.library,
7574
interface._inheritedMap,
7675
interface._overridden,
7776
);
@@ -99,7 +98,6 @@ class InheritanceManager3 {
9998

10099
var classLibrary = classElement.library;
101100
var isNonNullableByDefault = classLibrary.isNonNullableByDefault;
102-
var typeSystem = classLibrary.typeSystem;
103101

104102
Map<Name, List<ExecutableElement>> namedCandidates = {};
105103
List<Map<Name, ExecutableElement>> superImplemented = [];
@@ -143,7 +141,7 @@ class InheritanceManager3 {
143141
// from its superclass constraints, whether it is abstract or concrete.
144142
var superClass = <Name, ExecutableElement>{};
145143
_findMostSpecificFromNamedCandidates(
146-
typeSystem,
144+
classLibrary,
147145
superClass,
148146
superClassCandidates,
149147
);
@@ -203,7 +201,7 @@ class InheritanceManager3 {
203201
// signature becomes the signature of the class's interface.
204202
Map<Name, ExecutableElement> map = Map.of(declared);
205203
List<Conflict> conflicts = _findMostSpecificFromNamedCandidates(
206-
typeSystem,
204+
classLibrary,
207205
map,
208206
namedCandidates,
209207
);
@@ -384,7 +382,7 @@ class InheritanceManager3 {
384382
/// such single most specific signature (i.e. no valid override), then add a
385383
/// new conflict description.
386384
List<Conflict> _findMostSpecificFromNamedCandidates(
387-
TypeSystemImpl typeSystem,
385+
LibraryElement library,
388386
Map<Name, ExecutableElement> map,
389387
Map<Name, List<ExecutableElement>> namedCandidates) {
390388
List<Conflict> conflicts;
@@ -418,7 +416,7 @@ class InheritanceManager3 {
418416
for (var i = candidates.length - 1; i >= 0; i--) {
419417
validOverride = candidates[i];
420418
var overrideHelper = CorrectOverrideHelper(
421-
typeSystem: typeSystem,
419+
library: library,
422420
thisMember: validOverride,
423421
);
424422
for (var j = 0; j < candidates.length; j++) {

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import 'package:analyzer/src/generated/type_system.dart';
1616
import 'package:meta/meta.dart';
1717

1818
class CorrectOverrideHelper {
19+
final LibraryElement _library;
1920
final TypeSystemImpl _typeSystem;
2021

2122
final ExecutableElement _thisMember;
@@ -26,9 +27,10 @@ class CorrectOverrideHelper {
2627
Substitution _superSubstitution;
2728

2829
CorrectOverrideHelper({
29-
@required TypeSystemImpl typeSystem,
30+
@required LibraryElement library,
3031
@required ExecutableElement thisMember,
31-
}) : _typeSystem = typeSystem,
32+
}) : _library = library,
33+
_typeSystem = library.typeSystem,
3234
_thisMember = thisMember {
3335
_computeThisTypeForSubtype();
3436
}
@@ -37,6 +39,8 @@ class CorrectOverrideHelper {
3739
bool isCorrectOverrideOf({
3840
@required ExecutableElement superMember,
3941
}) {
42+
superMember = _library.toLegacyElementIfOptOut(superMember);
43+
4044
var superType = superMember.type;
4145
if (!_typeSystem.isSubtypeOf2(_thisTypeForSubtype, superType)) {
4246
return false;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ class _ClassVerifier {
233233
// overriding method. The classNameNode is always wrong.
234234
concreteElement = library.toLegacyElementIfOptOut(concreteElement);
235235
CorrectOverrideHelper(
236-
typeSystem: typeSystem,
236+
library: library,
237237
thisMember: concreteElement,
238238
).verify(
239239
superMember: interfaceElement,
@@ -272,7 +272,7 @@ class _ClassVerifier {
272272

273273
var name = Name(libraryUri, member.name);
274274
var correctOverrideHelper = CorrectOverrideHelper(
275-
typeSystem: typeSystem,
275+
library: library,
276276
thisMember: member,
277277
);
278278

pkg/analyzer/lib/src/generated/error_verifier.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3581,7 +3581,7 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
35813581

35823582
if (mixinMember != null) {
35833583
var isCorrect = CorrectOverrideHelper(
3584-
typeSystem: _typeSystem,
3584+
library: _currentLibrary,
35853585
thisMember: superMember,
35863586
).isCorrectOverrideOf(
35873587
superMember: mixinMember,

pkg/analyzer/test/src/diagnostics/invalid_override_test.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,23 @@ class InvalidOverrideWithNnbdTest extends DriverResolutionTest {
505505
@override
506506
bool get typeToStringWithNullability => true;
507507

508+
test_method_parameter_functionTyped_optOut_extends_optIn() async {
509+
newFile('/test/lib/a.dart', content: r'''
510+
abstract class A {
511+
A catchError(void Function(Object) a);
512+
}
513+
''');
514+
515+
await assertNoErrorsInCode('''
516+
// @dart=2.6
517+
import 'a.dart';
518+
519+
class B implements A {
520+
A catchError(void Function(dynamic) a) => this;
521+
}
522+
''');
523+
}
524+
508525
test_method_parameter_interfaceOptOut_concreteOptIn() async {
509526
newFile('/test/lib/a.dart', content: r'''
510527
class A {

0 commit comments

Comments
 (0)