From aad5ab85427abbdf4c71fad93efc61826f20da90 Mon Sep 17 00:00:00 2001 From: Christian Kamm 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 --- 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 38d14eda5c..601a373ae3 100644 --- a/src/libs/qmljs/qmljscheck.cpp +++ b/src/libs/qmljs/qmljscheck.cpp @@ -94,6 +94,42 @@ DiagnosticMessage QmlJS::errorMessage(const AST::SourceLocation &loc, const QStr } 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 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 392fc6c0e1..af4b75c2c3 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 DiagnosticMessage errorMessage(const T *node, const QString &message) { -- 2.11.0