private Positions ExprReplacementPositions(DareResult r, int tokPos, bool hasReplacement) { var ending = InvarDecEndPosition(r); var tokLen = ending.Item1 - tokPos; var usesTrailingSemi = ending.Item2; if (!hasReplacement && usesTrailingSemi) { tokLen++; } var current = tokPos + tokLen; var looking = true; while (looking) { var currentWord = new SnapshotSpan(Snapshot, current - 1, 1).GetText(); looking = currentWord.Trim() == ""; if (--current <= 0) { throw new IndexOutOfRangeException($"Managed to escape {r.TypeOfRemovable}"); } } tokLen--; return(new Positions(tokPos, tokLen)); }