public async static Task Run (MonoDevelop.Ide.Gui.Document doc) { if (!doc.Editor.IsSomethingSelected) return; var ad = doc.AnalysisDocument; if (ad == null) return; try { var selectionRange = doc.Editor.SelectionRange; var token = default(CancellationToken); var selection = new CSharpSelectionValidator (await SemanticDocument.CreateAsync (ad, token).ConfigureAwait (false), new TextSpan (selectionRange.Offset, selectionRange.Length), doc.GetOptionSet ()); var result = await selection.GetValidSelectionAsync (token).ConfigureAwait (false); if (!result.ContainsValidContext) return; var extractor = new CSharpMethodExtractor ((CSharpSelectionResult)result); var extractionResult = await extractor.ExtractMethodAsync (token).ConfigureAwait (false); var changes = await extractionResult.Document.GetTextChangesAsync (ad, token); using (var undo = doc.Editor.OpenUndoGroup ()) { foreach (var change in changes.OrderByDescending (ts => ts.Span.Start)) { doc.Editor.ReplaceText (change.Span.Start, change.Span.Length, change.NewText); } // hack to remove the redundant private modifier. if (doc.Editor.GetTextAt (extractionResult.MethodDeclarationNode.SpanStart, "private ".Length) == "private ") { doc.Editor.RemoveText (extractionResult.MethodDeclarationNode.SpanStart, "private ".Length); } } doc.UpdateParseDocument (); var info = RefactoringSymbolInfo.GetSymbolInfoAsync (doc, extractionResult.InvocationNameToken.Span.Start).Result; var sym = info.DeclaredSymbol ?? info.Symbol; if (sym != null) new MonoDevelop.Refactoring.Rename.RenameRefactoring ().Rename (sym); } catch (Exception e) { LoggingService.LogError ("Error while extracting method", e); } }
public static void FormatText (this AstNode node, MonoDevelop.Ide.Gui.Document doc) { doc.UpdateParseDocument (); MonoDevelop.CSharp.Formatting.OnTheFlyFormatter.Format (doc, node.StartLocation); }