[wildcards] allow overridden wildcards in `avoid_renaming_method_parameters`

Allow overriding methods to add variable names where they are declared as wildcards in their base implementation.

Follow-up from https://github.com/dart-lang/linter/issues/5025.

Change-Id: I5c9ad1dc5a946e5062cb51f8069ca3af1bd81a00
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/383708
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Phil Quitslund <pquitslund@google.com>
diff --git a/pkg/linter/lib/src/rules/avoid_renaming_method_parameters.dart b/pkg/linter/lib/src/rules/avoid_renaming_method_parameters.dart
index 5f01aa9..74a87a8 100644
--- a/pkg/linter/lib/src/rules/avoid_renaming_method_parameters.dart
+++ b/pkg/linter/lib/src/rules/avoid_renaming_method_parameters.dart
@@ -78,6 +78,9 @@
       : _wildCardVariablesEnabled =
             library?.featureSet.isEnabled(Feature.wildcard_variables) ?? false;
 
+  bool isWildcardIdentifier(String lexeme) =>
+      _wildCardVariablesEnabled && lexeme == '_';
+
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
     if (node.isStatic) return;
@@ -125,19 +128,18 @@
     for (var i = 0; i < count; i++) {
       if (parentParameters.length <= i) break;
 
-      var paramIdentifier = parameters[i].name;
-      if (paramIdentifier == null) {
-        continue;
-      }
+      var parentParameterName = parentParameters[i].name;
+      if (isWildcardIdentifier(parentParameterName)) continue;
 
-      var paramLexeme = paramIdentifier.lexeme;
-      if (_wildCardVariablesEnabled && paramLexeme == '_') {
-        continue; // wildcard identifier
-      }
+      var parameterName = parameters[i].name;
+      if (parameterName == null) continue;
 
-      if (paramLexeme != parentParameters[i].name) {
-        rule.reportLintForToken(paramIdentifier,
-            arguments: [paramIdentifier.lexeme, parentParameters[i].name]);
+      var paramLexeme = parameterName.lexeme;
+      if (isWildcardIdentifier(paramLexeme)) continue;
+
+      if (paramLexeme != parentParameterName) {
+        rule.reportLintForToken(parameterName,
+            arguments: [paramLexeme, parentParameterName]);
       }
     }
   }
diff --git a/pkg/linter/test/rules/avoid_renaming_method_parameters_test.dart b/pkg/linter/test/rules/avoid_renaming_method_parameters_test.dart
index cab28ed..d11ff136 100644
--- a/pkg/linter/test/rules/avoid_renaming_method_parameters_test.dart
+++ b/pkg/linter/test/rules/avoid_renaming_method_parameters_test.dart
@@ -244,6 +244,28 @@
     ]);
   }
 
+  test_wildcardInBase() async {
+    await assertNoDiagnostics(r'''
+class A {
+  void m(int _, int b, int c) {}
+}
+class B extends A {
+  void m(a, b, c) {}
+}
+''');
+  }
+
+  test_wildcardInBaseAndSub() async {
+    await assertNoDiagnostics(r'''
+class A {
+  void m(int _, int b, int c) {}
+}
+class B extends A {
+  void m(a, b, _) {}
+}
+''');
+  }
+
   test_zeroParameters() async {
     await assertNoDiagnostics(r'''
 class A {