Index: pkg/compiler/lib/src/kernel/kernel_visitor.dart |
diff --git a/pkg/compiler/lib/src/kernel/kernel_visitor.dart b/pkg/compiler/lib/src/kernel/kernel_visitor.dart |
index 415483f4c371f9fc985d87784e52833e0b56c13a..2787d2247b64296014c9bdfc452d45c568f1efdd 100644 |
--- a/pkg/compiler/lib/src/kernel/kernel_visitor.dart |
+++ b/pkg/compiler/lib/src/kernel/kernel_visitor.dart |
@@ -20,6 +20,7 @@ import 'package:kernel/frontend/accessors.dart' |
makeLet, |
makeOrReuseVariable; |
+import '../common.dart'; |
import '../constants/expressions.dart' |
show |
BoolFromEnvironmentConstantExpression, |
@@ -1383,22 +1384,6 @@ class KernelVisitor extends Object |
.buildAssignment(visitForValue(rhs), voidContext: isVoidContext); |
} |
- void addFieldsWithInitializers( |
- ConstructorElement constructor, List<ir.Initializer> initializers) { |
- constructor.enclosingClass.forEachInstanceField((_, FieldElement element) { |
- // Convert the element into the corresponding IR field before asking |
- // if the initializer exists. This is necessary to ensure that the |
- // element has been analyzed before looking at its initializer. |
- ir.Field field = kernel.fieldToIr(element); |
- if (element.initializer != null) { |
- KernelVisitor visitor = |
- new KernelVisitor(element, element.treeElements, kernel); |
- ir.Expression value = visitor.buildInitializer(); |
- initializers.add(new ir.FieldInitializer(field, value)); |
- } |
- }); |
- } |
- |
IrFunction buildGenerativeConstructor( |
ConstructorElement constructor, NodeList parameters, Node body) { |
List<ir.Initializer> constructorInitializers = <ir.Initializer>[]; |
@@ -1424,13 +1409,11 @@ class KernelVisitor extends Object |
if (kernel.isSyntheticError(constructor.definingConstructor)) { |
constructorInitializers.add(new ir.InvalidInitializer()); |
} else { |
- addFieldsWithInitializers(constructor, constructorInitializers); |
constructorInitializers.add(new ir.SuperInitializer( |
kernel.functionToIr(constructor.definingConstructor), |
new ir.Arguments(arguments, named: named, types: null))); |
} |
} else { |
- addFieldsWithInitializers(constructor, constructorInitializers); |
if (parameters != null) { |
// TODO(ahe): the following is a (modified) copy of |
// [SemanticDeclarationResolvedMixin.visitParameters]. |
@@ -1959,11 +1942,13 @@ class KernelVisitor extends Object |
ir.VariableDeclaration getLocal(LocalElement local) { |
return locals.putIfAbsent(local, () { |
+ // Currently, initializing formals are not final. |
+ bool isFinal = local.isFinal && !local.isInitializingFormal; |
return associateElement( |
new ir.VariableDeclaration(local.name, |
initializer: null, |
type: typeToIrHack(local.type), |
- isFinal: local.isFinal, |
+ isFinal: isFinal, |
isConst: local.isConst), |
local); |
}); |
@@ -1997,7 +1982,11 @@ class KernelVisitor extends Object |
initializer.parent = variable; |
} |
}); |
- returnType = typeToIrHack(signature.type.returnType); |
+ if (function.isGenerativeConstructor) { |
+ returnType = const ir.VoidType(); |
+ } else { |
+ returnType = typeToIrHack(signature.type.returnType); |
+ } |
if (function.isFactoryConstructor) { |
InterfaceType type = function.enclosingClass.thisType; |
if (type.isGeneric) { |
@@ -2033,8 +2022,20 @@ class KernelVisitor extends Object |
break; |
} |
} |
- ir.Statement body = |
- (bodyNode == null) ? null : buildStatementInBlock(bodyNode); |
+ ir.Statement body; |
+ if (function.isExternal) { |
+ // [body] must be `null`. |
+ } else if (function.isConstructor) { |
+ // TODO(johnniwinther): Clean this up pending kernel issue #28. |
+ ConstructorElement constructor = function; |
+ if (constructor.isDefaultConstructor) { |
+ body = new ir.EmptyStatement(); |
+ } else if (bodyNode != null && bodyNode.asEmptyStatement() == null) { |
+ body = buildStatementInBlock(bodyNode); |
+ } |
+ } else if (bodyNode != null) { |
+ body = buildStatementInBlock(bodyNode); |
+ } |
return associateElement( |
new ir.FunctionNode(body, |
asyncMarker: asyncMarker, |