diff options
author | Christian Kamm <christian.d.kamm@nokia.com> | 2011-08-17 11:35:57 +0200 |
---|---|---|
committer | Christian Kamm <christian.d.kamm@nokia.com> | 2011-08-19 11:12:09 +0200 |
commit | 8a6d767a8f2f98ea4e04847f92cff40d661b806f (patch) | |
tree | 586e5c539adfbb18623246d00dec5e894288c8e1 /src/plugins/cpptools/cpprefactoringchanges.cpp | |
parent | a07acad516b5fa1ac503493b4ec28d595f6e1ea0 (diff) |
Refactoring changes: Cleanup and improvements.
Previously RefactoringFiles were usually passed around by value.
However, since a RefactoringFile may sometimes own a QTextDocument
(when it was read from a file), that's not great and caused the
file to be reread after every copy.
With this change RefactoringFile becomes noncopyable and is always
owned by a shared pointer.
This change also allowed having const RefactoringFiles which is
useful because they can be safely used from other threads. See
CppRefactoringChanges::fileNoEditor.
Change-Id: I9045921d6d0f6349f9558ff2a3d8317ea172193b
Reviewed-on: http://codereview.qt.nokia.com/3084
Reviewed-by: Leandro T. C. Melo <leandro.melo@nokia.com>
Diffstat (limited to 'src/plugins/cpptools/cpprefactoringchanges.cpp')
-rw-r--r-- | src/plugins/cpptools/cpprefactoringchanges.cpp | 125 |
1 files changed, 84 insertions, 41 deletions
diff --git a/src/plugins/cpptools/cpprefactoringchanges.cpp b/src/plugins/cpptools/cpprefactoringchanges.cpp index c92aa862d2..af73d52d69 100644 --- a/src/plugins/cpptools/cpprefactoringchanges.cpp +++ b/src/plugins/cpptools/cpprefactoringchanges.cpp @@ -49,64 +49,101 @@ using namespace CPlusPlus; using namespace CppTools; using namespace Utils; +class CppTools::CppRefactoringChangesData : public TextEditor::RefactoringChangesData +{ +public: + CppRefactoringChangesData(const Snapshot &snapshot) + : m_snapshot(snapshot) + , m_modelManager(Internal::CppModelManager::instance()) + , m_workingCopy(m_modelManager->workingCopy()) + {} + + virtual void indentSelection(const QTextCursor &selection, + const QString &fileName, + const TextEditor::BaseTextEditorWidget *textEditor) const + { + // ### shares code with CPPEditor::indent() + QTextDocument *doc = selection.document(); + + QTextBlock block = doc->findBlock(selection.selectionStart()); + const QTextBlock end = doc->findBlock(selection.selectionEnd()).next(); + + const TextEditor::TabSettings &tabSettings = + ProjectExplorer::actualTabSettings(fileName, textEditor); + // TODO: add similar method like above one + CppTools::QtStyleCodeFormatter codeFormatter(tabSettings, + CppToolsSettings::instance()->cppCodeStylePreferences()->settings()); + codeFormatter.updateStateUntil(block); + + do { + int indent; + int padding; + codeFormatter.indentFor(block, &indent, &padding); + tabSettings.indentLine(block, indent + padding, padding); + codeFormatter.updateLineStateChange(block); + block = block.next(); + } while (block.isValid() && block != end); + + } + + virtual void fileChanged(const QString &fileName) + { + m_modelManager->updateSourceFiles(QStringList(fileName)); + } + + CPlusPlus::Snapshot m_snapshot; + CPlusPlus::CppModelManagerInterface *m_modelManager; + CPlusPlus::CppModelManagerInterface::WorkingCopy m_workingCopy; + +}; + CppRefactoringChanges::CppRefactoringChanges(const Snapshot &snapshot) - : m_snapshot(snapshot) - , m_modelManager(Internal::CppModelManager::instance()) + : RefactoringChanges(new CppRefactoringChangesData(snapshot)) { - Q_ASSERT(m_modelManager); - m_workingCopy = m_modelManager->workingCopy(); } -const Snapshot &CppRefactoringChanges::snapshot() const +CppRefactoringChangesData *CppRefactoringChanges::data() const { - return m_snapshot; + return static_cast<CppRefactoringChangesData *>(m_data.data()); } -CppRefactoringFile CppRefactoringChanges::file(const QString &fileName) +CppRefactoringFilePtr CppRefactoringChanges::file(TextEditor::BaseTextEditorWidget *editor, const Document::Ptr &document) { - return CppRefactoringFile(fileName, this); + CppRefactoringFilePtr result(new CppRefactoringFile(editor)); + result->setCppDocument(document); + return result; } -void CppRefactoringChanges::indentSelection(const QTextCursor &selection, - const QString &fileName, - const TextEditor::BaseTextEditorWidget *textEditor) const +CppRefactoringFilePtr CppRefactoringChanges::file(const QString &fileName) const { - // ### shares code with CPPEditor::indent() - QTextDocument *doc = selection.document(); + CppRefactoringFilePtr result(new CppRefactoringFile(fileName, m_data)); + return result; +} - QTextBlock block = doc->findBlock(selection.selectionStart()); - const QTextBlock end = doc->findBlock(selection.selectionEnd()).next(); +CppRefactoringFileConstPtr CppRefactoringChanges::fileNoEditor(const QString &fileName) const +{ + QTextDocument *document = 0; + if (data()->m_workingCopy.contains(fileName)) + document = new QTextDocument(data()->m_workingCopy.source(fileName)); + CppRefactoringFilePtr result(new CppRefactoringFile(document, fileName)); + result->m_data = m_data; - const TextEditor::TabSettings &tabSettings = - ProjectExplorer::actualTabSettings(fileName, textEditor); - // TODO: add similar method like above one - CppTools::QtStyleCodeFormatter codeFormatter(tabSettings, - CppToolsSettings::instance()->cppCodeStylePreferences()->settings()); - codeFormatter.updateStateUntil(block); + Document::Ptr cppDocument = data()->m_snapshot.document(fileName); + if (cppDocument) + result->setCppDocument(cppDocument); - do { - int indent; - int padding; - codeFormatter.indentFor(block, &indent, &padding); - tabSettings.indentLine(block, indent + padding, padding); - codeFormatter.updateLineStateChange(block); - block = block.next(); - } while (block.isValid() && block != end); + return result; } -void CppRefactoringChanges::fileChanged(const QString &fileName) +const Snapshot &CppRefactoringChanges::snapshot() const { - m_modelManager->updateSourceFiles(QStringList(fileName)); + return data()->m_snapshot; } - -CppRefactoringFile::CppRefactoringFile() -{ } - -CppRefactoringFile::CppRefactoringFile(const QString &fileName, CppRefactoringChanges *refactoringChanges) - : RefactoringFile(fileName, refactoringChanges) +CppRefactoringFile::CppRefactoringFile(const QString &fileName, const QSharedPointer<TextEditor::RefactoringChangesData> &data) + : RefactoringFile(fileName, data) { - const Snapshot &snapshot = refactoringChanges->snapshot(); + const Snapshot &snapshot = this->data()->m_snapshot; m_cppDocument = snapshot.document(fileName); } @@ -124,7 +161,7 @@ Document::Ptr CppRefactoringFile::cppDocument() const !m_cppDocument->translationUnit()->ast()) { const QString source = document()->toPlainText(); const QString name = fileName(); - const Snapshot &snapshot = refactoringChanges()->snapshot(); + const Snapshot &snapshot = data()->m_snapshot; const QByteArray contents = snapshot.preprocessedCode(source, name); m_cppDocument = snapshot.documentFromSource(contents, name); @@ -233,7 +270,13 @@ const Token &CppRefactoringFile::tokenAt(unsigned index) const return cppDocument()->translationUnit()->tokenAt(index); } -CppRefactoringChanges *CppRefactoringFile::refactoringChanges() const +CppRefactoringChangesData *CppRefactoringFile::data() const +{ + return static_cast<CppRefactoringChangesData *>(m_data.data()); +} + +void CppRefactoringFile::fileChanged() { - return static_cast<CppRefactoringChanges *>(m_refactoringChanges); + m_cppDocument.clear(); + RefactoringFile::fileChanged(); } |