public async Task Rename (ISymbol symbol)
{
var solution = IdeApp.ProjectOperations.CurrentSelectedSolution;
var ws = TypeSystemService.GetWorkspace (solution);
var currentSolution = ws.CurrentSolution;
var cts = new CancellationTokenSource ();
var newSolution = await MessageService.ExecuteTaskAndShowWaitDialog (Task.Run (() => Renamer.RenameSymbolAsync (currentSolution, symbol, "_" + symbol.Name + "_", ws.Options, cts.Token)), GettextCatalog.GetString ("Looking for all references"), cts);
var projectChanges = currentSolution.GetChanges (newSolution).GetProjectChanges ().ToList ();
var changedDocuments = new HashSet<string> ();
foreach (var change in projectChanges) {
foreach (var changedDoc in change.GetChangedDocuments ()) {
changedDocuments.Add (ws.CurrentSolution.GetDocument (changedDoc).FilePath);
}
}
if (changedDocuments.Count > 1) {
using (var dlg = new RenameItemDialog (symbol, this))
MessageService.ShowCustomDialog (dlg);
return;
}
var projectChange = projectChanges [0];
var changes = projectChange.GetChangedDocuments ().ToList ();
if (changes.Count != 1 || symbol.Kind == SymbolKind.NamedType) {
using (var dlg = new RenameItemDialog (symbol, this))
MessageService.ShowCustomDialog (dlg);
return;
}
var doc = IdeApp.Workbench.ActiveDocument;
var editor = doc.Editor;
var links = new List<TextLink> ();
var link = new TextLink ("name");
var cd = changes [0];
var oldDoc = projectChange.OldProject.GetDocument (cd);
var newDoc = projectChange.NewProject.GetDocument (cd);
var oldVersion = editor.Version;
foreach (var textChange in await oldDoc.GetTextChangesAsync (newDoc)) {
var segment = new TextSegment (textChange.Span.Start, textChange.Span.Length);
if (segment.Offset <= editor.CaretOffset && editor.CaretOffset <= segment.EndOffset) {
link.Links.Insert (0, segment);
} else {
link.AddLink (segment);
}
}
links.Add (link);
editor.StartTextLinkMode (new TextLinkModeOptions (links, (arg) => {
//If user cancel renaming revert changes
if (!arg.Success) {
var textChanges = editor.Version.GetChangesTo (oldVersion).ToList ();
foreach (var v in textChanges) {
editor.ReplaceText (v.Offset, v.RemovalLength, v.InsertedText);
}
}
}));
}