summaryrefslogtreecommitdiff
path: root/src/libs/qmljs/qmljshighlighter.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-01-29 11:20:42 +0100
committerRoberto Raggi <roberto.raggi@nokia.com>2010-01-29 11:20:42 +0100
commit14207aa856eb499f023cd48331fb40f4710b6c64 (patch)
treec945eac8acfd08256489b572dcafc18cedbc0644 /src/libs/qmljs/qmljshighlighter.cpp
parent272014a5d0e451652a0a812c27623c6bb5e92cbc (diff)
downloadqt-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.cpp138
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;
}
}