Store resolution for unresolved type instance creation.
R=brianwilkerson@google.com, paulberry@google.com
Change-Id: I91af78cc5b99924c8dab77662d6bd08786a24fd9
Reviewed-on: https://dart-review.googlesource.com/65026
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index 99c1af3..2125919 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -672,6 +672,7 @@
for (var argument in argumentList.arguments) {
if (argument is NamedExpression) {
argument.expression.accept(this);
+ argument.staticType = argument.expression.staticType;
} else {
argument.accept(this);
}
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 eb42be1..0b26443 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
@@ -105,13 +105,6 @@
@override
@failingTest
@potentialAnalyzerProblem
- test_unresolved_instanceCreation_name_11() async {
- await super.test_unresolved_instanceCreation_name_11();
- }
-
- @override
- @failingTest
- @potentialAnalyzerProblem
test_unresolved_instanceCreation_name_21() async {
await super.test_unresolved_instanceCreation_name_21();
}
@@ -133,13 +126,6 @@
@override
@failingTest
@potentialAnalyzerProblem
- test_unresolved_instanceCreation_name_32() async {
- await super.test_unresolved_instanceCreation_name_32();
- }
-
- @override
- @failingTest
- @potentialAnalyzerProblem
test_unresolved_instanceCreation_name_33() async {
await super.test_unresolved_instanceCreation_name_33();
}
@@ -154,13 +140,6 @@
@override
@failingTest
@potentialAnalyzerProblem
- test_unresolved_methodInvocation_target_resolved() async {
- await super.test_unresolved_methodInvocation_target_resolved();
- }
-
- @override
- @failingTest
- @potentialAnalyzerProblem
test_unresolved_methodInvocation_target_unresolved() async {
await super.test_unresolved_methodInvocation_target_unresolved();
}
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 685a711..8e06650 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -125,13 +125,11 @@
SimpleIdentifier nameIdentifier = named.name.label;
expect(nameIdentifier.staticElement, isNull);
- if (useCFE) {
- expect(nameIdentifier.staticType, isDynamicType);
- }
+ expect(nameIdentifier.staticType, isNull);
- SimpleIdentifier arg2Node = named.expression;
- expect(arg2Node.staticElement, same(variable.getter));
- expect(arg2Node.staticType, variable.type);
+ SimpleIdentifier expression = named.expression;
+ expect(expression.staticElement, same(variable.getter));
+ expect(expression.staticType, variable.type);
};
}
@@ -8310,6 +8308,7 @@
if (argument is NamedExpression) {
SimpleIdentifier name = argument.name.label;
expect(name.staticElement, same(actualParameter));
+ expect(name.staticType, isNull);
}
}
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 255f585..9409dc1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -66,6 +66,7 @@
DynamicType,
Expression,
Initializer,
+ InvalidConstructorInvocationJudgment,
InvalidType,
Member,
Name,
@@ -792,11 +793,13 @@
@override
Expression invokeConstructor(List<DartType> typeArguments, String name,
Arguments arguments, Token nameToken, Constness constness) {
+ helper.storeTypeUse(offsetForToken(token), const InvalidType());
if (typeArguments != null) {
assert(forest.argumentsTypeArguments(arguments).isEmpty);
forest.argumentsSetTypeArguments(arguments, typeArguments);
}
- return new SyntheticExpressionJudgment(buildError(arguments));
+ var error = buildError(arguments);
+ return new InvalidConstructorInvocationJudgment(error, null, arguments);
}
}
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 31f9b75..143ea69 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
@@ -2857,8 +2857,8 @@
}
}
-/// Synthetic judgment class representing an attempt to invoke a constructor
-/// that cannot be invoked.
+/// Synthetic judgment class representing an attempt to invoke an unresolved
+/// constructor, or a constructor that cannot be invoked.
class InvalidConstructorInvocationJudgment extends SyntheticExpressionJudgment {
final Constructor constructor;
final Arguments arguments;
@@ -2874,13 +2874,21 @@
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
- var calleeType = constructor.function.functionType;
- var inferenceResult = inferrer.inferInvocation(
+ FunctionType calleeType;
+ DartType returnType;
+ if (constructor != null) {
+ calleeType = constructor.function.functionType;
+ returnType = computeConstructorReturnType(constructor);
+ } else {
+ calleeType = new FunctionType([], const DynamicType());
+ returnType = const DynamicType();
+ }
+ ExpressionInferenceResult inferenceResult = inferrer.inferInvocation(
factory,
typeContext,
fileOffset,
calleeType,
- computeConstructorReturnType(constructor),
+ returnType,
argumentJudgments);
this.inferredType = inferenceResult.type;
inferrer.listener.constructorInvocation(
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 64ee7d5..e03c017 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
@@ -1750,6 +1750,7 @@
// TODO(paulberry): handle this case.
} else if (node is InvalidType) {
// TODO(paulberry): handle this case.
+ listener.storeClassReference(offset, null, const DynamicType());
} else {
// TODO(paulberry): handle this case.
return unhandled("${node.runtimeType}", "storeTypeUse", offset, uri);
diff --git a/pkg/front_end/testcases/expression/lib_nonshown_ctor.expression.yaml.expect b/pkg/front_end/testcases/expression/lib_nonshown_ctor.expression.yaml.expect
index f6b2dd6..f7f9eda 100644
--- a/pkg/front_end/testcases/expression/lib_nonshown_ctor.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/lib_nonshown_ctor.expression.yaml.expect
@@ -1,5 +1,6 @@
Errors: {
Method not found: 'Directory'. (@4)
+ Too many positional arguments: 0 allowed, 1 given. (@0)
}
method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
return throw new dart.core::NoSuchMethodError::withInvocation(null, new dart.core::_InvocationMirror::_withType(#Directory, 32, const <dart.core::Type>[], dart.core::List::unmodifiable<dynamic>(<dynamic>["test"]), dart.core::Map::unmodifiable<dart.core::Symbol, dynamic>(const <dart.core::Symbol, dynamic>{})));