private void VisitTypeDefinition(common_type_node type)
		{
            int offset = 0;
            if (is_interface == true) offset = SavePositionAndConstPool(type);
			else offset = SavePositionAndImplementationPool(type);
			bw.Write((byte)type.semantic_node_type);
			bw.Write(is_interface);
            bw.Write(type_entity_index++);
			if (is_interface == true)
			 bw.Write(GetNameIndex(type));
			else
			 bw.Write(type.name);
            /*if (type.base_type != null)
             WriteTypeReference(type.base_type);
            else*/

            //Пишем, является ли данный класс интерфейсом
            if (type.IsInterface)
            {
                bw.Write((byte)1);
            }
            else
            {
                bw.Write((byte)0);
            }

            //Пишем, является ли данный класс делегатом
            if (type.IsDelegate)
            {
                bw.Write((byte)1);
            }
            else
            {
                bw.Write((byte)0);
            }
			
            //Является ли тип описанием дженерика
            if (type.is_generic_type_definition)
            {
                bw.Write((byte)1);
                //Число типов-параметров
                bw.Write(type.generic_params.Count);
                //Имена параметров
                foreach (common_type_node par in type.generic_params)
                {
                    bw.Write(par.name);
                }
            }
            else
            {
                bw.Write((byte)0);
            }

            int base_class_off = (int)bw.BaseStream.Position;

            bw.Seek(GetSizeOfReference(type.base_type), SeekOrigin.Current);
			
            //(ssyy) На кой чёрт это надо?
            //WriteTypeReference(SystemLibrary.SystemLibrary.object_type);
            //WriteTypeReference(type.base_type);
            bw.Write(type.internal_is_value);

            //Пишем поддерживаемые интерфейсы
            //eto nepravilno!!! a vdrug bazovye interfejsy eshe ne projdeny.
            //WriteImplementingInterfaces(type);
            int interface_impl_off = (int)bw.BaseStream.Position;
            int seek_off = sizeof(int);
            for (int k=0; k<type.ImplementingInterfaces.Count; k++)
            	seek_off += GetSizeOfReference(type.ImplementingInterfaces[k] as TreeRealization.type_node);
            bw.Seek(seek_off, SeekOrigin.Current);
            bw.Write((byte)type.type_access_level);
            bw.Write((byte)type.type_special_kind);
            bw.Write(type.IsSealed);
            bw.Write(type.IsAbstract);
            bw.Write(type.IsPartial);
            if (type.type_special_kind == SemanticTree.type_special_kind.diap_type)
            {
            	ordinal_type_interface oti = type.get_internal_interface(internal_interface_kind.ordinal_interface) as ordinal_type_interface;
            	VisitExpression(oti.lower_value);
            	VisitExpression(oti.upper_value);
            }

            if (type.is_generic_type_definition)
            {
                //Ограничители параметров
                WriteTypeParamsEliminations(type.generic_params);
            }
            if(CanWriteObject(type.element_type))
                WriteTypeReference(type.element_type);
            
			bw.Write(GetUnitReference(type.comprehensive_namespace));
			SaveOffsetForAttribute(type);
            bw.Write(0);//attributes;
            if (type.default_property != null) 
                bw.Write((byte)1);
            else 
                bw.Write((byte)0);
            int def_prop_off = (int)bw.BaseStream.Position;
            if (type.default_property != null)
                bw.Write(0);//default_property
            WriteDebugInfo(type.loc);
			//заполнение списка имен членов этого класса
            int num = type.const_defs.Count + type.fields.Count + type.properties.Count + type.methods.Count+type.events.Count;
			NameRef[] names = new NameRef[num];
			int pos = (int)bw.BaseStream.Position;
            int int_size = System.Runtime.InteropServices.Marshal.SizeOf(typeof(int));
            int size = int_size;
			int i=0,j=0;
			for (i=j; i<type.const_defs.Count+j; i++)
			{
                names[i] = new NameRef(type.const_defs[i - j].name, i);
                name_pool[type.const_defs[i - j]] = names[i];
                size += names[i].Size;
			}
			j=i;
			for (i=j; i<type.fields.Count+j; i++)
			{
                names[i] = new NameRef(type.fields[i - j].name, i, convert_field_access_level(type.fields[i - j].field_access_level), type.fields[i - j].semantic_node_type);
                name_pool[type.fields[i - j]] = names[i];
                size += names[i].Size;
			}
			j=i;
			for (i=j; i<type.properties.Count+j; i++)
			{
                names[i] = new NameRef(type.properties[i - j].name, i, convert_field_access_level(type.properties[i - j].field_access_level), type.properties[i - j].semantic_node_type);
                name_pool[type.properties[i - j]] = names[i];
                size += names[i].Size;
			}
			j=i;
			for (i=j; i<type.methods.Count+j; i++)
			{
                names[i] = new NameRef(type.methods[i - j].name, i, convert_field_access_level(type.methods[i - j].field_access_level), type.methods[i - j].semantic_node_type);
                name_pool[type.methods[i - j]] = names[i];
                if (type.methods[i - j].is_overload)
                    names[i].symbol_kind = symbol_kind.sk_overload_function;
                names[i].virtual_slot = type.methods[i - j].newslot_awaited || type.methods[i - j].polymorphic_state == SemanticTree.polymorphic_state.ps_virtual || type.methods[i - j].polymorphic_state == SemanticTree.polymorphic_state.ps_virtual_abstract || type.methods[i - j].is_constructor;
                size += names[i].Size;
			}
			j=i;
			for (i=j; i<type.events.Count+j; i++)
			{
                names[i] = new NameRef(type.events[i - j].name, i, convert_field_access_level(type.events[i - j].field_access_level), type.events[i - j].semantic_node_type);
                name_pool[type.events[i - j]] = names[i];
                size += names[i].Size;
			}
			bw.BaseStream.Seek(size,SeekOrigin.Current);
			/*VisitConstantInTypeDefinitions(type);
			VisitFieldDefinitions(type);
			VisitMethodDefinitions(type);
			VisitPropertyDefinitions(type);
			int tmp = (int)bw.BaseStream.Position;
            if (type.default_property != null)
            {
                bw.Seek(def_prop_off, SeekOrigin.Begin);
                bw.Write(GetMemberOffset(type.default_property));
                bw.Seek(tmp, SeekOrigin.Begin);
            }
            bw.BaseStream.Seek(pos,SeekOrigin.Begin);
            bw.Write(names.Length);
            for (i=0; i<names.Length; i++)
			{
				bw.Write(names[i].name);
				bw.Write(names[i].offset);
			}
			bw.BaseStream.Seek(tmp,SeekOrigin.Begin);*/
            ClassInfo ci = new ClassInfo(pos, def_prop_off, base_class_off, interface_impl_off,names);
            class_info[type] = ci;
		}
Exemplo n.º 2
0
		private string get_array_name(common_type_node ctn)
		{
			StringBuilder sb = new StringBuilder();
			sb.Append("@array");
			bounded_array_interface bai = ctn.get_internal_interface(internal_interface_kind.bounded_array_interface) as bounded_array_interface;
			sb.Append('[');
			sb.Append(get_constant(bai.ordinal_type_interface.lower_value));
			sb.Append("..");
			sb.Append(get_constant(bai.ordinal_type_interface.upper_value));
			sb.Append(']');
			sb.Append("["+get_name(ctn.element_type)+"]");
			return sb.ToString();
		}