forked from qt-creator/qt-creator
		
	C++ indenter: Store tab size and use it to calculate the column position
This commit is contained in:
		@@ -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 ¤tToken() 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;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user