diff --git a/src/plugins/qmljseditor/qmlcodecompletion.cpp b/src/plugins/qmljseditor/qmlcodecompletion.cpp
index 1b8e730fab4b6da3ea3d230871297d5e841a3770..cd5f31eec13104525f83c404d5d9fd80367f2ffc 100644
--- a/src/plugins/qmljseditor/qmlcodecompletion.cpp
+++ b/src/plugins/qmljseditor/qmlcodecompletion.cpp
@@ -519,22 +519,26 @@ static bool isIdentifierChar(QChar ch)
 
 bool QmlCodeCompletion::triggersCompletion(TextEditor::ITextEditable *editor)
 {
-    const QChar ch = editor->characterAt(editor->position() - 1);
+    const int cursorPosition = editor->position();
+    const QChar ch = editor->characterAt(cursorPosition - 1);
 
     if (ch == QLatin1Char('(') || ch == QLatin1Char('.'))
         return true;
     else if (isIdentifierChar(ch)) {
-        if (QmlJSTextEditor *ed = qobject_cast<QmlJSTextEditor *>(editor->widget())) {
-            QTextCursor tc = ed->textCursor();
-            tc.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor);
-            const QString word = tc.selectedText();
-            if (word.length() > 2 && checkStartOfIdentifier(word)) {
-                for (int i = 0; i < word.length(); ++i) {
-                    if (! isIdentifierChar(word.at(i)))
-                        return false;
-                }
-                return true;
+        int pos = editor->position() - 1;
+        for (; pos != -1; --pos) {
+            if (! isIdentifierChar(editor->characterAt(pos)))
+                break;
+        }
+        ++pos;
+
+        const QString word = editor->textAt(pos, cursorPosition - pos);
+        if (word.length() > 2 && checkStartOfIdentifier(word)) {
+            for (int i = 0; i < word.length(); ++i) {
+                if (! isIdentifierChar(word.at(i)))
+                    return false;
             }
+            return true;
         }
     }