Commit 9839dea6 authored by Thorbjørn Lindeijer's avatar Thorbjørn Lindeijer
Browse files

Fixed autoindent when using tabs instead of spaces

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
parent e408159b
......@@ -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);
}
......@@ -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;
......
......@@ -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());
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment