From 8a6d767a8f2f98ea4e04847f92cff40d661b806f Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Wed, 17 Aug 2011 11:35:57 +0200 Subject: 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 --- src/plugins/cpptools/cpprefactoringchanges.cpp | 125 +++++++++++++++++-------- 1 file changed, 84 insertions(+), 41 deletions(-) (limited to 'src/plugins/cpptools/cpprefactoringchanges.cpp') 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(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 &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(m_data.data()); +} + +void CppRefactoringFile::fileChanged() { - return static_cast(m_refactoringChanges); + m_cppDocument.clear(); + RefactoringFile::fileChanged(); } -- cgit v1.2.1