private SyntaxTree.expression get_possible_array_const(SyntaxTree.expression expr, type_node tn) { try { if (tn == null) return expr; if (expr is SyntaxTree.bracket_expr && (tn.type_special_kind == SemanticTree.type_special_kind.array_kind || tn.type_special_kind == SemanticTree.type_special_kind.array_wrapper)) { array_internal_interface aii = tn.get_internal_interface(internal_interface_kind.unsized_array_interface) as array_internal_interface; if (aii != null && aii.rank > 1) return get_possible_array_const(expr, tn, aii.rank); SyntaxTree.array_const arr = new SyntaxTree.array_const(); arr.source_context = expr.source_context; arr.elements = new SyntaxTree.expression_list(); arr.elements.expressions.Add(get_possible_array_const((expr as SyntaxTree.bracket_expr).expr, tn.element_type)); return arr; } else if (expr is SyntaxTree.array_const && (tn.type_special_kind == SemanticTree.type_special_kind.array_kind || tn.type_special_kind == SemanticTree.type_special_kind.array_wrapper)) { array_internal_interface aii = tn.get_internal_interface(internal_interface_kind.unsized_array_interface) as array_internal_interface; if (aii != null && aii.rank > 1) return get_possible_array_const(expr, tn, aii.rank); SyntaxTree.array_const arr = expr as SyntaxTree.array_const; if (arr.elements != null) for (int i = 0; i < arr.elements.expressions.Count; i++) arr.elements.expressions[i] = get_possible_array_const(arr.elements.expressions[i], tn.element_type); return arr; } else if (expr is SyntaxTree.record_const && tn is common_type_node) { common_type_node ctn = tn as common_type_node; SyntaxTree.record_const rec = expr as SyntaxTree.record_const; for (int i = 0; i < rec.rec_consts.Count; i++) { if (i < ctn.fields.Count) rec.rec_consts[i].val = get_possible_array_const(rec.rec_consts[i].val, ctn.fields[i].type); } return rec; } } catch { } return expr; }
private SyntaxTree.expression get_possible_array_const(SyntaxTree.expression expr, type_node tn, int rank) { try { if (tn == null) return expr; if (rank == 0) return get_possible_array_const(expr, tn.element_type); if (expr is SyntaxTree.bracket_expr) { SyntaxTree.array_const arr = new SyntaxTree.array_const(); arr.source_context = expr.source_context; arr.elements = new SyntaxTree.expression_list(); arr.elements.expressions.Add(get_possible_array_const((expr as SyntaxTree.bracket_expr).expr, tn.element_type, rank - 1)); return arr; } else if (expr is SyntaxTree.array_const) { SyntaxTree.array_const arr = expr as SyntaxTree.array_const; if (arr.elements != null) for (int i = 0; i < arr.elements.expressions.Count; i++) arr.elements.expressions[i] = get_possible_array_const(arr.elements.expressions[i], tn.element_type, rank - 1); return arr; } } catch { } return expr; }