internal void ClearOldLinkedCode() { Log.WriteLine("Housekeeping old Linked Code."); if (RootXelement != null) { if (StartPlaceHolder != null && EndPlaceHolder != null) { try { string oldLinkedXml = "<root>" + OldLinkedXml + "</root>"; if (oldLinkedXml.Contains("ItemGroup")) { XElement keeperElements = XElement.Parse(oldLinkedXml); // http://stackoverflow.com/a/11644640/492 foreach (XElement descendant in keeperElements.DescendantsAndSelf().Where(e => e.Attribute("Include") != null)) { XAttribute xAttribute = descendant.Attribute("Include"); if (xAttribute != null /*&& !xAttribute.Value.StartsWith("..")*/) { Keepers.Add(descendant); // keep stray code that is not a relative link. VS *may* have added it here. } } if (Keepers.Any()) { Log.WriteLine($"Found {Keepers.Count} potential Project Items in the Linked Zone to rescue.", ConsoleColor.Cyan); } } if (StartPlaceHolder != null && EndPlaceHolder != null && StartPlaceHolder.IsBefore(EndPlaceHolder)) { XNode startNode = StartPlaceHolder; while (startNode.NextNode != EndPlaceHolder) { startNode.NextNode.Remove(); } } foreach (XElement itemGroup in ItemGroups) { if (itemGroup.IsEmpty || (!itemGroup.Descendants().Any() && string.IsNullOrEmpty(itemGroup.Value))) { itemGroup.Remove(); } } ItemGroups = RootXelement?.Elements(Settings.MSBuild + "ItemGroup").ToList(); } catch (Exception e) { App.Crash(e, "Bad Proj No ItemGroups: " + DestProjAbsolutePath); } } Log.WriteLine("finished parsing source project xml.", ConsoleColor.Gray); } }
/// <summary> Reads XML of between the Linked zone placeholders. Does not add a <c> <Root> </c> element </summary> internal string ReadLinkedXml() { var xmlBuilder = new StringBuilder(); if (StartPlaceHolder != null && EndPlaceHolder != null && StartPlaceHolder.IsBefore(EndPlaceHolder)) { XNode startNode = StartPlaceHolder; while (startNode.NextNode != EndPlaceHolder) { xmlBuilder.Append(startNode.NextNode); startNode = startNode.NextNode; } return(xmlBuilder.ToString()); } App.Crash($"Problem with placeholders in {DestProjAbsolutePath}. Has Start: {StartPlaceHolder != null}, " + $"has End: {EndPlaceHolder != null}, Start is before End: {StartPlaceHolder?.IsBefore(EndPlaceHolder)}"); return(null); // for the compiler, it never comes back from the crash }
internal void ClearOldLinkedCode() { Log.WriteLine("Housekeeping old Linked Code.", ConsoleColor.White, ConsoleColor.DarkGray); if (RootXelement != null) { if (StartPlaceHolder != null && EndPlaceHolder != null) { try { string oldXml = "<root>" + OldLinkedXml + "</root>"; if (oldXml.Contains("ItemGroup")) { XElement keeperElements = XElement.Parse(oldXml); // http://stackoverflow.com/a/11644640/492 foreach (XElement descendant in keeperElements.DescendantsAndSelf().Where(e => (e.Attribute("Include") ?? e.Attribute("Exclude")) != null)) { XAttribute xAttribute = descendant.Attribute("Include") ?? descendant.Attribute("Exclude"); if (xAttribute != null) { Keepers.Add(descendant); // keep stray code that is not a relative link. VS *may* have added it here. } } if (Keepers.Any()) { Log.WriteLine($"Found {Keepers.Count} potential Project Items in the Linked Zone to rescue.", ConsoleColor.Cyan); } } if (StartPlaceHolder != null && EndPlaceHolder != null && StartPlaceHolder.IsBefore(EndPlaceHolder)) { XNode startNode = StartPlaceHolder; while (startNode.NextNode != EndPlaceHolder) { startNode.NextNode.Remove(); } } foreach (XElement itemGroup in ItemGroups) { if (itemGroup.IsEmpty || (!itemGroup.Descendants().Any() && string.IsNullOrEmpty(itemGroup.Value))) { itemGroup.Remove(); } /*else if (itemGroup.IsAfter(StartPlaceHolder) && itemGroup.IsBefore(EndPlaceHolder)) * itemGroup.Remove();*/ // System.InvalidOperationException: A common ancestor is missing. } ItemGroups = RootXelement?.Elements(Settings.MSBuild + "ItemGroup").ToList(); } catch (Exception e) { App.Crash(e, $"FAILed clearing old linked code from: {DestProjAbsolutePath}"); } } Log.WriteLine("finished clearing old linked XML from source project", ConsoleColor.Gray); } }