QSyntaxHighlighter и многострочные комментарии - PullRequest
0 голосов
/ 24 июня 2018

Я использую Qt QSyntaxHighlighter, чтобы закрасить синтаксис, похожий на C, в QML TextEdit

Все отлично работает, кроме многострочных комментариев.

Я обнаруживаю их так:

void highlightBlock(QString const& text) override {
    bool inMultilineComment = previousBlockState() == STATES::COMMENT;
    bool inSingleLineComment = false;
    int previousIndex = 0;

    QRegularExpression expr("(\\/\\*|\\*\\/|\\/\\/|\n)"); // will match either /**, /**, // or \n
    QRegularExpressionMatchIterator it = expr.globalMatch(text);

    while(it.hasNext()) {
        QRegularExpressionMatch match = it.next();

        const QString captured = match.captured(1);

        if(captured == "/*" && !inSingleLineComment) {
            inMultilineComment = true;
            previousIndex = match.capturedStart(1);
        }

        if(captured == "*/" && inMultilineComment) {
            inMultilineComment = false;
            setFormat(previousIndex, match.capturedEnd(1) - previousIndex, _commentFormat);
        }

        if(captured == "//" && !inMultilineComment) {
            inSingleLineComment = true;
        }

        if(captured == "\n" && inSingleLineComment) {
            inSingleLineComment = false;
        }
    }

    if(inMultilineComment) {
        setFormat(previousIndex, text.size() - previousIndex, _commentFormat);
        setCurrentBlockState(STATES::COMMENT);
    }
    else {
        setCurrentBlockState(STATES::NONE);
    }
}

Это работает, пока я не возьму многострочный комментарий, уже окрашенный, и не удаляю /* в начале. Только блок, содержащий /*, обрабатывается и перекрашивается, но не следующие, что означает, что они продолжают появляться с комментариями, когда их нет.

Есть ли простой способ заставить QSyntaxHighlighter повторно обрабатывать следующие блоки, чтобы предотвратить такое неправильное окрашивание?

...