diff options
author | Christian Kamm <christian.d.kamm@nokia.com> | 2010-07-07 11:01:38 +0200 |
---|---|---|
committer | Christian Kamm <christian.d.kamm@nokia.com> | 2010-07-08 10:16:17 +0200 |
commit | 7ae3fd5a10c584de0f0f0d1ff7761266eadc68d0 (patch) | |
tree | 6762c09b73a74b3ed5ad4386a432efc8754159f4 /src/plugins/cpptools/cppcodeformatter.cpp | |
parent | 486b23b8ef1df404c026514b93f073163885d324 (diff) | |
download | qt-creator-7ae3fd5a10c584de0f0f0d1ff7761266eadc68d0.tar.gz |
C++ indenter: Refactor to be independent of BaseTextDocumentLayout.
Done-with: Thomas Hartmann
Diffstat (limited to 'src/plugins/cpptools/cppcodeformatter.cpp')
-rw-r--r-- | src/plugins/cpptools/cppcodeformatter.cpp | 156 |
1 files changed, 88 insertions, 68 deletions
diff --git a/src/plugins/cpptools/cppcodeformatter.cpp b/src/plugins/cpptools/cppcodeformatter.cpp index ac4d94faf9..5d42edef6d 100644 --- a/src/plugins/cpptools/cppcodeformatter.cpp +++ b/src/plugins/cpptools/cppcodeformatter.cpp @@ -10,33 +10,16 @@ #include <QtGui/QTextCursor> #include <QtGui/QTextBlock> -namespace CppTools { -namespace Internal { - class CppCodeFormatterData: public TextEditor::CodeFormatterData - { - public: - CppCodeFormatterData(int blockRevision, - const QStack<CodeFormatter::State> &beginState, - const QStack<CodeFormatter::State> &endState, - int indentDepth) - : CodeFormatterData(blockRevision) - , m_beginState(beginState) - , m_endState(endState) - , m_indentDepth(indentDepth) - {} - - QStack<CodeFormatter::State> m_beginState; - QStack<CodeFormatter::State> m_endState; - int m_indentDepth; - }; -} -} - using namespace CPlusPlus; using namespace CppTools; using namespace TextEditor; using namespace CppTools::Internal; +CodeFormatter::BlockData::BlockData() + : m_blockRevision(-1) +{ +} + CodeFormatter::CodeFormatter() : m_indentDepth(0) , m_tabSize(4) @@ -54,7 +37,7 @@ void CodeFormatter::setTabSize(int tabSize) void CodeFormatter::recalculateStateAfter(const QTextBlock &block) { - restoreBlockState(block.previous()); + restoreCurrentState(block.previous()); bool endedJoined = false; const int lexerState = tokenizeBlock(block, &endedJoined); @@ -420,14 +403,14 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block) if (topState == cpp_macro && endedJoined) turnInto(cpp_macro_cont); - storeBlockState(block); + saveCurrentState(block); } int CodeFormatter::indentFor(const QTextBlock &block) { // qDebug() << "indenting for" << block.blockNumber() + 1; - restoreBlockState(block.previous()); + restoreCurrentState(block.previous()); correctIndentation(block); return m_indentDepth; } @@ -439,18 +422,17 @@ void CodeFormatter::updateStateUntil(const QTextBlock &endBlock) // find the first block that needs recalculation for (; it.isValid() && it != endBlock; it = it.next()) { - TextBlockUserData *userData = BaseTextDocumentLayout::userData(it); - CppCodeFormatterData *cppData = static_cast<CppCodeFormatterData *>(userData->codeFormatterData()); - if (!cppData) + BlockData blockData; + if (!loadBlockData(it, &blockData)) break; - if (cppData->blockRevision() != it.revision()) + if (blockData.m_blockRevision != it.revision()) break; - if (previousState != cppData->m_beginState) + if (previousState != blockData.m_beginState) break; - if (TextBlockUserData::lexerState(it) == -1) + if (loadLexerState(it) == -1) break; - previousState = cppData->m_endState; + previousState = blockData.m_endState; } if (it == endBlock) @@ -462,10 +444,10 @@ void CodeFormatter::updateStateUntil(const QTextBlock &endBlock) } // invalidate everything below by marking the state in endBlock as invalid - TextBlockUserData *userData = BaseTextDocumentLayout::userData(endBlock); - CppCodeFormatterData *cppData = static_cast<CppCodeFormatterData *>(userData->codeFormatterData()); - if (cppData) - cppData->setBlockRevision(-1); + if (it.isValid()) { + BlockData invalidBlockData; + saveBlockData(&it, invalidBlockData); + } } void CodeFormatter::updateLineStateChange(const QTextBlock &block) @@ -473,26 +455,18 @@ void CodeFormatter::updateLineStateChange(const QTextBlock &block) if (!block.isValid()) return; - QStack<State> oldEndState; - - TextBlockUserData *userData = BaseTextDocumentLayout::userData(block); - CppCodeFormatterData *cppData = static_cast<CppCodeFormatterData *>(userData->codeFormatterData()); - if (cppData) - oldEndState = cppData->m_endState; + BlockData blockData; + if (loadBlockData(block, &blockData) && blockData.m_blockRevision == block.revision()) + return; recalculateStateAfter(block); - if (oldEndState.isEmpty() || oldEndState != cppData->m_endState) { - // invalidate everything below by marking the next block's state as invalid - QTextBlock next = block.next(); - if (!next.isValid()) - return; + // invalidate everything below by marking the next block's state as invalid + QTextBlock next = block.next(); + if (!next.isValid()) + return; - userData = BaseTextDocumentLayout::userData(next); - cppData = static_cast<CppCodeFormatterData *>(userData->codeFormatterData()); - if (cppData) - cppData->setBlockRevision(-1); - } + saveBlockData(&next, BlockData()); } CodeFormatter::State CodeFormatter::state(int belowTop) const @@ -528,13 +502,10 @@ void CodeFormatter::invalidateCache(QTextDocument *document) if (!document) return; + BlockData invalidBlockData; QTextBlock it = document->firstBlock(); for (; it.isValid(); it = it.next()) { - TextBlockUserData *userData = BaseTextDocumentLayout::userData(it); - CppCodeFormatterData *cppData = static_cast<CppCodeFormatterData *>(userData->codeFormatterData()); - if (!cppData) - break; - cppData->setBlockRevision(-1); + saveBlockData(&it, invalidBlockData); } } @@ -795,25 +766,29 @@ void CodeFormatter::turnInto(int newState) enter(newState); } -void CodeFormatter::storeBlockState(const QTextBlock &block) +void CodeFormatter::saveCurrentState(const QTextBlock &block) { if (!block.isValid()) return; - TextBlockUserData *userData = BaseTextDocumentLayout::userData(block); - userData->setCodeFormatterData( - new CppCodeFormatterData(block.revision(), m_beginState, m_currentState, m_indentDepth)); + BlockData blockData; + blockData.m_blockRevision = block.revision(); + blockData.m_beginState = m_beginState; + blockData.m_endState = m_currentState; + blockData.m_indentDepth = m_indentDepth; + + QTextBlock saveableBlock(block); + saveBlockData(&saveableBlock, blockData); } -void CodeFormatter::restoreBlockState(const QTextBlock &block) +void CodeFormatter::restoreCurrentState(const QTextBlock &block) { if (block.isValid()) { - TextBlockUserData *userData = BaseTextDocumentLayout::userData(block); - CppCodeFormatterData *oldData = static_cast<CppCodeFormatterData *>(userData->codeFormatterData()); - if (oldData) { - m_currentState = oldData->m_endState; + BlockData blockData; + if (loadBlockData(block, &blockData)) { + m_indentDepth = blockData.m_indentDepth; + m_currentState = blockData.m_endState; m_beginState = m_currentState; - m_indentDepth = oldData->m_indentDepth; return; } } @@ -833,7 +808,7 @@ QStack<CodeFormatter::State> CodeFormatter::initialState() int CodeFormatter::tokenizeBlock(const QTextBlock &block, bool *endedJoined) { - int startState = TextBlockUserData::lexerState(block.previous()); + int startState = loadLexerState(block.previous()); if (block.blockNumber() == 0) startState = 0; Q_ASSERT(startState != -1); @@ -866,6 +841,17 @@ void CodeFormatter::dump() qDebug() << "Current indent depth:" << m_indentDepth; } + +namespace CppTools { +namespace Internal { + class CppCodeFormatterData: public TextEditor::CodeFormatterData + { + public: + CodeFormatter::BlockData m_data; + }; +} +} + QtStyleCodeFormatter::QtStyleCodeFormatter() : m_indentSize(4) , m_indentSubstatementBraces(false) @@ -900,6 +886,40 @@ void QtStyleCodeFormatter::setIndentDeclarationMembers(bool onOff) m_indentDeclarationMembers = onOff; } +void QtStyleCodeFormatter::saveBlockData(QTextBlock *block, const BlockData &data) const +{ + TextBlockUserData *userData = BaseTextDocumentLayout::userData(*block); + CppCodeFormatterData *cppData = static_cast<CppCodeFormatterData *>(userData->codeFormatterData()); + if (!cppData) { + cppData = new CppCodeFormatterData; + userData->setCodeFormatterData(cppData); + } + cppData->m_data = data; +} + +bool QtStyleCodeFormatter::loadBlockData(const QTextBlock &block, BlockData *data) const +{ + TextBlockUserData *userData = BaseTextDocumentLayout::testUserData(block); + if (!userData) + return false; + CppCodeFormatterData *cppData = static_cast<CppCodeFormatterData *>(userData->codeFormatterData()); + if (!cppData) + return false; + + *data = cppData->m_data; + return true; +} + +void QtStyleCodeFormatter::saveLexerState(QTextBlock *block, int state) const +{ + TextBlockUserData::setLexerState(*block, state); +} + +int QtStyleCodeFormatter::loadLexerState(const QTextBlock &block) const +{ + return TextBlockUserData::lexerState(block); +} + void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedIndentDepth) const { const State &parentState = state(); |