private EventsCollector InitializeEvents() { _cancellation.ThrowIfCancellationRequested(); var methods = GetAllGraphMethodsFromBaseToDerived(); var eventsCollector = new EventsCollector(this, _pxContext); int declarationOrder = 0; foreach (IMethodSymbol method in methods) { _cancellation.ThrowIfCancellationRequested(); var(eventType, eventSignatureType) = method.GetEventHandlerInfo(_pxContext); if (eventSignatureType == EventHandlerSignatureType.None || eventType == EventType.None) { continue; } GraphEventCategory eventCategory = GetEventCategoryByEventType(eventType); if (!IsValidGraphEvent(method, eventSignatureType, eventCategory)) { continue; } if (eventCategory == GraphEventCategory.Row) { eventsCollector.AddEvent(eventSignatureType, eventType, method, declarationOrder, _cancellation); } else if (eventCategory == GraphEventCategory.Field) { eventsCollector.AddFieldEvent(eventSignatureType, eventType, method, declarationOrder, _cancellation); } declarationOrder++; } return(eventsCollector); }
/// <summary> /// <see cref="CodeResolvingUtils.GetEventHandlerInfo"/> helper allows not only graph events but also helper methods with appropriate signature. /// However, for graph events semantic model we are interested only in graph events, so we need to rule out helper methods by checking their signature. /// </summary> /// <param name="eventCandidate">The event candidate.</param> /// <param name="signatureType">Type of the signature.</param> /// <param name="eventCategory">Category the event belongs to.</param> /// <returns/> private bool IsValidGraphEvent(IMethodSymbol eventCandidate, EventHandlerSignatureType signatureType, GraphEventCategory eventCategory) { if (eventCandidate.IsStatic || eventCandidate.Parameters.Length > 2 || eventCategory == GraphEventCategory.None) { return(false); } else if (signatureType != EventHandlerSignatureType.Default) { return(true); } const char underscore = '_'; if (eventCandidate.Name[0] == underscore || eventCandidate.Name[eventCandidate.Name.Length - 1] == underscore) { return(false); } int underscoresCount = eventCandidate.Name.Count(c => c == underscore); switch (eventCategory) { case GraphEventCategory.Row: return(underscoresCount == 1); case GraphEventCategory.Field: return(underscoresCount == 2); default: return(false); } }