Skip to content

Commit 490dc01

Browse files
pqCommit Queue
authored and
Commit Queue
committed
[element model] migrate annotate_redeclares
Bug: https://github.com/dart-lang/linter/issues/5099 Change-Id: I7ca6a306d973080a486660a0ace8e1a5b9f50d8d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/392760 Auto-Submit: Phil Quitslund <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Phil Quitslund <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 3f6ff63 commit 490dc01

File tree

4 files changed

+47
-10
lines changed

4 files changed

+47
-10
lines changed

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

+33
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,7 @@ class InheritanceManager3 {
745745
noSuchMethodForwarders: noSuchMethodForwarders,
746746
overridden: namedCandidates,
747747
redeclared: const {},
748+
redeclared2: const {},
748749
superImplemented: superImplemented,
749750
conflicts: conflicts.toFixedList(),
750751
);
@@ -918,13 +919,30 @@ class InheritanceManager3 {
918919
}
919920
}
920921

922+
var uniqueRedeclared2 = <Name, List<ExecutableElement2>>{};
923+
for (var entry in redeclared.entries) {
924+
var name = entry.key;
925+
var fragments =
926+
entry.value.map((fragment) => fragment.asExecutableElement2);
927+
if (fragments.length == 1) {
928+
uniqueRedeclared2[name] = fragments.toFixedList();
929+
} else {
930+
var uniqueElements = <ExecutableElement2>{};
931+
for (var fragment in fragments) {
932+
uniqueElements.add(fragment);
933+
}
934+
uniqueRedeclared2[name] = uniqueElements.toFixedList();
935+
}
936+
}
937+
921938
return Interface._(
922939
map: implemented,
923940
declared: declared,
924941
implemented: implemented,
925942
noSuchMethodForwarders: const {},
926943
overridden: const {},
927944
redeclared: uniqueRedeclared,
945+
redeclared2: uniqueRedeclared2,
928946
superImplemented: const [],
929947
conflicts: conflicts.toFixedList(),
930948
);
@@ -983,6 +1001,7 @@ class InheritanceManager3 {
9831001
noSuchMethodForwarders: {},
9841002
overridden: interfaceCandidates,
9851003
redeclared: const {},
1004+
redeclared2: const {},
9861005
superImplemented: [superInterface],
9871006
conflicts: <Conflict>[
9881007
...superConflicts,
@@ -1201,6 +1220,7 @@ class Interface {
12011220
noSuchMethodForwarders: <Name>{},
12021221
overridden: const {},
12031222
redeclared: const {},
1223+
redeclared2: const {},
12041224
superImplemented: const [{}],
12051225
conflicts: const [],
12061226
);
@@ -1225,6 +1245,10 @@ class Interface {
12251245
/// declaration in this extension type redeclares.
12261246
final Map<Name, List<ExecutableElement>> redeclared;
12271247

1248+
/// The map of names to the signatures from superinterfaces that a member
1249+
/// declaration in this extension type redeclares.
1250+
final Map<Name, List<ExecutableElement2>> redeclared2;
1251+
12281252
/// Each item of this list maps names to their concrete implementations.
12291253
/// The first item of the list is the nominal superclass, next the nominal
12301254
/// superclass plus the first mixin, etc. So, for the class like
@@ -1247,6 +1271,7 @@ class Interface {
12471271
required this.noSuchMethodForwarders,
12481272
required this.overridden,
12491273
required this.redeclared,
1274+
required this.redeclared2,
12501275
required this.superImplemented,
12511276
required this.conflicts,
12521277
});
@@ -1412,3 +1437,11 @@ class _ParameterDesc {
14121437
other.name == name;
14131438
}
14141439
}
1440+
1441+
extension on ExecutableElement {
1442+
ExecutableElement2 get asExecutableElement2 => switch (this) {
1443+
ExecutableFragment(:var element) => element,
1444+
ExecutableMember member => member,
1445+
_ => throw UnsupportedError('Unsupported type: $runtimeType'),
1446+
};
1447+
}

pkg/linter/analyzer_use_new_elements.txt

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ lib/src/rules/always_require_non_null_named_parameters.dart
1111
lib/src/rules/always_specify_types.dart
1212
lib/src/rules/always_use_package_imports.dart
1313
lib/src/rules/annotate_overrides.dart
14+
lib/src/rules/annotate_redeclares.dart
1415
lib/src/rules/avoid_annotating_with_dynamic.dart
1516
lib/src/rules/avoid_as.dart
1617
lib/src/rules/avoid_bool_literals_in_conditional_expressions.dart
@@ -24,7 +25,9 @@ lib/src/rules/avoid_equals_and_hash_code_on_mutable_classes.dart
2425
lib/src/rules/avoid_escaping_inner_quotes.dart
2526
lib/src/rules/avoid_final_parameters.dart
2627
lib/src/rules/avoid_function_literals_in_foreach_calls.dart
28+
lib/src/rules/avoid_futureor_void.dart
2729
lib/src/rules/avoid_implementing_value_types.dart
30+
lib/src/rules/avoid_init_to_null.dart
2831
lib/src/rules/avoid_js_rounded_ints.dart
2932
lib/src/rules/avoid_multiple_declarations_per_line.dart
3033
lib/src/rules/avoid_null_checks_in_equality_operators.dart

pkg/linter/lib/src/rules/annotate_redeclares.dart

+11-9
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import 'package:analyzer/dart/ast/ast.dart';
66
import 'package:analyzer/dart/ast/visitor.dart';
7-
import 'package:analyzer/dart/element/element.dart';
7+
import 'package:analyzer/dart/element/element2.dart';
88

99
import '../analyzer.dart';
1010

@@ -46,11 +46,11 @@ class _Visitor extends SimpleAstVisitor<void> {
4646
// Shouldn't happen.
4747
if (parent is! ExtensionTypeDeclaration) return;
4848

49-
var element = node.declaredElement;
50-
if (element == null || element.hasRedeclare) return;
49+
var element = node.declaredFragment?.element;
50+
if (element == null || element.metadata2.hasRedeclare) return;
5151

52-
var parentElement = parent.declaredElement;
53-
var extensionType = parentElement?.augmented.firstFragment;
52+
var parentElement = parent.declaredFragment?.element;
53+
var extensionType = parentElement?.firstFragment.element;
5454
if (extensionType == null) return;
5555

5656
if (_redeclaresMember(element, extensionType)) {
@@ -60,10 +60,12 @@ class _Visitor extends SimpleAstVisitor<void> {
6060

6161
/// Return `true` if the [member] redeclares a member from a superinterface.
6262
bool _redeclaresMember(
63-
ExecutableElement member, InterfaceElement extensionType) {
63+
ExecutableElement2 member, InterfaceElement2 extensionType) {
6464
// TODO(pq): unify with similar logic in `redeclare_verifier` and move to inheritanceManager
65-
var uri = member.library.source.uri;
66-
var interface = context.inheritanceManager.getInterface(extensionType);
67-
return interface.redeclared.containsKey(Name(uri, member.name));
65+
var interface = context.inheritanceManager.getInterface2(extensionType);
66+
var memberName = member.name3;
67+
return memberName != null &&
68+
interface.redeclared2
69+
.containsKey(Name.forLibrary(member.library2, memberName));
6870
}
6971
}

pkg/linter/test/rules/annotate_redeclares_test.dart

-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ extension type E(A a) implements A {
4040
]);
4141
}
4242

43-
@FailingTest(reason: 'No check that `m` is an augmentation?')
4443
test_augmentationMethodWithAnnotation() async {
4544
newFile('$testPackageLibPath/a.dart', r'''
4645
part 'test.dart';

0 commit comments

Comments
 (0)