/// <summary> /// Incrementally lexes and parses the specified string. /// </summary> private IncrementalResult ParseIncremental <TSource>(TSource input, Int32 start, Int32 count, TextParserTokenStream output, TextParserOptions options = TextParserOptions.None) where TSource : ISegmentableStringSource { var inputLengthOld = output.SourceText.Length; var inputLengthNew = input.Length; var inputLengthDiff = inputLengthNew - inputLengthOld; Int32 ix1, ix2; FindTokensInfluencedBySubstring(output, start, count - inputLengthDiff, out ix1, out ix2); var token1 = output[ix1]; var token2 = output[ix2]; var invalidatedTokenCount = 1 + (ix2 - ix1); output.RemoveRange(ix1, invalidatedTokenCount); var lexStart = token1.SourceOffset; var lexCount = inputLengthDiff + (token2.SourceOffset + token2.SourceLength) - lexStart; var parserBuffer = incrementalParserBuffer.Value; Parse(input, parserBuffer, lexStart, lexCount); output.SourceText = input.CreateStringSegment(); output.InsertRange(ix1, parserBuffer); var affectedOffset = ix1; var affectedCount = parserBuffer.Count; parserBuffer.Clear(); return(new IncrementalResult(affectedOffset, affectedCount)); }