コード例 #1
0
        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();
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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();
                    });
                }
            }
        }