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);
}