Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(803)

Unified Diff: pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart

Issue 2864853002: Fix constructor invocation type inference. (Closed)
Patch Set: Rebase and remove unnecessary changes Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
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 504c88a5fe7c9888d1ebba88a6ee0359188f5766..6dc71000f3f7d2941f39f2b3e79146ce5b414e70 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
@@ -23,6 +23,23 @@ import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
import 'package:front_end/src/fasta/type_inference/type_promotion.dart';
import 'package:kernel/ast.dart';
+/// Concrete shadow object representing a set of invocation arguments.
+class KernelArguments extends Arguments {
+ bool _hasExplicitTypeArguments;
+
+ KernelArguments(List<Expression> positional,
+ {List<DartType> types, List<NamedExpression> named})
+ : _hasExplicitTypeArguments = types != null && types.isNotEmpty,
+ super(positional, types: types, named: named);
+
+ static void setExplicitArgumentTypes(
+ KernelArguments arguments, List<DartType> types) {
+ arguments.types.clear();
+ arguments.types.addAll(types);
+ arguments._hasExplicitTypeArguments = true;
+ }
+}
+
/// Shadow object for [AsExpression].
class KernelAsExpression extends AsExpression implements KernelExpression {
KernelAsExpression(Expression operand, DartType type) : super(operand, type);
@@ -109,15 +126,16 @@ class KernelConstructorInvocation extends ConstructorInvocation
@override
DartType _inferExpression(
KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
+ KernelArguments arguments = this.arguments;
return inferrer.inferConstructorInvocation(
typeContext,
typeNeeded,
fileOffset,
target,
- arguments.types.isEmpty ? null : arguments.types,
+ arguments._hasExplicitTypeArguments ? arguments.types : null,
_forEachArgument, (type) {
- arguments = new Arguments(arguments.positional,
- named: arguments.named, types: type.typeArguments);
+ arguments.types.clear();
+ arguments.types.addAll(type.typeArguments);
});
}
}

Powered by Google App Engine
This is Rietveld 408576698