| Index: pkg/compiler/lib/src/ssa/codegen.dart
 | 
| diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
 | 
| index 410532c1bdc0ee41dca3682154271268210f2bb4..3a5d85ad6aab3a8eedaf18d790521b2ea2d556cd 100644
 | 
| --- a/pkg/compiler/lib/src/ssa/codegen.dart
 | 
| +++ b/pkg/compiler/lib/src/ssa/codegen.dart
 | 
| @@ -3,62 +3,44 @@
 | 
|  // BSD-style license that can be found in the LICENSE file.
 | 
|  
 | 
|  import '../common.dart';
 | 
| -import '../common/codegen.dart' show
 | 
| -    CodegenRegistry,
 | 
| -    CodegenWorkItem;
 | 
| -import '../common/tasks.dart' show
 | 
| -    CompilerTask;
 | 
| -import '../compiler.dart' show
 | 
| -    Compiler;
 | 
| +import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem;
 | 
| +import '../common/tasks.dart' show CompilerTask;
 | 
| +import '../compiler.dart' show Compiler;
 | 
|  import '../constants/constant_system.dart';
 | 
|  import '../constants/values.dart';
 | 
| -import '../core_types.dart' show
 | 
| -    CoreClasses;
 | 
| +import '../core_types.dart' show CoreClasses;
 | 
|  import '../dart_types.dart';
 | 
|  import '../elements/elements.dart';
 | 
|  import '../io/source_information.dart';
 | 
|  import '../js/js.dart' as js;
 | 
| -import '../js_backend/backend_helpers.dart' show
 | 
| -    BackendHelpers;
 | 
| +import '../js_backend/backend_helpers.dart' show BackendHelpers;
 | 
|  import '../js_backend/js_backend.dart';
 | 
| -import '../js_emitter/js_emitter.dart' show
 | 
| -    CodeEmitterTask,
 | 
| -    NativeEmitter;
 | 
| +import '../js_emitter/js_emitter.dart' show CodeEmitterTask, NativeEmitter;
 | 
|  import '../native/native.dart' as native;
 | 
|  import '../types/types.dart';
 | 
| -import '../universe/call_structure.dart' show
 | 
| -    CallStructure;
 | 
| -import '../universe/selector.dart' show
 | 
| -    Selector;
 | 
| -import '../universe/use.dart' show
 | 
| -    DynamicUse,
 | 
| -    StaticUse,
 | 
| -    TypeUse;
 | 
| +import '../universe/call_structure.dart' show CallStructure;
 | 
| +import '../universe/selector.dart' show Selector;
 | 
| +import '../universe/use.dart' show DynamicUse, StaticUse, TypeUse;
 | 
|  import '../util/util.dart';
 | 
| -import '../world.dart' show
 | 
| -    ClassWorld,
 | 
| -    World;
 | 
| +import '../world.dart' show ClassWorld, World;
 | 
|  
 | 
|  import 'nodes.dart';
 | 
|  import 'codegen_helpers.dart';
 | 
|  import 'variable_allocator.dart';
 | 
|  
 | 
|  class SsaCodeGeneratorTask extends CompilerTask {
 | 
| -
 | 
|    final JavaScriptBackend backend;
 | 
|    final SourceInformationStrategy sourceInformationFactory;
 | 
|  
 | 
| -  SsaCodeGeneratorTask(JavaScriptBackend backend,
 | 
| -                       this.sourceInformationFactory)
 | 
| +  SsaCodeGeneratorTask(JavaScriptBackend backend, this.sourceInformationFactory)
 | 
|        : this.backend = backend,
 | 
|          super(backend.compiler);
 | 
|  
 | 
|    String get name => 'SSA code generator';
 | 
|    NativeEmitter get nativeEmitter => backend.emitter.nativeEmitter;
 | 
|  
 | 
| -  js.Fun buildJavaScriptFunction(FunctionElement element,
 | 
| -                                 List<js.Parameter> parameters,
 | 
| -                                 js.Block body) {
 | 
| +  js.Fun buildJavaScriptFunction(
 | 
| +      FunctionElement element, List<js.Parameter> parameters, js.Block body) {
 | 
|      js.AsyncModifier asyncModifier = element.asyncMarker.isAsync
 | 
|          ? (element.asyncMarker.isYielding
 | 
|              ? const js.AsyncModifier.asyncStar()
 | 
| @@ -68,9 +50,9 @@ class SsaCodeGeneratorTask extends CompilerTask {
 | 
|              : const js.AsyncModifier.sync());
 | 
|  
 | 
|      return new js.Fun(parameters, body, asyncModifier: asyncModifier)
 | 
| -        .withSourceInformation(
 | 
| -            sourceInformationFactory.createBuilderForContext(element)
 | 
| -                .buildDeclaration(element));
 | 
| +        .withSourceInformation(sourceInformationFactory
 | 
| +            .createBuilderForContext(element)
 | 
| +            .buildDeclaration(element));
 | 
|    }
 | 
|  
 | 
|    js.Expression generateCode(CodegenWorkItem work, HGraph graph) {
 | 
| @@ -84,9 +66,9 @@ class SsaCodeGeneratorTask extends CompilerTask {
 | 
|    js.Expression generateLazyInitializer(work, graph) {
 | 
|      return measure(() {
 | 
|        compiler.tracer.traceGraph("codegen", graph);
 | 
| -      SourceInformation sourceInformation =
 | 
| -          sourceInformationFactory.createBuilderForContext(work.element)
 | 
| -              .buildDeclaration(work.element);
 | 
| +      SourceInformation sourceInformation = sourceInformationFactory
 | 
| +          .createBuilderForContext(work.element)
 | 
| +          .buildDeclaration(work.element);
 | 
|        SsaCodeGenerator codegen = new SsaCodeGenerator(backend, work);
 | 
|        codegen.visitGraph(graph);
 | 
|        return new js.Fun(codegen.parameters, codegen.body)
 | 
| @@ -177,18 +159,18 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|    SubGraph subGraph;
 | 
|  
 | 
|    SsaCodeGenerator(this.backend, CodegenWorkItem work,
 | 
| -                   {SourceInformation sourceInformation})
 | 
| -    : this.work = work,
 | 
| -      declaredLocals = new Set<String>(),
 | 
| -      collectedVariableDeclarations = new Set<String>(),
 | 
| -      currentContainer = new js.Block.empty(),
 | 
| -      parameters = <js.Parameter>[],
 | 
| -      expressionStack = <js.Expression>[],
 | 
| -      oldContainerStack = <js.Block>[],
 | 
| -      generateAtUseSite = new Set<HInstruction>(),
 | 
| -      controlFlowOperators = new Set<HInstruction>(),
 | 
| -      breakAction = new Map<Entity, EntityAction>(),
 | 
| -      continueAction = new Map<Entity, EntityAction>();
 | 
| +      {SourceInformation sourceInformation})
 | 
| +      : this.work = work,
 | 
| +        declaredLocals = new Set<String>(),
 | 
| +        collectedVariableDeclarations = new Set<String>(),
 | 
| +        currentContainer = new js.Block.empty(),
 | 
| +        parameters = <js.Parameter>[],
 | 
| +        expressionStack = <js.Expression>[],
 | 
| +        oldContainerStack = <js.Block>[],
 | 
| +        generateAtUseSite = new Set<HInstruction>(),
 | 
| +        controlFlowOperators = new Set<HInstruction>(),
 | 
| +        breakAction = new Map<Entity, EntityAction>(),
 | 
| +        continueAction = new Map<Entity, EntityAction>();
 | 
|  
 | 
|    Compiler get compiler => backend.compiler;
 | 
|  
 | 
| @@ -248,8 +230,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|     * If the [instruction] is not `null` it will be used to attach the position
 | 
|     * to the [expression].
 | 
|     */
 | 
| -  pushExpressionAsStatement(js.Expression expression,
 | 
| -                            SourceInformation sourceInformation) {
 | 
| +  pushExpressionAsStatement(
 | 
| +      js.Expression expression, SourceInformation sourceInformation) {
 | 
|      pushStatement(new js.ExpressionStatement(expression)
 | 
|          .withSourceInformation(sourceInformation));
 | 
|    }
 | 
| @@ -271,8 +253,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      new SsaTypeKnownRemover().visitGraph(graph);
 | 
|      new SsaTrustedCheckRemover(compiler).visitGraph(graph);
 | 
|      new SsaInstructionMerger(generateAtUseSite, compiler).visitGraph(graph);
 | 
| -    new SsaConditionMerger(
 | 
| -        generateAtUseSite, controlFlowOperators).visitGraph(graph);
 | 
| +    new SsaConditionMerger(generateAtUseSite, controlFlowOperators)
 | 
| +        .visitGraph(graph);
 | 
|      SsaLiveIntervalBuilder intervalBuilder = new SsaLiveIntervalBuilder(
 | 
|          compiler, generateAtUseSite, controlFlowOperators);
 | 
|      intervalBuilder.visitGraph(graph);
 | 
| @@ -308,8 +290,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|                js.VariableInitialization initialization =
 | 
|                    new js.VariableInitialization(decl, assignment.value);
 | 
|                currentContainer.statements[0] = new js.ExpressionStatement(
 | 
| -                  new js.VariableDeclarationList([initialization]))
 | 
| -                      .withSourceInformation(sourceInformation);
 | 
| +                      new js.VariableDeclarationList([initialization]))
 | 
| +                  .withSourceInformation(sourceInformation);
 | 
|                return;
 | 
|              }
 | 
|            }
 | 
| @@ -324,7 +306,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|              new js.VariableDeclaration(name), null));
 | 
|        });
 | 
|        var declarationList = new js.VariableDeclarationList(declarations)
 | 
| -          .withSourceInformation(sourceInformation);;
 | 
| +          .withSourceInformation(sourceInformation);
 | 
| +      ;
 | 
|        insertStatementAtStart(new js.ExpressionStatement(declarationList));
 | 
|      }
 | 
|    }
 | 
| @@ -414,7 +397,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      HSubExpressionBlockInformation graph = info;
 | 
|      SubExpression limits = graph.subExpression;
 | 
|      return !identical(expressionType(info), TYPE_STATEMENT) &&
 | 
| -       (limits.end.last is HConditionalBranch);
 | 
| +        (limits.end.last is HConditionalBranch);
 | 
|    }
 | 
|  
 | 
|    /**
 | 
| @@ -492,7 +475,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      * Only visits the arguments starting at inputs[HInvoke.ARGUMENTS_OFFSET].
 | 
|      */
 | 
|    List<js.Expression> visitArguments(List<HInstruction> inputs,
 | 
| -                                     {int start: HInvoke.ARGUMENTS_OFFSET}) {
 | 
| +      {int start: HInvoke.ARGUMENTS_OFFSET}) {
 | 
|      assert(inputs.length >= start);
 | 
|      List<js.Expression> result = new List<js.Expression>(inputs.length - start);
 | 
|      for (int i = start; i < inputs.length; i++) {
 | 
| @@ -507,13 +490,19 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|          collectedVariableDeclarations.contains(variableName);
 | 
|    }
 | 
|  
 | 
| -  js.Expression generateExpressionAssignment(String variableName,
 | 
| -                                             js.Expression value) {
 | 
| +  js.Expression generateExpressionAssignment(
 | 
| +      String variableName, js.Expression value) {
 | 
|      if (value is js.Binary) {
 | 
|        js.Binary binary = value;
 | 
|        String op = binary.op;
 | 
| -      if (op == '+' || op == '-' || op == '/' || op == '*' || op == '%' ||
 | 
| -          op == '^' || op == '&' || op == '|') {
 | 
| +      if (op == '+' ||
 | 
| +          op == '-' ||
 | 
| +          op == '/' ||
 | 
| +          op == '*' ||
 | 
| +          op == '%' ||
 | 
| +          op == '^' ||
 | 
| +          op == '&' ||
 | 
| +          op == '|') {
 | 
|          if (binary.left is js.VariableUse &&
 | 
|              (binary.left as js.VariableUse).name == variableName) {
 | 
|            // We know now, that we can shorten x = x + y into x += y.
 | 
| @@ -531,9 +520,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|          .withSourceInformation(value.sourceInformation);
 | 
|    }
 | 
|  
 | 
| -  void assignVariable(String variableName,
 | 
| -                      js.Expression value,
 | 
| -                      SourceInformation sourceInformation) {
 | 
| +  void assignVariable(String variableName, js.Expression value,
 | 
| +      SourceInformation sourceInformation) {
 | 
|      if (isGeneratingExpression) {
 | 
|        // If we are in an expression then we can't declare the variable here.
 | 
|        // We have no choice, but to use it and then declare it separately.
 | 
| @@ -544,7 +532,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        // Otherwise if we are trying to declare inline and we are in a statement
 | 
|        // then we declare (unless it was already declared).
 | 
|      } else if (!shouldGroupVarDeclarations &&
 | 
| -               !declaredLocals.contains(variableName)) {
 | 
| +        !declaredLocals.contains(variableName)) {
 | 
|        // It may be necessary to remove it from the ones to be declared later.
 | 
|        collectedVariableDeclarations.remove(variableName);
 | 
|        declaredLocals.add(variableName);
 | 
| @@ -552,8 +540,9 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        js.VariableInitialization initialization =
 | 
|            new js.VariableInitialization(decl, value);
 | 
|  
 | 
| -      pushExpressionAsStatement(new js.VariableDeclarationList(
 | 
| -          <js.VariableInitialization>[initialization]),
 | 
| +      pushExpressionAsStatement(
 | 
| +          new js.VariableDeclarationList(
 | 
| +              <js.VariableInitialization>[initialization]),
 | 
|            sourceInformation);
 | 
|      } else {
 | 
|        // Otherwise we are just going to use it.  If we have not already declared
 | 
| @@ -562,8 +551,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|          collectedVariableDeclarations.add(variableName);
 | 
|        }
 | 
|        pushExpressionAsStatement(
 | 
| -          generateExpressionAssignment(variableName, value),
 | 
| -          sourceInformation);
 | 
| +          generateExpressionAssignment(variableName, value), sourceInformation);
 | 
|      }
 | 
|    }
 | 
|  
 | 
| @@ -584,10 +572,11 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      }
 | 
|  
 | 
|      if (needsAssignment &&
 | 
| -        !instruction.isControlFlow() && variableNames.hasName(instruction)) {
 | 
| +        !instruction.isControlFlow() &&
 | 
| +        variableNames.hasName(instruction)) {
 | 
|        visitExpression(instruction);
 | 
|        assignVariable(variableNames.getName(instruction), pop(),
 | 
| -                     instruction.sourceInformation);
 | 
| +          instruction.sourceInformation);
 | 
|        return;
 | 
|      }
 | 
|  
 | 
| @@ -638,16 +627,16 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|    }
 | 
|  
 | 
|    void implicitContinueAsBreak(JumpTarget target) {
 | 
| -    pushStatement(new js.Break(
 | 
| -        backend.namer.implicitContinueLabelName(target)));
 | 
| +    pushStatement(
 | 
| +        new js.Break(backend.namer.implicitContinueLabelName(target)));
 | 
|    }
 | 
|  
 | 
|    void implicitBreakWithLabel(JumpTarget target) {
 | 
|      pushStatement(new js.Break(backend.namer.implicitBreakLabelName(target)));
 | 
|    }
 | 
|  
 | 
| -  js.Statement wrapIntoLabels(js.Statement result,
 | 
| -                              List<LabelDefinition> labels) {
 | 
| +  js.Statement wrapIntoLabels(
 | 
| +      js.Statement result, List<LabelDefinition> labels) {
 | 
|      for (LabelDefinition label in labels) {
 | 
|        if (label.isTarget) {
 | 
|          String breakLabelString = backend.namer.breakLabelName(label);
 | 
| @@ -657,7 +646,6 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      return result;
 | 
|    }
 | 
|  
 | 
| -
 | 
|    // The regular [visitIf] method implements the needed logic.
 | 
|    bool visitIfInfo(HIfBlockInformation info) => false;
 | 
|  
 | 
| @@ -680,8 +668,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|  
 | 
|      js.Block oldContainer = currentContainer;
 | 
|      for (int inputIndex = 1, statementIndex = 0;
 | 
| -         inputIndex < inputs.length;
 | 
| -         statementIndex++) {
 | 
| +        inputIndex < inputs.length;
 | 
| +        statementIndex++) {
 | 
|        HBasicBlock successor = successors[inputIndex - 1];
 | 
|        // If liveness analysis has figured out that this case is dead,
 | 
|        // omit the code for it.
 | 
| @@ -691,15 +679,15 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|            currentContainer = new js.Block.empty();
 | 
|            cases.add(new js.Case(pop(), currentContainer));
 | 
|            inputIndex++;
 | 
| -        } while ((successors[inputIndex - 1] == successor)
 | 
| -                 && (inputIndex < inputs.length));
 | 
| +        } while ((successors[inputIndex - 1] == successor) &&
 | 
| +            (inputIndex < inputs.length));
 | 
|  
 | 
|          generateStatements(info.statements[statementIndex]);
 | 
|        } else {
 | 
|          // Skip all the case statements that belong to this
 | 
|          // block.
 | 
| -        while ((successors[inputIndex - 1] == successor)
 | 
| -              && (inputIndex < inputs.length)) {
 | 
| +        while ((successors[inputIndex - 1] == successor) &&
 | 
| +            (inputIndex < inputs.length)) {
 | 
|            ++inputIndex;
 | 
|          }
 | 
|        }
 | 
| @@ -809,7 +797,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|  
 | 
|          if (isConditionExpression &&
 | 
|              !hasPhiUpdates &&
 | 
| -            info.updates != null && isJSExpression(info.updates)) {
 | 
| +            info.updates != null &&
 | 
| +            isJSExpression(info.updates)) {
 | 
|            // If we have an updates graph, and it's expressible as an
 | 
|            // expression, generate a for-loop.
 | 
|            js.Expression jsInitialization = null;
 | 
| @@ -837,8 +826,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|                    }
 | 
|                  } else if (expression.isCommaOperator) {
 | 
|                    js.Binary binary = expression;
 | 
| -                  return allSimpleAssignments(binary.left)
 | 
| -                      && allSimpleAssignments(binary.right);
 | 
| +                  return allSimpleAssignments(binary.left) &&
 | 
| +                      allSimpleAssignments(binary.right);
 | 
|                  }
 | 
|                  return false;
 | 
|                }
 | 
| @@ -849,8 +838,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|                  for (js.Assignment assignment in assignments) {
 | 
|                    String id = (assignment.leftHandSide as js.VariableUse).name;
 | 
|                    js.Node declaration = new js.VariableDeclaration(id);
 | 
| -                  inits.add(new js.VariableInitialization(declaration,
 | 
| -                                                          assignment.value));
 | 
| +                  inits.add(new js.VariableInitialization(
 | 
| +                      declaration, assignment.value));
 | 
|                    collectedVariableDeclarations.remove(id);
 | 
|                    declaredLocals.add(id);
 | 
|                  }
 | 
| @@ -925,7 +914,6 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|          bool hasExitPhiUpdates = !exitAvoidContainer.statements.isEmpty;
 | 
|          currentContainer = oldContainer;
 | 
|  
 | 
| -
 | 
|          oldContainer = currentContainer;
 | 
|          js.Block body = new js.Block.empty();
 | 
|          // If there are phi copies in the block that jumps to the
 | 
| @@ -960,10 +948,9 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|            // If the condition is dead code, we turn the do-while into
 | 
|            // a simpler while because we will never reach the condition
 | 
|            // at the end of the loop anyway.
 | 
| -          loop = new js.While(
 | 
| -              newLiteralBool(true, info.sourceInformation),
 | 
| -              unwrapStatement(body))
 | 
| -                  .withSourceInformation(info.sourceInformation);
 | 
| +          loop = new js.While(newLiteralBool(true, info.sourceInformation),
 | 
| +                  unwrapStatement(body))
 | 
| +              .withSourceInformation(info.sourceInformation);
 | 
|          } else {
 | 
|            if (hasPhiUpdates || hasExitPhiUpdates) {
 | 
|              updateBody.statements.add(new js.Continue(null));
 | 
| @@ -975,8 +962,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|                exitAvoidContainer.statements.add(jsBreak);
 | 
|                exitLoop = exitAvoidContainer;
 | 
|              }
 | 
| -            body.statements.add(
 | 
| -                new js.If(jsCondition, updateBody, exitLoop));
 | 
| +            body.statements.add(new js.If(jsCondition, updateBody, exitLoop));
 | 
|              jsCondition = newLiteralBool(true, info.sourceInformation);
 | 
|            }
 | 
|            loop = new js.Do(unwrapStatement(body), jsCondition)
 | 
| @@ -1142,9 +1128,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|     * Sequentialize a list of conceptually parallel copies. Parallel
 | 
|     * copies may contain cycles, that this method breaks.
 | 
|     */
 | 
| -  void sequentializeCopies(Iterable<Copy> copies,
 | 
| -                           String tempName,
 | 
| -                           void doAssignment(String target, String source)) {
 | 
| +  void sequentializeCopies(Iterable<Copy> copies, String tempName,
 | 
| +      void doAssignment(String target, String source)) {
 | 
|      // Map to keep track of the current location (ie the variable that
 | 
|      // holds the initial value) of a variable.
 | 
|      Map<String, String> currentLocation = new Map<String, String>();
 | 
| @@ -1168,7 +1153,6 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      }
 | 
|      copies = prunedCopies;
 | 
|  
 | 
| -
 | 
|      // For each copy, set the current location of the source to
 | 
|      // itself, and the initial value of the destination to the source.
 | 
|      // Add the destination to the list of copies to make.
 | 
| @@ -1209,8 +1193,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        // If [current] is used as a source, and the assignment has been
 | 
|        // done, we are done with this variable. Otherwise there is a
 | 
|        // cycle that we break by using a temporary name.
 | 
| -      if (currentLocation[current] != null
 | 
| -          && current != currentLocation[initialValue[current]]) {
 | 
| +      if (currentLocation[current] != null &&
 | 
| +          current != currentLocation[initialValue[current]]) {
 | 
|          doAssignment(tempName, current);
 | 
|          currentLocation[current] = tempName;
 | 
|          // [current] can now be safely updated. Copies of [current]
 | 
| @@ -1227,7 +1211,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      // Map the instructions to strings.
 | 
|      Iterable<Copy> copies = handler.copies.map((Copy copy) {
 | 
|        return new Copy(variableNames.getName(copy.source),
 | 
| -                      variableNames.getName(copy.destination));
 | 
| +          variableNames.getName(copy.destination));
 | 
|      });
 | 
|  
 | 
|      sequentializeCopies(copies, variableNames.getSwapTemp(), emitAssignment);
 | 
| @@ -1251,9 +1235,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      visit(instruction);
 | 
|    }
 | 
|  
 | 
| -  void handleInvokeBinary(HInvokeBinary node,
 | 
| -                          String op,
 | 
| -                          SourceInformation sourceInformation) {
 | 
| +  void handleInvokeBinary(
 | 
| +      HInvokeBinary node, String op, SourceInformation sourceInformation) {
 | 
|      use(node.left);
 | 
|      js.Expression jsLeft = pop();
 | 
|      use(node.right);
 | 
| @@ -1275,14 +1258,14 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      visitInvokeBinary(node, op);
 | 
|      if (op != '>>>' && requiresUintConversion(node)) {
 | 
|        push(new js.Binary(">>>", pop(), new js.LiteralNumber("0"))
 | 
| -              .withSourceInformation(node.sourceInformation));
 | 
| +          .withSourceInformation(node.sourceInformation));
 | 
|      }
 | 
|    }
 | 
|  
 | 
|    visitInvokeUnary(HInvokeUnary node, String op) {
 | 
|      use(node.operand);
 | 
| -    push(new js.Prefix(op, pop())
 | 
| -        .withSourceInformation(node.sourceInformation));
 | 
| +    push(
 | 
| +        new js.Prefix(op, pop()).withSourceInformation(node.sourceInformation));
 | 
|    }
 | 
|  
 | 
|    // We want the outcome of bit-operations to be positive. We use the unsigned
 | 
| @@ -1295,9 +1278,9 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  void emitIdentityComparison(HIdentity instruction,
 | 
| -                              SourceInformation sourceInformation,
 | 
| -                              {bool inverse: false}) {
 | 
| +  void emitIdentityComparison(
 | 
| +      HIdentity instruction, SourceInformation sourceInformation,
 | 
| +      {bool inverse: false}) {
 | 
|      String op = instruction.singleComparisonOp;
 | 
|      HInstruction left = instruction.left;
 | 
|      HInstruction right = instruction.right;
 | 
| @@ -1306,20 +1289,19 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        js.Expression jsLeft = pop();
 | 
|        use(right);
 | 
|        push(new js.Binary(mapRelationalOperator(op, inverse), jsLeft, pop())
 | 
| -         .withSourceInformation(sourceInformation));
 | 
| +          .withSourceInformation(sourceInformation));
 | 
|      } else {
 | 
|        assert(NullConstantValue.JsNull == 'null');
 | 
|        use(left);
 | 
|        js.Binary leftEqualsNull =
 | 
|            new js.Binary("==", pop(), new js.LiteralNull());
 | 
|        use(right);
 | 
| -      js.Binary rightEqualsNull =
 | 
| -          new js.Binary(mapRelationalOperator("==", inverse),
 | 
| -                        pop(), new js.LiteralNull());
 | 
| +      js.Binary rightEqualsNull = new js.Binary(
 | 
| +          mapRelationalOperator("==", inverse), pop(), new js.LiteralNull());
 | 
|        use(right);
 | 
|        use(left);
 | 
| -      js.Binary tripleEq = new js.Binary(mapRelationalOperator("===", inverse),
 | 
| -                                         pop(), pop());
 | 
| +      js.Binary tripleEq =
 | 
| +          new js.Binary(mapRelationalOperator("===", inverse), pop(), pop());
 | 
|  
 | 
|        push(new js.Conditional(leftEqualsNull, rightEqualsNull, tripleEq)
 | 
|            .withSourceInformation(sourceInformation));
 | 
| @@ -1330,15 +1312,15 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      emitIdentityComparison(node, node.sourceInformation, inverse: false);
 | 
|    }
 | 
|  
 | 
| -  visitAdd(HAdd node)               => visitInvokeBinary(node, '+');
 | 
| -  visitDivide(HDivide node)         => visitInvokeBinary(node, '/');
 | 
| -  visitMultiply(HMultiply node)     => visitInvokeBinary(node, '*');
 | 
| -  visitSubtract(HSubtract node)     => visitInvokeBinary(node, '-');
 | 
| -  visitBitAnd(HBitAnd node)         => visitBitInvokeBinary(node, '&');
 | 
| -  visitBitNot(HBitNot node)         => visitBitInvokeUnary(node, '~');
 | 
| -  visitBitOr(HBitOr node)           => visitBitInvokeBinary(node, '|');
 | 
| -  visitBitXor(HBitXor node)         => visitBitInvokeBinary(node, '^');
 | 
| -  visitShiftLeft(HShiftLeft node)   => visitBitInvokeBinary(node, '<<');
 | 
| +  visitAdd(HAdd node) => visitInvokeBinary(node, '+');
 | 
| +  visitDivide(HDivide node) => visitInvokeBinary(node, '/');
 | 
| +  visitMultiply(HMultiply node) => visitInvokeBinary(node, '*');
 | 
| +  visitSubtract(HSubtract node) => visitInvokeBinary(node, '-');
 | 
| +  visitBitAnd(HBitAnd node) => visitBitInvokeBinary(node, '&');
 | 
| +  visitBitNot(HBitNot node) => visitBitInvokeUnary(node, '~');
 | 
| +  visitBitOr(HBitOr node) => visitBitInvokeBinary(node, '|');
 | 
| +  visitBitXor(HBitXor node) => visitBitInvokeBinary(node, '^');
 | 
| +  visitShiftLeft(HShiftLeft node) => visitBitInvokeBinary(node, '<<');
 | 
|    visitShiftRight(HShiftRight node) => visitBitInvokeBinary(node, '>>>');
 | 
|  
 | 
|    visitTruncatingDivide(HTruncatingDivide node) {
 | 
| @@ -1356,18 +1338,18 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|          .withSourceInformation(node.sourceInformation));
 | 
|    }
 | 
|  
 | 
| -  visitNegate(HNegate node)             => visitInvokeUnary(node, '-');
 | 
| +  visitNegate(HNegate node) => visitInvokeUnary(node, '-');
 | 
|  
 | 
| -  visitLess(HLess node)                 => visitRelational(node, '<');
 | 
| -  visitLessEqual(HLessEqual node)       => visitRelational(node, '<=');
 | 
| -  visitGreater(HGreater node)           => visitRelational(node, '>');
 | 
| +  visitLess(HLess node) => visitRelational(node, '<');
 | 
| +  visitLessEqual(HLessEqual node) => visitRelational(node, '<=');
 | 
| +  visitGreater(HGreater node) => visitRelational(node, '>');
 | 
|    visitGreaterEqual(HGreaterEqual node) => visitRelational(node, '>=');
 | 
|  
 | 
|    visitBoolify(HBoolify node) {
 | 
|      assert(node.inputs.length == 1);
 | 
|      use(node.inputs[0]);
 | 
| -    push(new js.Binary('===', pop(),
 | 
| -                       newLiteralBool(true, node.sourceInformation))
 | 
| +    push(new js.Binary(
 | 
| +            '===', pop(), newLiteralBool(true, node.sourceInformation))
 | 
|          .withSourceInformation(node.sourceInformation));
 | 
|    }
 | 
|  
 | 
| @@ -1424,9 +1406,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      if (node.label != null) {
 | 
|        LabelDefinition label = node.label;
 | 
|        if (!tryCallAction(breakAction, label)) {
 | 
| -        pushStatement(
 | 
| -            new js.Break(backend.namer.breakLabelName(label))
 | 
| -                .withSourceInformation(node.sourceInformation));
 | 
| +        pushStatement(new js.Break(backend.namer.breakLabelName(label))
 | 
| +            .withSourceInformation(node.sourceInformation));
 | 
|        }
 | 
|      } else {
 | 
|        JumpTarget target = node.target;
 | 
| @@ -1436,8 +1417,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|                new js.Break(backend.namer.implicitContinueLabelName(target))
 | 
|                    .withSourceInformation(node.sourceInformation));
 | 
|          } else {
 | 
| -          pushStatement(new js.Break(null)
 | 
| -              .withSourceInformation(node.sourceInformation));
 | 
| +          pushStatement(
 | 
| +              new js.Break(null).withSourceInformation(node.sourceInformation));
 | 
|          }
 | 
|        }
 | 
|      }
 | 
| @@ -1449,9 +1430,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        LabelDefinition label = node.label;
 | 
|        if (!tryCallAction(continueAction, label)) {
 | 
|          // TODO(floitsch): should this really be the breakLabelName?
 | 
| -        pushStatement(
 | 
| -            new js.Continue(backend.namer.breakLabelName(label))
 | 
| -                .withSourceInformation(node.sourceInformation));
 | 
| +        pushStatement(new js.Continue(backend.namer.breakLabelName(label))
 | 
| +            .withSourceInformation(node.sourceInformation));
 | 
|        }
 | 
|      } else {
 | 
|        JumpTarget target = node.target;
 | 
| @@ -1493,8 +1473,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      // if (condition) i = bar();
 | 
|      // Usually, the variable name is longer than 'if' and it takes up
 | 
|      // more space to duplicate the name.
 | 
| -    if (!atUseSite
 | 
| -        && variableNames.getName(phi) == variableNames.getName(phi.inputs[1])) {
 | 
| +    if (!atUseSite &&
 | 
| +        variableNames.getName(phi) == variableNames.getName(phi.inputs[1])) {
 | 
|        return false;
 | 
|      }
 | 
|      if (!atUseSite) define(phi);
 | 
| @@ -1569,8 +1549,9 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|            backend.namer.globalObjectFor(helpers.interceptorsLibrary));
 | 
|        use(node.receiver);
 | 
|        List<js.Expression> arguments = <js.Expression>[pop()];
 | 
| -      push(js.propertyCall(isolate, name, arguments)
 | 
| -           .withSourceInformation(node.sourceInformation));
 | 
| +      push(js
 | 
| +          .propertyCall(isolate, name, arguments)
 | 
| +          .withSourceInformation(node.sourceInformation));
 | 
|        registry.registerUseInterceptor();
 | 
|      }
 | 
|    }
 | 
| @@ -1593,8 +1574,9 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|          // Split returns a List, so we make sure the backend knows the
 | 
|          // list class is instantiated.
 | 
|          registry.registerInstantiatedClass(coreClasses.listClass);
 | 
| -      } else if (backend.isNative(target) && target.isFunction
 | 
| -                 && !node.isInterceptedCall) {
 | 
| +      } else if (backend.isNative(target) &&
 | 
| +          target.isFunction &&
 | 
| +          !node.isInterceptedCall) {
 | 
|          // A direct (i.e. non-interceptor) native call is the result of
 | 
|          // optimization.  The optimization ensures any type checks or
 | 
|          // conversions have been satisified.
 | 
| @@ -1609,8 +1591,9 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      } else {
 | 
|        methodLiteral = backend.namer.asName(methodName);
 | 
|      }
 | 
| -    push(js.propertyCall(object, methodLiteral, arguments)
 | 
| -         .withSourceInformation(node.sourceInformation));
 | 
| +    push(js
 | 
| +        .propertyCall(object, methodLiteral, arguments)
 | 
| +        .withSourceInformation(node.sourceInformation));
 | 
|    }
 | 
|  
 | 
|    void visitInvokeConstructorBody(HInvokeConstructorBody node) {
 | 
| @@ -1618,11 +1601,11 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      js.Expression object = pop();
 | 
|      js.Name methodName = backend.namer.instanceMethodName(node.element);
 | 
|      List<js.Expression> arguments = visitArguments(node.inputs);
 | 
| -    push(js.propertyCall(object, methodName, arguments)
 | 
| -         .withSourceInformation(node.sourceInformation));
 | 
| -    registry.registerStaticUse(
 | 
| -        new StaticUse.constructorBodyInvoke(
 | 
| -            node.element, new CallStructure.unnamed(arguments.length)));
 | 
| +    push(js
 | 
| +        .propertyCall(object, methodName, arguments)
 | 
| +        .withSourceInformation(node.sourceInformation));
 | 
| +    registry.registerStaticUse(new StaticUse.constructorBodyInvoke(
 | 
| +        node.element, new CallStructure.unnamed(arguments.length)));
 | 
|    }
 | 
|  
 | 
|    void visitOneShotInterceptor(HOneShotInterceptor node) {
 | 
| @@ -1632,7 +1615,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      Selector selector = node.selector;
 | 
|      TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask);
 | 
|      js.Name methodName = backend.registerOneShotInterceptor(selector);
 | 
| -    push(js.propertyCall(isolate, methodName, arguments)
 | 
| +    push(js
 | 
| +        .propertyCall(isolate, methodName, arguments)
 | 
|          .withSourceInformation(node.sourceInformation));
 | 
|      if (selector.isGetter) {
 | 
|        registerGetter(node);
 | 
| @@ -1644,9 +1628,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      registry.registerUseInterceptor();
 | 
|    }
 | 
|  
 | 
| -  TypeMask getOptimizedSelectorFor(HInvokeDynamic node,
 | 
| -                                   Selector selector,
 | 
| -                                   TypeMask mask) {
 | 
| +  TypeMask getOptimizedSelectorFor(
 | 
| +      HInvokeDynamic node, Selector selector, TypeMask mask) {
 | 
|      if (node.element != null) {
 | 
|        // Create an artificial type mask to make sure only
 | 
|        // [node.element] will be enqueued. We're not using the receiver
 | 
| @@ -1654,14 +1637,13 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        // invoke dynamic knows more than the receiver.
 | 
|        ClassElement enclosing = node.element.enclosingClass;
 | 
|        if (compiler.world.isInstantiated(enclosing)) {
 | 
| -        return new TypeMask.nonNullExact(
 | 
| -            enclosing.declaration, compiler.world);
 | 
| +        return new TypeMask.nonNullExact(enclosing.declaration, compiler.world);
 | 
|        } else {
 | 
|          // The element is mixed in so a non-null subtype mask is the most
 | 
|          // precise we have.
 | 
|          assert(invariant(node, compiler.world.isUsedAsMixin(enclosing),
 | 
|              message: "Element ${node.element} from $enclosing expected "
 | 
| -                     "to be mixed in."));
 | 
| +                "to be mixed in."));
 | 
|          return new TypeMask.nonNullSubtype(
 | 
|              enclosing.declaration, compiler.world);
 | 
|        }
 | 
| @@ -1684,52 +1666,49 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        // may know something about the types of closures that need
 | 
|        // the specific closure call method.
 | 
|        Selector call = new Selector.callClosureFrom(selector);
 | 
| -      registry.registerDynamicUse(
 | 
| -          new DynamicUse(call, null));
 | 
| +      registry.registerDynamicUse(new DynamicUse(call, null));
 | 
|      }
 | 
| -    registry.registerDynamicUse(
 | 
| -        new DynamicUse(selector, mask));
 | 
| +    registry.registerDynamicUse(new DynamicUse(selector, mask));
 | 
|    }
 | 
|  
 | 
|    void registerSetter(HInvokeDynamic node) {
 | 
|      Selector selector = node.selector;
 | 
|      TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask);
 | 
| -    registry.registerDynamicUse(
 | 
| -        new DynamicUse(selector, mask));
 | 
| +    registry.registerDynamicUse(new DynamicUse(selector, mask));
 | 
|    }
 | 
|  
 | 
|    void registerGetter(HInvokeDynamic node) {
 | 
|      Selector selector = node.selector;
 | 
|      TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask);
 | 
| -    registry.registerDynamicUse(
 | 
| -        new DynamicUse(selector, mask));
 | 
| +    registry.registerDynamicUse(new DynamicUse(selector, mask));
 | 
|    }
 | 
|  
 | 
|    visitInvokeDynamicSetter(HInvokeDynamicSetter node) {
 | 
|      use(node.receiver);
 | 
|      js.Name name = backend.namer.invocationName(node.selector);
 | 
| -    push(js.propertyCall(pop(), name, visitArguments(node.inputs))
 | 
| -         .withSourceInformation(node.sourceInformation));
 | 
| +    push(js
 | 
| +        .propertyCall(pop(), name, visitArguments(node.inputs))
 | 
| +        .withSourceInformation(node.sourceInformation));
 | 
|      registerSetter(node);
 | 
|    }
 | 
|  
 | 
|    visitInvokeDynamicGetter(HInvokeDynamicGetter node) {
 | 
|      use(node.receiver);
 | 
|      js.Name name = backend.namer.invocationName(node.selector);
 | 
| -    push(js.propertyCall(pop(), name, visitArguments(node.inputs))
 | 
| -         .withSourceInformation(node.sourceInformation));
 | 
| +    push(js
 | 
| +        .propertyCall(pop(), name, visitArguments(node.inputs))
 | 
| +        .withSourceInformation(node.sourceInformation));
 | 
|      registerGetter(node);
 | 
|    }
 | 
|  
 | 
|    visitInvokeClosure(HInvokeClosure node) {
 | 
|      Selector call = new Selector.callClosureFrom(node.selector);
 | 
|      use(node.receiver);
 | 
| -    push(js.propertyCall(pop(),
 | 
| -                         backend.namer.invocationName(call),
 | 
| -                         visitArguments(node.inputs))
 | 
| -            .withSourceInformation(node.sourceInformation));
 | 
| -    registry.registerDynamicUse(
 | 
| -        new DynamicUse(call, null));
 | 
| +    push(js
 | 
| +        .propertyCall(pop(), backend.namer.invocationName(call),
 | 
| +            visitArguments(node.inputs))
 | 
| +        .withSourceInformation(node.sourceInformation));
 | 
| +    registry.registerDynamicUse(new DynamicUse(call, null));
 | 
|    }
 | 
|  
 | 
|    visitInvokeStatic(HInvokeStatic node) {
 | 
| @@ -1763,38 +1742,34 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        // more optimizations available to the loop.  This form is 50% faster on
 | 
|        // some small loop, almost as fast as loops with no concurrent
 | 
|        // modification check.
 | 
| -      push(js.js('# || (0, #)(#)',[
 | 
| -          arguments[0],
 | 
| -          backend.emitter.staticFunctionAccess(throwFunction),
 | 
| -          arguments[1]]));
 | 
| +      push(js.js('# || (0, #)(#)', [
 | 
| +        arguments[0],
 | 
| +        backend.emitter.staticFunctionAccess(throwFunction),
 | 
| +        arguments[1]
 | 
| +      ]));
 | 
|      } else {
 | 
|        CallStructure callStructure = new CallStructure.unnamed(arguments.length);
 | 
| -      registry.registerStaticUse(
 | 
| -          element.isConstructor
 | 
| -            ? new StaticUse.constructorInvoke(element, callStructure)
 | 
| -            : new StaticUse.staticInvoke(element, callStructure));
 | 
| +      registry.registerStaticUse(element.isConstructor
 | 
| +          ? new StaticUse.constructorInvoke(element, callStructure)
 | 
| +          : new StaticUse.staticInvoke(element, callStructure));
 | 
|        push(backend.emitter.staticFunctionAccess(element));
 | 
|        push(new js.Call(pop(), arguments,
 | 
|            sourceInformation: node.sourceInformation));
 | 
|      }
 | 
| -
 | 
|    }
 | 
|  
 | 
|    visitInvokeSuper(HInvokeSuper node) {
 | 
|      Element superElement = node.element;
 | 
|      ClassElement superClass = superElement.enclosingClass;
 | 
|      if (superElement.isField) {
 | 
| -      js.Name fieldName =
 | 
| -          backend.namer.instanceFieldPropertyName(superElement);
 | 
| +      js.Name fieldName = backend.namer.instanceFieldPropertyName(superElement);
 | 
|        use(node.inputs[0]);
 | 
| -      js.PropertyAccess access =
 | 
| -          new js.PropertyAccess(pop(), fieldName)
 | 
| -              .withSourceInformation(node.sourceInformation);
 | 
| +      js.PropertyAccess access = new js.PropertyAccess(pop(), fieldName)
 | 
| +          .withSourceInformation(node.sourceInformation);
 | 
|        if (node.isSetter) {
 | 
| -        registry.registerStaticUse(
 | 
| -            superElement.isSetter
 | 
| -                ? new StaticUse.superSetterSet(superElement)
 | 
| -                : new StaticUse.superFieldSet(superElement));
 | 
| +        registry.registerStaticUse(superElement.isSetter
 | 
| +            ? new StaticUse.superSetterSet(superElement)
 | 
| +            : new StaticUse.superFieldSet(superElement));
 | 
|          use(node.value);
 | 
|          push(new js.Assignment(access, pop())
 | 
|              .withSourceInformation(node.sourceInformation));
 | 
| @@ -1811,33 +1786,31 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|            // will be created, and that this tear-off must bypass ordinary
 | 
|            // dispatch to ensure the super method is invoked.
 | 
|            FunctionElement helper = backend.helpers.closureFromTearOff;
 | 
| -          registry.registerStaticUse(new StaticUse.staticInvoke(helper,
 | 
| -                new CallStructure.unnamed(helper.parameters.length)));
 | 
| +          registry.registerStaticUse(new StaticUse.staticInvoke(
 | 
| +              helper, new CallStructure.unnamed(helper.parameters.length)));
 | 
|            registry.registerStaticUse(new StaticUse.superTearOff(node.element));
 | 
|            methodName = backend.namer.invocationName(selector);
 | 
|          } else {
 | 
|            methodName = backend.namer.instanceMethodName(superElement);
 | 
|          }
 | 
| -        registry.registerStaticUse(
 | 
| -            new StaticUse.superInvoke(
 | 
| -                superElement,
 | 
| -                new CallStructure.unnamed(node.inputs.length)));
 | 
| -        push(js.js('#.#.call(#)',
 | 
| -                   [backend.emitter.prototypeAccess(superClass,
 | 
| -                                                    hasBeenInstantiated: true),
 | 
| -                    methodName, visitArguments(node.inputs, start: 0)])
 | 
| -                .withSourceInformation(node.sourceInformation));
 | 
| +        registry.registerStaticUse(new StaticUse.superInvoke(
 | 
| +            superElement, new CallStructure.unnamed(node.inputs.length)));
 | 
| +        push(js.js('#.#.call(#)', [
 | 
| +          backend.emitter
 | 
| +              .prototypeAccess(superClass, hasBeenInstantiated: true),
 | 
| +          methodName,
 | 
| +          visitArguments(node.inputs, start: 0)
 | 
| +        ]).withSourceInformation(node.sourceInformation));
 | 
|        } else {
 | 
|          use(node.receiver);
 | 
| -        registry.registerStaticUse(
 | 
| -            new StaticUse.superInvoke(
 | 
| -                superElement,
 | 
| -                new CallStructure.unnamed(node.inputs.length - 1)));
 | 
| -        push(
 | 
| -          js.js('#.#(#)', [
 | 
| -            pop(), backend.namer.aliasedSuperMemberPropertyName(superElement),
 | 
| -            visitArguments(node.inputs, start: 1)]) // Skip receiver argument.
 | 
| -              .withSourceInformation(node.sourceInformation));
 | 
| +        registry.registerStaticUse(new StaticUse.superInvoke(
 | 
| +            superElement, new CallStructure.unnamed(node.inputs.length - 1)));
 | 
| +        push(js.js('#.#(#)', [
 | 
| +          pop(),
 | 
| +          backend.namer.aliasedSuperMemberPropertyName(superElement),
 | 
| +          visitArguments(node.inputs, start: 1)
 | 
| +        ]) // Skip receiver argument.
 | 
| +            .withSourceInformation(node.sourceInformation));
 | 
|        }
 | 
|      }
 | 
|    }
 | 
| @@ -1902,9 +1875,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|  
 | 
|    visitLocalSet(HLocalSet node) {
 | 
|      use(node.value);
 | 
| -    assignVariable(variableNames.getName(node.receiver),
 | 
| -                   pop(),
 | 
| -                   node.sourceInformation);
 | 
| +    assignVariable(
 | 
| +        variableNames.getName(node.receiver), pop(), node.sourceInformation);
 | 
|    }
 | 
|  
 | 
|    void registerForeignTypes(HForeign node) {
 | 
| @@ -1921,7 +1893,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|          use(inputs[i]);
 | 
|          interpolatedExpressions.add(pop());
 | 
|        }
 | 
| -      pushStatement(node.codeTemplate.instantiate(interpolatedExpressions)
 | 
| +      pushStatement(node.codeTemplate
 | 
| +          .instantiate(interpolatedExpressions)
 | 
|            .withSourceInformation(node.sourceInformation));
 | 
|      } else {
 | 
|        List<js.Expression> interpolatedExpressions = <js.Expression>[];
 | 
| @@ -1929,7 +1902,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|          use(inputs[i]);
 | 
|          interpolatedExpressions.add(pop());
 | 
|        }
 | 
| -      push(node.codeTemplate.instantiate(interpolatedExpressions)
 | 
| +      push(node.codeTemplate
 | 
| +          .instantiate(interpolatedExpressions)
 | 
|            .withSourceInformation(node.sourceInformation));
 | 
|      }
 | 
|  
 | 
| @@ -1958,24 +1932,22 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      });
 | 
|    }
 | 
|  
 | 
| -  js.Expression newLiteralBool(bool value,
 | 
| -                               SourceInformation sourceInformation) {
 | 
| +  js.Expression newLiteralBool(
 | 
| +      bool value, SourceInformation sourceInformation) {
 | 
|      if (compiler.options.enableMinification) {
 | 
|        // Use !0 for true, !1 for false.
 | 
|        return new js.Prefix("!", new js.LiteralNumber(value ? "0" : "1"))
 | 
|            .withSourceInformation(sourceInformation);
 | 
|      } else {
 | 
| -      return new js.LiteralBool(value)
 | 
| -          .withSourceInformation(sourceInformation);
 | 
| +      return new js.LiteralBool(value).withSourceInformation(sourceInformation);
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  void generateConstant(ConstantValue constant,
 | 
| -                        SourceInformation sourceInformation) {
 | 
| +  void generateConstant(
 | 
| +      ConstantValue constant, SourceInformation sourceInformation) {
 | 
|      if (constant.isFunction) {
 | 
|        FunctionConstantValue function = constant;
 | 
| -      registry.registerStaticUse(
 | 
| -          new StaticUse.staticTearOff(function.element));
 | 
| +      registry.registerStaticUse(new StaticUse.staticTearOff(function.element));
 | 
|      }
 | 
|      if (constant.isType) {
 | 
|        // If the type is a web component, we need to ensure the constructors are
 | 
| @@ -2008,21 +1980,21 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|  
 | 
|    static String mapRelationalOperator(String op, bool inverse) {
 | 
|      Map<String, String> inverseOperator = const <String, String>{
 | 
| -      "==" : "!=",
 | 
| -      "!=" : "==",
 | 
| +      "==": "!=",
 | 
| +      "!=": "==",
 | 
|        "===": "!==",
 | 
|        "!==": "===",
 | 
| -      "<"  : ">=",
 | 
| -      "<=" : ">",
 | 
| -      ">"  : "<=",
 | 
| -      ">=" : "<"
 | 
| +      "<": ">=",
 | 
| +      "<=": ">",
 | 
| +      ">": "<=",
 | 
| +      ">=": "<"
 | 
|      };
 | 
|      return inverse ? inverseOperator[op] : op;
 | 
|    }
 | 
|  
 | 
|    void generateNot(HInstruction input, SourceInformation sourceInformation) {
 | 
|      bool canGenerateOptimizedComparison(HInstruction instruction) {
 | 
| -      if (instruction is !HRelational) return false;
 | 
| +      if (instruction is! HRelational) return false;
 | 
|  
 | 
|        HRelational relational = instruction;
 | 
|  
 | 
| @@ -2050,8 +2022,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|          emitIdentityComparison(input, sourceInformation, inverse: true);
 | 
|        } else if (input is HBoolify) {
 | 
|          use(input.inputs[0]);
 | 
| -        push(new js.Binary("!==", pop(),
 | 
| -                           newLiteralBool(true, input.sourceInformation))
 | 
| +        push(new js.Binary(
 | 
| +                "!==", pop(), newLiteralBool(true, input.sourceInformation))
 | 
|              .withSourceInformation(sourceInformation));
 | 
|        } else if (canGenerateOptimizedComparison(input)) {
 | 
|          HRelational relational = input;
 | 
| @@ -2117,12 +2089,12 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      assert(node.inputs.length == 1);
 | 
|      HInstruction input = node.inputs[0];
 | 
|      if (input.isConstantNull()) {
 | 
| -      pushStatement(new js.Return()
 | 
| -          .withSourceInformation(node.sourceInformation));
 | 
| +      pushStatement(
 | 
| +          new js.Return().withSourceInformation(node.sourceInformation));
 | 
|      } else {
 | 
|        use(node.inputs[0]);
 | 
| -      pushStatement(new js.Return(pop())
 | 
| -          .withSourceInformation(node.sourceInformation));
 | 
| +      pushStatement(
 | 
| +          new js.Return(pop()).withSourceInformation(node.sourceInformation));
 | 
|      }
 | 
|    }
 | 
|  
 | 
| @@ -2133,8 +2105,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|    visitThrow(HThrow node) {
 | 
|      if (node.isRethrow) {
 | 
|        use(node.inputs[0]);
 | 
| -      pushStatement(new js.Throw(pop())
 | 
| -          .withSourceInformation(node.sourceInformation));
 | 
| +      pushStatement(
 | 
| +          new js.Throw(pop()).withSourceInformation(node.sourceInformation));
 | 
|      } else {
 | 
|        generateThrowWithHelper(helpers.wrapExceptionHelper, node.inputs[0],
 | 
|            sourceInformation: node.sourceInformation);
 | 
| @@ -2143,8 +2115,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|  
 | 
|    visitAwait(HAwait node) {
 | 
|      use(node.inputs[0]);
 | 
| -    push(new js.Await(pop())
 | 
| -        .withSourceInformation(node.sourceInformation));
 | 
| +    push(new js.Await(pop()).withSourceInformation(node.sourceInformation));
 | 
|    }
 | 
|  
 | 
|    visitYield(HYield node) {
 | 
| @@ -2191,9 +2162,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        assert(over != null || under != null);
 | 
|        js.Expression underOver = under == null
 | 
|            ? over
 | 
| -          : over == null
 | 
| -              ? under
 | 
| -              : new js.Binary("||", under, over);
 | 
| +          : over == null ? under : new js.Binary("||", under, over);
 | 
|        js.Statement thenBody = new js.Block.empty();
 | 
|        js.Block oldContainer = currentContainer;
 | 
|        currentContainer = thenBody;
 | 
| @@ -2204,13 +2173,13 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        pushStatement(new js.If.noElse(underOver, thenBody)
 | 
|            .withSourceInformation(node.sourceInformation));
 | 
|      } else {
 | 
| -      generateThrowWithHelper(helpers.throwIndexOutOfRangeException,
 | 
| -          [node.array, node.index]);
 | 
| +      generateThrowWithHelper(
 | 
| +          helpers.throwIndexOutOfRangeException, [node.array, node.index]);
 | 
|      }
 | 
|    }
 | 
|  
 | 
|    void generateThrowWithHelper(Element helper, argument,
 | 
| -                               {SourceInformation sourceInformation}) {
 | 
| +      {SourceInformation sourceInformation}) {
 | 
|      js.Expression jsHelper = backend.emitter.staticFunctionAccess(helper);
 | 
|      List arguments = [];
 | 
|      var location;
 | 
| @@ -2225,17 +2194,16 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        use(argument);
 | 
|        arguments.add(pop());
 | 
|      }
 | 
| -    registry.registerStaticUse(
 | 
| -        new StaticUse.staticInvoke(
 | 
| -            helper, new CallStructure.unnamed(arguments.length)));
 | 
| +    registry.registerStaticUse(new StaticUse.staticInvoke(
 | 
| +        helper, new CallStructure.unnamed(arguments.length)));
 | 
|      js.Call value = new js.Call(jsHelper, arguments.toList(growable: false),
 | 
|          sourceInformation: sourceInformation);
 | 
|      // BUG(4906): Using throw/return here adds to the size of the generated code
 | 
|      // but it has the advantage of explicitly telling the JS engine that
 | 
|      // this code path will terminate abruptly. Needs more work.
 | 
|      if (helper == helpers.wrapExceptionHelper) {
 | 
| -      pushStatement(new js.Throw(value)
 | 
| -          .withSourceInformation(sourceInformation));
 | 
| +      pushStatement(
 | 
| +          new js.Throw(value).withSourceInformation(sourceInformation));
 | 
|      } else {
 | 
|        Element element = work.element;
 | 
|        if (element is FunctionElement && element.asyncMarker.isYielding) {
 | 
| @@ -2245,8 +2213,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|          pushStatement(new js.ExpressionStatement(value)
 | 
|              .withSourceInformation(sourceInformation));
 | 
|        } else {
 | 
| -        pushStatement(new js.Return(value)
 | 
| -            .withSourceInformation(sourceInformation));
 | 
| +        pushStatement(
 | 
| +            new js.Return(value).withSourceInformation(sourceInformation));
 | 
|        }
 | 
|      }
 | 
|    }
 | 
| @@ -2273,22 +2241,21 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      Element element = node.element;
 | 
|      assert(element.isFunction || element.isField);
 | 
|      if (element.isFunction) {
 | 
| -      push(backend.emitter.isolateStaticClosureAccess(element)
 | 
| -           .withSourceInformation(node.sourceInformation));
 | 
| -      registry.registerStaticUse(
 | 
| -          new StaticUse.staticTearOff(element));
 | 
| +      push(backend.emitter
 | 
| +          .isolateStaticClosureAccess(element)
 | 
| +          .withSourceInformation(node.sourceInformation));
 | 
| +      registry.registerStaticUse(new StaticUse.staticTearOff(element));
 | 
|      } else {
 | 
| -      push(backend.emitter.staticFieldAccess(element)
 | 
| -           .withSourceInformation(node.sourceInformation));
 | 
| -      registry.registerStaticUse(
 | 
| -          new StaticUse.staticGet(element));
 | 
| +      push(backend.emitter
 | 
| +          .staticFieldAccess(element)
 | 
| +          .withSourceInformation(node.sourceInformation));
 | 
| +      registry.registerStaticUse(new StaticUse.staticGet(element));
 | 
|      }
 | 
|    }
 | 
|  
 | 
|    void visitLazyStatic(HLazyStatic node) {
 | 
|      Element element = node.element;
 | 
| -    registry.registerStaticUse(
 | 
| -        new StaticUse.staticInit(element));
 | 
| +    registry.registerStaticUse(new StaticUse.staticInit(element));
 | 
|      js.Expression lazyGetter =
 | 
|          backend.emitter.isolateLazyInitializerAccess(element);
 | 
|      js.Call call = new js.Call(lazyGetter, <js.Expression>[],
 | 
| @@ -2297,8 +2264,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|    }
 | 
|  
 | 
|    void visitStaticStore(HStaticStore node) {
 | 
| -    registry.registerStaticUse(
 | 
| -        new StaticUse.staticSet(node.element));
 | 
| +    registry.registerStaticUse(new StaticUse.staticSet(node.element));
 | 
|      js.Node variable = backend.emitter.staticFieldAccess(node.element);
 | 
|      use(node.inputs[0]);
 | 
|      push(new js.Assignment(variable, pop())
 | 
| @@ -2321,9 +2287,9 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        // JavaScript's + operator with a string for the left operand will convert
 | 
|        // the right operand to a string, and the conversion result is correct.
 | 
|        use(input);
 | 
| -      if (node.usedBy.length == 1
 | 
| -          && node.usedBy[0] is HStringConcat
 | 
| -          && node.usedBy[0].inputs[1] == node) {
 | 
| +      if (node.usedBy.length == 1 &&
 | 
| +          node.usedBy[0] is HStringConcat &&
 | 
| +          node.usedBy[0].inputs[1] == node) {
 | 
|          // The context is already <string> + value.
 | 
|        } else {
 | 
|          // Force an empty string for the first operand.
 | 
| @@ -2338,7 +2304,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|            backend.emitter.staticFunctionAccess(convertToString);
 | 
|        use(input);
 | 
|        push(new js.Call(jsHelper, <js.Expression>[pop()],
 | 
| -                       sourceInformation: node.sourceInformation));
 | 
| +          sourceInformation: node.sourceInformation));
 | 
|      }
 | 
|    }
 | 
|  
 | 
| @@ -2382,46 +2348,46 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      push(new js.Binary(cmp, left, or0));
 | 
|    }
 | 
|  
 | 
| -  void checkBigInt(HInstruction input, String cmp,
 | 
| -                   SourceInformation sourceInformation) {
 | 
| +  void checkBigInt(
 | 
| +      HInstruction input, String cmp, SourceInformation sourceInformation) {
 | 
|      use(input);
 | 
|      js.Expression left = pop();
 | 
|      use(input);
 | 
|      js.Expression right = pop();
 | 
|      // TODO(4984): Deal with infinity and -0.0.
 | 
| -    push(js.js('Math.floor(#) $cmp #', <js.Expression>[left, right])
 | 
| -            .withSourceInformation(sourceInformation));
 | 
| +    push(js.js('Math.floor(#) $cmp #',
 | 
| +        <js.Expression>[left, right]).withSourceInformation(sourceInformation));
 | 
|    }
 | 
|  
 | 
|    void checkTypeOf(HInstruction input, String cmp, String typeName,
 | 
| -                   SourceInformation sourceInformation) {
 | 
| +      SourceInformation sourceInformation) {
 | 
|      use(input);
 | 
|      js.Expression typeOf = new js.Prefix("typeof", pop());
 | 
|      push(new js.Binary(cmp, typeOf, js.string(typeName)));
 | 
|    }
 | 
|  
 | 
| -  void checkNum(HInstruction input, String cmp,
 | 
| -                SourceInformation sourceInformation) {
 | 
| +  void checkNum(
 | 
| +      HInstruction input, String cmp, SourceInformation sourceInformation) {
 | 
|      return checkTypeOf(input, cmp, 'number', sourceInformation);
 | 
|    }
 | 
|  
 | 
| -  void checkDouble(HInstruction input, String cmp,
 | 
| -                   SourceInformation sourceInformation) {
 | 
| +  void checkDouble(
 | 
| +      HInstruction input, String cmp, SourceInformation sourceInformation) {
 | 
|      return checkNum(input, cmp, sourceInformation);
 | 
|    }
 | 
|  
 | 
| -  void checkString(HInstruction input, String cmp,
 | 
| -                   SourceInformation sourceInformation) {
 | 
| +  void checkString(
 | 
| +      HInstruction input, String cmp, SourceInformation sourceInformation) {
 | 
|      return checkTypeOf(input, cmp, 'string', sourceInformation);
 | 
|    }
 | 
|  
 | 
| -  void checkBool(HInstruction input, String cmp,
 | 
| -                 SourceInformation sourceInformation) {
 | 
| +  void checkBool(
 | 
| +      HInstruction input, String cmp, SourceInformation sourceInformation) {
 | 
|      return checkTypeOf(input, cmp, 'boolean', sourceInformation);
 | 
|    }
 | 
|  
 | 
| -  void checkObject(HInstruction input, String cmp,
 | 
| -                   SourceInformation sourceInformation) {
 | 
| +  void checkObject(
 | 
| +      HInstruction input, String cmp, SourceInformation sourceInformation) {
 | 
|      assert(NullConstantValue.JsNull == 'null');
 | 
|      if (cmp == "===") {
 | 
|        checkTypeOf(input, '===', 'object', sourceInformation);
 | 
| @@ -2487,13 +2453,12 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      push(new js.Binary('!=', pop(), new js.LiteralNull()));
 | 
|    }
 | 
|  
 | 
| -  void checkType(HInstruction input, HInstruction interceptor,
 | 
| -                 DartType type,
 | 
| -                 SourceInformation sourceInformation,
 | 
| -                 {bool negative: false}) {
 | 
| +  void checkType(HInstruction input, HInstruction interceptor, DartType type,
 | 
| +      SourceInformation sourceInformation,
 | 
| +      {bool negative: false}) {
 | 
|      Element element = type.element;
 | 
|      if (element == helpers.jsArrayClass) {
 | 
| -      checkArray(input, negative ? '!==': '===');
 | 
| +      checkArray(input, negative ? '!==' : '===');
 | 
|        return;
 | 
|      } else if (element == helpers.jsMutableArrayClass) {
 | 
|        if (negative) {
 | 
| @@ -2526,15 +2491,15 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      }
 | 
|      if (interceptor != null) {
 | 
|        checkTypeViaProperty(interceptor, type, sourceInformation,
 | 
| -                           negative: negative);
 | 
| +          negative: negative);
 | 
|      } else {
 | 
|        checkTypeViaProperty(input, type, sourceInformation, negative: negative);
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  void checkTypeViaProperty(HInstruction input, DartType type,
 | 
| -                            SourceInformation sourceInformation,
 | 
| -                            {bool negative: false}) {
 | 
| +  void checkTypeViaProperty(
 | 
| +      HInstruction input, DartType type, SourceInformation sourceInformation,
 | 
| +      {bool negative: false}) {
 | 
|      registry.registerTypeUse(new TypeUse.isCheck(type));
 | 
|  
 | 
|      use(input);
 | 
| @@ -2543,18 +2508,15 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|          new js.PropertyAccess(pop(), backend.namer.operatorIsType(type))
 | 
|              .withSourceInformation(sourceInformation);
 | 
|      // We always negate at least once so that the result is boolified.
 | 
| -    push(new js.Prefix('!', field)
 | 
| -        .withSourceInformation(sourceInformation));
 | 
| +    push(new js.Prefix('!', field).withSourceInformation(sourceInformation));
 | 
|      // If the result is not negated, put another '!' in front.
 | 
|      if (!negative) {
 | 
| -      push(new js.Prefix('!', pop())
 | 
| -          .withSourceInformation(sourceInformation));
 | 
| +      push(new js.Prefix('!', pop()).withSourceInformation(sourceInformation));
 | 
|      }
 | 
|    }
 | 
|  
 | 
|    void checkTypeViaInstanceof(
 | 
| -      HInstruction input, DartType type,
 | 
| -      SourceInformation sourceInformation,
 | 
| +      HInstruction input, DartType type, SourceInformation sourceInformation,
 | 
|        {bool negative: false}) {
 | 
|      registry.registerTypeUse(new TypeUse.isCheck(type));
 | 
|  
 | 
| @@ -2562,23 +2524,23 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|  
 | 
|      js.Expression jsClassReference =
 | 
|          backend.emitter.constructorAccess(type.element);
 | 
| -    push(js.js('# instanceof #', [pop(), jsClassReference])
 | 
| -            .withSourceInformation(sourceInformation));
 | 
| +    push(js.js('# instanceof #',
 | 
| +        [pop(), jsClassReference]).withSourceInformation(sourceInformation));
 | 
|      if (negative) {
 | 
| -      push(new js.Prefix('!', pop())
 | 
| -          .withSourceInformation(sourceInformation));
 | 
| +      push(new js.Prefix('!', pop()).withSourceInformation(sourceInformation));
 | 
|      }
 | 
|      registry.registerInstantiation(type);
 | 
|    }
 | 
|  
 | 
| -  void handleNumberOrStringSupertypeCheck(HInstruction input,
 | 
| -                                          HInstruction interceptor,
 | 
| -                                          DartType type,
 | 
| -                                          SourceInformation sourceInformation,
 | 
| -                                          {bool negative: false}) {
 | 
| +  void handleNumberOrStringSupertypeCheck(
 | 
| +      HInstruction input,
 | 
| +      HInstruction interceptor,
 | 
| +      DartType type,
 | 
| +      SourceInformation sourceInformation,
 | 
| +      {bool negative: false}) {
 | 
|      assert(!identical(type.element, coreClasses.listClass) &&
 | 
| -           !Elements.isListSupertype(type.element, compiler) &&
 | 
| -           !Elements.isStringOnlySupertype(type.element, compiler));
 | 
| +        !Elements.isListSupertype(type.element, compiler) &&
 | 
| +        !Elements.isStringOnlySupertype(type.element, compiler));
 | 
|      String relation = negative ? '!==' : '===';
 | 
|      checkNum(input, relation, sourceInformation);
 | 
|      js.Expression numberTest = pop();
 | 
| @@ -2589,22 +2551,21 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      checkType(input, interceptor, type, sourceInformation, negative: negative);
 | 
|      String combiner = negative ? '&&' : '||';
 | 
|      String combiner2 = negative ? '||' : '&&';
 | 
| -    push(new js.Binary(combiner,
 | 
| -                       new js.Binary(combiner, numberTest, stringTest)
 | 
| -                          .withSourceInformation(sourceInformation),
 | 
| -                       new js.Binary(combiner2, objectTest, pop())
 | 
| -                          .withSourceInformation(sourceInformation))
 | 
| +    push(new js.Binary(
 | 
| +            combiner,
 | 
| +            new js.Binary(combiner, numberTest, stringTest)
 | 
| +                .withSourceInformation(sourceInformation),
 | 
| +            new js.Binary(combiner2, objectTest, pop())
 | 
| +                .withSourceInformation(sourceInformation))
 | 
|          .withSourceInformation(sourceInformation));
 | 
|    }
 | 
|  
 | 
| -  void handleStringSupertypeCheck(HInstruction input,
 | 
| -                                  HInstruction interceptor,
 | 
| -                                  DartType type,
 | 
| -                                  SourceInformation sourceInformation,
 | 
| -                                  {bool negative: false}) {
 | 
| -    assert(!identical(type.element, coreClasses.listClass)
 | 
| -           && !Elements.isListSupertype(type.element, compiler)
 | 
| -           && !Elements.isNumberOrStringSupertype(type.element, compiler));
 | 
| +  void handleStringSupertypeCheck(HInstruction input, HInstruction interceptor,
 | 
| +      DartType type, SourceInformation sourceInformation,
 | 
| +      {bool negative: false}) {
 | 
| +    assert(!identical(type.element, coreClasses.listClass) &&
 | 
| +        !Elements.isListSupertype(type.element, compiler) &&
 | 
| +        !Elements.isNumberOrStringSupertype(type.element, compiler));
 | 
|      String relation = negative ? '!==' : '===';
 | 
|      checkString(input, relation, sourceInformation);
 | 
|      js.Expression stringTest = pop();
 | 
| @@ -2612,19 +2573,16 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      js.Expression objectTest = pop();
 | 
|      checkType(input, interceptor, type, sourceInformation, negative: negative);
 | 
|      String combiner = negative ? '||' : '&&';
 | 
| -    push(new js.Binary(negative ? '&&' : '||',
 | 
| -                       stringTest,
 | 
| -                       new js.Binary(combiner, objectTest, pop())));
 | 
| -  }
 | 
| -
 | 
| -  void handleListOrSupertypeCheck(HInstruction input,
 | 
| -                                  HInstruction interceptor,
 | 
| -                                  DartType type,
 | 
| -                                  SourceInformation sourceInformation,
 | 
| -                                  { bool negative: false }) {
 | 
| -    assert(!identical(type.element, coreClasses.stringClass)
 | 
| -           && !Elements.isStringOnlySupertype(type.element, compiler)
 | 
| -           && !Elements.isNumberOrStringSupertype(type.element, compiler));
 | 
| +    push(new js.Binary(negative ? '&&' : '||', stringTest,
 | 
| +        new js.Binary(combiner, objectTest, pop())));
 | 
| +  }
 | 
| +
 | 
| +  void handleListOrSupertypeCheck(HInstruction input, HInstruction interceptor,
 | 
| +      DartType type, SourceInformation sourceInformation,
 | 
| +      {bool negative: false}) {
 | 
| +    assert(!identical(type.element, coreClasses.stringClass) &&
 | 
| +        !Elements.isStringOnlySupertype(type.element, compiler) &&
 | 
| +        !Elements.isNumberOrStringSupertype(type.element, compiler));
 | 
|      String relation = negative ? '!==' : '===';
 | 
|      checkObject(input, relation, sourceInformation);
 | 
|      js.Expression objectTest = pop();
 | 
| @@ -2632,9 +2590,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      js.Expression arrayTest = pop();
 | 
|      checkType(input, interceptor, type, sourceInformation, negative: negative);
 | 
|      String combiner = negative ? '&&' : '||';
 | 
| -    push(new js.Binary(negative ? '||' : '&&',
 | 
| -                       objectTest,
 | 
| -                       new js.Binary(combiner, arrayTest, pop()))
 | 
| +    push(new js.Binary(negative ? '||' : '&&', objectTest,
 | 
| +            new js.Binary(combiner, arrayTest, pop()))
 | 
|          .withSourceInformation(sourceInformation));
 | 
|    }
 | 
|  
 | 
| @@ -2646,7 +2603,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      emitIsViaInterceptor(node, node.sourceInformation, negative: false);
 | 
|    }
 | 
|  
 | 
| -  void emitIs(HIs node, String relation, SourceInformation sourceInformation)  {
 | 
| +  void emitIs(HIs node, String relation, SourceInformation sourceInformation) {
 | 
|      DartType type = node.typeExpression;
 | 
|      registry.registerTypeUse(new TypeUse.isCheck(type));
 | 
|      HInstruction input = node.expression;
 | 
| @@ -2693,53 +2650,44 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|              .withSourceInformation(sourceInformation));
 | 
|        } else if (node.useInstanceOf) {
 | 
|          assert(interceptor == null);
 | 
| -        checkTypeViaInstanceof(input, type,
 | 
| -                               sourceInformation,
 | 
| -                               negative: negative);
 | 
| +        checkTypeViaInstanceof(input, type, sourceInformation,
 | 
| +            negative: negative);
 | 
|        } else if (Elements.isNumberOrStringSupertype(element, compiler)) {
 | 
|          handleNumberOrStringSupertypeCheck(
 | 
| -            input, interceptor, type,
 | 
| -            sourceInformation,
 | 
| +            input, interceptor, type, sourceInformation,
 | 
|              negative: negative);
 | 
|        } else if (Elements.isStringOnlySupertype(element, compiler)) {
 | 
| -        handleStringSupertypeCheck(
 | 
| -            input, interceptor, type,
 | 
| -            sourceInformation,
 | 
| +        handleStringSupertypeCheck(input, interceptor, type, sourceInformation,
 | 
|              negative: negative);
 | 
|        } else if (identical(element, coreClasses.listClass) ||
 | 
| -                 Elements.isListSupertype(element, compiler)) {
 | 
| -        handleListOrSupertypeCheck(
 | 
| -            input, interceptor, type,
 | 
| -            sourceInformation,
 | 
| +          Elements.isListSupertype(element, compiler)) {
 | 
| +        handleListOrSupertypeCheck(input, interceptor, type, sourceInformation,
 | 
|              negative: negative);
 | 
|        } else if (type.isFunctionType) {
 | 
| -        checkType(input, interceptor, type,
 | 
| -                  sourceInformation,
 | 
| -                  negative: negative);
 | 
| -      } else if ((input.canBePrimitive(compiler)
 | 
| -                  && !input.canBePrimitiveArray(compiler))
 | 
| -                 || input.canBeNull()) {
 | 
| +        checkType(input, interceptor, type, sourceInformation,
 | 
| +            negative: negative);
 | 
| +      } else if ((input.canBePrimitive(compiler) &&
 | 
| +              !input.canBePrimitiveArray(compiler)) ||
 | 
| +          input.canBeNull()) {
 | 
|          checkObject(input, relation, node.sourceInformation);
 | 
|          js.Expression objectTest = pop();
 | 
| -        checkType(input, interceptor, type,
 | 
| -                  sourceInformation,
 | 
| -                  negative: negative);
 | 
| +        checkType(input, interceptor, type, sourceInformation,
 | 
| +            negative: negative);
 | 
|          push(new js.Binary(negative ? '||' : '&&', objectTest, pop())
 | 
|              .withSourceInformation(sourceInformation));
 | 
|        } else {
 | 
| -        checkType(input, interceptor, type,
 | 
| -                  sourceInformation,
 | 
| -                  negative: negative);
 | 
| +        checkType(input, interceptor, type, sourceInformation,
 | 
| +            negative: negative);
 | 
|        }
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  void emitIsViaInterceptor(HIsViaInterceptor node,
 | 
| -                            SourceInformation sourceInformation,
 | 
| -                            {bool negative: false}) {
 | 
| -    checkTypeViaProperty(node.interceptor, node.typeExpression,
 | 
| -                         sourceInformation,
 | 
| -                         negative: negative);
 | 
| +  void emitIsViaInterceptor(
 | 
| +      HIsViaInterceptor node, SourceInformation sourceInformation,
 | 
| +      {bool negative: false}) {
 | 
| +    checkTypeViaProperty(
 | 
| +        node.interceptor, node.typeExpression, sourceInformation,
 | 
| +        negative: negative);
 | 
|    }
 | 
|  
 | 
|    js.Expression generateReceiverOrArgumentTypeTest(
 | 
| @@ -2752,10 +2700,10 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|      // typeof check so the null check is cheaper.
 | 
|      bool isIntCheck = checkedType.containsOnlyInt(classWorld);
 | 
|      bool turnIntoNumCheck = isIntCheck && input.isIntegerOrNull(compiler);
 | 
| -    bool turnIntoNullCheck = !turnIntoNumCheck
 | 
| -        && (checkedType.nullable() == inputType)
 | 
| -        && (isIntCheck
 | 
| -            || checkedType.satisfies(helpers.jsIndexableClass, classWorld));
 | 
| +    bool turnIntoNullCheck = !turnIntoNumCheck &&
 | 
| +        (checkedType.nullable() == inputType) &&
 | 
| +        (isIntCheck ||
 | 
| +            checkedType.satisfies(helpers.jsIndexableClass, classWorld));
 | 
|  
 | 
|      if (turnIntoNullCheck) {
 | 
|        use(input);
 | 
| @@ -2788,8 +2736,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        // An int check if the input is not int or null, is not
 | 
|        // sufficient for doing an argument or receiver check.
 | 
|        assert(compiler.options.trustTypeAnnotations ||
 | 
| -             !node.checkedType.containsOnlyInt(classWorld) ||
 | 
| -             node.checkedInput.isIntegerOrNull(compiler));
 | 
| +          !node.checkedType.containsOnlyInt(classWorld) ||
 | 
| +          node.checkedInput.isIntegerOrNull(compiler));
 | 
|        js.Expression test = generateReceiverOrArgumentTypeTest(
 | 
|            node.checkedInput, node.checkedType);
 | 
|        js.Block oldContainer = currentContainer;
 | 
| @@ -2797,8 +2745,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        currentContainer = body;
 | 
|        if (node.isArgumentTypeCheck) {
 | 
|          generateThrowWithHelper(
 | 
| -            helpers.throwIllegalArgumentException,
 | 
| -            node.checkedInput,
 | 
| +            helpers.throwIllegalArgumentException, node.checkedInput,
 | 
|              sourceInformation: node.sourceInformation);
 | 
|        } else if (node.isReceiverTypeCheck) {
 | 
|          use(node.checkedInput);
 | 
| @@ -2827,8 +2774,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|  
 | 
|      CheckedModeHelper helper;
 | 
|      if (node.isBooleanConversionCheck) {
 | 
| -      helper =
 | 
| -          const CheckedModeHelper('boolConversionCheck');
 | 
| +      helper = const CheckedModeHelper('boolConversionCheck');
 | 
|      } else {
 | 
|        helper =
 | 
|            backend.getCheckedModeHelper(type, typeCast: node.isCastTypeCheck);
 | 
| @@ -2884,9 +2830,10 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        push(js.js('#(#)', [accessHelper('buildFunctionType'), arguments]));
 | 
|      } else {
 | 
|        var arguments = [
 | 
| -          returnType,
 | 
| -          new js.ArrayInitializer(parameterTypes),
 | 
| -          new js.ObjectInitializer(namedParameters)];
 | 
| +        returnType,
 | 
| +        new js.ArrayInitializer(parameterTypes),
 | 
| +        new js.ObjectInitializer(namedParameters)
 | 
| +      ];
 | 
|        push(js.js('#(#)', [accessHelper('buildNamedFunctionType'), arguments]));
 | 
|      }
 | 
|    }
 | 
| @@ -2902,19 +2849,18 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        if (backend.isInterceptorClass(element.enclosingClass)) {
 | 
|          int index = element.index;
 | 
|          js.Expression receiver = pop();
 | 
| -        js.Expression helper = backend.emitter
 | 
| -            .staticFunctionAccess(helperElement);
 | 
| +        js.Expression helper =
 | 
| +            backend.emitter.staticFunctionAccess(helperElement);
 | 
|          push(js.js(r'#(#.$builtinTypeInfo && #.$builtinTypeInfo[#])',
 | 
| -                [helper, receiver, receiver, js.js.number(index)]));
 | 
| +            [helper, receiver, receiver, js.js.number(index)]));
 | 
|        } else {
 | 
|          backend.emitter.registerReadTypeVariable(element);
 | 
| -        push(js.js('#.#()',
 | 
| -                [pop(), backend.namer.nameForReadTypeVariable(element)]));
 | 
| +        push(js.js(
 | 
| +            '#.#()', [pop(), backend.namer.nameForReadTypeVariable(element)]));
 | 
|        }
 | 
|      } else {
 | 
| -      push(js.js('#(#)', [
 | 
| -          backend.emitter.staticFunctionAccess(helperElement),
 | 
| -          pop()]));
 | 
| +      push(js.js('#(#)',
 | 
| +          [backend.emitter.staticFunctionAccess(helperElement), pop()]));
 | 
|      }
 | 
|    }
 | 
|  
 | 
| @@ -2948,9 +2894,8 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
 | 
|        // For mocked-up tests.
 | 
|        return js.js('(void 0).$name');
 | 
|      }
 | 
| -    registry.registerStaticUse(
 | 
| -        new StaticUse.staticInvoke(helper,
 | 
| -            new CallStructure.unnamed(argumentCount)));
 | 
| +    registry.registerStaticUse(new StaticUse.staticInvoke(
 | 
| +        helper, new CallStructure.unnamed(argumentCount)));
 | 
|      return backend.emitter.staticFunctionAccess(helper);
 | 
|    }
 | 
|  
 | 
| 
 |