Example #1
0
        protected override async Task ComputeRefactoringsAsync(CodeRefactoringContext context, SemanticModel semanticModel, PXContext pxContext)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);

            var methodNode = root?.FindNode(context.Span)?.GetDeclaringMethodNode();

            if (methodNode == null)
            {
                return;
            }

            IMethodSymbol methodSymbol = semanticModel.GetDeclaredSymbol(methodNode, context.CancellationToken);

            if (IsSuitableForRefactoring(methodSymbol, pxContext))
            {
                var eventHandlerInfo = methodSymbol.GetEventHandlerInfo(pxContext);

                if (eventHandlerInfo.SignatureType == EventHandlerSignatureType.Default &&
                    methodSymbol.Name.EndsWith("_" + eventHandlerInfo.Type, StringComparison.Ordinal) &&
                    pxContext.Events.EventHandlerSignatureTypeMap.TryGetValue(                        // check that there is a corresponding generic event args symbol
                        new EventInfo(eventHandlerInfo.Type, EventHandlerSignatureType.Generic), out var genericArgsSymbol))
                {
                    (string dacName, string fieldName) = ParseMethodName(methodSymbol.Name, eventHandlerInfo.Type);

                    string     title      = nameof(Resources.EventHandlerSignatureCodeActionTitle).GetLocalized().ToString();
                    CodeAction codeAction =
                        CodeAction.Create(title, ct => ChangeSignatureAsync(context.Document, root, semanticModel, methodNode, methodSymbol,
                                                                            eventHandlerInfo.Type, genericArgsSymbol, dacName, fieldName, ct),
                                          title);
                    context.RegisterRefactoring(codeAction);
                }
            }
        }
Example #2
0
 /// <summary>
 /// Returns event handler type for the provided method symbol.
 /// </summary>
 /// <param name="symbol">Method symbol for the event handler</param>
 /// <param name="pxContext">PXContext instance</param>
 /// <returns>Event Type (e.g. RowSelecting). If method is not an event handler, returns <code>EventType.None</code>.</returns>
 public static EventType GetEventHandlerType(this IMethodSymbol symbol, PXContext pxContext)
 {
     return(symbol.GetEventHandlerInfo(pxContext).EventType);
 }