forked from qt-creator/qt-creator
QuickFix: Introduce CppRefactoringFile.
This commit is contained in:
@@ -82,10 +82,10 @@ public:
|
||||
"CppEditor::DeclFromDef").arg(type));
|
||||
}
|
||||
|
||||
void performChanges(TextEditor::RefactoringFile *, CppRefactoringChanges *refactoring)
|
||||
void performChanges(CppRefactoringFile *, CppRefactoringChanges *refactoring)
|
||||
{
|
||||
TextEditor::RefactoringFile targetFile = refactoring->file(m_targetFileName);
|
||||
Document::Ptr targetDoc = refactoring->document(targetFile);
|
||||
CppRefactoringFile targetFile = refactoring->file(m_targetFileName);
|
||||
Document::Ptr targetDoc = targetFile.cppDocument();
|
||||
InsertionPointLocator locator(targetDoc);
|
||||
const InsertionLocation loc = locator.methodDeclarationInClass(m_targetSymbol, m_xsSpec);
|
||||
Q_ASSERT(loc.isValid());
|
||||
|
||||
@@ -192,7 +192,7 @@ CppQuickFixOperation::~CppQuickFixOperation()
|
||||
void CppQuickFixOperation::perform()
|
||||
{
|
||||
CppRefactoringChanges refactoring(_state.document(), _state.snapshot());
|
||||
TextEditor::RefactoringFile current = refactoring.file(fileName());
|
||||
CppRefactoringFile current = refactoring.file(fileName());
|
||||
|
||||
performChanges(¤t, &refactoring);
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ public:
|
||||
virtual void perform();
|
||||
|
||||
protected:
|
||||
virtual void performChanges(TextEditor::RefactoringFile *currentFile, CppRefactoringChanges *refactoring) = 0;
|
||||
virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *refactoring) = 0;
|
||||
|
||||
QString fileName() const;
|
||||
|
||||
|
||||
@@ -148,7 +148,7 @@ private:
|
||||
return QApplication::translate("CppTools::QuickFix", "Rewrite Using %1").arg(replacement);
|
||||
}
|
||||
|
||||
virtual void performChanges(TextEditor::RefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
{
|
||||
ChangeSet changes;
|
||||
if (negation) {
|
||||
@@ -243,7 +243,7 @@ private:
|
||||
return QApplication::translate("CppTools::QuickFix", "Rewrite Using %1").arg(replacement);
|
||||
}
|
||||
|
||||
virtual void performChanges(TextEditor::RefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
{
|
||||
ChangeSet changes;
|
||||
|
||||
@@ -321,7 +321,7 @@ private:
|
||||
pattern = mk->BinaryExpression(left, right);
|
||||
}
|
||||
|
||||
virtual void performChanges(TextEditor::RefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
{
|
||||
ChangeSet changes;
|
||||
changes.replace(range(pattern->binary_op_token), QLatin1String("||"));
|
||||
@@ -422,7 +422,7 @@ private:
|
||||
"Split Declaration"));
|
||||
}
|
||||
|
||||
virtual void performChanges(TextEditor::RefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
{
|
||||
ChangeSet changes;
|
||||
|
||||
@@ -505,7 +505,7 @@ private:
|
||||
"Add Curly Braces"));
|
||||
}
|
||||
|
||||
virtual void performChanges(TextEditor::RefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
{
|
||||
ChangeSet changes;
|
||||
|
||||
@@ -576,7 +576,7 @@ private:
|
||||
pattern = mk.IfStatement(condition);
|
||||
}
|
||||
|
||||
virtual void performChanges(TextEditor::RefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
{
|
||||
ChangeSet changes;
|
||||
|
||||
@@ -658,7 +658,7 @@ private:
|
||||
pattern = mk.WhileStatement(condition);
|
||||
}
|
||||
|
||||
virtual void performChanges(TextEditor::RefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
{
|
||||
ChangeSet changes;
|
||||
|
||||
@@ -767,7 +767,7 @@ private:
|
||||
"Split if Statement"));
|
||||
}
|
||||
|
||||
virtual void performChanges(TextEditor::RefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
{
|
||||
const Token binaryToken = state().tokenAt(condition->binary_op_token);
|
||||
|
||||
@@ -777,7 +777,7 @@ private:
|
||||
splitOrCondition(currentFile);
|
||||
}
|
||||
|
||||
void splitAndCondition(TextEditor::RefactoringFile *currentFile)
|
||||
void splitAndCondition(CppRefactoringFile *currentFile)
|
||||
{
|
||||
ChangeSet changes;
|
||||
|
||||
@@ -794,7 +794,7 @@ private:
|
||||
currentFile->indent(range(pattern));
|
||||
}
|
||||
|
||||
void splitOrCondition(TextEditor::RefactoringFile *currentFile)
|
||||
void splitOrCondition(CppRefactoringFile *currentFile)
|
||||
{
|
||||
ChangeSet changes;
|
||||
|
||||
@@ -905,7 +905,7 @@ private:
|
||||
"Enclose in QLatin1String(...)"));
|
||||
}
|
||||
|
||||
virtual void performChanges(TextEditor::RefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
{
|
||||
ChangeSet changes;
|
||||
|
||||
@@ -1026,7 +1026,7 @@ private:
|
||||
setDescription(QApplication::translate("CppTools::QuickFix", "Mark as translateable"));
|
||||
}
|
||||
|
||||
virtual void performChanges(TextEditor::RefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
{
|
||||
ChangeSet changes;
|
||||
|
||||
@@ -1107,7 +1107,7 @@ private:
|
||||
"Convert to Objective-C String Literal"));
|
||||
}
|
||||
|
||||
virtual void performChanges(TextEditor::RefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
{
|
||||
ChangeSet changes;
|
||||
|
||||
@@ -1255,7 +1255,7 @@ private:
|
||||
, replacement(replacement)
|
||||
{}
|
||||
|
||||
virtual void performChanges(TextEditor::RefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
{
|
||||
ChangeSet changes;
|
||||
changes.replace(start, end, replacement);
|
||||
@@ -1409,7 +1409,7 @@ private:
|
||||
}
|
||||
|
||||
|
||||
virtual void performChanges(TextEditor::RefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
{
|
||||
ChangeSet changes;
|
||||
int start = endOf(compoundStatement->lbrace_token);
|
||||
@@ -1485,7 +1485,7 @@ private:
|
||||
"#include header file"));
|
||||
}
|
||||
|
||||
virtual void performChanges(TextEditor::RefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
{
|
||||
Q_ASSERT(fwdClass != 0);
|
||||
|
||||
@@ -1599,7 +1599,7 @@ private:
|
||||
setDescription(QApplication::translate("CppTools::QuickFix", "Add local declaration"));
|
||||
}
|
||||
|
||||
virtual void performChanges(TextEditor::RefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *)
|
||||
{
|
||||
TypeOfExpression typeOfExpression;
|
||||
typeOfExpression.init(state().document(), state().snapshot(), state().context().bindings());
|
||||
@@ -1687,7 +1687,7 @@ private:
|
||||
"Convert to Camel Case ..."));
|
||||
}
|
||||
|
||||
virtual void performChanges(TextEditor::RefactoringFile *, CppRefactoringChanges *)
|
||||
virtual void performChanges(CppRefactoringFile *, CppRefactoringChanges *)
|
||||
{
|
||||
for (int i = 1; i < m_name.length(); ++i) {
|
||||
QCharRef c = m_name[i];
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
|
||||
#include "cpprefactoringchanges.h"
|
||||
|
||||
#include <TranslationUnit.h>
|
||||
#include <AST.h>
|
||||
#include <cpptools/cppcodeformatter.h>
|
||||
#include <texteditor/texteditorsettings.h>
|
||||
#include <texteditor/tabsettings.h>
|
||||
@@ -37,6 +39,7 @@
|
||||
|
||||
using namespace CppEditor;
|
||||
using namespace CPlusPlus;
|
||||
using namespace Utils;
|
||||
|
||||
CppRefactoringChanges::CppRefactoringChanges(const Document::Ptr &thisDocument, const Snapshot &snapshot)
|
||||
: m_thisDocument(thisDocument)
|
||||
@@ -63,16 +66,9 @@ const LookupContext &CppRefactoringChanges::context() const
|
||||
return m_context;
|
||||
}
|
||||
|
||||
Document::Ptr CppRefactoringChanges::document(const TextEditor::RefactoringFile &file) const
|
||||
CppRefactoringFile CppRefactoringChanges::file(const QString &fileName)
|
||||
{
|
||||
QString source = file.document()->toPlainText();
|
||||
QString fileName = file.fileName();
|
||||
|
||||
const QByteArray contents = m_snapshot.preprocessedCode(source, fileName);
|
||||
Document::Ptr doc = m_snapshot.documentFromSource(contents, fileName);
|
||||
doc->check();
|
||||
|
||||
return doc;
|
||||
return CppRefactoringFile(fileName, this);
|
||||
}
|
||||
|
||||
void CppRefactoringChanges::indentSelection(const QTextCursor &selection) const
|
||||
@@ -98,3 +94,126 @@ void CppRefactoringChanges::fileChanged(const QString &fileName)
|
||||
{
|
||||
m_modelManager->updateSourceFiles(QStringList(fileName));
|
||||
}
|
||||
|
||||
|
||||
CppRefactoringFile::CppRefactoringFile()
|
||||
{ }
|
||||
|
||||
CppRefactoringFile::CppRefactoringFile(const QString &fileName, CppRefactoringChanges *refactoringChanges)
|
||||
: RefactoringFile(fileName, refactoringChanges)
|
||||
{ }
|
||||
|
||||
Document::Ptr CppRefactoringFile::cppDocument() const
|
||||
{
|
||||
if (!m_cppDocument) {
|
||||
const QString source = document()->toPlainText();
|
||||
const QString name = fileName();
|
||||
const Snapshot &snapshot = refactoringChanges()->snapshot();
|
||||
|
||||
const QByteArray contents = snapshot.preprocessedCode(source, name);
|
||||
m_cppDocument = snapshot.documentFromSource(contents, name);
|
||||
m_cppDocument->check();
|
||||
}
|
||||
|
||||
return m_cppDocument;
|
||||
}
|
||||
|
||||
Scope *CppRefactoringFile::scopeAt(unsigned index) const
|
||||
{
|
||||
unsigned line, column;
|
||||
cppDocument()->translationUnit()->getTokenStartPosition(index, &line, &column);
|
||||
return cppDocument()->scopeAt(line, column);
|
||||
}
|
||||
|
||||
bool CppRefactoringFile::isCursorOn(unsigned tokenIndex) const
|
||||
{
|
||||
QTextCursor tc = cursor();
|
||||
int cursorBegin = tc.selectionStart();
|
||||
|
||||
int start = startOf(tokenIndex);
|
||||
int end = endOf(tokenIndex);
|
||||
|
||||
if (cursorBegin >= start && cursorBegin <= end)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CppRefactoringFile::isCursorOn(const AST *ast) const
|
||||
{
|
||||
QTextCursor tc = cursor();
|
||||
int cursorBegin = tc.selectionStart();
|
||||
|
||||
int start = startOf(ast);
|
||||
int end = endOf(ast);
|
||||
|
||||
if (cursorBegin >= start && cursorBegin <= end)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
ChangeSet::Range CppRefactoringFile::range(unsigned tokenIndex) const
|
||||
{
|
||||
const Token &token = tokenAt(tokenIndex);
|
||||
unsigned line, column;
|
||||
cppDocument()->translationUnit()->getPosition(token.begin(), &line, &column);
|
||||
const int start = document()->findBlockByNumber(line - 1).position() + column - 1;
|
||||
return ChangeSet::Range(start, start + token.length());
|
||||
}
|
||||
|
||||
ChangeSet::Range CppRefactoringFile::range(AST *ast) const
|
||||
{
|
||||
return ChangeSet::Range(startOf(ast), endOf(ast));
|
||||
}
|
||||
|
||||
int CppRefactoringFile::startOf(unsigned index) const
|
||||
{
|
||||
unsigned line, column;
|
||||
cppDocument()->translationUnit()->getPosition(tokenAt(index).begin(), &line, &column);
|
||||
return document()->findBlockByNumber(line - 1).position() + column - 1;
|
||||
}
|
||||
|
||||
int CppRefactoringFile::startOf(const AST *ast) const
|
||||
{
|
||||
return startOf(ast->firstToken());
|
||||
}
|
||||
|
||||
int CppRefactoringFile::endOf(unsigned index) const
|
||||
{
|
||||
unsigned line, column;
|
||||
cppDocument()->translationUnit()->getPosition(tokenAt(index).end(), &line, &column);
|
||||
return document()->findBlockByNumber(line - 1).position() + column - 1;
|
||||
}
|
||||
|
||||
int CppRefactoringFile::endOf(const AST *ast) const
|
||||
{
|
||||
if (unsigned end = ast->lastToken())
|
||||
return endOf(end - 1);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CppRefactoringFile::startAndEndOf(unsigned index, int *start, int *end) const
|
||||
{
|
||||
unsigned line, column;
|
||||
Token token(tokenAt(index));
|
||||
cppDocument()->translationUnit()->getPosition(token.begin(), &line, &column);
|
||||
*start = document()->findBlockByNumber(line - 1).position() + column - 1;
|
||||
*end = *start + token.length();
|
||||
}
|
||||
|
||||
QString CppRefactoringFile::textOf(const AST *ast) const
|
||||
{
|
||||
return textOf(startOf(ast), endOf(ast));
|
||||
}
|
||||
|
||||
const Token &CppRefactoringFile::tokenAt(unsigned index) const
|
||||
{
|
||||
return cppDocument()->translationUnit()->tokenAt(index);
|
||||
}
|
||||
|
||||
CppRefactoringChanges *CppRefactoringFile::refactoringChanges() const
|
||||
{
|
||||
return static_cast<CppRefactoringChanges *>(m_refactoringChanges);
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#ifndef CPPREFACTORINGCHANGES_H
|
||||
#define CPPREFACTORINGCHANGES_H
|
||||
|
||||
#include <ASTfwd.h>
|
||||
#include <cplusplus/CppDocument.h>
|
||||
#include <cplusplus/LookupContext.h>
|
||||
|
||||
@@ -40,6 +41,43 @@
|
||||
|
||||
namespace CppEditor {
|
||||
|
||||
class CppRefactoringChanges;
|
||||
|
||||
class CPPEDITOR_EXPORT CppRefactoringFile: public TextEditor::RefactoringFile
|
||||
{
|
||||
public:
|
||||
CppRefactoringFile();
|
||||
CppRefactoringFile(const QString &fileName, CppRefactoringChanges *refactoringChanges);
|
||||
|
||||
CPlusPlus::Document::Ptr cppDocument() const;
|
||||
|
||||
CPlusPlus::Scope *scopeAt(unsigned index) const;
|
||||
|
||||
bool isCursorOn(unsigned tokenIndex) const;
|
||||
bool isCursorOn(const CPlusPlus::AST *ast) const;
|
||||
|
||||
Range range(int start, int end) const;
|
||||
Range range(unsigned tokenIndex) const;
|
||||
Range range(CPlusPlus::AST *ast) const;
|
||||
|
||||
const CPlusPlus::Token &tokenAt(unsigned index) const;
|
||||
|
||||
int startOf(unsigned index) const;
|
||||
int startOf(const CPlusPlus::AST *ast) const;
|
||||
int endOf(unsigned index) const;
|
||||
int endOf(const CPlusPlus::AST *ast) const;
|
||||
|
||||
void startAndEndOf(unsigned index, int *start, int *end) const;
|
||||
|
||||
using TextEditor::RefactoringFile::textOf;
|
||||
QString textOf(const CPlusPlus::AST *ast) const;
|
||||
|
||||
private:
|
||||
CppRefactoringChanges *refactoringChanges() const;
|
||||
|
||||
mutable CPlusPlus::Document::Ptr m_cppDocument;
|
||||
};
|
||||
|
||||
class CPPEDITOR_EXPORT CppRefactoringChanges: public TextEditor::RefactoringChanges
|
||||
{
|
||||
public:
|
||||
@@ -50,7 +88,7 @@ public:
|
||||
const CPlusPlus::Snapshot &snapshot() const;
|
||||
const CPlusPlus::LookupContext &context() const;
|
||||
|
||||
CPlusPlus::Document::Ptr document(const TextEditor::RefactoringFile &file) const;
|
||||
CppRefactoringFile file(const QString &fileName);
|
||||
|
||||
private:
|
||||
virtual void indentSelection(const QTextCursor &selection) const;
|
||||
|
||||
@@ -196,11 +196,11 @@ RefactoringFile::RefactoringFile(const RefactoringFile &other)
|
||||
|
||||
RefactoringFile::~RefactoringFile()
|
||||
{
|
||||
if (m_openEditor)
|
||||
if (m_refactoringChanges && m_openEditor)
|
||||
m_editor = m_refactoringChanges->openEditor(m_fileName, -1);
|
||||
|
||||
// apply changes, if any
|
||||
if (!m_indentRanges.isEmpty() || !m_changes.isEmpty()) {
|
||||
if (m_refactoringChanges && !(m_indentRanges.isEmpty() && m_changes.isEmpty())) {
|
||||
QTextDocument *doc = mutableDocument();
|
||||
{
|
||||
QTextCursor c = cursor();
|
||||
@@ -291,7 +291,7 @@ QChar RefactoringFile::charAt(int pos) const
|
||||
return QChar();
|
||||
}
|
||||
|
||||
QString RefactoringFile::textAt(int start, int end) const
|
||||
QString RefactoringFile::textOf(int start, int end) const
|
||||
{
|
||||
QTextCursor c = cursor();
|
||||
c.setPosition(start);
|
||||
@@ -299,9 +299,9 @@ QString RefactoringFile::textAt(int start, int end) const
|
||||
return c.selectedText();
|
||||
}
|
||||
|
||||
QString RefactoringFile::textAt(const Range &range) const
|
||||
QString RefactoringFile::textOf(const Range &range) const
|
||||
{
|
||||
return textAt(range.start, range.end);
|
||||
return textOf(range.start, range.end);
|
||||
}
|
||||
|
||||
bool RefactoringFile::change(const Utils::ChangeSet &changeSet, bool openEditor)
|
||||
|
||||
@@ -51,7 +51,7 @@ public:
|
||||
RefactoringFile();
|
||||
RefactoringFile(const QString &fileName, RefactoringChanges *refactoringChanges);
|
||||
RefactoringFile(const RefactoringFile &other);
|
||||
~RefactoringFile();
|
||||
virtual ~RefactoringFile();
|
||||
|
||||
bool isValid() const;
|
||||
|
||||
@@ -63,19 +63,19 @@ public:
|
||||
int position(unsigned line, unsigned column) const;
|
||||
|
||||
QChar charAt(int pos) const;
|
||||
QString textAt(int start, int end) const;
|
||||
QString textAt(const Range &range) const;
|
||||
QString textOf(int start, int end) const;
|
||||
QString textOf(const Range &range) const;
|
||||
|
||||
bool change(const Utils::ChangeSet &changeSet, bool openEditor = true);
|
||||
bool indent(const Range &range, bool openEditor = true);
|
||||
|
||||
private:
|
||||
protected:
|
||||
// not assignable
|
||||
//const RefactoringFile &operator=(const RefactoringFile &other);
|
||||
|
||||
QTextDocument *mutableDocument() const;
|
||||
|
||||
private:
|
||||
protected:
|
||||
QString m_fileName;
|
||||
RefactoringChanges *m_refactoringChanges;
|
||||
mutable QTextDocument *m_document;
|
||||
|
||||
Reference in New Issue
Block a user