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)); }
private DeadAnnotationTag FindStmtTag(DareResult r) { var replacement = FindReplacement(r.Replace, r.StartTok.pos, r.TypeOfRemovable); var pos = StmtReplacementPositions(r.StartTok.pos, r.Length, r.Replace != null); return(new DeadAnnotationTag(Snapshot, pos.ReplaceStart, pos.ReplaceLength, replacement, r.TypeOfRemovable, r.StartTok.filename)); }
private DeadAnnotationTag FindExprTag(DareResult r) { var actualTokPos = InvarDecStartPosition(r); var replacement = FindReplacement(r.Replace, actualTokPos, r.TypeOfRemovable); var pos = ExprReplacementPositions(r, actualTokPos, r.Replace != null); return(new DeadAnnotationTag(Snapshot, pos.ReplaceStart, pos.ReplaceLength, replacement, r.TypeOfRemovable, r.StartTok.filename)); }
private int InvarDecStartPosition(DareResult r) { var current = r.StartTok.pos; var currentSpan = new SnapshotSpan(); var looking = true; var matchers = new [] { "invariant", "decreases" }; while (looking) { currentSpan = _tsn.GetExtentOfWord(new SnapshotPoint(Snapshot, current)).Span; var currentWord = currentSpan.GetText(); looking = matchers.All(x => x != currentWord); current--; if (currentWord == ";" || currentWord == "}" || current <= 0) { throw new IndexOutOfRangeException($"Managed to escape {r.TypeOfRemovable}"); } } return(currentSpan.Start.Position); }
private Tuple <int, bool> InvarDecEndPosition(DareResult r) { var current = r.StartTok.pos; var currentSpan = new SnapshotSpan(); var currentWord = ""; var looking = true; var matchers = new [] { "invariant", "decreases", ";", "{" }; while (looking) { currentSpan = _tsn.GetExtentOfWord(new SnapshotPoint(Snapshot, current)).Span; currentWord = currentSpan.GetText(); looking = matchers.All(x => x != currentWord); current++; if (currentWord == "}" || current >= Snapshot.Length) { throw new IndexOutOfRangeException($"Managed to escape {r.TypeOfRemovable}"); } } return(new Tuple <int, bool>(currentSpan.Start.Position, currentWord == ";")); }
private DeadAnnotationTag ProcessValidResult(DareResult r) { DeadAnnotationTag tag; switch (r.TypeOfRemovable) { case "Assert Statement": case "Calc Statement": case "Lemma Call": tag = FindStmtTag(r); break; case "Decreases Expression": case "Invariant": tag = FindExprTag(r); break; default: throw new Tcce.UnreachableException(); } AddTag(tag); return(tag); }