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