forked from qt-creator/qt-creator
Added infrastructure to change multiple files at once.
This commit is contained in:
@@ -733,6 +733,11 @@ TokenCache *CPPEditor::tokenCache() const
|
||||
return m_modelManager->tokenCache(editableInterface());
|
||||
}
|
||||
|
||||
CppTools::CppModelManagerInterface *CPPEditor::modelManager() const
|
||||
{
|
||||
return m_modelManager;
|
||||
}
|
||||
|
||||
void CPPEditor::startRename()
|
||||
{
|
||||
m_inRenameChanged = false;
|
||||
|
@@ -201,6 +201,8 @@ public:
|
||||
|
||||
CPlusPlus::TokenCache *tokenCache() const;
|
||||
|
||||
CppTools::CppModelManagerInterface *modelManager() const;
|
||||
|
||||
public Q_SLOTS:
|
||||
virtual void setFontSettings(const TextEditor::FontSettings &);
|
||||
void setSortedMethodOverview(bool sort);
|
||||
|
@@ -15,6 +15,7 @@ HEADERS += cppplugin.h \
|
||||
cppeditor_global.h \
|
||||
cppclasswizard.h \
|
||||
cppquickfix.h
|
||||
|
||||
SOURCES += cppplugin.cpp \
|
||||
cppeditor.cpp \
|
||||
cpphighlighter.cpp \
|
||||
@@ -22,6 +23,7 @@ SOURCES += cppplugin.cpp \
|
||||
cppfilewizard.cpp \
|
||||
cppclasswizard.cpp \
|
||||
cppquickfix.cpp
|
||||
|
||||
RESOURCES += cppeditor.qrc
|
||||
|
||||
OTHER_FILES += CppEditor.pluginspec CppEditor.mimetypes.xml
|
||||
|
@@ -47,6 +47,7 @@
|
||||
#include <Name.h>
|
||||
#include <Literals.h>
|
||||
|
||||
#include <cpptools/cpprefactoringchanges.h>
|
||||
#include <cpptools/cpptoolsconstants.h>
|
||||
#include <cpptools/cppmodelmanagerinterface.h>
|
||||
|
||||
@@ -864,28 +865,39 @@ private:
|
||||
|
||||
|
||||
CppQuickFixOperation::CppQuickFixOperation(TextEditor::BaseTextEditor *editor)
|
||||
: TextEditor::QuickFixOperation(editor), _topLevelNode(0)
|
||||
: TextEditor::QuickFixOperation(editor)
|
||||
, _refactoringChanges(0)
|
||||
, _topLevelNode(0)
|
||||
{ }
|
||||
|
||||
CppQuickFixOperation::~CppQuickFixOperation()
|
||||
{ }
|
||||
|
||||
CppQuickFixOperation::Range CppQuickFixOperation::topLevelRange() const
|
||||
{
|
||||
if (topLevelNode())
|
||||
return createRange(topLevelNode());
|
||||
|
||||
return Range();
|
||||
if (_refactoringChanges)
|
||||
delete _refactoringChanges;
|
||||
}
|
||||
|
||||
int CppQuickFixOperation::match(TextEditor::QuickFixState *state)
|
||||
{
|
||||
CppQuickFixState *s = static_cast<CppQuickFixState *>(state);
|
||||
_document = s->info.doc;
|
||||
_snapshot = s->info.snapshot;
|
||||
if (_refactoringChanges)
|
||||
delete _refactoringChanges;
|
||||
CPPEditor *cppEditor = qobject_cast<CPPEditor*>(editor());
|
||||
_refactoringChanges = new CppTools::CppRefactoringChanges(s->info.snapshot, cppEditor->modelManager());
|
||||
return match(s->path);
|
||||
}
|
||||
|
||||
void CppQuickFixOperation::apply()
|
||||
{
|
||||
cppRefactoringChanges()->apply();
|
||||
}
|
||||
|
||||
CppTools::CppRefactoringChanges *CppQuickFixOperation::cppRefactoringChanges() const
|
||||
{ return _refactoringChanges; }
|
||||
|
||||
TextEditor::RefactoringChanges *CppQuickFixOperation::refactoringChanges() const
|
||||
{ return cppRefactoringChanges(); }
|
||||
|
||||
CPlusPlus::AST *CppQuickFixOperation::topLevelNode() const
|
||||
{ return _topLevelNode; }
|
||||
|
||||
@@ -896,7 +908,9 @@ Document::Ptr CppQuickFixOperation::document() const
|
||||
{ return _document; }
|
||||
|
||||
const Snapshot &CppQuickFixOperation::snapshot() const
|
||||
{ return _snapshot; }
|
||||
{
|
||||
return _refactoringChanges->snapshot();
|
||||
}
|
||||
|
||||
const CPlusPlus::Token &CppQuickFixOperation::tokenAt(unsigned index) const
|
||||
{ return _document->translationUnit()->tokenAt(index); }
|
||||
@@ -965,11 +979,6 @@ bool CppQuickFixOperation::isCursorOn(const CPlusPlus::AST *ast) const
|
||||
return false;
|
||||
}
|
||||
|
||||
CppQuickFixOperation::Range CppQuickFixOperation::createRange(AST *ast) const
|
||||
{
|
||||
return range(startOf(ast), endOf(ast));
|
||||
}
|
||||
|
||||
void CppQuickFixOperation::move(unsigned tokenIndex, int to)
|
||||
{
|
||||
int start, end;
|
||||
|
@@ -43,6 +43,7 @@
|
||||
|
||||
namespace CppTools {
|
||||
class CppModelManagerInterface;
|
||||
class CppRefactoringChanges;
|
||||
} // end of namespace CppTools
|
||||
|
||||
namespace CppEditor {
|
||||
@@ -61,10 +62,13 @@ public:
|
||||
CPlusPlus::Document::Ptr document() const;
|
||||
const CPlusPlus::Snapshot &snapshot() const;
|
||||
|
||||
virtual Range topLevelRange() const;
|
||||
virtual int match(TextEditor::QuickFixState *state);
|
||||
|
||||
protected:
|
||||
virtual void apply();
|
||||
virtual CppTools::CppRefactoringChanges *cppRefactoringChanges() const;
|
||||
virtual TextEditor::RefactoringChanges *refactoringChanges() const;
|
||||
|
||||
CPlusPlus::AST *topLevelNode() const;
|
||||
void setTopLevelNode(CPlusPlus::AST *topLevelNode);
|
||||
|
||||
@@ -100,11 +104,10 @@ protected:
|
||||
void copy(const CPlusPlus::AST *ast, int to);
|
||||
|
||||
QString textOf(const CPlusPlus::AST *ast) const;
|
||||
Range createRange(CPlusPlus::AST *ast) const; // ### rename me
|
||||
|
||||
private:
|
||||
CppTools::CppRefactoringChanges *_refactoringChanges;
|
||||
CPlusPlus::Document::Ptr _document;
|
||||
CPlusPlus::Snapshot _snapshot;
|
||||
CPlusPlus::AST *_topLevelNode;
|
||||
};
|
||||
|
||||
|
75
src/plugins/cpptools/cpprefactoringchanges.cpp
Normal file
75
src/plugins/cpptools/cpprefactoringchanges.cpp
Normal file
@@ -0,0 +1,75 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#include "cpprefactoringchanges.h"
|
||||
|
||||
using namespace CPlusPlus;
|
||||
using namespace CppTools;
|
||||
using namespace TextEditor;
|
||||
|
||||
CppRefactoringChanges::CppRefactoringChanges(const Snapshot &snapshot,
|
||||
CppModelManagerInterface *modelManager)
|
||||
: m_snapshot(snapshot)
|
||||
, m_modelManager(modelManager)
|
||||
, m_workingCopy(modelManager->workingCopy())
|
||||
{
|
||||
Q_ASSERT(modelManager);
|
||||
}
|
||||
|
||||
QStringList CppRefactoringChanges::apply()
|
||||
{
|
||||
const QStringList changedFiles = TextEditor::RefactoringChanges::apply();
|
||||
m_modelManager->updateSourceFiles(changedFiles);
|
||||
return changedFiles;
|
||||
}
|
||||
|
||||
Document::Ptr CppRefactoringChanges::parsedDocumentForFile(const QString &fileName) const
|
||||
{
|
||||
Document::Ptr doc = m_snapshot.document(fileName);
|
||||
|
||||
QString source;
|
||||
if (m_workingCopy.contains(fileName)) {
|
||||
QPair<QString, unsigned> workingCopy = m_workingCopy.get(fileName);
|
||||
if (doc && doc->editorRevision() == workingCopy.second)
|
||||
return doc;
|
||||
else
|
||||
source = workingCopy.first;
|
||||
} else {
|
||||
QFile file(fileName);
|
||||
if (! file.open(QFile::ReadOnly))
|
||||
return Document::Ptr();
|
||||
|
||||
source = QTextStream(&file).readAll(); // ### FIXME read bytes, and remove the convert below
|
||||
file.close();
|
||||
}
|
||||
|
||||
doc = m_snapshot.documentFromSource(source.toLatin1(), fileName);
|
||||
doc->check();
|
||||
return doc;
|
||||
}
|
62
src/plugins/cpptools/cpprefactoringchanges.h
Normal file
62
src/plugins/cpptools/cpprefactoringchanges.h
Normal file
@@ -0,0 +1,62 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef CPPREFACTORINGCHANGES_H
|
||||
#define CPPREFACTORINGCHANGES_H
|
||||
|
||||
#include <cplusplus/CppDocument.h>
|
||||
|
||||
#include <cpptools/cppmodelmanagerinterface.h>
|
||||
#include <cpptools/cpptools_global.h>
|
||||
|
||||
#include <texteditor/refactoringchanges.h>
|
||||
|
||||
namespace CppTools {
|
||||
|
||||
class CPPTOOLS_EXPORT CppRefactoringChanges: public TextEditor::RefactoringChanges
|
||||
{
|
||||
public:
|
||||
CppRefactoringChanges(const CPlusPlus::Snapshot &snapshot, CppModelManagerInterface *modelManager);
|
||||
|
||||
virtual QStringList apply();
|
||||
|
||||
const CPlusPlus::Snapshot &snapshot() const
|
||||
{ return m_snapshot; }
|
||||
|
||||
CPlusPlus::Document::Ptr parsedDocumentForFile(const QString &fileName) const;
|
||||
|
||||
private:
|
||||
CPlusPlus::Snapshot m_snapshot;
|
||||
CppModelManagerInterface *m_modelManager;
|
||||
CppModelManagerInterface::WorkingCopy m_workingCopy;
|
||||
};
|
||||
|
||||
} // namespace CppTools
|
||||
|
||||
#endif // CPPREFACTORINGCHANGES_H
|
@@ -23,7 +23,8 @@ HEADERS += completionsettingspage.h \
|
||||
searchsymbols.h \
|
||||
cppdoxygen.h \
|
||||
cppfilesettingspage.h \
|
||||
cppfindreferences.h
|
||||
cppfindreferences.h \
|
||||
cpprefactoringchanges.h
|
||||
|
||||
SOURCES += completionsettingspage.cpp \
|
||||
cppclassesfilter.cpp \
|
||||
@@ -38,7 +39,8 @@ SOURCES += completionsettingspage.cpp \
|
||||
cppdoxygen.cpp \
|
||||
cppfilesettingspage.cpp \
|
||||
abstracteditorsupport.cpp \
|
||||
cppfindreferences.cpp
|
||||
cppfindreferences.cpp \
|
||||
cpprefactoringchanges.cpp
|
||||
|
||||
FORMS += completionsettingspage.ui \
|
||||
cppfilesettingspage.ui
|
||||
|
@@ -436,7 +436,7 @@ protected:
|
||||
range.ast = member;
|
||||
|
||||
range.begin = QTextCursor(_textDocument);
|
||||
range.begin.setPosition(ast->lbraceToken.begin());
|
||||
range.begin.setPosition(member->firstSourceLocation().begin());
|
||||
|
||||
range.end = QTextCursor(_textDocument);
|
||||
range.end.setPosition(ast->rbraceToken.end());
|
||||
|
@@ -21,7 +21,8 @@ HEADERS += \
|
||||
qmljshoverhandler.h \
|
||||
qmljsmodelmanager.h \
|
||||
qmljspreviewrunner.h \
|
||||
qmljsquickfix.h
|
||||
qmljsquickfix.h \
|
||||
qmljsrefactoringchanges.h
|
||||
|
||||
SOURCES += \
|
||||
qmljscodecompletion.cpp \
|
||||
@@ -35,7 +36,8 @@ SOURCES += \
|
||||
qmljshoverhandler.cpp \
|
||||
qmljsmodelmanager.cpp \
|
||||
qmljspreviewrunner.cpp \
|
||||
qmljsquickfix.cpp
|
||||
qmljsquickfix.cpp \
|
||||
qmljsrefactoringchanges.cpp
|
||||
|
||||
RESOURCES += qmljseditor.qrc
|
||||
OTHER_FILES += QmlJSEditor.pluginspec QmlJSEditor.mimetypes.xml
|
||||
|
@@ -29,11 +29,19 @@
|
||||
|
||||
#include "qmljsquickfix.h"
|
||||
#include "qmljseditor.h"
|
||||
#include "qmljsrefactoringchanges.h"
|
||||
#include "qmljs/parser/qmljsast_p.h"
|
||||
|
||||
#include <extensionsystem/pluginmanager.h>
|
||||
|
||||
#include <qmljs/qmljsmodelmanagerinterface.h>
|
||||
|
||||
#include <QtGui/QApplication>
|
||||
#include <QtCore/QDebug>
|
||||
|
||||
using namespace QmlJSEditor;
|
||||
using namespace QmlJSEditor::Internal;
|
||||
using TextEditor::RefactoringChanges;
|
||||
|
||||
class QmlJSQuickFixState: public TextEditor::QuickFixState
|
||||
{
|
||||
@@ -54,14 +62,6 @@ public:
|
||||
return QApplication::translate("QmlJSEditor::QuickFix", "Split initializer");
|
||||
}
|
||||
|
||||
virtual Range topLevelRange() const
|
||||
{
|
||||
Q_ASSERT(_objectInitializer);
|
||||
|
||||
return range(position(_objectInitializer->lbraceToken),
|
||||
position(_objectInitializer->rbraceToken));
|
||||
}
|
||||
|
||||
virtual void createChangeSet()
|
||||
{
|
||||
Q_ASSERT(_objectInitializer != 0);
|
||||
@@ -77,6 +77,10 @@ public:
|
||||
|
||||
// insert a newline before the closing brace
|
||||
insert(position(_objectInitializer->rbraceToken), QLatin1String("\n"));
|
||||
|
||||
reindent(RefactoringChanges::Range(position(_objectInitializer->lbraceToken),
|
||||
position(_objectInitializer->rbraceToken)));
|
||||
|
||||
}
|
||||
|
||||
virtual int check()
|
||||
@@ -112,11 +116,14 @@ private:
|
||||
|
||||
QmlJSQuickFixOperation::QmlJSQuickFixOperation(TextEditor::BaseTextEditor *editor)
|
||||
: TextEditor::QuickFixOperation(editor)
|
||||
, _refactoringChanges(0)
|
||||
{
|
||||
}
|
||||
|
||||
QmlJSQuickFixOperation::~QmlJSQuickFixOperation()
|
||||
{
|
||||
if (_refactoringChanges)
|
||||
delete _refactoringChanges;
|
||||
}
|
||||
|
||||
QmlJS::Document::Ptr QmlJSQuickFixOperation::document() const
|
||||
@@ -136,11 +143,27 @@ const SemanticInfo &QmlJSQuickFixOperation::semanticInfo() const
|
||||
|
||||
int QmlJSQuickFixOperation::match(TextEditor::QuickFixState *state)
|
||||
{
|
||||
QmlJS::ModelManagerInterface *modelManager = ExtensionSystem::PluginManager::instance()->getObject<QmlJS::ModelManagerInterface>();
|
||||
QmlJSQuickFixState *s = static_cast<QmlJSQuickFixState *>(state);
|
||||
_semanticInfo = s->semanticInfo;
|
||||
if (_refactoringChanges) {
|
||||
delete _refactoringChanges;
|
||||
}
|
||||
_refactoringChanges = new QmlJSRefactoringChanges(modelManager, _semanticInfo.snapshot);
|
||||
return check();
|
||||
}
|
||||
|
||||
void QmlJSQuickFixOperation::apply()
|
||||
{
|
||||
_refactoringChanges->apply();
|
||||
}
|
||||
|
||||
QmlJSRefactoringChanges *QmlJSQuickFixOperation::qmljsRefactoringChanges() const
|
||||
{ return _refactoringChanges; }
|
||||
|
||||
RefactoringChanges *QmlJSQuickFixOperation::refactoringChanges() const
|
||||
{ return qmljsRefactoringChanges(); }
|
||||
|
||||
unsigned QmlJSQuickFixOperation::position(const QmlJS::AST::SourceLocation &loc) const
|
||||
{
|
||||
return position(loc.startLine, loc.startColumn);
|
||||
|
@@ -31,6 +31,7 @@
|
||||
#define QMLJSQUICKFIX_H
|
||||
|
||||
#include "qmljseditor.h"
|
||||
|
||||
#include <texteditor/quickfix.h>
|
||||
#include <qmljs/parser/qmljsastfwd_p.h>
|
||||
#include <qmljs/qmljsdocument.h>
|
||||
@@ -40,6 +41,7 @@ namespace QmlJS {
|
||||
}
|
||||
|
||||
namespace QmlJSEditor {
|
||||
class QmlJSRefactoringChanges;
|
||||
|
||||
namespace Internal {
|
||||
|
||||
@@ -69,6 +71,10 @@ protected:
|
||||
using TextEditor::QuickFixOperation::charAt;
|
||||
using TextEditor::QuickFixOperation::position;
|
||||
|
||||
virtual void apply();
|
||||
QmlJSRefactoringChanges *qmljsRefactoringChanges() const;
|
||||
virtual TextEditor::RefactoringChanges *refactoringChanges() const;
|
||||
|
||||
unsigned position(const QmlJS::AST::SourceLocation &loc) const;
|
||||
|
||||
// token based operations
|
||||
@@ -79,6 +85,7 @@ protected:
|
||||
|
||||
private:
|
||||
SemanticInfo _semanticInfo;
|
||||
QmlJSRefactoringChanges *_refactoringChanges;
|
||||
};
|
||||
|
||||
class QmlJSQuickFixCollector: public TextEditor::QuickFixCollector
|
||||
|
50
src/plugins/qmljseditor/qmljsrefactoringchanges.cpp
Normal file
50
src/plugins/qmljseditor/qmljsrefactoringchanges.cpp
Normal file
@@ -0,0 +1,50 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#include "qmljsrefactoringchanges.h"
|
||||
|
||||
#include <qmljs/qmljsmodelmanagerinterface.h>
|
||||
|
||||
using namespace QmlJS;
|
||||
using namespace QmlJSEditor;
|
||||
|
||||
QmlJSRefactoringChanges::QmlJSRefactoringChanges(ModelManagerInterface *modelManager,
|
||||
const Snapshot &snapshot)
|
||||
: m_modelManager(modelManager)
|
||||
, m_snapshot(snapshot)
|
||||
{
|
||||
Q_ASSERT(modelManager);
|
||||
}
|
||||
|
||||
QStringList QmlJSRefactoringChanges::apply()
|
||||
{
|
||||
const QStringList changedFiles = TextEditor::RefactoringChanges::apply();
|
||||
m_modelManager->updateSourceFiles(changedFiles, true);
|
||||
return changedFiles;
|
||||
}
|
58
src/plugins/qmljseditor/qmljsrefactoringchanges.h
Normal file
58
src/plugins/qmljseditor/qmljsrefactoringchanges.h
Normal file
@@ -0,0 +1,58 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef QMLREFACTORINGCHANGES_H
|
||||
#define QMLREFACTORINGCHANGES_H
|
||||
|
||||
#include <qmljs/qmljsdocument.h>
|
||||
|
||||
#include <texteditor/refactoringchanges.h>
|
||||
|
||||
namespace QmlJS {
|
||||
class ModelManagerInterface;
|
||||
} // namespace QmlJS
|
||||
|
||||
namespace QmlJSEditor {
|
||||
|
||||
class QmlJSRefactoringChanges: public TextEditor::RefactoringChanges
|
||||
{
|
||||
public:
|
||||
QmlJSRefactoringChanges(QmlJS::ModelManagerInterface *modelManager,
|
||||
const QmlJS::Snapshot &snapshot);
|
||||
|
||||
virtual QStringList apply();
|
||||
|
||||
private:
|
||||
QmlJS::ModelManagerInterface *m_modelManager;
|
||||
QmlJS::Snapshot m_snapshot;
|
||||
};
|
||||
|
||||
} // namespace QmlJSEditor
|
||||
|
||||
#endif // QMLREFACTORINGCHANGES_H
|
@@ -69,6 +69,7 @@ public:
|
||||
/* returns the list of unique files that were passed in items */
|
||||
static QStringList replaceAll(const QString &txt,
|
||||
const QList<Find::SearchResultItem> &items);
|
||||
|
||||
protected:
|
||||
virtual QStringList files() = 0;
|
||||
void writeCommonSettings(QSettings *settings);
|
||||
|
@@ -30,11 +30,14 @@
|
||||
#include "quickfix.h"
|
||||
#include "basetexteditor.h"
|
||||
|
||||
#include <coreplugin/ifile.h>
|
||||
|
||||
#include <QtGui/QApplication>
|
||||
#include <QtGui/QTextBlock>
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
|
||||
using TextEditor::RefactoringChanges;
|
||||
using TextEditor::QuickFixOperation;
|
||||
using TextEditor::QuickFixCollector;
|
||||
|
||||
@@ -72,49 +75,16 @@ int QuickFixOperation::selectionEnd() const
|
||||
return _textCursor.selectionEnd();
|
||||
}
|
||||
|
||||
const Utils::ChangeSet &QuickFixOperation::changeSet() const
|
||||
{
|
||||
return _changeSet;
|
||||
}
|
||||
|
||||
void QuickFixOperation::apply()
|
||||
{
|
||||
const Range r = topLevelRange();
|
||||
|
||||
_textCursor.beginEditBlock();
|
||||
_changeSet.apply(&_textCursor);
|
||||
reindent(r);
|
||||
_textCursor.endEditBlock();
|
||||
}
|
||||
|
||||
QuickFixOperation::Range QuickFixOperation::range(int from, int to) const
|
||||
{
|
||||
QTextDocument *doc = editor()->document();
|
||||
|
||||
QTextCursor begin(doc);
|
||||
begin.setPosition(from);
|
||||
|
||||
QTextCursor end(doc);
|
||||
end.setPosition(to);
|
||||
|
||||
Range range;
|
||||
range.begin = begin;
|
||||
range.end = end;
|
||||
return range;
|
||||
}
|
||||
|
||||
int QuickFixOperation::position(int line, int column) const
|
||||
{
|
||||
QTextDocument *doc = editor()->document();
|
||||
return doc->findBlockByNumber(line - 1).position() + column - 1;
|
||||
}
|
||||
|
||||
void QuickFixOperation::reindent(const Range &range)
|
||||
void QuickFixOperation::reindent(const RefactoringChanges::Range &range)
|
||||
{
|
||||
if (! range.isNull()) {
|
||||
QTextCursor tc = range.begin;
|
||||
tc.setPosition(range.end.position(), QTextCursor::KeepAnchor);
|
||||
editor()->indentInsertedText(tc);
|
||||
refactoringChanges()->reindent(editor()->file()->fileName(), range);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,9 +132,18 @@ QString QuickFixOperation::textOf(int start, int end) const
|
||||
return tc.selectedText();
|
||||
}
|
||||
|
||||
TextEditor::RefactoringChanges::Range QuickFixOperation::range(int start, int end)
|
||||
{
|
||||
return TextEditor::RefactoringChanges::Range(start, end);
|
||||
}
|
||||
|
||||
void QuickFixOperation::perform()
|
||||
{
|
||||
createChangeSet();
|
||||
|
||||
if (!_changeSet.isEmpty())
|
||||
refactoringChanges()->changeFile(editor()->file()->fileName(), _changeSet);
|
||||
|
||||
apply();
|
||||
}
|
||||
|
||||
|
@@ -32,6 +32,8 @@
|
||||
|
||||
#include "texteditor_global.h"
|
||||
#include "icompletioncollector.h"
|
||||
|
||||
#include <texteditor/refactoringchanges.h>
|
||||
#include <utils/changeset.h>
|
||||
|
||||
#include <QtCore/QSharedPointer>
|
||||
@@ -58,41 +60,28 @@ class TEXTEDITOR_EXPORT QuickFixOperation
|
||||
public:
|
||||
typedef QSharedPointer<QuickFixOperation> Ptr;
|
||||
|
||||
struct Range {
|
||||
Range() {}
|
||||
Range(const QTextCursor &tc): begin(tc), end(tc) {}
|
||||
|
||||
bool isNull() const { return begin.isNull() || end.isNull(); }
|
||||
|
||||
QTextCursor begin;
|
||||
QTextCursor end;
|
||||
};
|
||||
|
||||
public:
|
||||
QuickFixOperation(TextEditor::BaseTextEditor *editor);
|
||||
virtual ~QuickFixOperation();
|
||||
|
||||
virtual QString description() const = 0;
|
||||
virtual void createChangeSet() = 0;
|
||||
virtual Range topLevelRange() const = 0;
|
||||
|
||||
virtual int match(QuickFixState *state) = 0;
|
||||
|
||||
void perform();
|
||||
void apply();
|
||||
|
||||
TextEditor::BaseTextEditor *editor() const;
|
||||
|
||||
QTextCursor textCursor() const;
|
||||
void setTextCursor(const QTextCursor &cursor);
|
||||
|
||||
void reindent(const Range &range);
|
||||
void reindent(const TextEditor::RefactoringChanges::Range &range);
|
||||
|
||||
int selectionStart() const;
|
||||
int selectionEnd() const;
|
||||
|
||||
int position(int line, int column) const;
|
||||
Range range(int from, int to) const;
|
||||
|
||||
void move(int start, int end, int to);
|
||||
void replace(int start, int end, const QString &replacement);
|
||||
@@ -104,7 +93,11 @@ public:
|
||||
QChar charAt(int offset) const;
|
||||
QString textOf(int start, int end) const;
|
||||
|
||||
const Utils::ChangeSet &changeSet() const;
|
||||
static TextEditor::RefactoringChanges::Range range(int start, int end);
|
||||
|
||||
protected:
|
||||
virtual void apply() = 0;
|
||||
virtual TextEditor::RefactoringChanges *refactoringChanges() const = 0;
|
||||
|
||||
private:
|
||||
TextEditor::BaseTextEditor *_editor;
|
||||
|
191
src/plugins/texteditor/refactoringchanges.cpp
Normal file
191
src/plugins/texteditor/refactoringchanges.cpp
Normal file
@@ -0,0 +1,191 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#include "refactoringchanges.h"
|
||||
|
||||
#include <coreplugin/editormanager/editormanager.h>
|
||||
#include <extensionsystem/pluginmanager.h>
|
||||
|
||||
#include <QtCore/QFile>
|
||||
#include <QtCore/QSet>
|
||||
#include <QtGui/QTextBlock>
|
||||
|
||||
using namespace TextEditor;
|
||||
|
||||
RefactoringChanges::~RefactoringChanges()
|
||||
{}
|
||||
|
||||
void RefactoringChanges::createFile(const QString &fileName, const QString &contents)
|
||||
{
|
||||
m_contentsByCreatedFile.insert(fileName, contents);
|
||||
}
|
||||
|
||||
void RefactoringChanges::changeFile(const QString &fileName, const Utils::ChangeSet &changeSet)
|
||||
{
|
||||
m_changesByFile.insert(fileName, changeSet);
|
||||
}
|
||||
|
||||
void RefactoringChanges::reindent(const QString &fileName, const Range &range)
|
||||
{
|
||||
m_indentRangesByFile[fileName].append(range);
|
||||
}
|
||||
|
||||
QStringList RefactoringChanges::apply()
|
||||
{
|
||||
QSet<QString> changed;
|
||||
|
||||
{ // create files
|
||||
foreach (const QString &fileName, m_contentsByCreatedFile.keys()) {
|
||||
BaseTextEditor *editor = editorForNewFile(fileName);
|
||||
if (editor == 0)
|
||||
continue;
|
||||
|
||||
QTextCursor tc = editor->textCursor();
|
||||
tc.beginEditBlock();
|
||||
tc.setPosition(0);
|
||||
tc.insertText(m_contentsByCreatedFile.value(fileName));
|
||||
|
||||
foreach (const Range &range, m_indentRangesByFile.value(fileName, QList<Range>())) {
|
||||
QTextCursor indentCursor = editor->textCursor();
|
||||
indentCursor.setPosition(range.begin);
|
||||
indentCursor.setPosition(range.end, QTextCursor::KeepAnchor);
|
||||
editor->indentInsertedText(indentCursor);
|
||||
}
|
||||
|
||||
tc.endEditBlock();
|
||||
changed.insert(fileName);
|
||||
}
|
||||
}
|
||||
|
||||
{ // change and indent files
|
||||
foreach (const QString &fileName, m_changesByFile.keys()) {
|
||||
BaseTextEditor *editor = editorForFile(fileName, true);
|
||||
if (editor == 0)
|
||||
continue;
|
||||
|
||||
QTextCursor tc = editor->textCursor();
|
||||
tc.beginEditBlock();
|
||||
|
||||
typedef QPair<QTextCursor, QTextCursor> CursorPair;
|
||||
QList<CursorPair> cursorPairs;
|
||||
foreach (const Range &range, m_indentRangesByFile.value(fileName, QList<Range>())) {
|
||||
QTextCursor start = editor->textCursor();
|
||||
QTextCursor end = editor->textCursor();
|
||||
start.setPosition(range.begin);
|
||||
end.setPosition(range.end);
|
||||
cursorPairs.append(qMakePair(start, end));
|
||||
}
|
||||
|
||||
QTextCursor changeSetCursor = editor->textCursor();
|
||||
Utils::ChangeSet changeSet = m_changesByFile[fileName];
|
||||
changeSet.apply(&changeSetCursor);
|
||||
|
||||
foreach (const CursorPair &cursorPair, cursorPairs) {
|
||||
QTextCursor indentCursor = cursorPair.first;
|
||||
indentCursor.setPosition(cursorPair.second.position(),
|
||||
QTextCursor::KeepAnchor);
|
||||
editor->indentInsertedText(indentCursor);
|
||||
}
|
||||
|
||||
tc.endEditBlock();
|
||||
changed.insert(fileName);
|
||||
}
|
||||
}
|
||||
|
||||
{ // Indent files which are not changed
|
||||
foreach (const QString &fileName, m_indentRangesByFile.keys()) {
|
||||
BaseTextEditor *editor = editorForFile(fileName);
|
||||
|
||||
if (editor == 0)
|
||||
continue;
|
||||
|
||||
if (changed.contains(fileName))
|
||||
continue;
|
||||
|
||||
QTextCursor tc = editor->textCursor();
|
||||
tc.beginEditBlock();
|
||||
|
||||
foreach (const Range &range, m_indentRangesByFile.value(fileName, QList<Range>())) {
|
||||
QTextCursor indentCursor = editor->textCursor();
|
||||
indentCursor.setPosition(range.begin);
|
||||
indentCursor.setPosition(range.end, QTextCursor::KeepAnchor);
|
||||
editor->indentInsertedText(indentCursor);
|
||||
}
|
||||
|
||||
tc.endEditBlock();
|
||||
changed.insert(fileName);
|
||||
}
|
||||
}
|
||||
|
||||
{ // Delete files
|
||||
// ###
|
||||
}
|
||||
|
||||
return changed.toList();
|
||||
}
|
||||
|
||||
int RefactoringChanges::positionInFile(const QString &fileName, int line, int column) const
|
||||
{
|
||||
if (BaseTextEditor *editor = editorForFile(fileName)) {
|
||||
return editor->document()->findBlockByNumber(line).position() + column;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
BaseTextEditor *RefactoringChanges::editorForFile(const QString &fileName,
|
||||
bool openIfClosed)
|
||||
{
|
||||
Core::EditorManager *editorManager = Core::EditorManager::instance();
|
||||
|
||||
const QList<Core::IEditor *> editors = editorManager->editorsForFileName(fileName);
|
||||
foreach (Core::IEditor *editor, editors) {
|
||||
BaseTextEditor *textEditor = qobject_cast<BaseTextEditor *>(editor->widget());
|
||||
if (textEditor != 0)
|
||||
return textEditor;
|
||||
}
|
||||
|
||||
if (!openIfClosed)
|
||||
return 0;
|
||||
|
||||
Core::IEditor *editor = editorManager->openEditor(fileName, QString(),
|
||||
Core::EditorManager::NoActivate | Core::EditorManager::IgnoreNavigationHistory | Core::EditorManager::NoModeSwitch);
|
||||
return qobject_cast<BaseTextEditor *>(editor->widget());
|
||||
}
|
||||
|
||||
BaseTextEditor *RefactoringChanges::editorForNewFile(const QString &fileName)
|
||||
{
|
||||
QFile f(fileName);
|
||||
if (f.exists())
|
||||
return 0;
|
||||
if (!f.open(QIODevice::Append))
|
||||
return 0;
|
||||
f.close();
|
||||
return editorForFile(fileName, true);
|
||||
}
|
89
src/plugins/texteditor/refactoringchanges.h
Normal file
89
src/plugins/texteditor/refactoringchanges.h
Normal file
@@ -0,0 +1,89 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef REFACTORINGCHANGES_H
|
||||
#define REFACTORINGCHANGES_H
|
||||
|
||||
#include <utils/changeset.h>
|
||||
#include <texteditor/basetexteditor.h>
|
||||
#include <texteditor/texteditor_global.h>
|
||||
|
||||
#include <QtCore/QList>
|
||||
#include <QtCore/QMap>
|
||||
#include <QtCore/QString>
|
||||
|
||||
namespace TextEditor {
|
||||
|
||||
class TEXTEDITOR_EXPORT RefactoringChanges
|
||||
{
|
||||
public:
|
||||
struct Range {
|
||||
Range()
|
||||
: begin(0)
|
||||
, end(0)
|
||||
{}
|
||||
Range(int beginPosition, int endPosition)
|
||||
: begin(beginPosition)
|
||||
, end(endPosition)
|
||||
{}
|
||||
|
||||
bool isNull() const
|
||||
{ return begin == 0 || end == 0; }
|
||||
|
||||
int begin;
|
||||
int end;
|
||||
};
|
||||
|
||||
public:
|
||||
virtual ~RefactoringChanges();
|
||||
|
||||
void createFile(const QString &fileName, const QString &contents);
|
||||
void changeFile(const QString &fileName, const Utils::ChangeSet &changeSet);
|
||||
// TODO:
|
||||
// void deleteFile(const QString &fileName);
|
||||
|
||||
void reindent(const QString &fileName, const Range &range);
|
||||
|
||||
virtual QStringList apply();
|
||||
|
||||
int positionInFile(const QString &fileName, int line, int column = 0) const;
|
||||
|
||||
static BaseTextEditor *editorForFile(const QString &fileName,
|
||||
bool openIfClosed = false);
|
||||
static BaseTextEditor *editorForNewFile(const QString &fileName);
|
||||
|
||||
private:
|
||||
QMap<QString, QString> m_contentsByCreatedFile;
|
||||
QMap<QString, Utils::ChangeSet> m_changesByFile;
|
||||
QMap<QString, QList<Range> > m_indentRangesByFile;
|
||||
};
|
||||
|
||||
} // namespace TextEditor
|
||||
|
||||
#endif // REFACTORINGCHANGES_H
|
@@ -58,7 +58,8 @@ SOURCES += texteditorplugin.cpp \
|
||||
generichighlighter/highlightersettings.cpp \
|
||||
generichighlighter/managedefinitionsdialog.cpp \
|
||||
generichighlighter/highlightdefinitionmetadata.cpp \
|
||||
generichighlighter/definitiondownloader.cpp
|
||||
generichighlighter/definitiondownloader.cpp \
|
||||
refactoringchanges.cpp
|
||||
|
||||
HEADERS += texteditorplugin.h \
|
||||
textfilewizard.h \
|
||||
@@ -119,8 +120,8 @@ HEADERS += texteditorplugin.h \
|
||||
generichighlighter/highlightersettings.h \
|
||||
generichighlighter/managedefinitionsdialog.h \
|
||||
generichighlighter/highlightdefinitionmetadata.h \
|
||||
generichighlighter/definitiondownloader.h
|
||||
|
||||
generichighlighter/definitiondownloader.h \
|
||||
refactoringchanges.h
|
||||
|
||||
FORMS += behaviorsettingspage.ui \
|
||||
displaysettingspage.ui \
|
||||
|
Reference in New Issue
Block a user