forked from qt-creator/qt-creator
		
	Fixed the highlihting of bindings and types.
This commit is contained in:
		@@ -57,17 +57,28 @@ QScriptHighlighter::QScriptHighlighter(bool duiEnabled, QTextDocument *parent):
 | 
			
		||||
bool QScriptHighlighter::isDuiEnabled() const
 | 
			
		||||
{ return m_duiEnabled; }
 | 
			
		||||
 | 
			
		||||
static bool checkStartOfBinding(const Token &token)
 | 
			
		||||
{
 | 
			
		||||
    switch (token.kind) {
 | 
			
		||||
    case Token::Semicolon:
 | 
			
		||||
    case Token::LeftBrace:
 | 
			
		||||
    case Token::RightBrace:
 | 
			
		||||
    case Token::LeftBracket:
 | 
			
		||||
    case Token::RightBracket:
 | 
			
		||||
        return true;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
        return false;
 | 
			
		||||
    } // end of switch
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QScriptHighlighter::highlightBlock(const QString &text)
 | 
			
		||||
{
 | 
			
		||||
    const QList<Token> tokens = m_scanner(text, onBlockStart());
 | 
			
		||||
 | 
			
		||||
    QTextCharFormat emptyFormat;
 | 
			
		||||
    int lastEnd = 0;
 | 
			
		||||
    for (int i = 0; i < tokens.size(); ++i) {
 | 
			
		||||
        const Token token = tokens.at(i);
 | 
			
		||||
 | 
			
		||||
        if (token.offset != lastEnd)
 | 
			
		||||
            setFormat(lastEnd, token.offset - lastEnd, m_formats[VisualWhitespace]);
 | 
			
		||||
    int index = 0;
 | 
			
		||||
    while (index < tokens.size()) {
 | 
			
		||||
        const Token &token = tokens.at(index);
 | 
			
		||||
 | 
			
		||||
        switch (token.kind) {
 | 
			
		||||
            case Token::Keyword:
 | 
			
		||||
@@ -110,43 +121,42 @@ void QScriptHighlighter::highlightBlock(const QString &text)
 | 
			
		||||
                onClosingParenthesis(']', token.offset);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case Token::Identifier:
 | 
			
		||||
                if (m_duiEnabled && (i + 1) < tokens.size() && tokens.at(i + 1).is(Token::Colon)) {
 | 
			
		||||
                    int j = i;
 | 
			
		||||
                    for (; j != -1; --j) {
 | 
			
		||||
                        const Token &tok = tokens.at(j);
 | 
			
		||||
                        if (tok.is(Token::Dot) || tok.is(Token::Identifier)) {
 | 
			
		||||
                            setFormat(tok.offset, tok.length, m_formats[LabelFormat]);
 | 
			
		||||
                        } else {
 | 
			
		||||
            case Token::Identifier: {
 | 
			
		||||
                if (index + 1 < tokens.size()) {
 | 
			
		||||
                    if (tokens.at(index + 1).is(Token::LeftBrace) && text.at(token.offset).isUpper()) {
 | 
			
		||||
                        setFormat(token.offset, token.length, m_formats[TypeFormat]);
 | 
			
		||||
                    } else if (index == 0 || checkStartOfBinding(tokens.at(index - 1))) {
 | 
			
		||||
                        const int start = index;
 | 
			
		||||
 | 
			
		||||
                        ++index; // skip the identifier.
 | 
			
		||||
                        while (index + 1 < tokens.size() &&
 | 
			
		||||
                               tokens.at(index).is(Token::Dot) &&
 | 
			
		||||
                               tokens.at(index + 1).is(Token::Identifier)) {
 | 
			
		||||
                            index += 2;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        if (index < tokens.size() && tokens.at(index).is(Token::Colon)) {
 | 
			
		||||
                            // it's a binding.
 | 
			
		||||
                            for (int i = start; i < index; ++i) {
 | 
			
		||||
                                const Token &tok = tokens.at(i);
 | 
			
		||||
                                setFormat(tok.offset, tok.length, m_formats[LabelFormat]);
 | 
			
		||||
                            }
 | 
			
		||||
                            break;
 | 
			
		||||
                        } else {
 | 
			
		||||
                            index = start;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    const QChar c = text.at(token.offset);
 | 
			
		||||
 | 
			
		||||
                    if ((m_duiEnabled && c.isUpper()) || (!m_duiEnabled && c == QLatin1Char('Q')))
 | 
			
		||||
                        setFormat(token.offset, token.length, m_formats[TypeFormat]);
 | 
			
		||||
                    else
 | 
			
		||||
                        setFormat(token.offset, token.length, emptyFormat);
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case Token::Colon:
 | 
			
		||||
                if (m_duiEnabled && i > 0 && tokens.at(i - 1).kind == Token::Identifier)
 | 
			
		||||
                    setFormat(token.offset, token.length, m_formats[LabelFormat]);
 | 
			
		||||
                else
 | 
			
		||||
                    setFormat(token.offset, token.length, emptyFormat);
 | 
			
		||||
                break;
 | 
			
		||||
            }   break;
 | 
			
		||||
 | 
			
		||||
            case Token::Delimiter:
 | 
			
		||||
                setFormat(token.offset, token.length, emptyFormat);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
        } // end swtich
 | 
			
		||||
 | 
			
		||||
        lastEnd = token.end();
 | 
			
		||||
        ++index;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int firstNonSpace = 0;
 | 
			
		||||
@@ -156,11 +166,6 @@ void QScriptHighlighter::highlightBlock(const QString &text)
 | 
			
		||||
        firstNonSpace = tk.offset;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (firstNonSpace > lastEnd)
 | 
			
		||||
        setFormat(lastEnd, firstNonSpace - lastEnd, m_formats[VisualWhitespace]);
 | 
			
		||||
    else if (text.length() > lastEnd)
 | 
			
		||||
        setFormat(lastEnd, text.length() - lastEnd, m_formats[VisualWhitespace]);
 | 
			
		||||
 | 
			
		||||
    setCurrentBlockState(m_scanner.endState());
 | 
			
		||||
    onBlockEnd(m_scanner.endState(), firstNonSpace);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user