public override void DoGlobalOperationOn (IEntity entity, Action<RefactoringContext, Script, AstNode> callback, string operationName = null) { using (var monitor = IdeApp.Workbench.ProgressMonitors.GetBackgroundProgressMonitor (operationName ?? GettextCatalog.GetString ("Performing refactoring task..."), null)) { var col = ReferenceFinder.FindReferences (entity, true, monitor); string oldFileName = null; MDRefactoringContext ctx = null; MDRefactoringScript script = null; TextEditorData data = null; bool hadBom = false; System.Text.Encoding encoding = null; bool isOpen = true; foreach (var r in col) { var memberRef = r as CSharpReferenceFinder.CSharpMemberReference; if (memberRef == null) continue; if (oldFileName != memberRef.FileName) { if (oldFileName != null && !isOpen) { script.Dispose (); Mono.TextEditor.Utils.TextFileUtility.WriteText (oldFileName, data.Text, encoding, hadBom); } data = TextFileProvider.Instance.GetTextEditorData (memberRef.FileName, out hadBom, out encoding, out isOpen); var project = memberRef.Project; ParsedDocument parsedDocument; using (var reader = new StreamReader (data.OpenStream ())) parsedDocument = new MonoDevelop.CSharp.Parser.TypeSystemParser ().Parse (true, memberRef.FileName, reader, project); var resolver = new CSharpAstResolver (TypeSystemService.GetCompilation (project), memberRef.SyntaxTree, parsedDocument.ParsedFile as CSharpUnresolvedFile); ctx = new MDRefactoringContext (project as DotNetProject, data, parsedDocument, resolver, memberRef.AstNode.StartLocation, this.context.CancellationToken); script = new MDRefactoringScript (ctx, FormattingOptions); oldFileName = memberRef.FileName; } callback (ctx, script, memberRef.AstNode); } if (oldFileName != null && !isOpen) { script.Dispose (); Mono.TextEditor.Utils.TextFileUtility.WriteText (oldFileName, data.Text, encoding, hadBom); } } }
public override void DoGlobalOperationOn (IEnumerable<IEntity> entities, Action<RefactoringContext, Script, IEnumerable<AstNode>> callback, string operationName = null) { using (var monitor = IdeApp.Workbench.ProgressMonitors.GetBackgroundProgressMonitor (operationName ?? GettextCatalog.GetString ("Performing refactoring task..."), null)) { var col = entities.SelectMany (entity => ReferenceFinder.FindReferences (entity, true, monitor)).OfType<CSharpReferenceFinder.CSharpMemberReference> ().GroupBy(reference => reference.FileName); foreach (var r in col) { string filename = r.Key; bool isOpen; System.Text.Encoding encoding; bool hadBom; var data = TextFileProvider.Instance.GetTextEditorData (filename, out hadBom, out encoding, out isOpen); var firstReference = r.First (); var project = firstReference.Project; ParsedDocument parsedDocument; using (var reader = new StreamReader (data.OpenStream ())) parsedDocument = new MonoDevelop.CSharp.Parser.TypeSystemParser ().Parse (true, filename, reader, project); var resolver = new CSharpAstResolver (TypeSystemService.GetCompilation (project), firstReference.SyntaxTree, parsedDocument.ParsedFile as CSharpUnresolvedFile); var ctx = new MDRefactoringContext (project as DotNetProject, data, parsedDocument, resolver, firstReference.AstNode.StartLocation, this.context.CancellationToken); var script = new MDRefactoringScript (ctx, FormattingOptions); callback (ctx, script, r.Select (reference => reference.AstNode)); if (!isOpen) { script.Dispose (); Mono.TextEditor.Utils.TextFileUtility.WriteText (filename, data.Text, encoding, hadBom); } } } }