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