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

Unified Diff: pkg/compiler/lib/src/kernel/kernel.dart

Issue 2468273003: Fix kernel/visitor_test (Closed)
Patch Set: Fix impact_test after changes. Created 4 years, 1 month 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
« no previous file with comments | « pkg/compiler/lib/src/elements/modelx.dart ('k') | pkg/compiler/lib/src/resolution/constructors.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/kernel/kernel.dart
diff --git a/pkg/compiler/lib/src/kernel/kernel.dart b/pkg/compiler/lib/src/kernel/kernel.dart
index b4ff25a039f6f74eab0a206b9e67cb2605c02845..53ca7823e1725d958337e109a6e3be1a6c9b3d33 100644
--- a/pkg/compiler/lib/src/kernel/kernel.dart
+++ b/pkg/compiler/lib/src/kernel/kernel.dart
@@ -194,6 +194,10 @@ class Kernel {
if (cls.supertype != null) {
classNode.supertype = interfaceTypeToIr(cls.supertype);
}
+ if (cls.isMixinApplication) {
+ MixinApplicationElement mixinApplication = cls;
+ classNode.mixedInType = interfaceTypeToIr(mixinApplication.mixinType);
+ }
classNode.parent = libraryToIr(cls.library);
if (cls.isUnnamedMixinApplication) {
classNode.enclosingLibrary.addClass(classNode);
@@ -218,6 +222,9 @@ class Kernel {
in typesToIr(cls.interfaces.reverse().toList())) {
classNode.implementedTypes.add(interface);
}
+ addWork(cls, () {
+ addDefaultInstanceFieldInitializers(classNode);
+ });
});
addWork(cls.declaration, () {
for (MetadataAnnotation metadata in cls.declaration.metadata) {
@@ -229,6 +236,37 @@ class Kernel {
});
}
+ /// Adds initializers to instance fields that are have no initializer and are
+ /// not initialized by all constructors in the class.
+ ///
+ /// This is more or less copied directly from `ast_from_analyzer.dart` in
+ /// dartk.
+ void addDefaultInstanceFieldInitializers(ir.Class node) {
+ List<ir.Field> uninitializedFields = new List<ir.Field>();
+ for (ir.Field field in node.fields) {
+ if (field.initializer != null || field.isStatic) continue;
+ uninitializedFields.add(field);
+ }
+ if (uninitializedFields.isEmpty) return;
+ constructorLoop:
+ for (ir.Constructor constructor in node.constructors) {
+ Set<ir.Field> remainingFields = uninitializedFields.toSet();
+ for (ir.Initializer initializer in constructor.initializers) {
+ if (initializer is ir.FieldInitializer) {
+ remainingFields.remove(initializer.field);
+ } else if (initializer is ir.RedirectingInitializer) {
+ // The target constructor will be checked in another iteration.
+ continue constructorLoop;
+ }
+ }
+ for (ir.Field field in remainingFields) {
+ if (field.initializer == null) {
+ field.initializer = new ir.NullLiteral()..parent = field;
+ }
+ }
+ }
+ }
+
bool hasHierarchyProblem(ClassElement cls) => cls.hasIncompleteHierarchy;
ir.InterfaceType interfaceTypeToIr(InterfaceType type) {
@@ -459,11 +497,15 @@ class Kernel {
isConst: field.isConst);
addWork(field, () {
setParent(fieldNode, field);
- if (!field.isMalformed && field.initializer != null) {
- KernelVisitor visitor =
- new KernelVisitor(field, field.treeElements, this);
- fieldNode.initializer = visitor.buildInitializer()
- ..parent = fieldNode;
+ if (!field.isMalformed) {
+ if (field.initializer != null) {
+ KernelVisitor visitor =
+ new KernelVisitor(field, field.treeElements, this);
+ fieldNode.initializer = visitor.buildInitializer()
+ ..parent = fieldNode;
+ } else if (!field.isInstanceMember) {
+ fieldNode.initializer = new ir.NullLiteral()..parent = fieldNode;
+ }
}
});
addWork(field.declaration, () {
« no previous file with comments | « pkg/compiler/lib/src/elements/modelx.dart ('k') | pkg/compiler/lib/src/resolution/constructors.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698