/// <summary> /// Recursive method for creating a code item for the specified code element, adding it to /// the specified code items set and recursing into all of the code element's children. /// </summary> /// <param name="codeItems">The code items set for accumulation.</param> /// <param name="codeElement">The CodeElement to walk (add and recurse).</param> private static void RetrieveCodeItemsRecursively(SetCodeItems codeItems, CodeElement codeElement) { var parentCodeItem = FactoryCodeItems.CreateCodeItemElement(codeElement); if (parentCodeItem != null) { codeItems.Add(parentCodeItem); } if (codeElement.Children != null) { RetrieveCodeItemsFromElements(codeItems, codeElement.Children); } }
/// <summary> /// Recursively gets the children in a depth-first fashion for the specified parent without /// delving into nested element parents. /// </summary> /// <param name="parent">The parent.</param> /// <returns>The recursive set of children.</returns> public static SetCodeItems GetChildrenRecursive(this ICodeItemParent parent) { var children = new SetCodeItems(); foreach (var child in parent.Children) { children.Add(child); var childAsParent = child as ICodeItemParent; if (childAsParent != null && !(child is BaseCodeItemElementParent)) { children.AddRange(childAsParent.GetChildrenRecursive()); } } return(children); }
/// <summary> /// Organizes the specified code items by file sort order. /// </summary> /// <param name="rawCodeItems">The raw code items.</param> /// <returns>The organized code items.</returns> private static SetCodeItems OrganizeCodeItemsByFileSortOrder(IEnumerable <BaseCodeItem> rawCodeItems) { var organizedCodeItems = new SetCodeItems(); if (rawCodeItems != null) { // Sort the raw list of code items by starting position. var sortedCodeItems = rawCodeItems.OrderBy(x => x.StartOffset); var codeItemStack = new Stack <BaseCodeItem>(); foreach (var codeItem in sortedCodeItems) { while (true) { if (!codeItemStack.Any()) { organizedCodeItems.Add(codeItem); codeItemStack.Push(codeItem); break; } var top = codeItemStack.Peek(); if (codeItem.EndOffset < top.EndOffset) { var topParent = top as ICodeItemParent; if (topParent != null) { topParent.Children.Add(codeItem); codeItemStack.Push(codeItem); break; } if (codeItem is CodeItemRegion) { // Skip regions within non-parentable items (e.g. in methods). break; } } codeItemStack.Pop(); } } } return(organizedCodeItems); }
/// <summary> /// Recursively gets the children in a depth-first fashion for the specified parent without /// delving into nested element parents. /// </summary> /// <param name="parent">The parent.</param> /// <returns>The recursive set of children.</returns> public static SetCodeItems GetChildrenRecursive(this ICodeItemParent parent) { var children = new SetCodeItems(); foreach (var child in parent.Children) { children.Add(child); var childAsParent = child as ICodeItemParent; if (childAsParent != null && !(child is BaseCodeItemElementParent)) { children.AddRange(childAsParent.GetChildrenRecursive()); } } return children; }
/// <summary> /// Organizes the specified code items by file layout. /// </summary> /// <param name="rawCodeItems">The raw code items.</param> /// <returns>The organized code items.</returns> private static SetCodeItems OrganizeCodeItemsByFileLayout(IEnumerable <BaseCodeItem> rawCodeItems) { var organizedCodeItems = new SetCodeItems(); if (rawCodeItems != null) { // Sort the raw list of code items by starting position. var sortedCodeItems = rawCodeItems.OrderBy(x => x.StartOffset); var codeItemStack = new Stack <BaseCodeItem>(); foreach (var codeItem in sortedCodeItems) { while (true) { if (!codeItemStack.Any()) { organizedCodeItems.Add(codeItem); codeItemStack.Push(codeItem); break; } var top = codeItemStack.Peek() as ICodeItemParent; if (top != null && codeItem.EndOffset < top.EndOffset) { top.Children.Add(codeItem); codeItemStack.Push(codeItem); break; } codeItemStack.Pop(); } } } return(organizedCodeItems); }
/// <summary> /// Organizes the specified code items by file sort order. /// </summary> /// <param name="rawCodeItems">The raw code items.</param> /// <returns>The organized code items.</returns> private static SetCodeItems OrganizeCodeItemsByFileSortOrder(IEnumerable<BaseCodeItem> rawCodeItems) { var organizedCodeItems = new SetCodeItems(); if (rawCodeItems != null) { // Sort the raw list of code items by starting position. var sortedCodeItems = rawCodeItems.OrderBy(x => x.StartOffset); var codeItemStack = new Stack<BaseCodeItem>(); foreach (var codeItem in sortedCodeItems) { while (true) { if (!codeItemStack.Any()) { organizedCodeItems.Add(codeItem); codeItemStack.Push(codeItem); break; } var top = codeItemStack.Peek(); if (codeItem.EndOffset < top.EndOffset) { var topParent = top as ICodeItemParent; if (topParent != null) { topParent.Children.Add(codeItem); codeItemStack.Push(codeItem); break; } if (codeItem is CodeItemRegion) { // Skip regions within non-parentable items (e.g. in methods). break; } } codeItemStack.Pop(); } } } return organizedCodeItems; }
/// <summary> /// Organizes the specified code items by file layout. /// </summary> /// <param name="rawCodeItems">The raw code items.</param> /// <returns>The organized code items.</returns> private static SetCodeItems OrganizeCodeItemsByFileLayout(IEnumerable<BaseCodeItem> rawCodeItems) { var organizedCodeItems = new SetCodeItems(); if (rawCodeItems != null) { // Sort the raw list of code items by starting position. var sortedCodeItems = rawCodeItems.OrderBy(x => x.StartOffset); var codeItemStack = new Stack<BaseCodeItem>(); foreach (var codeItem in sortedCodeItems) { while (true) { if (!codeItemStack.Any()) { organizedCodeItems.Add(codeItem); codeItemStack.Push(codeItem); break; } var top = codeItemStack.Peek() as ICodeItemParent; if (top != null && codeItem.EndOffset < top.EndOffset) { top.Children.Add(codeItem); codeItemStack.Push(codeItem); break; } codeItemStack.Pop(); } } } return organizedCodeItems; }