diff --git a/src/libs/cplusplus/BackwardsScanner.cpp b/src/libs/cplusplus/BackwardsScanner.cpp index 7f1f6cdfe6b9d816a656346e760b6d2ae5ae4c6f..288d643e799ba4651c06077e25e766bfea235d81 100644 --- a/src/libs/cplusplus/BackwardsScanner.cpp +++ b/src/libs/cplusplus/BackwardsScanner.cpp @@ -70,13 +70,14 @@ const SimpleToken &BackwardsScanner::fetchToken(int i) } else { ++_blocksTokenized; - const QString blockText = _block.text(); + QString blockText = _block.text(); + _text.prepend(QLatin1Char('\n')); _text.prepend(blockText); QList<SimpleToken> adaptedTokens; for (int i = 0; i < _tokens.size(); ++i) { SimpleToken t = _tokens.at(i); - t.setPosition(t.position() + blockText.length()); + t.setPosition(t.position() + blockText.length() + 1); t.setText(_text.midRef(t.position(), t.length())); adaptedTokens.append(t); } @@ -247,8 +248,9 @@ int BackwardsScanner::startOfBlock(int index) const return start; } -int BackwardsScanner::indentation(int index) const +QString BackwardsScanner::indentationString(int index) const { - SimpleToken newline = operator[](startOfLine(index + 1)); - return newline.position(); + const SimpleToken tokenAfterNewline = operator[](startOfLine(index + 1)); + const int newlinePos = qMax(0, _text.lastIndexOf(QLatin1Char('\n'), tokenAfterNewline.position())); + return _text.mid(newlinePos, tokenAfterNewline.position() - newlinePos); } diff --git a/src/libs/cplusplus/BackwardsScanner.h b/src/libs/cplusplus/BackwardsScanner.h index d991906fc55703f0bb18aee92a7fad3dfbc6af84..c4c65e7bbc6309857e53b3248028aa2146eb8708 100644 --- a/src/libs/cplusplus/BackwardsScanner.h +++ b/src/libs/cplusplus/BackwardsScanner.h @@ -61,7 +61,7 @@ public: // n-la token is [startToken - n] SimpleToken operator[](int index) const; // ### deprecate - int indentation(int index) const; + QString indentationString(int index) const; int startOfLine(int index) const; int startOfMatchingBrace(int index) const; diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 2f21580ba90a4577296c411621c73ef1a91434cb..91a9e40be7d36622f67bbfb4f50e23dc93eb9325 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -1592,37 +1592,44 @@ static void indentCPPBlock(const CPPEditor::TabSettings &ts, ts.indentLine(block, indent); } +static int indentationColumn(const TextEditor::TabSettings &tabSettings, + const BackwardsScanner &scanner, + int index) +{ + return tabSettings.indentationColumn(scanner.indentationString(index)); +} + void CPPEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar) { QTextCursor tc(block); tc.movePosition(QTextCursor::EndOfBlock); + const TabSettings &ts = tabSettings(); + BackwardsScanner tk(tc, QString(), 400); const int tokenCount = tk.startToken(); - const int indentSize = tabSettings().m_indentSize; if (tokenCount != 0) { const SimpleToken firstToken = tk[0]; if (firstToken.is(T_COLON)) { - const int indent = tk.indentation(-1) + // indentation of the previous newline - indentSize; - tabSettings().indentLine(block, indent); + const int previousLineIndent = indentationColumn(ts, tk, -1); + ts.indentLine(block, previousLineIndent + ts.m_indentSize); return; } else if ((firstToken.is(T_PUBLIC) || firstToken.is(T_PROTECTED) || firstToken.is(T_PRIVATE) || firstToken.is(T_Q_SIGNALS) || firstToken.is(T_Q_SLOTS)) && tk.size() > 1 && tk[1].is(T_COLON)) { const int startOfBlock = tk.startOfBlock(0); if (startOfBlock != 0) { - const int indent = tk.indentation(startOfBlock); - tabSettings().indentLine(block, indent); + const int indent = indentationColumn(ts, tk, startOfBlock); + ts.indentLine(block, indent); return; } } else if (firstToken.is(T_CASE) || firstToken.is(T_DEFAULT)) { const int startOfBlock = tk.startOfBlock(0); if (startOfBlock != 0) { - const int indent = tk.indentation(startOfBlock); - tabSettings().indentLine(block, indent); + const int indent = indentationColumn(ts, tk, startOfBlock); + ts.indentLine(block, indent); return; } return; @@ -1641,15 +1648,15 @@ void CPPEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar typedCha const QString spell = tk.text(tokenIndex); if (tk[tokenIndex].followsNewline() && (spell.startsWith(QLatin1String("QT_")) || spell.startsWith(QLatin1String("Q_")))) { - const int indent = tk.indentation(tokenIndex); - tabSettings().indentLine(block, indent); + const int indent = indentationColumn(ts, tk, tokenIndex); + ts.indentLine(block, indent); return; } } const TextEditor::TextBlockIterator begin(doc->begin()); const TextEditor::TextBlockIterator end(block.next()); - indentCPPBlock(tabSettings(), block, begin, end, typedChar); + indentCPPBlock(ts, block, begin, end, typedChar); } bool CPPEditor::event(QEvent *e) @@ -1682,9 +1689,6 @@ void CPPEditor::contextMenuEvent(QContextMenuEvent *e) foreach (QAction *action, contextMenu->actions()) menu->addAction(action); - const QList<QTextEdit::ExtraSelection> selections = - extraSelections(BaseTextEditor::CodeSemanticsSelection); - appendStandardContextMenuActions(menu); menu->exec(e->globalPos());