Skip to content
Snippets Groups Projects
Commit aad5ab85 authored by Christian Kamm's avatar Christian Kamm
Browse files

QmlJS: Check property declaration types.

Change-Id: I2cc1236552e00e99a846b0d4b724135724f175fc
Task-number: QTCREATORBUG-3666
Reviewed-on: http://codereview.qt.nokia.com/4241


Reviewed-by: default avatarLeandro T. C. Melo <leandro.melo@nokia.com>
parent e906341d
No related branches found
No related tags found
No related merge requests found
......@@ -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
......
......@@ -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)
{
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment