void CodeEditorComponent::getIteratorForPosition (int position, CodeDocument::Iterator& source)
{
    if (codeTokeniser == 0)
        return;

    for (int i = cachedIterators.size(); --i >= 0;)
    {
        CodeDocument::Iterator* t = cachedIterators.getUnchecked (i);
        if (t->getPosition() <= position)
        {
            source = *t;
            break;
        }
    }

    while (source.getPosition() < position)
    {
        const CodeDocument::Iterator original (source);
        codeTokeniser->readNextToken (source);

        if (source.getPosition() > position || source.isEOF())
        {
            source = original;
            break;
        }
    }
}
void CodeEditorComponent::updateCachedIterators (int maxLineNum)
{
    const int maxNumCachedPositions = 5000;
    const int linesBetweenCachedSources = jmax (10, document.getNumLines() / maxNumCachedPositions);

    if (cachedIterators.size() == 0)
        cachedIterators.add (new CodeDocument::Iterator (&document));

    if (codeTokeniser == 0)
        return;

    for (;;)
    {
        CodeDocument::Iterator* last = cachedIterators.getLast();

        if (last->getLine() >= maxLineNum)
            break;

        CodeDocument::Iterator* t = new CodeDocument::Iterator (*last);
        cachedIterators.add (t);
        const int targetLine = last->getLine() + linesBetweenCachedSources;

        for (;;)
        {
            codeTokeniser->readNextToken (*t);

            if (t->getLine() >= targetLine)
                break;

            if (t->isEOF())
                return;
        }
    }
}