visitObject()

in lib/generator.js [1947:2031]


  visitObject(ast, level, env) {
    assert.equal(ast.type, 'object');
    if (ast.fields.length === 0) {
      this.emit(`new `);
      this.visitType(ast.inferred, level, env);
      this.emit('()');
      let comments = DSL.comment.getBetweenComments(this.comments, ast.tokenRange[0], ast.tokenRange[1]);
      if (comments.length > 0) {
        this.emit('\n');
        this.emit('{\n', level);
        this.visitComments(comments, level + 1);
        this.emit('}', level);
      } else {
        this.emit('{}');
      }
      return;
    }

    var hasExpandField = false;
    for (let i = 0; i < ast.fields.length; i++) {
      const field = ast.fields[i];
      if (field.type === 'expandField') {
        hasExpandField = true;
        break;
      }
    }

    if (!hasExpandField) {
      this.emit('new ');
      this.visitType(ast.inferred, level, env);
      this.emit('\n');
      this.emit('{\n', level);

      for (var i = 0; i < ast.fields.length; i++) {
        this.visitObjectField(ast.fields[i], level + 1, env);
      }
      //find the last item's back comment
      let comments = DSL.comment.getBetweenComments(this.comments, ast.fields[i - 1].tokenRange[0], ast.tokenRange[1]);
      this.visitComments(comments, level + 1);
      this.emit('}', level);
      return;
    }

    var all = [];
    // 分段
    var current = [];
    for (let i = 0; i < ast.fields.length; i++) {
      const field = ast.fields[i];
      if (field.type === 'objectField') {
        current.push(field);
      } else {
        if (current.length > 0) {
          all.push(current);
        }
        all.push(field);
        current = [];
      }
    }

    if (current.length > 0) {
      all.push(current);
    }

    this.emit(`ConverterUtils.Merge<${this._type(ast.inferred.valueType.name)}>\n`);
    this.emit('(\n', level);
    for (let i = 0; i < all.length; i++) {
      const item = all[i];
      if (Array.isArray(item)) {
        this.emit(`new Dictionary<${this._type(ast.inferred.keyType.name)}, ${this._type(ast.inferred.valueType.name)}>()\n`, level + 1);
        this.emit('{\n', level + 1);
        for (var j = 0; j < item.length; j++) {
          this.visitObjectField(item[j], level + 2, env);
        }
        this.emit('}', level + 1);
      } else {
        this.emit('', level + 1);
        this.visitExpr(item.expr, level + 1, env);
      }
      if (i < all.length - 1) {
        this.emit(',');
      }
      this.emit('\n');
    }
    this.emit(')', level);
  }