visitArray()

in lib/generator.js [2763:2811]


  visitArray(ast, level, env, expected) {
    assert.equal(ast.type, 'array');
    let expectedType;
    if (!expected || !expected.type || (expected && _name(expected) && _name(expected) === 'any')) {
      expectedType = ast.inferred;
    } else {
      expectedType = expected;
    }
    this.visitPointerType(expectedType, level, env);
    let arrayComments = DSL.comment.getBetweenComments(this.comments, ast.tokenRange[0], ast.tokenRange[1]);
    if (ast.items.length === 0) {
      this.emit(`{`);
      if (arrayComments.length > 0) {
        this.emit('\n');
        this.visitComments(arrayComments, level + 1);
        this.emit('', level);
      }
      this.emit('}');
      return;
    }
    let item;
    this.emit(`{`);
    let itemType = expectedType.subType || expectedType.itemType;
    itemType.pointer = true;
    for (let i = 0; i < ast.items.length; i++) {
      item = ast.items[i];
      let comments = DSL.comment.getFrontComments(this.comments, item.tokenRange[0]);
      if (comments.length > 0) {
        this.emit('\n');
        this.visitComments(comments, level + 1);
        this.emit('', level + 1);
      }
      this.visitExpr(item, level + 1, env, itemType);
      if (i < ast.items.length - 1) {
        this.emit(`, `);
      }
    }
    if (item) {
      //find the last item's back comment
      let comments = DSL.comment.getBetweenComments(this.comments, item.tokenRange[0], ast.tokenRange[1]);
      if (comments.length > 0) {
        this.emit('\n');
        this.visitComments(comments, level + 1);
        this.emit(`}`, level);
        return;
      }
    }
    this.emit(`}`);
  }