OSDN Git Service

Fixed autoindent when using tabs instead of spaces
authorThorbjørn Lindeijer <thorbjorn.lindeijer@nokia.com>
Mon, 7 Dec 2009 17:26:47 +0000 (18:26 +0100)
committerThorbjørn Lindeijer <thorbjorn.lindeijer@nokia.com>
Tue, 8 Dec 2009 10:09:11 +0000 (11:09 +0100)
Several special cases that are handled by the CPPEditor did not take
into account code that was using tab characters.

Task-number: QTCREATORBUG-292
Reviewed-by: Roberto Raggi
src/libs/cplusplus/BackwardsScanner.cpp
src/libs/cplusplus/BackwardsScanner.h
src/plugins/cppeditor/cppeditor.cpp

index 7f1f6cd..288d643 100644 (file)
@@ -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);
 }
index d991906..c4c65e7 100644 (file)
@@ -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;
index 2f21580..91a9e40 100644 (file)
@@ -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());