Esempio n. 1
0
        private IEnumerable <Expression> FindExpressions(int rangeStart, int rangeEnd)
        {
            List <Expression> results = new List <Expression>();

            Queue <Expression> targets = new Queue <Expression>();

            foreach (Expression subExpression in Tree.Root.Statements)
            {
                targets.Enqueue(subExpression);
            }

            while (targets.Count > 0)
            {
                Expression current = targets.Dequeue();

                if (rangeStart >= current.EndToken.End)
                {
                    continue;
                }

                if (rangeEnd <= current.StartToken.Start)
                {
                    continue;
                }

                results.Add(current);

                foreach (Expression subExpression in current.GetSubExpressions())
                {
                    targets.Enqueue(subExpression);
                }
            }

            return(results);
        }
Esempio n. 2
0
        private bool ApplyOverlap(Expression expression, int start, int end, VisualLine visualLine)
        {
            if (expression.StartToken.Start >= end)
            {
                return(false);
            }

            if (expression.EndToken.End <= start)
            {
                return(true);
            }

            int overlapStart = Math.Max(start, expression.StartToken.Start);
            int overlapEnd   = Math.Min(end, expression.EndToken.End);

            int offset = visualLine.FirstDocumentLine.Offset;

            overlapStart = visualLine.GetVisualColumn(overlapStart - offset);
            overlapEnd   = visualLine.GetVisualColumn(overlapEnd - offset);

            IEnumerable <IColorizerElement <Expression> > elements = Elements
                                                                     .Where(x => x.CanApply(expression));

            void ApplyColorizerElements(VisualLineElement lineElement)
            {
                foreach (IColorizerElement <Expression> colorizerElement in elements)
                {
                    colorizerElement.Apply(lineElement, expression);
                }
            }

            if (elements.Count() > 0)
            {
                ChangeVisualElements(overlapStart, overlapEnd, ApplyColorizerElements);
            }

            return(true);
        }