Resolve required arguments after named.

Change-Id: I2947be1fc20b1455e7865c34e35349977d61f70b
Reviewed-on: https://dart-review.googlesource.com/71382
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index 878d257..abb74ac 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
@@ -1061,14 +1061,4 @@
 class ArgListContributorTest_UseCFE extends ArgListContributorTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_ArgumentList_local_constructor_named_param_4() =>
-      super.test_ArgumentList_local_constructor_named_param_4();
-
-  @failingTest
-  @override
-  test_ArgumentList_local_constructor_named_param_5() =>
-      super.test_ArgumentList_local_constructor_named_param_5();
 }
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 aa48539..8624cb8 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -4641,6 +4641,21 @@
     assertIdentifierTopGetRef(arg2.expression, 'c');
   }
 
+  test_invalid_invocation_arguments_requiredAfterNamed() async {
+    addTestFile(r'''
+var a = 0;
+var b = 0;
+main() {
+  f(p: a, b);
+}
+void f({p}) {}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+    assertTopGetRef('a, ', 'a');
+    assertTopGetRef('b);', 'b');
+  }
+
   test_invalid_invocation_arguments_static_method() async {
     addTestFile(r'''
 class C {
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 12fc1e2..4be50c6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1098,12 +1098,14 @@
         Expression argument = toValue(node);
         arguments[i] = argument;
         if (i > firstNamedArgumentIndex) {
-          arguments[i] = new NamedExpression(
-              "#$i",
+          arguments[i] = new NamedExpressionJudgment(
+              tokensSaver?.namedExpressionTokens(null, null),
+              '#$i',
               buildCompileTimeErrorExpression(
                   fasta.messageExpectedNamedArgument,
-                  forest.readOffset(argument)))
-            ..fileOffset = beginToken.charOffset;
+                  forest.readOffset(argument)),
+              originalValue: argument)
+            ..fileOffset = offsetForToken(beginToken);
         }
       }
     }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index 863527c..bcd41f7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -3716,10 +3716,17 @@
 
 /// Concrete shadow object representing a named expression.
 class NamedExpressionJudgment extends NamedExpression {
-  NamedExpressionTokens tokens;
+  final NamedExpressionTokens tokens;
 
-  NamedExpressionJudgment(this.tokens, String nameLexeme, Expression value)
-      : super(nameLexeme, value);
+  /// The original value that is wrapped by this synthetic named argument.
+  /// Its type will be inferred.
+  final Expression originalValue;
+
+  NamedExpressionJudgment(this.tokens, String nameLexeme, Expression value,
+      {this.originalValue})
+      : super(nameLexeme, value) {
+    originalValue?.parent = this;
+  }
 
   ExpressionJudgment get judgment => value;
 }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 295e7a3..b8113fe 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -1956,13 +1956,14 @@
     return new InterfaceType(class_, <DartType>[type ?? const DynamicType()]);
   }
 
-  void _forEachArgument(
-      Arguments arguments, void callback(String name, Expression expression)) {
+  void _forEachArgument(ArgumentsJudgment arguments,
+      void callback(String name, Expression expression)) {
     for (var expression in arguments.positional) {
       callback(null, expression);
     }
-    for (var namedExpression in arguments.named) {
-      callback(namedExpression.name, namedExpression.value);
+    for (var namedExpression in arguments.namedJudgments) {
+      callback(namedExpression.name,
+          namedExpression.originalValue ?? namedExpression.value);
     }
   }
 
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 78abbe1..6339d09 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -27,10 +27,6 @@
 
 [ $compiler == dart2analyzer && $fasta ]
 arg_param_trailing_comma_test/100: Crash # Issue #34043 - Error recovery in outline (extraneous comma before formal parameter)
-arg_param_trailing_comma_test/138: Crash # Error recovery in method body (synthetic argument)
-arg_param_trailing_comma_test/147: Crash # Error recovery in method body (synthetic argument)
-arg_param_trailing_comma_test/156: Crash # Error recovery in method body (synthetic argument)
-arg_param_trailing_comma_test/165: Crash # Error recovery in method body (synthetic argument)
 arg_param_trailing_comma_test/24: Crash # Issue #34043 - Error recovery in outline (extraneous comma before formal parameter)
 arg_param_trailing_comma_test/25: Crash # Issue #34043 - Error recovery in outline (extraneous comma before formal parameter)
 arg_param_trailing_comma_test/26: Crash # Issue #34043 - Error recovery in outline (extraneous comma before formal parameter)