From 4c427aec82ee269c3bd0b98a4084f057b95a482b Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Thu, 26 Nov 2009 15:00:54 +0100
Subject: [PATCH] Quickfix: Be more efficient when looking up token start/end
 positions.

---
 src/plugins/cppeditor/cppquickfix.cpp | 25 +++++++++++++++++++++----
 src/plugins/cppeditor/cppquickfix.h   |  1 +
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/src/plugins/cppeditor/cppquickfix.cpp b/src/plugins/cppeditor/cppquickfix.cpp
index 6e01608d1f1..06b5191a846 100644
--- a/src/plugins/cppeditor/cppquickfix.cpp
+++ b/src/plugins/cppeditor/cppquickfix.cpp
@@ -639,6 +639,15 @@ int QuickFixOperation::endOf(const CPlusPlus::AST *ast) const
     return endOf(ast->lastToken() - 1);
 }
 
+void QuickFixOperation::startAndEndOf(unsigned index, int *start, int *end) const
+{
+    unsigned line, column;
+    CPlusPlus::Token token(tokenAt(index));
+    _document->translationUnit()->getPosition(token.begin(), &line, &column);
+    *start = _textCursor.document()->findBlockByNumber(line - 1).position() + column - 1;
+    *end = *start + token.length();
+}
+
 bool QuickFixOperation::isCursorOn(unsigned tokenIndex) const
 {
     QTextCursor tc = textCursor();
@@ -690,7 +699,9 @@ void QuickFixOperation::move(int start, int end, int to)
 
 void QuickFixOperation::move(unsigned tokenIndex, int to)
 {
-    move(startOf(tokenIndex), endOf(tokenIndex), to);
+    int start, end;
+    startAndEndOf(tokenIndex, &start, &end);
+    move(start, end, to);
 }
 
 void QuickFixOperation::move(const CPlusPlus::AST *ast, int to)
@@ -705,7 +716,9 @@ void QuickFixOperation::replace(int start, int end, const QString &replacement)
 
 void QuickFixOperation::replace(unsigned tokenIndex, const QString &replacement)
 {
-    replace(startOf(tokenIndex), endOf(tokenIndex), replacement);
+    int start, end;
+    startAndEndOf(tokenIndex, &start, &end);
+    replace(start, end, replacement);
 }
 
 void QuickFixOperation::replace(const CPlusPlus::AST *ast, const QString &replacement)
@@ -725,7 +738,9 @@ void QuickFixOperation::remove(int start, int end)
 
 void QuickFixOperation::remove(unsigned tokenIndex)
 {
-    remove(startOf(tokenIndex), endOf(tokenIndex));
+    int start, end;
+    startAndEndOf(tokenIndex, &start, &end);
+    remove(start, end);
 }
 
 void QuickFixOperation::remove(const CPlusPlus::AST *ast)
@@ -750,7 +765,9 @@ void QuickFixOperation::copy(int start, int end, int to)
 
 void QuickFixOperation::copy(unsigned tokenIndex, int to)
 {
-    copy(startOf(tokenIndex), endOf(tokenIndex), to);
+    int start, end;
+    startAndEndOf(tokenIndex, &start, &end);
+    copy(start, end, to);
 }
 
 void QuickFixOperation::copy(const CPlusPlus::AST *ast, int to)
diff --git a/src/plugins/cppeditor/cppquickfix.h b/src/plugins/cppeditor/cppquickfix.h
index c69aac7dfbe..d98f606d846 100644
--- a/src/plugins/cppeditor/cppquickfix.h
+++ b/src/plugins/cppeditor/cppquickfix.h
@@ -92,6 +92,7 @@ protected:
     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;
 
     bool isCursorOn(unsigned tokenIndex) const;
     bool isCursorOn(const CPlusPlus::AST *ast) const;
-- 
GitLab