private void WriteUnsizedArrayType(type_node type,array_internal_interface aii) { bw.Write((byte)TypeKind.UnsizedArray); WriteDebugInfo((type as SemanticTree.ILocated).Location); WriteTypeReference(aii.element_type); bw.Write(aii.rank); }
public type_node create_unsized_array(type_node element_type, common_namespace_node cmn, int rank, location loc) { List<type_node> ret = null; if(types_unsized_arrays.TryGetValue(element_type,out ret)) { for (int i=0; i<ret.Count; i++) if (ret[i] is common_type_node) { if ((ret[i] as common_type_node).rank == rank) return ret[i]; } else if (ret[i] is compiled_type_node) { if ((ret[i] as compiled_type_node).rank == rank) return ret[i]; } } array_internal_interface aii = new array_internal_interface(element_type, rank); compiled_type_node comp_element_type = element_type as compiled_type_node; if (comp_element_type != null) { compiled_type_node ctn=NetHelper.NetHelper.get_array_type(comp_element_type, rank); ctn.Location = loc; if (ctn.get_internal_interface(internal_interface_kind.unsized_array_interface) == null) { ctn.add_internal_interface(aii); } ctn.SetName(compiler_string_consts.get_array_type_name(ctn.element_type.name,rank)); if (!types_unsized_arrays.TryGetValue(element_type,out ret)) { ret = new List<type_node>(); types_unsized_arrays[element_type] = ret; } ret.Add(ctn); //types_unsized_arrays.Add(element_type, ctn); SystemLibrary.SystemLibrary.init_reference_type(ctn); return ctn; } SymbolTable.Scope top_scope = null; if (cmn != null) { top_scope = cmn.scope; } common_type_node comtn = new common_type_node(SystemLibrary.SystemLibrary.array_base_type, compiler_string_consts.get_array_type_name(element_type.name,rank), SemanticTree.type_access_level.tal_public, cmn, convertion_data_and_alghoritms.symbol_table.CreateClassScope(top_scope,SystemLibrary.SystemLibrary.array_base_type.Scope), loc); comtn.internal_type_special_kind = SemanticTree.type_special_kind.array_kind; comtn.add_internal_interface(aii); if (!types_unsized_arrays.TryGetValue(element_type,out ret)) { ret = new List<type_node>(); types_unsized_arrays[element_type] = ret; } ret.Add(comtn); //(ssyy) Добавляем интерфейсы. comtn.ImplementingInterfaces.Add(SystemLibrary.SystemLibrary.icloneable_interface); comtn.ImplementingInterfaces.Add(SystemLibrary.SystemLibrary.ilist_interface); comtn.ImplementingInterfaces.Add(SystemLibrary.SystemLibrary.icollection_interface); comtn.ImplementingInterfaces.Add(SystemLibrary.SystemLibrary.ienumerable_interface); if (generic_parameter_eliminations.check_type_generic_useful(element_type, null) == null) { List<type_node> type_params = new List<type_node>(1); type_params.Add(element_type); comtn.ImplementingInterfaces.Add(SystemLibrary.SystemLibrary.ilist1_interface.get_instance(type_params)); comtn.ImplementingInterfaces.Add(SystemLibrary.SystemLibrary.icollection1_interface.get_instance(type_params)); comtn.ImplementingInterfaces.Add(SystemLibrary.SystemLibrary.ienumerable1_interface.get_instance(type_params)); } //SystemLibrary.SystemLibrary.ic //(ssyy) Убрал 18.05.08 //if (this.convertion_data_and_alghoritms.syntax_tree_visitor.context.converted_namespace != null) //this.convertion_data_and_alghoritms.syntax_tree_visitor.context.converted_namespace.types.AddElement(comtn); SystemLibrary.SystemLibrary.init_reference_type(comtn); return comtn; }
private void mark_if_array() { if (!(compiled_type.IsArray)) { return; } type_node elem_type=compiled_type_node.get_type_node(compiled_type.GetElementType()); array_internal_interface aii = new array_internal_interface(elem_type,_compiled_type.GetArrayRank()); add_internal_interface(aii); return; }
public static void make_array_interface(common_type_node ctn) { array_internal_interface aii = new array_internal_interface(ctn.element_type,1); ctn.add_internal_interface(aii); //types_unsized_arrays.Add(element_type, comtn); }