anchor.diff:  
     void emitString() {
       emit("'");
  -    int l = rand.nextInt(8);
  -    for (int i = 0; i < l; i++) {
  +    for (int i = 0, n = rand.nextInt(8); i < n; i++) {
         emitChar();
       }
       emit("'");
     }
   
  -  void emitList(String open, String close) {
  -    emit('$open ');
  -    int l = 1 + rand.nextInt(4);
  -    for (int i = 0; i < l; i++) {
  -      emitInt();
  -      if (i != (l - 1)) {
  +  void emitElementExpr(int depth, DartType tp) {
  +    if (currentMethod != null) {
  +      emitExpr(depth, tp);
  +    } else {
  +      emitLiteral(depth, tp);
  +    }
  +  }
  +
  +  void emitElement(int depth, DartType tp) {
  +    if (tp == DartType.INT_STRING_MAP) {
  +      emitSmallPositiveInt();
  +      emit(' : ');
  +      emitElementExpr(depth, DartType.STRING);
  +    } else {
  +      emitElementExpr(depth, DartType.INT);
  +    }
  +  }
  +
  +  void emitCollectionElement(int depth, DartType tp) {
  +    int r = depth <= exprDepth ? rand.nextInt(10) : 10;
  +    switch (r + 3) {
  +      // TODO(ajcbik): enable when on by default
  +      // Favors elements over control-flow collections.
  +      case 0:
  +        emit('...'); // spread
  +        emitCollection(depth + 1, tp);
  +        break;
  +      case 1:
  +        emit('if (');
  +        emitElementExpr(depth + 1, DartType.BOOL);
  +        emit(') ');
  +        emitCollectionElement(depth + 1, tp);
  +        if (rand.nextBool()) {
  +          emit(' else ');
  +          emitCollectionElement(depth + 1, tp);
  +        }
  +        break;
  +      case 2:
  +        {
  +          int i = localVars.length;
  +          emit('for (int $localName$i ');
  +          // For-loop (induction, list, set).
  +          switch (rand.nextInt(3)) {
  +            case 0:
  +              emit('= 0; $localName$i < ');
  +              emitSmallPositiveInt();
  +              emit('; $localName$i++) ');
  +              break;
  +            case 1:
  +              emit('in ');
  +              emitCollection(depth + 1, DartType.INT_LIST);
  +              emit(') ');
  +              break;
  +            default:
  +              emit('in ');
  +              emitCollection(depth + 1, DartType.INT_SET);
  +              emit(') ');
  +              break;
  +          }
  +          nest++;
  +          localVars.add(DartType.INT);
  +          emitCollectionElement(depth + 1, tp);
  +          localVars.removeLast();
  +          nest--;
  +          break;
  +        }
  +      default:
  +        emitElement(depth, tp);
  +        break;
  +    }
  +  }
  +
  +  void emitCollection(int depth, DartType tp) {
  +    emit(tp == DartType.INT_LIST ? '[ ' : '{ ');
  +    for (int i = 0, n = 1 + rand.nextInt(8); i < n; i++) {
  +      emitCollectionElement(depth, tp);
  +      if (i != (n - 1)) {
           emit(', ');
         }
       }
  -    emit(' $close');
  -  }
  -
  -  void emitMap() {
  -    emit('{ ');
  -    int l = 1 + rand.nextInt(4);
  -    for (int i = 0; i < l; i++) {
  -      emit('$i : ');
  -      emitString();
  -      if (i != (l - 1)) {
  -        emit(', ');
  -      }
  -    }
  -    emit(' }');
  -  }
  -
  -  void emitLiteral(DartType tp) {
  +    emit(tp == DartType.INT_LIST ? ' ]' : ' }');
  +  }
  +
  +  void emitLiteral(int depth, DartType tp) {
       if (tp == DartType.BOOL) {
         emitBool();
       } else if (tp == DartType.INT) {
  
positive.code: 
    List<DartType> fillTypes1() {
      List<DartType> list = new List<DartType>();
      int n = 1 + rand.nextInt(4);
      for (int i = 0; i < n; i++) {
        list.add(getType());
      }
      return list;
  
negative.code:   void emitMethodCall(int depth, DartType tp) {
      // Only call backward to avoid infinite recursion.
      if (currentClass == null) {
        // Outside a class but inside a method: call backward in global methods.
        if (currentMethod != null &&
            pickedCall(depth, tp, methodName, globalMethods, currentMethod)) {
          return;
        }
      } else {
  