diff --git a/src/libs/qmljs/qmljshighlighter.cpp b/src/libs/qmljs/qmljshighlighter.cpp index 9c225e3e3a2be68bdce0041481ec84189f11e1e1..0b035350f077742e719928d238b57e552af1a659 100644 --- a/src/libs/qmljs/qmljshighlighter.cpp +++ b/src/libs/qmljs/qmljshighlighter.cpp @@ -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); }