anchor.diff:      return substitute(type, typeSubstitution);
     }
   
  +  DartType visitOptionalType(DartType type) {
  +    return type == null ? null : substitute(type, typeSubstitution);
  +  }
  +
     visitInvalidExpression(InvalidExpression node) => new InvalidExpression();
   
     visitVariableGet(VariableGet node) {
  -    return new VariableGet(variables[node.variable]);
  +    return new VariableGet(
  +        variables[node.variable], visitOptionalType(node.promotedType));
     }
   
     visitVariableSet(VariableSet node) {
  
positive.code:   }
  
    visitLogicalExpression(LogicalExpression node) {
      return new LogicalExpression(
          clone(node.left), node.operator, clone(node.right));
    }
  
    visitConditionalExpression(ConditionalExpression node) {
      return new ConditionalExpression(
          clone(node.condition), clone(node.then), clone(node.otherwise));
    }
  
    visitStringConcatenation(StringConcatenation node) {
  
negative.code:   }
  
    visitPropertyGet(PropertyGet node) {
      return new PropertyGet(
          clone(node.receiver), node.name, node.interfaceTarget);
    }
  
    visitPropertySet(PropertySet node) {
      return new PropertySet(clone(node.receiver), node.name, clone(node.value),
          node.interfaceTarget);
    }
  
    visitDirectPropertyGet(DirectPropertyGet node) {
  