From cc0f7f60e72ec4e37780b8c9ae05cee1521e2b94 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 26 Sep 2009 12:34:07 +0000 Subject: [PATCH] Fix bug in "AddUsingDeclaration" refactoring: when running the refactoring two times quickly after another (without waiting for a reparse), the list of using declarations would get corrupted. Use correct sorting logic for inserting using declarations. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@5001 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../NamespaceRefactoringService.cs | 17 +++++++++++++---- .../RefactoringMenuBuilder.cs | 1 + 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/NamespaceRefactoringService.cs b/src/Main/Base/Project/Src/Services/RefactoringService/NamespaceRefactoringService.cs index 716ea03db1..7b9b7e7249 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/NamespaceRefactoringService.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/NamespaceRefactoringService.cs @@ -32,7 +32,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring } else if (!IsSystemNamespace(u1) && IsSystemNamespace(u2)) { return 1; } - return a.Usings[0].CompareTo(b.Usings[0]); + return u1.CompareTo(u2); } if (a.Aliases.Count != 0 && b.Aliases.Count != 0) { return a.Aliases.Keys.First().CompareTo(b.Aliases.Keys.First()); @@ -95,6 +95,17 @@ namespace ICSharpCode.SharpDevelop.Refactoring public static void AddUsingDeclaration(ICompilationUnit cu, IDocument document, string newNamespace, bool sortExistingUsings) { + if (cu == null) + throw new ArgumentNullException("cu"); + if (document == null) + throw new ArgumentNullException("document"); + if (newNamespace == null) + throw new ArgumentNullException("newNamespace"); + + ParseInformation info = ParserService.ParseFile(cu.FileName, document.TextContent); + if (info != null) + cu = info.MostRecentCompilationUnit; + IUsing newUsingDecl = new DefaultUsing(cu.ProjectContent); newUsingDecl.Usings.Add(newNamespace); @@ -104,9 +115,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring } bool inserted = false; for (int i = 0; i < newUsings.Count; i++) { - if (newUsings[i].Usings.Count >= 1 - && cu.ProjectContent.Language.NameComparer.Compare(newNamespace, newUsings[i].Usings[0]) <= 0) - { + if (CompareUsings(newUsingDecl, newUsings[i]) <= 0) { newUsings.Insert(i, newUsingDecl); inserted = true; break; diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs b/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs index 6f4caf2db1..011e9eec32 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs @@ -188,6 +188,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring item.DropDownItems.Add(subItem); subItem.Click += delegate { NamespaceRefactoringService.AddUsingDeclaration(callingClass.CompilationUnit, textArea.Document, newNamespace, true); + ParserService.StartAsyncParse(callingClass.CompilationUnit.FileName, textArea.Document.TextContent); textArea.MotherTextEditorControl.Refresh(); }; }