private TypeScope internalInstance(TypeScope ts, List<TypeScope> gen_args) { if (ts is TemplateParameterScope || ts is UnknownScope) { int ind = this.generic_params.IndexOf(ts.Name); if (ind != -1) { return gen_args[ind]; } else return ts; } else if (ts is ArrayScope) { ArrayScope arr = null; if ((ts as ArrayScope).is_dynamic_arr) { arr = new ArrayScope(internalInstance(ts.elementType, gen_args), (ts as ArrayScope).indexes); arr.is_dynamic_arr = true; } else arr = new ArrayScope(internalInstance(ts.elementType, gen_args), (ts as ArrayScope).indexes); return arr; } else if (ts is TypeScope && ts.instances != null && ts.instances.Count > 0) { return ts.simpleGetInstance(gen_args); } else return ts; }
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; }
private TypeScope GetTypeReference() { byte b = br.ReadByte(); //(ssyy) Âñòàâèë switch âìåñòî óñëîâèé TypeScope tn; switch (b) { case 255: return null; case 1://åñëè òèï îïèñàí â ìîäóëå int offset = br.ReadInt32(); tn = (TypeScope)members[offset]; if (tn == null) return GetCommonType(offset); return tn; case 0://åñëè ýòî èìïîðòèð. òèï tn = null; int pos = br.ReadInt32(); tn = ext_members[pos] as TypeScope; if (tn != null) return tn; int tmp = (int)br.BaseStream.Position; br.BaseStream.Seek(ext_pos+pos,SeekOrigin.Begin); if ((ImportKind)br.ReadByte() == ImportKind.Common) { //tn = ReadCommonExtType(); //ext_members[pos] = tn; tn = new UnknownScope(new SymInfo("$", SymbolKind.Type,"$")); ext_members[pos] = tn; } else // ýòî íåòîâñêèé òèï { tn = ReadNetExtType(); ext_members[pos] = tn; } br.BaseStream.Seek(tmp,SeekOrigin.Begin); return tn; case 2://ýòî ìàññèâ //simple_array type = new simple_array(GetTypeReference(),br.ReadInt32()); TypeScope type = new ArrayScope(GetTypeReference(),new TypeScope[0]); return type; case 3://ýòî óêàçàòåëü TypeScope pointed_type = GetTypeReference(); return new PointerScope(pointed_type); case 4://ýòî äèíàìè÷åñêèé ìàññèâ ReadDebugInfo(); TypeScope elem_type = GetTypeReference(); return new ArrayScope(elem_type,null); case 6: //return GetTemplateInstance(); return null; case 7: return GetGenericInstance(); case 8: //return GetShortStringType(); return null; } return null; }
public override void visit(new_expr _new_expr) { _new_expr.type.visit(this); if (returned_scope != null && returned_scope is TypeScope) { TypeScope ts = returned_scope as TypeScope; if (_new_expr.new_array) { ts = new ArrayScope(ts,new TypeScope[1]{TypeTable.int_type}); (ts as ArrayScope).is_dynamic_arr = true; returned_scope = ts; return; } ProcScope tmp = ts.GetConstructor(); List<ProcScope> cnstrs = ts.GetConstructors(false); if (search_all) returned_scopes.AddRange(cnstrs.ToArray()); if (!on_bracket) { ProcScope[] constrs = cnstrs.ToArray(); ProcScope ps = select_method(constrs,_new_expr.params_list!=null?_new_expr.params_list.expressions.ToArray():null); if (ps != null) returned_scope = ps; else returned_scope = tmp; } else returned_scope = tmp; } }