const Token &BackwardsScanner::fetchToken(int tokenIndex)
{
    while (_offset + tokenIndex < 0) {
        _block = _block.previous();
        if (_blocksTokenized == _maxBlockCount || !_block.isValid()) {
            ++_offset;
            _tokens.prepend(Token()); // sentinel
            break;
        } else {
            ++_blocksTokenized;

            QString blockText = _block.text();
            _text.prepend(QLatin1Char('\n'));
            _text.prepend(blockText);

            Tokens adaptedTokens;
            for (int i = 0; i < _tokens.size(); ++i) {
                Token t = _tokens.at(i);
                t.utf16charOffset += blockText.length() + 1;
                adaptedTokens.append(t);
            }

            _tokens = _tokenize(blockText, previousBlockState(_block));
            _offset += _tokens.size();
            _tokens += adaptedTokens;
        }
    }

    return _tokens.at(_offset + tokenIndex);
}