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>
This commit is contained in:
Christian Kamm
2011-09-05 15:37:14 +02:00
parent e906341df3
commit aad5ab8542
2 changed files with 52 additions and 0 deletions

View File

@@ -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