diff --git a/src/plugins/cppeditor/cppfunctiondecldeflink.cpp b/src/plugins/cppeditor/cppfunctiondecldeflink.cpp index 9f33c62ffd8..545ae54af4c 100644 --- a/src/plugins/cppeditor/cppfunctiondecldeflink.cpp +++ b/src/plugins/cppeditor/cppfunctiondecldeflink.cpp @@ -174,7 +174,7 @@ static QSharedPointer findLinkHelper(QSharedPointerstartOf(targetParent), targetEnd); - link->targetOffset = targetStart; + targetFile->lineAndColumn(targetStart, &link->targetLine, &link->targetColumn); link->targetInitial = targetInitial; link->targetFile = targetFile; @@ -228,7 +228,8 @@ void FunctionDeclDefLinkFinder::startFindLinkAt( FunctionDeclDefLink::FunctionDeclDefLink() { hasMarker = false; - targetOffset = 0; + targetLine = 0; + targetColumn = 0; sourceFunction = 0; targetFunction = 0; targetDeclaration = 0; @@ -276,12 +277,13 @@ void FunctionDeclDefLink::apply(CPPEditorWidget *editor, bool jumpToMatch) CppTools::CppRefactoringFilePtr newTargetFile = refactoringChanges.file(targetFile->fileName()); if (!newTargetFile->isValid()) return; - const int targetEnd = targetOffset + targetInitial.size(); - if (targetInitial == newTargetFile->textOf(targetOffset, targetEnd)) { - const Utils::ChangeSet changeset = changes(snapshot); + const int targetStart = newTargetFile->position(targetLine, targetColumn); + const int targetEnd = targetStart + targetInitial.size(); + if (targetInitial == newTargetFile->textOf(targetStart, targetEnd)) { + const Utils::ChangeSet changeset = changes(snapshot, targetStart); newTargetFile->setChangeSet(changeset); if (jumpToMatch) - newTargetFile->setOpenEditor(true, targetOffset); + newTargetFile->setOpenEditor(true, targetStart); newTargetFile->apply(); } else { TextEditor::ToolTip::instance()->show( @@ -354,7 +356,7 @@ static int declaredArgumentCount(Function *function) return c; } -Utils::ChangeSet FunctionDeclDefLink::changes(const Snapshot &snapshot) +Utils::ChangeSet FunctionDeclDefLink::changes(const Snapshot &snapshot, int targetOffset) { Utils::ChangeSet changes; @@ -379,7 +381,7 @@ Utils::ChangeSet FunctionDeclDefLink::changes(const Snapshot &snapshot) Function *newFunction = newDef->symbol; QTC_ASSERT(newFunction, return changes); // check() should always create this symbol - LookupContext sourceContext(sourceDocument, snapshot); + const LookupContext &sourceContext = typeOfExpression.context(); LookupContext targetContext(targetFile->cppDocument(), snapshot); Overview overview; @@ -573,5 +575,16 @@ Utils::ChangeSet FunctionDeclDefLink::changes(const Snapshot &snapshot) } } + if (targetOffset != -1) { + // move all change operations to have the right start offset + const int moveAmount = targetOffset - targetFile->startOf(targetDeclaration); + QList ops = changes.operationList(); + for (int i = 0; i < ops.size(); ++i) { + ops[i].pos1 += moveAmount; + ops[i].pos2 += moveAmount; + } + changes = Utils::ChangeSet(ops); + } + return changes; } diff --git a/src/plugins/cppeditor/cppfunctiondecldeflink.h b/src/plugins/cppeditor/cppfunctiondecldeflink.h index a75e71f3ef6..d27833bced2 100644 --- a/src/plugins/cppeditor/cppfunctiondecldeflink.h +++ b/src/plugins/cppeditor/cppfunctiondecldeflink.h @@ -89,10 +89,12 @@ public: void apply(CPPEditorWidget *editor, bool jumpToMatch); void hideMarker(CPPEditorWidget *editor); void showMarker(CPPEditorWidget *editor); - Utils::ChangeSet changes(const CPlusPlus::Snapshot &snapshot); + Utils::ChangeSet changes(const CPlusPlus::Snapshot &snapshot, int targetOffset = -1); QTextCursor linkSelection; - int targetOffset; + // 1-based line and column + unsigned targetLine; + unsigned targetColumn; QString targetInitial; CPlusPlus::Document::Ptr sourceDocument;