private JSONParseItem GetItemBeforePosition(int pos, JSONComplexItem parentItem) { JSONParseItem item = null; JSONParseItemList children = parentItem.Children; int start = 0; if (children.Any()) { start = children[0].Start; } if (start < pos) { int i = FindInsertIndex(children, pos, beforeExisting: true) - 1; if (i >= 0) { item = children[i]; if (item is JSONComplexItem complexItem) { // Recurse to find the deepest item item = GetItemBeforePosition(pos, complexItem); } } } return(item); }
[DataRow(170, 5)] // The last index public void JSONHelpers_FindInsertIndex_InvalidJson(int position, int expectedIndex) { JSONComplexItem item = JSONParser.Parse(_invalidJsonText).Children[0] as JSONComplexItem; JSONParseItemList items = item.Children; int actualIndex = JsonHelpers.FindInsertIndex(items, position); Assert.AreEqual(expectedIndex, actualIndex); }
private JSONParseItem GetPreviousChild(JSONParseItem child, JSONParseItemList children) { int index = (child != null) ? children.IndexOf(child) : -1; if (index > 0) { return(children[index - 1]); } return(null); }
private JSONParseItem GetNextChild(JSONParseItem child, JSONParseItemList children) { int index = (child != null) ? children.IndexOf(child) : -1; if (index != -1 && index + 1 < children.Count) { return(children[index + 1]); } return(null); }
private int FindInsertIndex(JSONParseItemList jsonParseItems, int rangeStart, bool beforeExisting) { int min = 0; int max = jsonParseItems.Count - 1; while (min <= max) { int mid = (min + max) / 2; int start = jsonParseItems[mid].Start; if (rangeStart < start || (beforeExisting && rangeStart == start)) { max = mid - 1; } else { min = mid + 1; } } return(max + 1); }
internal static int FindInsertIndex(JSONParseItemList jsonParseItems, int rangeStart) { int min = 0; int max = jsonParseItems.Count - 1; while (min <= max) { int mid = (min + max) / 2; int start = jsonParseItems[mid].Start; if (rangeStart <= start) { max = mid - 1; } else { min = mid + 1; } } return(max + 1); }