private void WriteEventReference(event_node ev) { byte is_def = 0; int offset = GetEventReference(ev, ref is_def); bw.Write(is_def); bw.Write(offset); }
private int GetEventReference(event_node ev, ref byte is_def) { if (ev.semantic_node_type == semantic_node_type.compiled_event) { is_def = 2; compiled_event cev = (compiled_event)ev; ImportedEntity ie = null; if (ext_members.TryGetValue(cev, out ie)) { return ie.index * ie.GetSize(); } //заполняем структуру в списке импортируемых сущностей ie = new ImportedEntity(); ie.index = imp_entitles.Count; ie.flag = ImportKind.DotNet; ie.num_unit = GetAssemblyToken(cev.event_info.DeclaringType.Assembly); //ie.offset = (int)ctn.compiled_type.MetadataToken;//токен для типа (уникален в сборке) ie.offset = GetTokenForNetEntity(cev.event_info.DeclaringType); int offset = imp_entitles.Count * ie.GetSize(); imp_entitles.Add(ie);//добавляем структуру ext_members[cev] = ie; return offset;//возвращаем смещение относительно начала списка импорт. сущ-тей } else if (ev.semantic_node_type == semantic_node_type.common_namespace_event) { int off = 0; if (members.TryGetValue(ev, out off)) //если этот тип описан в этом модуле { is_def = 4; return off;//возвращаем его смещение } is_def = 3; ImportedEntity ie = null; if (ext_members.TryGetValue(ev, out ie)) { return ie.index * ie.GetSize(); } ie = new ImportedEntity(); ie.flag = ImportKind.Common; ie.num_unit = GetUnitReference((ev as common_namespace_event).namespace_node); ie.offset = GetExternalOffset(ev); int offset = imp_entitles.Count * ie.GetSize(); ie.index = imp_entitles.Count; imp_entitles.Add(ie); ext_members[ev] = ie; return offset; } else { int off = 0; if (members.TryGetValue(ev, out off)) //если этот тип описан в этом модуле { is_def = 1; return off;//возвращаем его смещение } is_def = 0; ImportedEntity ie = null; if (ext_members.TryGetValue(ev, out ie)) { return ie.index * ie.GetSize(); } ie = new ImportedEntity(); ie.flag = ImportKind.Common; ie.num_unit = GetExtTypeReference((ev as common_event).cont_type); ie.offset = GetExternalOffset(ev); int offset = imp_entitles.Count * ie.GetSize(); ie.index = imp_entitles.Count; imp_entitles.Add(ie); ext_members[ev] = ie; return offset; } }
public nonstatic_event_reference(expression_node obj, event_node en, location loc) : base(en, loc) { _obj = obj; }
public static_event_reference(event_node en, location loc) :base(en.delegate_type, loc) { _en = en; }
public static_event_reference(event_node en, location loc) : base(en.delegate_type, loc) { _en = en; }