From 5a7858f5ec36f01036bf36f5d60425a6c0ceef33 Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Thu, 11 Mar 2010 10:57:46 +0100
Subject: [PATCH] Make sure the BackwardScanner has tokenized before asking for
 a string.

The problem was that for

Foo::Foo
(|)

when the user triggers completion at |, startOfLine() returns a token
that's not on the current line and not yet tokenized by that instance
of the BackwardScanner.

As a fix I explicitly ask the instance to tokenize up to the given
index.

Task-number: QTCREATORBUG-673
Reviewed-by: Roberto Raggi
---
 src/plugins/cpptools/cppcodecompletion.cpp | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index ac0d9813e71..bbc63d9ee09 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -1076,7 +1076,11 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<LookupItem> &r
             QTextCursor tc(edit->document());
             tc.setPosition(endOfExpression);
             BackwardsScanner bs(tc);
-            QString possibleDecl = bs.mid(bs.startOfLine(bs.startToken())).trimmed().append("();");
+            const int startToken = bs.startToken();
+            const int lineStartToken = bs.startOfLine(startToken);
+            // make sure the required tokens are actually available
+            bs.LA(startToken - lineStartToken);
+            QString possibleDecl = bs.mid(lineStartToken).trimmed().append("();");
 
             Document::Ptr doc = Document::create(QLatin1String("<completion>"));
             doc->setSource(possibleDecl.toLatin1());
-- 
GitLab