diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-01-29 11:20:42 +0100 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-01-29 11:20:42 +0100 |
commit | 14207aa856eb499f023cd48331fb40f4710b6c64 (patch) | |
tree | c945eac8acfd08256489b572dcafc18cedbc0644 /src/libs/qmljs/qmljshighlighter.cpp | |
parent | 272014a5d0e451652a0a812c27623c6bb5e92cbc (diff) | |
download | qt-creator-14207aa856eb499f023cd48331fb40f4710b6c64.tar.gz |
Fixed highlihing of QML context keywords.
Diffstat (limited to 'src/libs/qmljs/qmljshighlighter.cpp')
-rw-r--r-- | src/libs/qmljs/qmljshighlighter.cpp | 138 |
1 files changed, 36 insertions, 102 deletions
diff --git a/src/libs/qmljs/qmljshighlighter.cpp b/src/libs/qmljs/qmljshighlighter.cpp index 81dbf34415..81c01d2b33 100644 --- a/src/libs/qmljs/qmljshighlighter.cpp +++ b/src/libs/qmljs/qmljshighlighter.cpp @@ -50,12 +50,17 @@ QScriptHighlighter::QScriptHighlighter(bool duiEnabled, QTextDocument *parent): rc[PreProcessorFormat].setForeground(Qt::darkBlue); rc[VisualWhitespace].setForeground(Qt::lightGray); // for debug: rc[VisualWhitespace].setBackground(Qt::red); setFormats(rc); - - m_scanner.setKeywords(keywords()); } bool QScriptHighlighter::isDuiEnabled() const -{ return m_duiEnabled; } +{ + return m_duiEnabled; +} + +QTextCharFormat QScriptHighlighter::labelTextCharFormat() const +{ + return m_formats[LabelFormat]; +} static bool checkStartOfBinding(const Token &token) { @@ -85,18 +90,6 @@ void QScriptHighlighter::highlightBlock(const QString &text) setFormat(token.offset, token.length, m_formats[KeywordFormat]); break; - case Token::String: - highlightWhitespace(token, text, StringFormat); - break; - - case Token::Comment: - highlightWhitespace(token, text, CommentFormat); - break; - - case Token::Number: - highlightWhitespace(token, text, NumberFormat); - break; - case Token::LeftParenthesis: onOpeningParenthesis('(', token.offset); break; @@ -122,6 +115,16 @@ void QScriptHighlighter::highlightBlock(const QString &text) break; case Token::Identifier: { + if (maybeQmlKeyword(text.midRef(token.offset, token.length))) { + // check the previous token + if (index == 0 || tokens.at(index - 1).isNot(Token::Dot)) { + if (index + 1 == tokens.size() || tokens.at(index + 1).isNot(Token::Colon)) { + setFormat(token.offset, token.length, m_formats[KeywordFormat]); + break; + } + } + } + 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]); @@ -195,8 +198,8 @@ void QScriptHighlighter::highlightBlock(const QString &text) if (! tokens.isEmpty()) firstNonSpace = tokens.first().offset; - setCurrentBlockState(m_scanner.endState()); - onBlockEnd(m_scanner.endState(), firstNonSpace); + setCurrentBlockState(m_scanner.state()); + onBlockEnd(m_scanner.state(), firstNonSpace); } void QScriptHighlighter::setFormats(const QVector<QTextCharFormat> &s) @@ -205,76 +208,6 @@ void QScriptHighlighter::setFormats(const QVector<QTextCharFormat> &s) qCopy(s.constBegin(), s.constEnd(), m_formats); } -QSet<QString> QScriptHighlighter::keywords() -{ - QSet<QString> keywords; - - keywords << QLatin1String("Infinity"); - keywords << QLatin1String("NaN"); - keywords << QLatin1String("abstract"); - keywords << QLatin1String("boolean"); - keywords << QLatin1String("break"); - keywords << QLatin1String("byte"); - keywords << QLatin1String("case"); - keywords << QLatin1String("catch"); - keywords << QLatin1String("char"); - keywords << QLatin1String("class"); - keywords << QLatin1String("const"); - keywords << QLatin1String("constructor"); - keywords << QLatin1String("continue"); - keywords << QLatin1String("debugger"); - keywords << QLatin1String("default"); - keywords << QLatin1String("delete"); - keywords << QLatin1String("do"); - keywords << QLatin1String("double"); - keywords << QLatin1String("else"); - keywords << QLatin1String("enum"); - keywords << QLatin1String("export"); - keywords << QLatin1String("extends"); - keywords << QLatin1String("false"); - keywords << QLatin1String("final"); - keywords << QLatin1String("finally"); - keywords << QLatin1String("float"); - keywords << QLatin1String("for"); - keywords << QLatin1String("function"); - keywords << QLatin1String("goto"); - keywords << QLatin1String("if"); - keywords << QLatin1String("implements"); - keywords << QLatin1String("import"); - keywords << QLatin1String("in"); - keywords << QLatin1String("instanceof"); - keywords << QLatin1String("int"); - keywords << QLatin1String("interface"); - keywords << QLatin1String("long"); - keywords << QLatin1String("native"); - keywords << QLatin1String("new"); - keywords << QLatin1String("package"); - keywords << QLatin1String("private"); - keywords << QLatin1String("protected"); - keywords << QLatin1String("public"); - keywords << QLatin1String("return"); - keywords << QLatin1String("short"); - keywords << QLatin1String("static"); - keywords << QLatin1String("super"); - keywords << QLatin1String("switch"); - keywords << QLatin1String("synchronized"); - keywords << QLatin1String("this"); - keywords << QLatin1String("throw"); - keywords << QLatin1String("throws"); - keywords << QLatin1String("transient"); - keywords << QLatin1String("true"); - keywords << QLatin1String("try"); - keywords << QLatin1String("typeof"); - keywords << QLatin1String("undefined"); - keywords << QLatin1String("var"); - keywords << QLatin1String("void"); - keywords << QLatin1String("volatile"); - keywords << QLatin1String("while"); - keywords << QLatin1String("with"); - - return keywords; -} - int QScriptHighlighter::onBlockStart() { return currentBlockState(); @@ -292,22 +225,23 @@ void QScriptHighlighter::onClosingParenthesis(QChar, int) { } -void QScriptHighlighter::highlightWhitespace(const Token &token, const QString &text, int nonWhitespaceFormat) +bool QScriptHighlighter::maybeQmlKeyword(const QStringRef &text) const { - const QTextCharFormat normalFormat = m_formats[nonWhitespaceFormat]; - const QTextCharFormat visualSpaceFormat = m_formats[VisualWhitespace]; - - const int end = token.end(); - int index = token.offset; - - while (index != end) { - const bool isSpace = text.at(index).isSpace(); - const int start = index; - - do { ++index; } - while (index != end && text.at(index).isSpace() == isSpace); + if (text.isEmpty()) + return false; - const int tokenLength = index - start; - setFormat(start, tokenLength, isSpace ? visualSpaceFormat : normalFormat); + const QChar ch = text.at(0); + if (ch == QLatin1Char('p') && text == QLatin1String("property")) { + return true; + } else if (ch == QLatin1Char('a') && text == QLatin1String("alias")) { + return true; + } else if (ch == QLatin1Char('s') && text == QLatin1String("signal")) { + return true; + } else if (ch == QLatin1Char('p') && text == QLatin1String("property")) { + return true; + } else if (ch == QLatin1Char('r') && text == QLatin1String("readonly")) { + return true; + } else { + return false; } } |