diff --git a/src/libs/cplusplus/BackwardsScanner.cpp b/src/libs/cplusplus/BackwardsScanner.cpp index 46fb15efe42464c136824656c940f0fd93ad0fc3..bca041c5d7249634b199c7da1ca04abd740326d6 100644 --- a/src/libs/cplusplus/BackwardsScanner.cpp +++ b/src/libs/cplusplus/BackwardsScanner.cpp @@ -71,13 +71,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); } @@ -248,8 +249,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/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index c6aa2f9ae0f55504fb27bca3122b4ac502c41a5c..ca497beab0f0d0e3e0e09cb5d16c5fb0269755f9 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -641,6 +641,7 @@ ResolveExpression::resolveBaseExpression(const QList<LookupItem> &baseResults, i foreach (Symbol *typedefCandidate, typedefCandidates) { if (typedefCandidate->isTypedef() && typedefCandidate->type()->isNamedType()) { ty = typedefCandidate->type(); + lastVisibleSymbol = typedefCandidate; break; } } diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 4d442258cd2bce4df4bf91d7c4f5d196edd69565..f0b64fef7c273e452f22b5e03cec3354e7a6b00b 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -1700,37 +1700,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; @@ -1749,15 +1756,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)