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

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

Issue 2736103004: Use correct types on cloned constructors in mixin applications. (Closed)
Patch Set: Update kompile.status. Created 3 years, 9 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_target.dart
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index babe86b5c9d88400cdd46ba0d7c7207d9df7ad23..218585d6cc4a74426cf969414b4e0af7ca74f8c3 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -14,6 +14,7 @@ import 'package:kernel/ast.dart'
AsyncMarker,
Class,
Constructor,
+ DartType,
EmptyStatement,
Expression,
ExpressionStatement,
@@ -33,6 +34,7 @@ import 'package:kernel/ast.dart'
StringLiteral,
SuperInitializer,
Throw,
+ TypeParameter,
VariableDeclaration,
VariableGet,
VoidType;
@@ -51,6 +53,8 @@ import 'package:kernel/transformations/mixin_full_resolution.dart'
import 'package:kernel/transformations/setup_builtin_library.dart'
as setup_builtin_library;
+import 'package:kernel/type_algebra.dart' show substitute;
+
import '../source/source_loader.dart' show SourceLoader;
import '../source/source_class_builder.dart' show SourceClassBuilder;
@@ -80,7 +84,8 @@ import 'kernel_builder.dart'
MixinApplicationBuilder,
NamedMixinApplicationBuilder,
NamedTypeBuilder,
- TypeBuilder;
+ TypeBuilder,
+ TypeVariableBuilder;
class KernelTarget extends TargetImplementation {
final DillTarget dillTarget;
@@ -93,6 +98,9 @@ class KernelTarget extends TargetImplementation {
final List errors = [];
+ final TypeBuilder dynamicType =
+ new KernelNamedTypeBuilder("dynamic", null, -1, null);
+
KernelTarget(DillTarget dillTarget, TranslateUri uriTranslator,
[Map<String, Source> uriToSource])
: dillTarget = dillTarget,
@@ -389,7 +397,8 @@ class KernelTarget extends TargetImplementation {
if (builder.isMixinApplication || builder.constructors.isNotEmpty) return;
/// Quotes below are from [Dart Programming Language Specification, 4th
- /// Edition](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf):
+ /// Edition](
+ /// http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf):
if (builder is NamedMixinApplicationBuilder) {
/// >A mixin application of the form S with M; defines a class C with
/// >superclass S.
@@ -415,9 +424,14 @@ class KernelTarget extends TargetImplementation {
}
}
if (supertype is KernelClassBuilder) {
+ Map<TypeParameter, DartType> substitutionMap =
+ computeKernelSubstitutionMap(
+ builder.getSubstitutionMap(supertype, builder.fileUri,
+ builder.charOffset, dynamicType),
+ builder.parent);
for (Constructor constructor in supertype.cls.constructors) {
- builder.addSyntheticConstructor(
- makeMixinApplicationConstructor(builder.cls.mixin, constructor));
+ builder.addSyntheticConstructor(makeMixinApplicationConstructor(
+ builder.cls.mixin, constructor, substitutionMap));
}
} else {
internalError("Unhandled: ${supertype.runtimeType}");
@@ -430,12 +444,26 @@ class KernelTarget extends TargetImplementation {
}
}
- Constructor makeMixinApplicationConstructor(
- Class mixin, Constructor constructor) {
+ Map<TypeParameter, DartType> computeKernelSubstitutionMap(
+ Map<TypeVariableBuilder, TypeBuilder> substitutionMap,
+ LibraryBuilder library) {
+ if (substitutionMap == null) return const <TypeParameter, DartType>{};
+ Map<TypeParameter, DartType> result = <TypeParameter, DartType>{};
+ substitutionMap
+ .forEach((TypeVariableBuilder variable, TypeBuilder argument) {
+ result[variable.target] = argument.build(library);
+ });
+ return result;
+ }
+
+ Constructor makeMixinApplicationConstructor(Class mixin,
+ Constructor constructor, Map<TypeParameter, DartType> substitutionMap) {
VariableDeclaration copyFormal(VariableDeclaration formal) {
// TODO(ahe): Handle initializers.
return new VariableDeclaration(formal.name,
- type: formal.type, isFinal: formal.isFinal, isConst: formal.isConst);
+ type: substitute(formal.type, substitutionMap),
+ isFinal: formal.isFinal,
+ isConst: formal.isConst);
}
List<VariableDeclaration> positionalParameters = <VariableDeclaration>[];

Powered by Google App Engine
This is Rietveld 408576698