static void DeleteExistingDefinition(ITextSnapshot snapshot, Parser.Result result) { DTE2 dte = Global.GetDTE2(); ITextEdit edit = snapshot.TextBuffer.CreateEdit(); try { ITextSnapshotLine currentLine; for (int i = result.StartLine - 1; i <= result.EndLine - 1; i++) { currentLine = snapshot.GetLineFromLineNumber(i); edit.Delete(currentLine.Start.Position, currentLine.LengthIncludingLineBreak); } //remove separating empty line if found if (snapshot.LineCount > result.EndLine) { currentLine = snapshot.GetLineFromLineNumber(result.EndLine); if (string.IsNullOrWhiteSpace(currentLine.GetText())) { edit.Delete(currentLine.Start.Position, currentLine.LengthIncludingLineBreak); } } edit.Apply(); } catch { edit.Cancel(); } dte.ActiveDocument.Save(); }
static string WriteNewDefinition(Parser.Result result, Project project) { DTE2 dte = Global.GetDTE2(); string dir = Path.GetDirectoryName(dte.ActiveDocument.FullName); string fileName = result.TypeName + ".cs"; fileName = Path.Combine(dir, fileName); fileName = fileName.Replace("<", "") .Replace(">", ""); if (File.Exists(fileName)) { string newFileName = fileName; for (int i = 2; i <= 10; i++) { newFileName = Path.Combine(dir, Path.GetFileNameWithoutExtension(fileName) + "_" + i + ".cs"); if (!File.Exists(newFileName)) { break; } } if (File.Exists(newFileName)) { using (var dialog = new SaveFileDialog()) { dialog.InitialDirectory = dir; dialog.FileName = fileName; if (dialog.ShowDialog() == DialogResult.OK) { newFileName = dialog.FileName; } else { return(null); //user canceled everything } } } fileName = newFileName; } File.WriteAllText(fileName, result.TypeDefinition); project.ProjectItems.AddFromFile(fileName); return(fileName); }
public void ExecuteSingle(int line = -1, Project destProject = null, bool openWhenDone = true) { IWpfTextView textView = Global.GetTextView(); ITextSnapshot snapshot = textView.TextSnapshot; if (snapshot != snapshot.TextBuffer.CurrentSnapshot) { return; } if (!textView.Selection.IsEmpty) { return; } int caretLineNumber = line; if (caretLineNumber == -1) { caretLineNumber = snapshot.GetLineNumberFromPosition(textView.Caret.Position.BufferPosition); } string code = snapshot.GetText(); string header = GetUserDefinedHeader(); // caretLineNumber = caretLineNumber + 1; // NRefactory parser is 1-based // Parser.Result result = Parser.FindTypeDeclarationNRefactory(code, caretLineNumber, header); Parser.Result result = Parser.FindTypeDeclaration(code, caretLineNumber, header); if (!result.Success) { System.Windows.MessageBox.Show("Cannot find any type definition.\nPlease ensure that the document has no errors and the cursor is placed inside of the type definition.", "'Move Type To File' Extension"); return; } DTE2 dte = Global.GetDTE2(); Project project = destProject; if (project == null) { Project[] containingProjects = GetParentProject(dte, dte.ActiveDocument.FullName); if (containingProjects.Length == 1) { project = containingProjects.First(); } else { project = SelectProjectManually(); } } if (project == null) //operation was canceled by the user { return; } string file = WriteNewDefinition(result, project); if (file != null) { DeleteExistingDefinition(snapshot, result); if (openWhenDone) { dte.ItemOperations.OpenFile(file); Task.Run(() => { System.Threading.Thread.Sleep(1300); FormatActiveDocument(); }); } } }