[kernel] Support BlockExpression-s in the type inference constraint builder.

Ignore function bodies for external methods.

BUG=
R=asgerf@google.com

Review URL: https://chromereviews.googleplex.com/482497013 .
diff --git a/pkg/kernel/lib/type_propagation/builder.dart b/pkg/kernel/lib/type_propagation/builder.dart
index cf743b5..01df0b3 100644
--- a/pkg/kernel/lib/type_propagation/builder.dart
+++ b/pkg/kernel/lib/type_propagation/builder.dart
@@ -811,7 +811,8 @@
     var environment = new Environment(this, null, field);
     int initializer = field.initializer == null
         ? nullNode
-        : new ExpressionBuilder(this, environment).build(field.initializer);
+        : new StatementBuilder(this, environment)
+            .buildExpression(field.initializer);
     environment.addAssign(initializer, getSharedFieldVariable(field));
   }
 
@@ -833,8 +834,9 @@
   }
 
   int _makeDeclarationSiteFieldInitializer(Field field) {
-    return new ExpressionBuilder(this, new Environment(this, null, field))
-        .build(field.initializer);
+    final initializerEnvironment = new Environment(this, null, field);
+    return new StatementBuilder(this, initializerEnvironment)
+        .buildExpression(field.initializer);
   }
 
   void buildConstructor(Class hostClass, Constructor node) {
@@ -873,7 +875,8 @@
   /// which currently do have function values).
   void buildFunctionNode(FunctionNode node, Environment environment,
       {int function, bool addTypeBasedSummary: false}) {
-    var expressionBuilder = new ExpressionBuilder(this, environment);
+    var expressionBuilder =
+        new StatementBuilder(this, environment).expressionBuilder;
     int minArity = node.requiredParameterCount;
     int maxArity = node.positionalParameters.length;
     for (int i = 0; i < node.positionalParameters.length; ++i) {
@@ -936,8 +939,7 @@
     if (addTypeBasedSummary) {
       int returnFromType = buildCovariantType(node.returnType, environment);
       environment.addAssign(returnFromType, environment.returnVariable);
-    }
-    if (node.body != null) {
+    } else if (node.body != null) {
       Completion completes =
           new StatementBuilder(this, environment).build(node.body);
       if (completes == Completion.Maybe) {
@@ -1137,12 +1139,13 @@
 class ExpressionBuilder extends ExpressionVisitor<int> {
   final Builder builder;
   final Environment environment;
+  final StatementBuilder statementBuilder;
 
   ConstraintSystem get constraints => builder.constraints;
   Visualizer get visualizer => builder.visualizer;
   FieldNames get fieldNames => builder.fieldNames;
 
-  ExpressionBuilder(this.builder, this.environment);
+  ExpressionBuilder(this.builder, this.statementBuilder, this.environment);
 
   int build(Expression node) {
     int variable = node.accept(this);
@@ -1439,6 +1442,11 @@
     return build(node.body);
   }
 
+  int visitBlockExpression(BlockExpression node) {
+    statementBuilder.build(node.body);
+    return build(node.value);
+  }
+
   int buildInnerFunction(FunctionNode node, {VariableDeclaration self}) {
     int variable = builder.newFunction(node);
     if (self != null) {
@@ -1500,7 +1508,7 @@
   FieldNames get names => builder.fieldNames;
 
   StatementBuilder(this.builder, this.environment) {
-    expressionBuilder = new ExpressionBuilder(builder, environment);
+    expressionBuilder = new ExpressionBuilder(builder, this, environment);
   }
 
   Completion build(Statement node) => node.accept(this);
@@ -1671,7 +1679,8 @@
   FieldNames get fieldNames => builder.fieldNames;
 
   InitializerBuilder(this.builder, this.environment) {
-    expressionBuilder = new ExpressionBuilder(builder, environment);
+    expressionBuilder =
+        new StatementBuilder(builder, environment).expressionBuilder;
   }
 
   void build(Initializer node) {