void TextBufferChanged(int position, int newLength, int dif)
        {
            int startLex = Math.Max(position - _lookahead, 0);

            EnsureLexed(Buffer.CurrentSnapshot, startLex);

            if (dif > 0)
            {
                _tokens.InsertSpace(position, dif);
            }
            else if (_tokens.Count > position)
            {
                _tokens.RemoveRange(position, Math.Min(-dif, _tokens.Count - position));
            }

            int endLex = position + newLength + _lookahead;

            endLex   = _tokens.NextHigherIndex(endLex - 1) ?? _tokens.Count;
            startLex = _tokens.NextLowerIndex(startLex + 1) ?? 0;

            _lexer = PrepareLexer(_lexer, _wrappedBuffer, startLex);
            int stoppedAt = RunLexerUntil(endLex);

            if (ClassificationChanged != null)
            {
                var span = new SnapshotSpan(Buffer.CurrentSnapshot, new Span(startLex, stoppedAt - startLex));
                ClassificationChanged(this, new ClassificationChangedEventArgs(span));
            }
        }