private TypeScope CreateInterfaceCommonType(string name, int offset)
		{
            TypeScope ctn = (TypeScope)members[offset];
            if (ctn != null) return ctn;
			bool in_scope = false;
            if (name != null) in_scope = true;
            bool is_interface = br.ReadBoolean();                        
            if (is_interface)//ïðîïóñêàåì ôëàã - èíòåðôåéñíîñòè
            {
                name = GetString(br.ReadInt32());
            }
            else
            {
                name = br.ReadString();
            }
			//br.ReadInt32();
            //ssyy
            //×èòàåì, ÿâëÿåòñÿ ëè òèï èíòåðôåéñîì
            bool type_is_interface = (br.ReadByte() == 1);

            //×èòàåì, ÿâëÿåòñÿ ëè òèï äåëåãàòîì
            bool type_is_delegate = (br.ReadByte() == 1);
            //\ssyy
			
            bool type_is_generic_definition = (br.ReadByte() == 1);
            
            if (type_is_generic_definition)
            {
            	throw new Exception();
            }
            TypeScope base_type = GetTypeReference();
            bool is_value_type = br.ReadBoolean();

            //ssyy
            //×èòàåì ïîääåðæèâàåìûå èíòåðôåéñû
            int interf_count = br.ReadInt32();
            List<TypeScope> interfaces = new List<TypeScope>();
            for (int i = 0; i < interf_count; i++)
            {
                interfaces.Add(GetTypeReference());
            }
            //\ssyy
			object low_val=null;
			object upper_val=null;
            PascalABCCompiler.SemanticTree.type_access_level tal = (PascalABCCompiler.SemanticTree.type_access_level)br.ReadByte();
            PascalABCCompiler.SemanticTree.type_special_kind tsk = (PascalABCCompiler.SemanticTree.type_special_kind)br.ReadByte();
            bool is_sealed = br.ReadBoolean();
            bool is_abstract = br.ReadBoolean();
            if (tsk == PascalABCCompiler.SemanticTree.type_special_kind.diap_type)
            {
            	low_val = CreateExpression();
            	upper_val = CreateExpression();
            }
	
            TypeScope element_type = null;
            if (CanReadObject())
                element_type = GetTypeReference();
            switch (tsk)
            {
            	case PascalABCCompiler.SemanticTree.type_special_kind.none_kind : ctn = new TypeScope(SymbolKind.Class,cur_scope,base_type); break;
            	case PascalABCCompiler.SemanticTree.type_special_kind.record : ctn = new TypeScope(SymbolKind.Struct,cur_scope,base_type); break;
            	case PascalABCCompiler.SemanticTree.type_special_kind.array_wrapper : ctn = new ArrayScope(); break;
            	case PascalABCCompiler.SemanticTree.type_special_kind.enum_kind : ctn = new EnumScope(SymbolKind.Enum,cur_scope,base_type); break;
            	case PascalABCCompiler.SemanticTree.type_special_kind.set_type : ctn = new SetScope(element_type); break;
            	case PascalABCCompiler.SemanticTree.type_special_kind.array_kind : if (!in_scope) ctn = new ArrayScope(); else return null; break;
            	case PascalABCCompiler.SemanticTree.type_special_kind.diap_type : ctn = new DiapasonScope(low_val,upper_val);break;
            	case PascalABCCompiler.SemanticTree.type_special_kind.typed_file : ctn = new FileScope(element_type,null);break;
            	case PascalABCCompiler.SemanticTree.type_special_kind.binary_file : ctn = new FileScope(null,null);break;
           		
            }
            ctn.declaringUnit = root_scope;
            ctn.si.name = name;
            ctn.is_abstract = is_abstract;
            ctn.is_final = is_sealed;
            AddMember(ctn, offset);
            ctn.elementType = element_type;
			
            br.ReadInt32();
            br.ReadInt32();//attributes
            //common_namespace_node ns = cun.namespaces[0];
            byte flag = br.ReadByte();
            int def_prop_off=0;
            if (flag == 1)
            {
                def_prop_off = br.ReadInt32();
            }
            ReadDebugInfo();
            ctn.si.describe = ctn.GetDescription();
            //ñîçäàåì scope äëÿ êëàññà
            //ctn = new wrapped_common_type_node(this, base_type, name, tal, ns, scope, loc, offset);
            //members[offset] = ctn;
            //AddMember(ctn, offset);
            RestoreAllMembers(ctn);

            return ctn;
		}
 public override void visit(enum_type_definition _enum_type_definition)
 {
     bool is_tuple = false;
     template_type_reference tuple = new template_type_reference();
     tuple.name = new named_type_reference(new ident_list(new ident("System"), new ident("Tuple")).idents);
     template_param_list tpl = new template_param_list();
     tuple.params_list = tpl;
     if (_enum_type_definition.enumerators != null)
         foreach (enumerator en in _enum_type_definition.enumerators.enumerators)
         {
             if (!(en.name is named_type_reference))
             {
                 is_tuple = true;
             }
             else
             {
                 named_type_reference ntr = en.name as named_type_reference;
                 if (ntr.names.Count > 1 || ntr.names.Count == 0)
                 {
                     is_tuple = true;
                 }
                 else
                 {
                     SymScope ss = cur_scope.FindName(ntr.FirstIdent.name);
                     if (ss != null && ss is TypeScope)
                     {
                         is_tuple = true;
                     }
                 }
             }
             tpl.Add(en.name);
         }
     if (is_tuple)
     {
         tuple.visit(this);
         return;
     }
     //throw new Exception("The method or operation is not implemented.");
     EnumScope enum_scope = new EnumScope(SymbolKind.Enum, cur_scope,
                                  TypeTable.get_compiled_type(new SymInfo(typeof(Enum).Name, SymbolKind.Enum, typeof(Enum).FullName), typeof(Enum)));
     enum_scope.loc = get_location(_enum_type_definition);
     enum_scope.topScope = cur_scope;
     List<ElementScope> elems = new List<ElementScope>();
     if (_enum_type_definition.enumerators != null)
         foreach (enumerator en in _enum_type_definition.enumerators.enumerators)
         {
             var name = (en.name as named_type_reference).FirstIdent.name;
             ElementScope ss = new ElementScope(new SymInfo(name, SymbolKind.Constant, name),/*cur_scope.FindName(PascalABCCompiler.TreeConverter.compiler_string_consts.integer_type_name)*/enum_scope, cur_scope);
             ss.is_static = true;
             ss.cnst_val = name;
             elems.Add(ss);
             ss.loc = get_location(en);
             cur_scope.AddName(name, ss);
             enum_scope.AddName(name, ss);
             enum_scope.AddEnumConstant(name);
             if (this.converter.controller.docs.ContainsKey(en))
                 ss.AddDocumentation(this.converter.controller.docs[en]);
         }
     for (int i = 0; i < elems.Count; i++)
         elems[i].MakeDescription();
     returned_scope = enum_scope;
 }
 public override void visit(enum_type_definition _enum_type_definition)
 {
     //throw new Exception("The method or operation is not implemented.");
     EnumScope enum_scope = new EnumScope(SymbolKind.Enum,cur_scope,
                                          TypeTable.get_compiled_type(new SymInfo(typeof(Enum).Name, SymbolKind.Enum,typeof(Enum).FullName),typeof(Enum)));
     enum_scope.loc = get_location(_enum_type_definition);
     enum_scope.topScope = cur_scope;
     List<ElementScope> elems = new List<ElementScope>();
     if (_enum_type_definition.enumerators != null)
     foreach (enumerator en in _enum_type_definition.enumerators.enumerators)
     {
     	ElementScope ss = new ElementScope(new SymInfo(en.name.name, SymbolKind.Constant, en.name.name),/*cur_scope.FindName(PascalABCCompiler.TreeConverter.compiler_string_consts.integer_type_name)*/enum_scope,cur_scope);
     	ss.is_static = true;
     	ss.cnst_val = en.name.name;
     	elems.Add(ss);
     	ss.loc = get_location(en);
     	cur_scope.AddName(en.name.name, ss);
     	enum_scope.AddName(en.name.name, ss);
     	enum_scope.AddEnumConstant(en.name.name);
     }
     for (int i=0; i<elems.Count; i++)
     	elems[i].MakeDescription();
     ret_tn = enum_scope;
 }