diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp index 38d14eda5c09e19f0f9570cf1f183f0d80daa5b4..601a373ae34980cc848ed6eeab42fdf7c6d41b38 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 392fc6c0e10517b1721ffadc25452fe7b7c113d8..af4b75c2c3c93ab2fa6dd6d1fb83425a4733e787 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) {