QmlJS: improve support for enum declarations

Add indentation and little highlighting for enums.
It just highlights the 'enum' keyword and the name of the enum, not its
values.

Task-number: QTCREATORBUG-19226
Change-Id: I36e46a27b0e32c4aecc8e91875c3d22df1814d93
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Marco Benelli
2018-05-22 17:07:27 +02:00
parent 4d082b9500
commit d14e89f899
3 changed files with 31 additions and 2 deletions

View File

@@ -177,6 +177,7 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
case Property: enter(property_start); break; case Property: enter(property_start); break;
case Function: enter(function_start); break; case Function: enter(function_start); break;
case Signal: enter(signal_start); break; case Signal: enter(signal_start); break;
case Enum: enter(enum_start); break;
case On: case On:
case As: case As:
case List: case List:
@@ -215,6 +216,11 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
default: leave(true); continue; default: leave(true); continue;
} break; } break;
case enum_start:
switch (kind) {
case LeftBrace: enter(objectliteral_open); break;
} break;
case signal_start: case signal_start:
switch (kind) { switch (kind) {
case Colon: enter(binding_assignment); break; // oops, was a binding case Colon: enter(binding_assignment); break; // oops, was a binding
@@ -931,6 +937,8 @@ CodeFormatter::TokenKind CodeFormatter::extendedTokenKind(const QmlJS::Token &to
return On; return On;
if (text == QLatin1String("list")) if (text == QLatin1String("list"))
return List; return List;
if (text == QLatin1String("enum"))
return Enum;
} else if (kind == Keyword) { } else if (kind == Keyword) {
const char char1 = text.at(0).toLatin1(); const char char1 = text.at(0).toLatin1();
const char char2 = text.at(1).toLatin1(); const char char2 = text.at(1).toLatin1();

View File

@@ -109,6 +109,8 @@ public: // must be public to make Q_GADGET introspection work
property_name, // after the type property_name, // after the type
property_maybe_initializer, // after the identifier property_maybe_initializer, // after the identifier
enum_start, // after 'enum'
signal_start, // after 'signal' signal_start, // after 'signal'
signal_maybe_arglist, // after identifier signal_maybe_arglist, // after identifier
signal_arglist_open, // after '(' signal_arglist_open, // after '('
@@ -197,6 +199,7 @@ protected:
Comma, Comma,
Dot, Dot,
Delimiter, Delimiter,
RegExp,
EndOfExistingTokenKinds, EndOfExistingTokenKinds,
@@ -209,6 +212,7 @@ protected:
Delete, Delete,
Do, Do,
Else, Else,
Enum,
Finally, Finally,
For, For,
Function, Function,

View File

@@ -131,13 +131,28 @@ void QmlJSHighlighter::highlightBlock(const QString &text)
break; break;
} }
} }
if (text.midRef(token.offset, token.length) == QLatin1String("enum")) {
setFormat(token.offset, token.length, formatForCategory(C_KEYWORD));
break;
}
} else if (index > 0 && maybeQmlBuiltinType(spell)) { } else if (index > 0 && maybeQmlBuiltinType(spell)) {
const Token &previousToken = tokens.at(index - 1); const Token &previousToken = tokens.at(index - 1);
if (previousToken.is(Token::Identifier) && text.at(previousToken.offset) == QLatin1Char('p') if (previousToken.is(Token::Identifier)
&& text.midRef(previousToken.offset, previousToken.length) == QLatin1String("property")) { && text.at(previousToken.offset) == QLatin1Char('p')
&& text.midRef(previousToken.offset, previousToken.length)
== QLatin1String("property")) {
setFormat(token.offset, token.length, formatForCategory(C_KEYWORD)); setFormat(token.offset, token.length, formatForCategory(C_KEYWORD));
break; break;
} }
} else if (index == 1) {
const Token &previousToken = tokens.at(0);
if (previousToken.is(Token::Identifier)
&& text.at(previousToken.offset) == QLatin1Char('e')
&& text.midRef(previousToken.offset, previousToken.length)
== QLatin1String("enum")) {
setFormat(token.offset, token.length, formatForCategory(C_ENUMERATION));
break;
}
} }
} break; } break;
@@ -206,6 +221,8 @@ bool QmlJSHighlighter::maybeQmlKeyword(const QStringRef &text) const
return true; return true;
else if (ch == QLatin1Char('o') && text == QLatin1String("on")) else if (ch == QLatin1Char('o') && text == QLatin1String("on"))
return true; return true;
else if (ch == QLatin1Char('e') && text == QLatin1String("enum"))
return true;
else else
return false; return false;
} }