public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) { var document = context.Document; if (document.Project.Solution.Workspace.Kind == WorkspaceKind.MiscellaneousFiles) { return; } var span = context.Span; if (!span.IsEmpty) { return; } var cancellationToken = context.CancellationToken; if (cancellationToken.IsCancellationRequested) { return; } var model = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); if (model.IsFromGeneratedCode(cancellationToken)) { return; } var root = await model.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); var token = root.FindToken(span.Start); if (!token.IsKind(SyntaxKind.IdentifierToken)) { return; } var node = token.Parent as VariableDeclaratorSyntax; if (node == null) { return; } var declaredSymbol = model.GetDeclaredSymbol(node, cancellationToken); if (declaredSymbol == null || !declaredSymbol.IsKind(SymbolKind.Event)) { return; } if (declaredSymbol.ContainingSymbol.IsInterfaceType()) { return; } var invokeMethod = declaredSymbol.GetReturnType().GetDelegateInvokeMethod(); if (invokeMethod == null) { return; } context.RegisterRefactoring( CodeActionFactory.CreateInsertion( span, DiagnosticSeverity.Info, GettextCatalog.GetString("Create event invocator"), t2 => { SyntaxNode eventInvocator = CreateEventInvocator(document, declaredSymbol); return(Task.FromResult(new InsertionResult(context, eventInvocator, declaredSymbol.ContainingType, declaredSymbol.Locations.First()))); } ) ); }