public override void visit(SyntaxTree.array_const _array_const) { if (_array_const.elements != null) { List<constant_node> elements = new List<constant_node>(); List<expression_node> exprs = new List<expression_node>(); foreach (SyntaxTree.expression expr in _array_const.elements.expressions) { if (is_typed_const_def) elements.Add(convert_strong_to_constant_node(expr)); else exprs.Add(convert_strong(expr)); } if (is_typed_const_def) { array_const arrc = new array_const(elements, get_location(_array_const)); arrc.SetType(new ArrayConstType(elements[0].type, elements.Count, arrc.location)); return_value(arrc); } else { array_initializer arrc = new array_initializer(exprs, get_location(_array_const)); arrc.type = new ArrayConstType(exprs[0].type, exprs.Count, arrc.location); return_value(arrc); } } else { //это пустой инициализатор записи record_constant rc = new record_constant(new List<PascalABCCompiler.SyntaxTree.record_const_definition>(), get_location(_array_const)); rc.SetType(new RecordConstType(get_location(_array_const))); return_value(rc); } }
private record_constant ConvertRecordConst(common_type_node ctn, record_constant constant) { location loc = constant.location; if (!ctn.is_value_type) AddError(loc, "RECORD_CONST_NOT_ALLOWED_{0}", ctn.name); if (ctn.fields.Count != constant.record_const_definition_list.Count) AddError(loc, "INVALID_RECORD_CONST_FIELD_COUNT"); constant.SetType(ctn); constant.field_values.Clear(); bool tmp = this.is_typed_const_def; this.is_typed_const_def = true; for (int i = 0; i < ctn.fields.Count; i++) { class_field cf = ctn.fields[i]; if (cf.name.ToLower() != constant.record_const_definition_list[i].name.name.ToLower()) AddError(get_location(constant.record_const_definition_list[i].name), "FIELD_NAME_SHOULD_BE_EQUAL_RECORD_FIELD_NAME", cf.name); constant.field_values.Add(convert_strong_to_constant_node(constant.record_const_definition_list[i].val, cf.type)); } this.is_typed_const_def = tmp; return constant; }
public override void visit(SyntaxTree.record_const node) { if (is_typed_const_def) { record_constant rc = new record_constant(node.rec_consts, get_location(node)); rc.SetType(new RecordConstType(rc.location)); return_value(rc); } else { record_initializer ri = new record_initializer(node.rec_consts, get_location(node)); ri.type = new RecordConstType(ri.location); return_value(ri); } }
private record_constant CreateRecordConst() { List<constant_node> field_values = new List<constant_node>(); int count = br.ReadInt32(); for (int i = 0; i < count; i++) field_values.Add((constant_node)CreateExpression()); record_constant recc = new record_constant(field_values, null); recc.SetType(GetTypeReference()); return recc; }