Ejemplo n.º 1
0
        // returns the brace pair when the point is already a brace
        public Tuple <BracePos, BracePos> GetBracePair(SnapshotPoint point)
        {
            if (point.Snapshot != this.Snapshot || point.Position >= Snapshot.Length)
            {
                return(null);
            }

            this.EnsureLinesInPreferredSpan(point.SpanUntil());

            int index = FindIndexOfBraceAtOrAfter(point.Position);

            if (index < 0)
            {
                return(null);
            }
            BracePos one = this.braces[index];

            if (one.Position != point.Position)
            {
                return(null);
            }

            if (IsOpeningBrace(one.Brace))
            {
                return(GetBracePairFromPosition(point, RainbowHighlightMode.TrackNextScope));
            }
            else
            {
                return(GetBracePairFromPosition(point, RainbowHighlightMode.TrackInsertionPoint));
            }
        }
Ejemplo n.º 2
0
        // TODO: Avoid use of SnapshotPoint
        public Tuple <BracePos, BracePos> GetBracePairFromPosition(SnapshotPoint point, RainbowHighlightMode mode)
        {
            if (point.Snapshot != this.Snapshot || point.Position >= Snapshot.Length)
            {
                return(null);
            }

            var span = point.SpanUntil();

            this.EnsureLinesInPreferredSpan(new TextSpan(span.Start, span.Length));

            int      openIndex = -1;
            BracePos?opening   = null;

            if (mode == RainbowHighlightMode.TrackInsertionPoint)
            {
                opening = FindClosestOpeningBrace(point.Position, out openIndex);
            }
            else
            {
                opening = CheckForBraceAtPositionOrClosestOpeningBrace(point.Position, out openIndex);
            }
            if (opening == null)
            {
                return(null);
            }

            for (int i = openIndex + 1; i < this.braces.Count; i++)
            {
                if (i == this.braces.Count - 1)
                {
                    // continue parsing the document if necessary
                    this.ContinueParsing(this.LastParsedPosition, this.Snapshot.Length);
                }
                BracePos closing = this.braces[i];
                if (this.IsOpeningBrace(closing.Brace))
                {
                    continue;
                }
                if (this.braceList[opening.Value.Brace] == closing.Brace &&
                    closing.Depth == opening.Value.Depth)
                {
                    return(new Tuple <BracePos, BracePos>(opening.Value, closing));
                }
            }
            return(null);
        }