public async Task <SolutionFolderItem> ReloadItem(ProgressMonitor monitor, SolutionFolderItem sitem) { if (Items.IndexOf(sitem) == -1) { throw new InvalidOperationException("Solution item '" + sitem.Name + "' does not belong to folder '" + Name + "'"); } if (sitem is SolutionItem item) { // Load the new item SolutionItem newItem; try { if (ParentSolution.IsSolutionItemEnabled(item.FileName)) { using (var ctx = new SolutionLoadContext(ParentSolution)) newItem = await Services.ProjectService.ReadSolutionItem(monitor, item.FileName, null, ctx : ctx, itemGuid : item.ItemId); } else { UnknownSolutionItem e = new UnloadedSolutionItem() { FileName = item.FileName }; e.ItemId = item.ItemId; e.TypeGuid = item.TypeGuid; newItem = e; } } catch (Exception ex) { newItem = new UnknownSolutionItem { LoadError = ex.Message, FileName = item.FileName }; } if (!Items.Contains(item)) { // The old item is gone, which probably means it has already been reloaded (BXC20615), or maybe removed. // In this case, there isn't anything else we can do newItem.Dispose(); // Find the replacement if it exists return(Items.OfType <SolutionItem> ().FirstOrDefault(it => it.FileName == item.FileName)); } // Replace in the file list Items.Replace(item, newItem); item.ParentFolder = null; DisconnectChildEntryEvents(item); ConnectChildEntryEvents(newItem); NotifyModified("Items"); OnItemRemoved(new SolutionItemChangeEventArgs(item, ParentSolution, true) { ReplacedItem = item }, true); OnItemAdded(new SolutionItemChangeEventArgs(newItem, ParentSolution, true) { ReplacedItem = item }, true); item.Dispose(); return(newItem); } return(sitem); }
public async Task <SolutionFolderItem> ReloadItem(ProgressMonitor monitor, SolutionFolderItem sitem) { if (Items.IndexOf(sitem) == -1) { throw new InvalidOperationException("Solution item '" + sitem.Name + "' does not belong to folder '" + Name + "'"); } if (sitem is SolutionItem item) { // Load the new item SolutionItem newItem; try { if (ParentSolution.IsSolutionItemEnabled(item.FileName)) { using (var ctx = new SolutionLoadContext(ParentSolution)) newItem = await Services.ProjectService.ReadSolutionItem(monitor, item.FileName, null, ctx : ctx, itemGuid : item.ItemId); } else { UnknownSolutionItem e = new UnloadedSolutionItem() { FileName = item.FileName }; e.ItemId = item.ItemId; e.TypeGuid = item.TypeGuid; newItem = e; } } catch (Exception ex) { newItem = new UnknownSolutionItem { LoadError = ex.Message, FileName = item.FileName }; } if (!Items.Contains(item)) { // The old item is gone, which probably means it has already been reloaded (BXC20615), or maybe removed. // In this case, there isn't anything else we can do newItem.Dispose(); // Find the replacement if it exists return(Items.OfType <SolutionItem> ().FirstOrDefault(it => it.FileName == item.FileName)); } // Replace in the file list Items.Replace(item, newItem); item.ParentFolder = null; DisconnectChildEntryEvents(item); ConnectChildEntryEvents(newItem); // Shutdown project builder before the ItemAdded event is fired. This should prevent the old out of // date project builder being used by the TypeSystemService when getting reference information. The // TypeSystemService loads the project when the ItemAdded event is fired before the item is disposed. // Disposing the project will also shutdown the project builder but this happens too late and can // result in the old project builder being used which does not have the latest project xml. if (item is Project) { await RemoteBuildEngineManager.UnloadProject(item.FileName); } NotifyModified("Items"); OnItemRemoved(new SolutionItemChangeEventArgs(item, ParentSolution, true) { ReplacedItem = item }, true); OnItemAdded(new SolutionItemChangeEventArgs(newItem, ParentSolution, true) { ReplacedItem = item }, true); item.Dispose(); return(newItem); } return(sitem); }