Analyzer: Gather operator super calls for mustCallSuper
Fixes https://github.com/dart-lang/sdk/issues/27896
Change-Id: I7017026346a92ffc43a3cfa506f7a257af1a3471
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164421
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 07891bc..4a49b97 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -5396,6 +5396,14 @@
final List<String> superCalls = <String>[];
@override
+ void visitBinaryExpression(BinaryExpression node) {
+ if (node.leftOperand is SuperExpression) {
+ superCalls.add(node.operator.lexeme);
+ }
+ super.visitBinaryExpression(node);
+ }
+
+ @override
void visitMethodInvocation(MethodInvocation node) {
if (node.target is SuperExpression) {
superCalls.add(node.methodName.name);
diff --git a/pkg/analyzer/test/src/diagnostics/must_call_super_test.dart b/pkg/analyzer/test/src/diagnostics/must_call_super_test.dart
index eda7bec..f871116 100644
--- a/pkg/analyzer/test/src/diagnostics/must_call_super_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/must_call_super_test.dart
@@ -82,6 +82,36 @@
''');
}
+ test_fromExtendingClass_operator() async {
+ await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+ @mustCallSuper
+ operator ==(Object o) => o is A;
+}
+class B extends A {
+ @override
+ operator ==(Object o) => o is B;
+}
+''', [
+ error(HintCode.MUST_CALL_SUPER, 140, 2),
+ ]);
+ }
+
+ test_fromExtendingClass_operator_containsSuperCall() async {
+ await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+class A {
+ @mustCallSuper
+ operator ==(Object o) => o is A;
+}
+class B extends A {
+ @override
+ operator ==(Object o) => o is B && super == o;
+}
+''');
+ }
+
test_fromInterface() async {
await assertNoErrorsInCode(r'''
import 'package:meta/meta.dart';