Merge branch 'master' into 0.1.108
diff --git a/lib/src/rules/avoid_redundant_argument_values.dart b/lib/src/rules/avoid_redundant_argument_values.dart
index 0da8062..265becf 100644
--- a/lib/src/rules/avoid_redundant_argument_values.dart
+++ b/lib/src/rules/avoid_redundant_argument_values.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
 
 import '../analyzer.dart';
 
@@ -62,15 +61,19 @@
 
   _Visitor(this.rule, this.context);
 
-  void check(ArgumentList argumentList, List<ParameterElement> parameters) {
-    if (argumentList.arguments.isEmpty || parameters == null) {
+  void check(ArgumentList argumentList) {
+    final arguments = argumentList.arguments;
+    if (arguments.isEmpty) {
       return;
     }
 
-    for (var arg in argumentList.arguments) {
+    for (var i = arguments.length - 1; i >= 0; --i) {
+      var arg = arguments[i];
       final param = arg.staticParameterElement;
-      if (param == null || param.hasRequired) {
+      if (param == null || param.hasRequired || param.isRequiredNamed) {
         continue;
+      } else if (param.isRequiredPositional) {
+        break;
       }
       final value = param.constantValue;
       if (value != null) {
@@ -82,25 +85,19 @@
           rule.reportLint(arg);
         }
       }
+      if (param.isOptionalPositional) {
+        break;
+      }
     }
   }
 
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
-    check(node.argumentList, node.staticElement?.parameters);
+    check(node.argumentList);
   }
 
   @override
   void visitMethodInvocation(MethodInvocation node) {
-    final element = node.staticInvokeType.element;
-    List<ParameterElement> parameters;
-    if (element is MethodElement) {
-      parameters = element.parameters;
-    }
-    if (element is FunctionElement) {
-      parameters = element.parameters;
-    }
-
-    check(node.argumentList, parameters);
+    check(node.argumentList);
   }
 }
diff --git a/test/rules/avoid_redundant_argument_values.dart b/test/rules/avoid_redundant_argument_values.dart
index 9c215c7..b07942e 100644
--- a/test/rules/avoid_redundant_argument_values.dart
+++ b/test/rules/avoid_redundant_argument_values.dart
@@ -19,6 +19,10 @@
 void g({@required bool valWithDefault = true, bool val}) {}
 
 void gg(int x, [int y = 0]) {}
+void ggg([int a = 1, int b = 2]) {}
+void gggg([int a = 0, int b]) {}
+
+void h([int a, int b = 1]) {}
 
 void main() {
   A(valWithDefault: true); //LINT
@@ -56,4 +60,15 @@
   gg(1, 0); //LINT
   gg(1, 1); //OK
   gg(1); //OK
+
+  ggg(
+      1, // OK the  - first argument is required so that we can provide the second argument.
+      3);
+  ggg(1,
+      2); // LINT
+
+  gggg(0, 1); //OK
+
+  h(0,
+      1); //LINT
 }