From aad5ab85427abbdf4c71fad93efc61826f20da90 Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Mon, 5 Sep 2011 15:37:14 +0200
Subject: [PATCH] QmlJS: Check property declaration types.

Change-Id: I2cc1236552e00e99a846b0d4b724135724f175fc
Task-number: QTCREATORBUG-3666
Reviewed-on: http://codereview.qt.nokia.com/4241
Reviewed-by: Leandro T. C. Melo <leandro.melo@nokia.com>
---
 src/libs/qmljs/qmljscheck.cpp | 49 +++++++++++++++++++++++++++++++++++
 src/libs/qmljs/qmljscheck.h   |  3 +++
 2 files changed, 52 insertions(+)

diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp
index 38d14eda5c0..601a373ae34 100644
--- a/src/libs/qmljs/qmljscheck.cpp
+++ b/src/libs/qmljs/qmljscheck.cpp
@@ -93,6 +93,42 @@ DiagnosticMessage QmlJS::errorMessage(const AST::SourceLocation &loc, const QStr
     return DiagnosticMessage(DiagnosticMessage::Error, loc, message);
 }
 
+namespace {
+class SharedData
+{
+public:
+    SharedData()
+    {
+        validBuiltinPropertyNames.insert(QLatin1String("action"));
+        validBuiltinPropertyNames.insert(QLatin1String("bool"));
+        validBuiltinPropertyNames.insert(QLatin1String("color"));
+        validBuiltinPropertyNames.insert(QLatin1String("date"));
+        validBuiltinPropertyNames.insert(QLatin1String("double"));
+        validBuiltinPropertyNames.insert(QLatin1String("enumeration"));
+        validBuiltinPropertyNames.insert(QLatin1String("font"));
+        validBuiltinPropertyNames.insert(QLatin1String("int"));
+        validBuiltinPropertyNames.insert(QLatin1String("list"));
+        validBuiltinPropertyNames.insert(QLatin1String("point"));
+        validBuiltinPropertyNames.insert(QLatin1String("real"));
+        validBuiltinPropertyNames.insert(QLatin1String("rect"));
+        validBuiltinPropertyNames.insert(QLatin1String("size"));
+        validBuiltinPropertyNames.insert(QLatin1String("string"));
+        validBuiltinPropertyNames.insert(QLatin1String("time"));
+        validBuiltinPropertyNames.insert(QLatin1String("url"));
+        validBuiltinPropertyNames.insert(QLatin1String("variant"));
+        validBuiltinPropertyNames.insert(QLatin1String("vector3d"));
+    }
+
+    QSet<QString> validBuiltinPropertyNames;
+};
+} // anonymous namespace
+Q_GLOBAL_STATIC(SharedData, sharedData)
+
+bool QmlJS::isValidBuiltinPropertyType(const QString &name)
+{
+    return sharedData()->validBuiltinPropertyNames.contains(name);
+}
+
 namespace {
 
 class AssignmentCheck : public ValueVisitor
@@ -597,6 +633,19 @@ bool Check::visit(UiArrayBinding *ast)
     return true;
 }
 
+bool Check::visit(UiPublicMember *ast)
+{
+    // check if the member type is valid
+    if (ast->memberType) {
+        const QString name = ast->memberType->asString();
+        if (!name.isEmpty() && name.at(0).isLower()) {
+            if (!isValidBuiltinPropertyType(name))
+                error(ast->typeToken, tr("'%1' is not a valid property type").arg(name));
+        }
+    }
+    return true;
+}
+
 bool Check::visit(IdentifierExpression *ast)
 {
     // currently disabled: too many false negatives
diff --git a/src/libs/qmljs/qmljscheck.h b/src/libs/qmljs/qmljscheck.h
index 392fc6c0e10..af4b75c2c3c 100644
--- a/src/libs/qmljs/qmljscheck.h
+++ b/src/libs/qmljs/qmljscheck.h
@@ -91,6 +91,7 @@ protected:
     virtual bool visit(AST::UiObjectBinding *ast);
     virtual bool visit(AST::UiScriptBinding *ast);
     virtual bool visit(AST::UiArrayBinding *ast);
+    virtual bool visit(AST::UiPublicMember *ast);
     virtual bool visit(AST::IdentifierExpression *ast);
     virtual bool visit(AST::FieldMemberExpression *ast);
     virtual bool visit(AST::FunctionDeclaration *ast);
@@ -152,6 +153,8 @@ QMLJS_EXPORT AST::SourceLocation fullLocationForQualifiedId(AST::UiQualifiedId *
 QMLJS_EXPORT DiagnosticMessage errorMessage(const AST::SourceLocation &loc,
                                             const QString &message);
 
+QMLJS_EXPORT bool isValidBuiltinPropertyType(const QString &name);
+
 template <class T>
 DiagnosticMessage errorMessage(const T *node, const QString &message)
 {
-- 
GitLab