Commit e4886468 authored by Christian Kamm's avatar Christian Kamm

C++ indenter: Store tab size and use it to calculate the column position

parent 19db6c98
......@@ -39,6 +39,7 @@ using namespace CppTools::Internal;
CodeFormatter::CodeFormatter()
: m_indentDepth(0)
, m_tabSize(4)
{
}
......@@ -46,6 +47,11 @@ CodeFormatter::~CodeFormatter()
{
}
void CodeFormatter::setTabSize(int tabSize)
{
m_tabSize = tabSize;
}
void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
{
restoreBlockState(block.previous());
......@@ -723,6 +729,24 @@ const Token &CodeFormatter::tokenAt(int idx) const
return m_tokens.at(idx);
}
int CodeFormatter::column(int index) const
{
int col = 0;
if (index > m_currentLine.length())
index = m_currentLine.length();
const QChar tab = QLatin1Char('\t');
for (int i = 0; i < index; i++) {
if (m_currentLine[i] == tab) {
col = ((col / m_tabSize) + 1) * m_tabSize;
} else {
col++;
}
}
return col;
}
QStringRef CodeFormatter::currentTokenText() const
{
return m_currentLine.midRef(m_currentToken.begin(), m_currentToken.length());
......@@ -843,7 +867,7 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd
{
const State &parentState = state();
const Token &tk = currentToken();
const int tokenPosition = tk.begin();
const int tokenPosition = column(tk.begin());
const bool firstToken = (tokenIndex() == 0);
const bool lastToken = (tokenIndex() == tokenCount() - 1);
......
......@@ -31,6 +31,8 @@ public:
int indentFor(const QTextBlock &block);
void invalidateCache(QTextDocument *document);
void setTabSize(int tabSize);
protected:
virtual void onEnter(int newState, int *indentDepth, int *savedIndentDepth) const = 0;
virtual void adjustIndent(const QList<CPlusPlus::Token> &tokens, int lexerState, int *indentDepth) const = 0;
......@@ -130,6 +132,7 @@ protected:
int tokenCount() const;
const CPlusPlus::Token &currentToken() const;
const CPlusPlus::Token &tokenAt(int idx) const;
int column(int position) const;
bool isBracelessState(int type) const;
......@@ -170,6 +173,8 @@ private:
// should store indent level and padding instead
int m_indentDepth;
int m_tabSize;
friend class Internal::CppCodeFormatterData;
};
......
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