From b2bb919e454a0abd54aa5f21844857b0cd0502a8 Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Fri, 26 Mar 2010 13:50:51 +0100
Subject: [PATCH] QmlJSEditor: Add completion for JS keywords and Qml reserved
 words.

Task-number: QTCREATORBUG-919
Reviewed-by: Roberto Raggi
---
 src/libs/qmljs/qmljsscanner.cpp               | 10 ++++++++++
 src/libs/qmljs/qmljsscanner.h                 |  1 +
 .../qmljseditor/qmljscodecompletion.cpp       | 19 +++++++++++++++++++
 3 files changed, 30 insertions(+)

diff --git a/src/libs/qmljs/qmljsscanner.cpp b/src/libs/qmljs/qmljsscanner.cpp
index 7b201d2c6c7..79f81509f23 100644
--- a/src/libs/qmljs/qmljsscanner.cpp
+++ b/src/libs/qmljs/qmljsscanner.cpp
@@ -309,3 +309,13 @@ bool Scanner::isKeyword(const QString &text) const
 
     return false;
 }
+
+QStringList Scanner::keywords()
+{
+    static QStringList words;
+    if (words.isEmpty()) {
+        for (const QString *word = begin(js_keywords); word != end(js_keywords); ++word)
+            words.append(*word);
+    }
+    return words;
+}
diff --git a/src/libs/qmljs/qmljsscanner.h b/src/libs/qmljs/qmljsscanner.h
index 7d02e1b42dd..9141842cd71 100644
--- a/src/libs/qmljs/qmljsscanner.h
+++ b/src/libs/qmljs/qmljsscanner.h
@@ -87,6 +87,7 @@ public:
     int state() const;
 
     bool isKeyword(const QString &text) const;
+    static QStringList keywords();
 
 private:
     int _state;
diff --git a/src/plugins/qmljseditor/qmljscodecompletion.cpp b/src/plugins/qmljseditor/qmljscodecompletion.cpp
index 2eab2db74fb..1c7f3e39d1b 100644
--- a/src/plugins/qmljseditor/qmljscodecompletion.cpp
+++ b/src/plugins/qmljseditor/qmljscodecompletion.cpp
@@ -692,6 +692,25 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
             item.icon = symbolIcon;
             m_completions.append(item);
         }
+
+        // add js keywords
+        foreach (const QString &word, Scanner::keywords()) {
+            TextEditor::CompletionItem item(this);
+            item.text = word;
+            m_completions.append(item);
+        }
+
+        // add qml extra words
+        if (document->qmlProgram()) {
+            static QStringList qmlWords;
+            if (qmlWords.isEmpty())
+                qmlWords << "property" << "readonly" << "signal";
+            foreach (const QString &word, qmlWords) {
+                TextEditor::CompletionItem item(this);
+                item.text = word;
+                m_completions.append(item);
+            }
+        }
     }
 
     else if (completionOperator == QLatin1Char('.') || completionOperator == QLatin1Char('(')) {
-- 
GitLab