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); }
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); }