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)