Resolve invocation arguments to parameters.

R=brianwilkerson@google.com

Change-Id: I76a8ea8221e0a888253af8297fb50c423699e175
Reviewed-on: https://dart-review.googlesource.com/69000
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analysis_server/test/analysis/get_hover_test.dart b/pkg/analysis_server/test/analysis/get_hover_test.dart
index b50a7e3..ef203c77 100644
--- a/pkg/analysis_server/test/analysis/get_hover_test.dart
+++ b/pkg/analysis_server/test/analysis/get_hover_test.dart
@@ -618,9 +618,4 @@
 class AnalysisHoverTest_UseCFE extends AnalysisHoverTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_expression_literal_noElement() async =>
-      super.test_expression_literal_noElement();
 }
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
index 438f6d1c..9e8555e 100644
--- a/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -607,22 +607,8 @@
 
   @failingTest
   @override
-  test_analysis_onlyOneFile() => super.test_analysis_onlyOneFile();
-
-  @failingTest
-  @override
   test_resetOnAnalysisSetChanged_overlay() =>
       super.test_resetOnAnalysisSetChanged_overlay();
-
-  @failingTest
-  @override
-  test_resetOnAnalysisSetChanged_watch_otherFile() =>
-      super.test_resetOnAnalysisSetChanged_watch_otherFile();
-
-  @failingTest
-  @override
-  test_resetOnAnalysisSetChanged_watch_thisFile() =>
-      super.test_resetOnAnalysisSetChanged_watch_thisFile();
 }
 
 @reflectiveTest
diff --git a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
index 8cefd64..f69ee37 100644
--- a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
@@ -198,8 +198,4 @@
     extends AnalysisGetHoverIntegrationTest {
   @override
   bool get useCFE => true;
-
-  @override
-  @failingTest
-  test_getHover() => super.test_getHover();
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/common_usage_sorter_test.dart b/pkg/analysis_server/test/services/completion/dart/common_usage_sorter_test.dart
index 17e238f..9b2c734 100644
--- a/pkg/analysis_server/test/services/completion/dart/common_usage_sorter_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/common_usage_sorter_test.dart
@@ -171,8 +171,4 @@
 class CommonUsageSorterTest_UseCFE extends CommonUsageSorterTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_namedArgument_enum() async => super.test_namedArgument_enum();
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
index a50aa26..654b9eaa 100644
--- a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
@@ -4514,10 +4514,6 @@
 
   @failingTest
   @override
-  test_enum_filter() => super.test_enum_filter();
-
-  @failingTest
-  @override
   test_ForEachStatement_body_untyped() =>
       super.test_ForEachStatement_body_untyped();
 
diff --git a/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart
index c550fa9..f832fca 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart
@@ -4248,16 +4248,6 @@
 
   @failingTest
   @override
-  test_InstanceCreationExpression_invocationArgument() =>
-      super.test_InstanceCreationExpression_invocationArgument();
-
-  @failingTest
-  @override
-  test_InstanceCreationExpression_invocationArgument_named() =>
-      super.test_InstanceCreationExpression_invocationArgument_named();
-
-  @failingTest
-  @override
   test_InstanceCreationExpression_unimported() =>
       super.test_InstanceCreationExpression_unimported();
 
diff --git a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
index 5f7ad8d..ecf6d6a 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
@@ -4689,16 +4689,6 @@
 
   @failingTest
   @override
-  test_ArgumentList_MethodInvocation_functionalArg2() =>
-      super.test_ArgumentList_MethodInvocation_functionalArg2();
-
-  @failingTest
-  @override
-  test_ArgumentList_namedParam_filter() =>
-      super.test_ArgumentList_namedParam_filter();
-
-  @failingTest
-  @override
   test_AsExpression_type() => super.test_AsExpression_type();
 
   @failingTest
@@ -4734,10 +4724,6 @@
 
   @failingTest
   @override
-  test_enum_filter() => super.test_enum_filter();
-
-  @failingTest
-  @override
   test_ForEachStatement_body_untyped() =>
       super.test_ForEachStatement_body_untyped();
 
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index 2f32126..865cf03 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -7709,11 +7709,6 @@
 
   @failingTest
   @override
-  test_creationFunction_forFunctionType_coreFunction() =>
-      super.test_creationFunction_forFunctionType_coreFunction();
-
-  @failingTest
-  @override
   test_creationFunction_forFunctionType_dynamicArgument() =>
       super.test_creationFunction_forFunctionType_dynamicArgument();
 
diff --git a/pkg/analysis_server/test/services/correction/name_suggestion_test.dart b/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
index fb5c715..beb4fe9 100644
--- a/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
+++ b/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
@@ -376,21 +376,6 @@
 
   @failingTest
   @override
-  test_forExpression_indexExpression_endsWithE() =>
-      super.test_forExpression_indexExpression_endsWithE();
-
-  @failingTest
-  @override
   test_forExpression_instanceCreation() =>
       super.test_forExpression_instanceCreation();
-
-  @failingTest
-  @override
-  test_forExpression_invocationArgument_optional() =>
-      super.test_forExpression_invocationArgument_optional();
-
-  @failingTest
-  @override
-  test_forExpression_invocationArgument_positional() =>
-      super.test_forExpression_invocationArgument_positional();
 }
diff --git a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
index aa90750..95714c8 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
@@ -1352,20 +1352,6 @@
 
   @failingTest
   @override
-  test_guessNames_singleExpression() =>
-      super.test_guessNames_singleExpression();
-
-  @failingTest
-  @override
-  test_occurrences_differentVariable() =>
-      super.test_occurrences_differentVariable();
-
-  @failingTest
-  @override
   test_singleExpression_hasParseError_expectedSemicolon() =>
       super.test_singleExpression_hasParseError_expectedSemicolon();
-
-  @failingTest
-  @override
-  test_stringLiteral_whole() => super.test_stringLiteral_whole();
 }
diff --git a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
index 743d87f..eda761b 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
@@ -2947,18 +2947,6 @@
 
   @failingTest
   @override
-  test_closure_atArgumentName() => super.test_closure_atArgumentName();
-
-  @failingTest
-  @override
-  test_closure_atParameters() => super.test_closure_atParameters();
-
-  @failingTest
-  @override
-  test_names_singleExpression() => super.test_names_singleExpression();
-
-  @failingTest
-  @override
   test_statements_parameters_localFunction() =>
       super.test_statements_parameters_localFunction();
 }
diff --git a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
index 01ec170..61450ac 100644
--- a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
@@ -704,57 +704,4 @@
 class FlutterOutlineComputerTest_UseCFE extends FlutterOutlineComputerTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_attribute_namedExpression() => super.test_attribute_namedExpression();
-
-  @failingTest
-  @override
-  test_attributes_bool() => super.test_attributes_bool();
-
-  @failingTest
-  @override
-  test_attributes_functionExpression_hasParameters_blockExpression() =>
-      super.test_attributes_functionExpression_hasParameters_blockExpression();
-
-  @failingTest
-  @override
-  test_attributes_functionExpression_hasParameters_bodyExpression() =>
-      super.test_attributes_functionExpression_hasParameters_bodyExpression();
-
-  @failingTest
-  @override
-  test_attributes_functionExpression_noParameters_blockExpression() =>
-      super.test_attributes_functionExpression_noParameters_blockExpression();
-
-  @failingTest
-  @override
-  test_attributes_functionExpression_noParameters_bodyExpression() =>
-      super.test_attributes_functionExpression_noParameters_bodyExpression();
-
-  @failingTest
-  @override
-  test_attributes_int() => super.test_attributes_int();
-
-  @failingTest
-  @override
-  test_attributes_listLiteral() => super.test_attributes_listLiteral();
-
-  @failingTest
-  @override
-  test_attributes_mapLiteral() => super.test_attributes_mapLiteral();
-
-  @failingTest
-  @override
-  test_attributes_multiLine() => super.test_attributes_multiLine();
-
-  @failingTest
-  @override
-  test_attributes_string_interpolation() =>
-      super.test_attributes_string_interpolation();
-
-  @failingTest
-  @override
-  test_attributes_string_literal() => super.test_attributes_string_literal();
 }
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index 7784637..26afda9 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -99,7 +99,7 @@
       }
 
       argumentList.accept(this);
-      _resolveNamedArguments(argumentList, element.parameters);
+      _resolveArgumentsToParameters(argumentList, element.parameters);
     }
   }
 
@@ -437,7 +437,7 @@
 
     ArgumentList argumentList = node.argumentList;
     argumentList.accept(this);
-    _resolveNamedArguments(argumentList, constructor?.parameters);
+    _resolveArgumentsToParameters(argumentList, constructor?.parameters);
   }
 
   @override
@@ -526,10 +526,16 @@
         PropertyAccessorElement accessor = elementForParameters;
         elementForParameters = accessor.returnType.element;
       }
+      List<ParameterElement> parameters;
       if (elementForParameters is FunctionTypedElement) {
-        List<ParameterElement> parameters = elementForParameters.parameters;
-        _resolveNamedArguments(argumentList, parameters);
+        parameters = elementForParameters.parameters;
+      } else if (elementForParameters is ParameterElement) {
+        var type = elementForParameters.type;
+        if (type is FunctionType) {
+          parameters = type.parameters;
+        }
       }
+      _resolveArgumentsToParameters(argumentList, parameters);
     }
 
     if (invokeElement is ConstructorElement) {
@@ -607,7 +613,7 @@
 
     ArgumentList argumentList = node.argumentList;
     argumentList.accept(this);
-    _resolveNamedArguments(argumentList, element?.parameters);
+    _resolveArgumentsToParameters(argumentList, element?.parameters);
   }
 
   @override
@@ -653,7 +659,7 @@
 
     ArgumentList argumentList = node.argumentList;
     argumentList.accept(this);
-    _resolveNamedArguments(argumentList, element?.parameters);
+    _resolveArgumentsToParameters(argumentList, element?.parameters);
   }
 
   @override
@@ -748,21 +754,44 @@
     }
   }
 
-  /// Apply resolution to named arguments of the [argumentList].
-  void _resolveNamedArguments(
+  /// Resolve arguments of the [argumentList] to corresponding [parameters].
+  void _resolveArgumentsToParameters(
       ArgumentList argumentList, List<ParameterElement> parameters) {
     if (parameters != null) {
-      for (var argument in argumentList.arguments) {
+      var numberOfPositionalParameters = 0;
+      for (var parameter in parameters) {
+        if (parameter.isPositional) {
+          numberOfPositionalParameters++;
+        }
+      }
+
+      var numberOfArguments = argumentList.arguments.length;
+      if (numberOfArguments == numberOfPositionalParameters &&
+          numberOfPositionalParameters == parameters.length) {
+        argumentList.correspondingStaticParameters = parameters;
+        return;
+      }
+
+      var resolvedParameters = new List<ParameterElement>(numberOfArguments);
+      for (var i = 0; i < numberOfArguments; i++) {
+        var argument = argumentList.arguments[i];
+        ParameterElement argumentParameter;
         if (argument is NamedExpression) {
           SimpleIdentifier identifier = argument.name.label;
           for (var parameter in parameters) {
             if (parameter.name == identifier.name) {
+              argumentParameter = parameter;
               identifier.staticElement = parameter;
               break;
             }
           }
+        } else if (i < parameters.length && parameters[i].isPositional) {
+          argumentParameter = parameters[i];
         }
+        resolvedParameters[i] = argumentParameter;
       }
+
+      argumentList.correspondingStaticParameters = resolvedParameters;
     }
   }
 
diff --git a/pkg/analyzer/test/generated/hint_code_kernel_test.dart b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
index e773bc6..4103dd6 100644
--- a/pkg/analyzer/test/generated/hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
@@ -55,12 +55,6 @@
 
   @failingTest
   @override
-  test_deprecatedAnnotationUse_positional() async {
-    return super.test_deprecatedAnnotationUse_positional();
-  }
-
-  @failingTest
-  @override
   test_deprecatedFunction_class() async {
     return super.test_deprecatedFunction_class();
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
index 1927342..a83d5af 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
@@ -51,6 +51,12 @@
 
   @override
   @failingTest
+  test_methodInvocation_topLevelFunction_generic() async {
+    await super.test_methodInvocation_topLevelFunction_generic();
+  }
+
+  @override
+  @failingTest
   test_unresolved_assignment_left_indexed1_simple() async {
     await super.test_unresolved_assignment_left_indexed1_simple();
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 14378de..4b6176e 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -6710,9 +6710,9 @@
       expect(invocation.staticInvokeType.toString(), fTypeString);
 
       _assertArgumentToParameter(arguments[0], fElement.parameters[0],
-          parameterMemberType: typeProvider.boolType);
+          memberType: typeProvider.boolType);
       _assertArgumentToParameter(arguments[1], fElement.parameters[1],
-          parameterMemberType: typeProvider.stringType);
+          memberType: typeProvider.stringType);
     }
 
     // f(1, 2.3);
@@ -6730,9 +6730,9 @@
       expect(invocation.staticInvokeType.toString(), fTypeString);
 
       _assertArgumentToParameter(arguments[0], fElement.parameters[0],
-          parameterMemberType: typeProvider.intType);
+          memberType: typeProvider.intType);
       _assertArgumentToParameter(arguments[1], fElement.parameters[1],
-          parameterMemberType: typeProvider.doubleType);
+          memberType: typeProvider.doubleType);
     }
   }
 
@@ -10013,41 +10013,34 @@
     assertType(intRef, 'int');
   }
 
-  /// Assert that the [argument] is associated with the [expectedParameter],
+  /// Assert that the [argument] is associated with the [expected],
   /// if [useCFE] is `null`. If the [argument] is a [NamedExpression],
   /// the name must be resolved to the parameter in both cases.
   void _assertArgumentToParameter(
-      Expression argument, ParameterElement expectedParameter,
-      {DartType parameterMemberType}) {
-    ParameterElement actualParameter = argument.staticParameterElement;
-    if (useCFE) {
-      expect(actualParameter, isNull);
-      if (argument is NamedExpression) {
-        SimpleIdentifier name = argument.name.label;
-        expect(name.staticElement, same(expectedParameter));
+      Expression argument, ParameterElement expected,
+      {DartType memberType}) {
+    ParameterElement actual = argument.staticParameterElement;
+    if (memberType != null) {
+      expect(actual.type, memberType);
+    }
+
+    ParameterElement base = actual;
+    if (actual is ParameterMember) {
+      base = actual.baseElement;
+      // Unwrap ParameterMember one more time.
+      // By some reason we wrap in twice.
+      if (base is ParameterMember) {
+        ParameterMember member = base;
+        base = member.baseElement;
       }
-    } else {
-      ParameterElement baseActualParameter;
-      if (actualParameter is ParameterMember) {
-        if (parameterMemberType != null) {
-          expect(actualParameter.type, parameterMemberType);
-        }
-        baseActualParameter = actualParameter.baseElement;
-        // Unwrap ParameterMember one more time.
-        // By some reason we wrap in twice.
-        if (baseActualParameter is ParameterMember) {
-          ParameterMember member = baseActualParameter;
-          baseActualParameter = member.baseElement;
-        }
-      } else {
-        baseActualParameter = actualParameter;
-      }
-      expect(baseActualParameter, same(expectedParameter));
-      if (argument is NamedExpression) {
-        SimpleIdentifier name = argument.name.label;
-        expect(name.staticElement, same(actualParameter));
-        expect(name.staticType, isNull);
-      }
+    }
+    ParameterElement baseActual = base;
+    expect(baseActual, same(expected));
+
+    if (argument is NamedExpression) {
+      SimpleIdentifier name = argument.name.label;
+      expect(name.staticElement, same(actual));
+      expect(name.staticType, isNull);
     }
   }
 
@@ -10258,6 +10251,9 @@
     for (var function in unitElement.functions) {
       function.parameters.forEach(considerParameter);
     }
+    for (var function in unitElement.functionTypeAliases) {
+      function.parameters.forEach(considerParameter);
+    }
     for (var class_ in unitElement.types) {
       for (var constructor in class_.constructors) {
         constructor.parameters.forEach(considerParameter);
@@ -10429,6 +10425,10 @@
     return _node(search).getAncestor((n) => n is SimpleFormalParameter);
   }
 
+  StringLiteral stringLiteral(String search) {
+    return _node(search).getAncestor((n) => n is StringLiteral);
+  }
+
   SuperExpression super_(String search) {
     return _node(search).getAncestor((n) => n is SuperExpression);
   }