Microsoft.CSharp.RuntimeBinder.SymbolTable.AddEventToSymbolTable C# (CSharp) Method

AddEventToSymbolTable() private method

private AddEventToSymbolTable ( EventInfo eventInfo, AggregateSymbol aggregate, Microsoft.CSharp.RuntimeBinder.Semantics.FieldSymbol addedField ) : Microsoft.CSharp.RuntimeBinder.Semantics.EventSymbol
eventInfo System.Reflection.EventInfo
aggregate Microsoft.CSharp.RuntimeBinder.Semantics.AggregateSymbol
addedField Microsoft.CSharp.RuntimeBinder.Semantics.FieldSymbol
return Microsoft.CSharp.RuntimeBinder.Semantics.EventSymbol
        private EventSymbol AddEventToSymbolTable(EventInfo eventInfo, AggregateSymbol aggregate, FieldSymbol addedField)
        {
            EventSymbol ev = _symbolTable.LookupSym(
                GetName(eventInfo.Name),
                aggregate,
                symbmask_t.MASK_EventSymbol) as EventSymbol;
            if (ev != null)
            {
                Debug.Assert(ev.AssociatedEventInfo == eventInfo);
                return ev;
            }

            ev = _symFactory.CreateEvent(GetName(eventInfo.Name), aggregate, null);
            ev.AssociatedEventInfo = eventInfo;

            // EventSymbol
            ACCESS access = ACCESS.ACC_PRIVATE;
            if (eventInfo.AddMethod != null)
            {
                ev.methAdd = AddMethodToSymbolTable(eventInfo.AddMethod, aggregate, MethodKindEnum.EventAccessor);
                ev.methAdd.SetEvent(ev);
                ev.isOverride = ev.methAdd.IsOverride();

                access = ev.methAdd.GetAccess();
            }
            if (eventInfo.RemoveMethod != null)
            {
                ev.methRemove = AddMethodToSymbolTable(eventInfo.RemoveMethod, aggregate, MethodKindEnum.EventAccessor);
                ev.methRemove.SetEvent(ev);
                ev.isOverride = ev.methRemove.IsOverride();

                access = ev.methRemove.GetAccess();
            }
            Debug.Assert(ev.methAdd != null || ev.methRemove != null);
            ev.isStatic = false;
            ev.type = GetCTypeFromType(eventInfo.EventHandlerType);

            // Symbol
            ev.SetAccess(access);

            Type eventRegistrationTokenType = EventRegistrationTokenType;
            if ((object)eventRegistrationTokenType != null && (object)WindowsRuntimeMarshalType != null &&
                ev.methAdd.RetType.AssociatedSystemType == eventRegistrationTokenType &&
                ev.methRemove.Params.Item(0).AssociatedSystemType == eventRegistrationTokenType)
            {
                ev.IsWindowsRuntimeEvent = true;
            }

            // If we imported a field on the same aggregate, with the same name, and it also
            // has the same type, then that field is the backing field for this event, and
            // we mark it as such. This is used for the CSharpIsEventBinder.
            // In the case of a WindowsRuntime event, the field will be of type
            // EventRegistrationTokenTable<delegateType>.
            Type eventRegistrationTokenTableType;
            if (addedField != null && addedField.GetType() != null &&
                (addedField.GetType() == ev.type ||
                (
                    addedField.GetType().AssociatedSystemType.IsConstructedGenericType &&
                    (object)(eventRegistrationTokenTableType = EventRegistrationTokenTableType) != null &&
                    addedField.GetType().AssociatedSystemType.GetGenericTypeDefinition() == eventRegistrationTokenTableType &&
                    addedField.GetType().AssociatedSystemType.GenericTypeArguments[0] == ev.type.AssociatedSystemType)
                ))
            {
                addedField.isEvent = true;
            }

            return ev;
        }
        #endregion