Skip to content
Snippets Groups Projects
Commit ea9f96a3 authored by Roberto Raggi's avatar Roberto Raggi
Browse files

Improved QML/JS indenter when using C-like multiline comments.

parent 35e35268
No related branches found
No related tags found
No related merge requests found
...@@ -208,12 +208,10 @@ QString QScriptIndenter::trimmedCodeLine(const QString &t) ...@@ -208,12 +208,10 @@ QString QScriptIndenter::trimmedCodeLine(const QString &t)
{ {
QScriptIncrementalScanner scanner; QScriptIncrementalScanner scanner;
int state = yyLinizerState.iter.userState(); QTextBlock currentLine = yyLinizerState.iter;
if (state == -1) int startState = qMax(0, currentLine.previous().userState()) & 0xff;
state = 0;
state = state & 0xff;
yyLinizerState.tokens = scanner(t, state); yyLinizerState.tokens = scanner(t, startState);
QString trimmed; QString trimmed;
int previousTokenEnd = 0; int previousTokenEnd = 0;
foreach (const QScriptIncrementalScanner::Token &token, yyLinizerState.tokens) { foreach (const QScriptIncrementalScanner::Token &token, yyLinizerState.tokens) {
...@@ -224,8 +222,25 @@ QString QScriptIndenter::trimmedCodeLine(const QString &t) ...@@ -224,8 +222,25 @@ QString QScriptIndenter::trimmedCodeLine(const QString &t)
trimmed.append(QLatin1Char('X')); trimmed.append(QLatin1Char('X'));
} else if (token.is(QScriptIncrementalScanner::Token::Comment)) { } else if (token.is(QScriptIncrementalScanner::Token::Comment)) {
for (int i = 0; i < token.length; ++i) int i = 0;
trimmed.append(QLatin1Char(' ')); int e = token.length;
if (token.offset > 0 || startState == 0) {
trimmed.append(QLatin1String("/*"));
i += 2;
}
bool needEndOfComment = false;
if (e > 2 && token.end() == t.length() && scanner.endState() != 0) {
needEndOfComment = true;
e -= 2;
}
for (; i < e; ++i)
trimmed.append(QLatin1Char(' '));
if (needEndOfComment)
trimmed.append(QLatin1String("*/"));
} else { } else {
trimmed.append(t.midRef(token.offset, token.length)); trimmed.append(t.midRef(token.offset, token.length));
...@@ -450,35 +465,15 @@ void QScriptIndenter::startLinizer() ...@@ -450,35 +465,15 @@ void QScriptIndenter::startLinizer()
potentially the whole line) is part of a C-style comment; potentially the whole line) is part of a C-style comment;
otherwise returns false. otherwise returns false.
*/ */
bool QScriptIndenter::bottomLineStartsInCComment() bool QScriptIndenter::bottomLineStartsInMultilineComment()
{ {
const QLatin1String slashAster("/*"); QTextBlock currentLine = yyProgram.lastBlock().previous();
const QLatin1String asterSlash("*/"); QTextBlock previousLine = currentLine.previous();
/*
We could use the linizer here, but that would slow us down
terribly. We are better to trim only the code lines we need.
*/
QTextBlock p = yyProgram.lastBlock();
p = p.previous(); // skip bottom line
for (int i = 0; i < BigRoof; i++) {
if (p == yyProgram.firstBlock())
return false;
p = p.previous();
const QString blockText = p.text();
if (blockText.indexOf(slashAster) != -1 || blockText.indexOf(asterSlash) != -1) { int startState = qMax(0, previousLine.userState()) & 0xff;
const QString trimmed = trimmedCodeLine(blockText); if (startState > 0)
return true;
if (trimmed.indexOf(slashAster) != -1) {
return true;
} else if (trimmed.indexOf(asterSlash) != -1) {
return false;
}
}
}
return false; return false;
} }
...@@ -490,7 +485,7 @@ bool QScriptIndenter::bottomLineStartsInCComment() ...@@ -490,7 +485,7 @@ bool QScriptIndenter::bottomLineStartsInCComment()
Essentially, we're trying to align against some text on the Essentially, we're trying to align against some text on the
previous line. previous line.
*/ */
int QScriptIndenter::indentWhenBottomLineStartsInCComment() int QScriptIndenter::indentWhenBottomLineStartsInMultiLineComment()
{ {
int k = yyLine->lastIndexOf(QLatin1String("/*")); int k = yyLine->lastIndexOf(QLatin1String("/*"));
if (k == -1) { if (k == -1) {
...@@ -1028,14 +1023,14 @@ int QScriptIndenter::indentForBottomLine(QTextBlock begin, QTextBlock end, QChar ...@@ -1028,14 +1023,14 @@ int QScriptIndenter::indentForBottomLine(QTextBlock begin, QTextBlock end, QChar
QChar firstCh = firstNonWhiteSpace(bottomLine); QChar firstCh = firstNonWhiteSpace(bottomLine);
int indent = 0; int indent = 0;
if (bottomLineStartsInCComment()) { if (bottomLineStartsInMultilineComment()) {
/* /*
The bottom line starts in a C-style comment. Indent it The bottom line starts in a C-style comment. Indent it
smartly, unless the user has already played around with it, smartly, unless the user has already played around with it,
in which case it's better to leave her stuff alone. in which case it's better to leave her stuff alone.
*/ */
if (isOnlyWhiteSpace(bottomLine)) { if (isOnlyWhiteSpace(bottomLine)) {
indent = indentWhenBottomLineStartsInCComment(); indent = indentWhenBottomLineStartsInMultiLineComment();
} else { } else {
indent = indentOfLine(bottomLine); indent = indentOfLine(bottomLine);
} }
......
...@@ -74,8 +74,8 @@ private: ...@@ -74,8 +74,8 @@ private:
bool readLine(); bool readLine();
void startLinizer(); void startLinizer();
bool bottomLineStartsInCComment(); bool bottomLineStartsInMultilineComment();
int indentWhenBottomLineStartsInCComment(); int indentWhenBottomLineStartsInMultiLineComment();
bool matchBracelessControlStatement(); bool matchBracelessControlStatement();
bool isUnfinishedLine(); bool isUnfinishedLine();
bool isContinuationLine(); bool isContinuationLine();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment