/// <summary> /// Conditionally removes existing regions that should not remain and returns an updated /// collection including the members of removed regions. /// </summary> /// <param name="codeItems">The code items.</param> /// <returns>An updated code items collection.</returns> private IEnumerable <BaseCodeItem> RegionsRemoveExisting(IEnumerable <BaseCodeItem> codeItems) { if (!Settings.Default.Reorganizing_RegionsRemoveExistingRegions) { return(codeItems); } while (true) { var regionsToRemove = _generateRegionLogic.GetRegionsToRemove(codeItems); _removeRegionLogic.RemoveRegions(regionsToRemove); var removedRegionsChildren = regionsToRemove.SelectMany(x => x.Children); // Update the code items collection by excluding the removed regions and including those region's direct children. codeItems = codeItems.Except(regionsToRemove).Union(removedRegionsChildren); // If there were any nested regions in those regions that were removed, loop back over again. if (removedRegionsChildren.Any(x => x is CodeItemRegion)) { continue; } return(codeItems); } }
/// <summary> /// Conditionally removes existing regions that should not remain and returns an updated /// collection including the members of removed regions. /// </summary> /// <param name="codeItems">The code items.</param> /// <returns>An updated code items collection.</returns> private IEnumerable <BaseCodeItem> RegionsRemoveExisting(IEnumerable <BaseCodeItem> codeItems) { if (!Settings.Default.Reorganizing_RegionsRemoveExistingRegions) { return(codeItems); } while (true) { var regionsToRemove = _generateRegionLogic.GetRegionsToRemove(codeItems).ToList(); var regionsToRemoveChildren = regionsToRemove.SelectMany(x => x.Children).ToList(); var regionsToRemoveChildrenRegions = regionsToRemoveChildren.OfType <CodeItemRegion>().ToList(); // Nested regions do not track points well, so offset cursor position by 1 as a workaround. foreach (var nestedRegion in regionsToRemoveChildrenRegions) { nestedRegion.StartPoint.CharRight(); nestedRegion.EndPoint.CharRight(); } _removeRegionLogic.RemoveRegions(regionsToRemove); // Reverse offset of cursor position for nested regions. foreach (var nestedRegion in regionsToRemoveChildrenRegions) { nestedRegion.StartPoint.CharLeft(); nestedRegion.EndPoint.CharLeft(); } // Update the code items collection by excluding the removed regions and including those region's direct children. codeItems = codeItems.Except(regionsToRemove).Union(regionsToRemoveChildren); // If there were any nested regions in those regions that were removed, loop back over again. if (regionsToRemoveChildrenRegions.Any()) { continue; } return(codeItems); } }