diff --git a/src/AddIns/Misc/UnitTesting/Src/UnitTestsPad.cs b/src/AddIns/Misc/UnitTesting/Src/UnitTestsPad.cs index 3970e4acdd..ef4046643d 100644 --- a/src/AddIns/Misc/UnitTesting/Src/UnitTestsPad.cs +++ b/src/AddIns/Misc/UnitTesting/Src/UnitTestsPad.cs @@ -136,6 +136,11 @@ namespace ICSharpCode.UnitTesting if (project != null) { treeView.RemoveProject(project); } + + if (solutionFolder is ISolutionFolderContainer) { + // recurse into child folders that were also removed + ((ISolutionFolderContainer)solutionFolder).Folders.ForEach(SolutionFolderRemoved); + } } /// diff --git a/src/Main/Base/Project/Src/Project/Solution/Solution.cs b/src/Main/Base/Project/Src/Project/Solution/Solution.cs index 08c4b45f50..8ae733b856 100644 --- a/src/Main/Base/Project/Src/Project/Solution/Solution.cs +++ b/src/Main/Base/Project/Src/Project/Solution/Solution.cs @@ -672,10 +672,41 @@ namespace ICSharpCode.SharpDevelop.Project } } } + + // remove all configuration entries belonging to removed projects + prjSec.Items.RemoveAll( + item => { + if (item.Name.Contains(".")) { + string guid = item.Name.Substring(0, item.Name.IndexOf('.')); + if (!this.Projects.Any(p => string.Equals(p.IdGuid, guid, StringComparison.OrdinalIgnoreCase))) { + changed = true; + return true; + } + } + return false; + }); return changed; } #endregion + /// + /// Removes all configurations belonging to the specified project. + /// Is used to remove a project from the solution. + /// + internal void RemoveProjectConfigurations(string projectGuid) + { + ProjectSection prjSec = GetProjectConfigurationsSection(); + prjSec.Items.RemoveAll( + item => { + if (item.Name.Contains(".")) { + string guid = item.Name.Substring(0, item.Name.IndexOf('.')); + if (string.Equals(projectGuid, guid, StringComparison.OrdinalIgnoreCase)) + return true; // remove configuration + } + return false; + }); + } + #region GetProjectConfigurationsSection/GetPlatformNames public IList GetConfigurationNames() { diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs index 716c0d96e0..0152746dd0 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs @@ -320,6 +320,13 @@ namespace ICSharpCode.SharpDevelop } } + internal static void RemoveProjectContentForRemovedProject(IProject project) + { + lock (projectContents) { + projectContents.Remove(project); + } + } + public static IProjectContent GetProjectContent(IProject project) { lock (projectContents) { diff --git a/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs b/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs index 528b290b8d..f69aa2a74a 100644 --- a/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs +++ b/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs @@ -571,11 +571,24 @@ namespace ICSharpCode.SharpDevelop.Project if (folder.IdGuid == guid) { folder.Parent.RemoveFolder(folder); OnSolutionFolderRemoved(new SolutionFolderEventArgs(folder)); + HandleRemovedSolutionFolder(folder); break; } } } + static void HandleRemovedSolutionFolder(ISolutionFolder folder) + { + if (folder is IProject) { + OpenSolution.RemoveProjectConfigurations(folder.IdGuid); + ParserService.RemoveProjectContentForRemovedProject((IProject)folder); + } + if (folder is ISolutionFolderContainer) { + // recurse into child folders that were also removed + ((ISolutionFolderContainer)folder).Folders.ForEach(HandleRemovedSolutionFolder); + } + } + static void OnSolutionFolderRemoved(SolutionFolderEventArgs e) { if (SolutionFolderRemoved != null) {