protected static IReadOnlyList Add()

in src/Kusto.Language/Editor/CommonCodeService.cs [87:218]


        protected static IReadOnlyList<ClassifiedRange> Add(
            IReadOnlyList<ClassifiedRange> classifications1,
            IReadOnlyList<ClassifiedRange> classifications2)
        {
            if (classifications2.Count == 0)
                return classifications1;

            if (classifications1.Count == 0)
                return classifications2;

            var list = new List<ClassifiedRange>(classifications1.Count + classifications2.Count);

            int index1 = 0;
            int index2 = 0;
            ClassifiedRange class1 = null;
            ClassifiedRange class2 = null;

            while (true)
            {
                if (class1 == null && index1 < classifications1.Count)
                {
                    class1 = classifications1[index1];
                }

                if (class2 == null && index2 < classifications2.Count)
                {
                    class2 = classifications2[index2];
                }

                if (class1 == null && class2 == null)
                {
                    // we are done
                    break;
                }
                else if (class1 != null && class2 == null)
                {
                    // no more class2, just add class1
                    list.Add(class1);
                    class1 = null;
                    index1++;
                }
                else if (class2 != null && class1 == null)
                {
                    // no more class1, just add class2
                    list.Add(class2);
                    class2 = null;
                    index2++;
                }
                else if (class1.End < class2.Start)
                {
                    // class1 is entirely before class2, so add class1 and advance it
                    list.Add(class1);
                    class1 = null;
                    index1++;
                }
                else if (class2.End < class1.Start)
                {
                    // class2 is entirely before classs1, so add class2 and advance it
                    list.Add(class2);
                    class2 = null;
                    index2++;
                }
                else if (class1.Start >= class2.Start && class1.End <= class2.End)
                {
                    // class1 is entirely within class2
                    // drop class1 because class2 takes precedence
                    class1 = null;
                    index1++;
                }
                else if (class1.Start < class2.Start)
                {
                    // class1 starts before class2
                    var len = class2.Start - class1.Start;

                    // add the first part off class1
                    list.Add(new ClassifiedRange(class1.Kind, class1.Start, len));

                    if (class1.Length > len)
                    {
                        // adjust class1 for next time around
                        class1 = new ClassifiedRange(class1.Kind, class1.Start + len, class1.Length - len);
                    }
                    else
                    {
                        // advance class1 if no more
                        class1 = null;
                        index1++;
                    }
                }
                else if (class2.Start < class1.Start)
                {
                    // class2 starts before class1
                    var len = class1.Start - class2.Start;

                    // add the first part of class2
                    list.Add(new ClassifiedRange(class2.Kind, class2.Start, len));

                    if (class2.Length > len)
                    {
                        class2 = new ClassifiedRange(class2.Kind, class2.Start + len, class2.Length - len);
                    }
                    else
                    {
                        // advance class2 if no more
                        class2 = null;
                        index2++;
                    }
                }
                else if (class1.End <= class2.End)
                {
                    // both start at same position, class1 ends first
                    // just drop class1, since class2 takes precedence
                    class1 = null;
                    index1++;
                }
                else
                {
                    // both start at same position, class2 ends first
                    var len = class2.Length;

                    // add class2 since it takes precedence
                    list.Add(class2);
                    class2 = null;
                    index2++;

                    // adjust remainder of class1
                    class1 = new ClassifiedRange(class1.Kind, class1.Start + len, class1.Length - len);
                }
            }

            return list;
        }