return objectValue;
}
+ // try qml builtin type names
+ if (const Value *v = valueOwner()->defaultValueForBuiltinType(typeName)) {
+ if (!v->asUndefinedValue())
+ return v;
+ }
+
+ // map other C++ types
if (typeName == QLatin1String("QByteArray")
- || typeName == QLatin1String("string")
|| typeName == QLatin1String("QString")) {
return valueOwner()->stringValue();
} else if (typeName == QLatin1String("QUrl")) {
return valueOwner()->urlValue();
- } else if (typeName == QLatin1String("bool")) {
- return valueOwner()->booleanValue();
- } else if (typeName == QLatin1String("int")
- || typeName == QLatin1String("long")) {
+ } else if (typeName == QLatin1String("long")) {
return valueOwner()->intValue();
} else if (typeName == QLatin1String("float")
- || typeName == QLatin1String("double")
|| typeName == QLatin1String("qreal")) {
- // ### Review: more types here?
return valueOwner()->realValue();
} else if (typeName == QLatin1String("QFont")) {
return valueOwner()->qmlFontObject();
if (def->defaultToken.isValid())
_defaultPropertyRef = ref;
} else if (def->type == UiPublicMember::Signal && !def->name.isEmpty()) {
- ASTSignalReference *ref = new ASTSignalReference(def, _doc, valueOwner);
+ ASTSignal *ref = new ASTSignal(def, _doc, valueOwner);
_signals.append(ref);
}
}
// ### Should get a different value?
processor->processGeneratedSlot(ref->onChangedSlotName(), ref);
}
- foreach (ASTSignalReference *ref, _signals) {
+ foreach (ASTSignal *ref, _signals) {
processor->processSignal(ref->ast()->name.toString(), ref);
// ### Should get a different value?
processor->processGeneratedSlot(ref->slotName(), ref);
return valueOwner()->undefinedValue();
}
-ASTSignalReference::ASTSignalReference(UiPublicMember *ast, const Document *doc, ValueOwner *valueOwner)
- : Reference(valueOwner), _ast(ast), _doc(doc)
+ASTSignal::ASTSignal(UiPublicMember *ast, const Document *doc, ValueOwner *valueOwner)
+ : FunctionValue(valueOwner), _ast(ast), _doc(doc)
{
const QString &signalName = ast->name.toString();
_slotName = QLatin1String("on");
_slotName += signalName.midRef(1);
}
-ASTSignalReference::~ASTSignalReference()
+ASTSignal::~ASTSignal()
{
}
-bool ASTSignalReference::getSourceLocation(QString *fileName, int *line, int *column) const
+int ASTSignal::argumentCount() const
+{
+ int count = 0;
+ for (UiParameterList *it = _ast->parameters; it; it = it->next)
+ ++count;
+ return count;
+}
+
+const Value *ASTSignal::argument(int index) const
+{
+ UiParameterList *param = _ast->parameters;
+ for (int i = 0; param && i < index; ++i)
+ param = param->next;
+ if (!param || param->type.isEmpty())
+ return valueOwner()->undefinedValue();
+ return valueOwner()->defaultValueForBuiltinType(param->type.toString());
+}
+
+QString ASTSignal::argumentName(int index) const
+{
+ UiParameterList *param = _ast->parameters;
+ for (int i = 0; param && i < index; ++i)
+ param = param->next;
+ if (!param || param->name.isEmpty())
+ return FunctionValue::argumentName(index);
+ return param->name.toString();
+}
+
+bool ASTSignal::getSourceLocation(QString *fileName, int *line, int *column) const
{
*fileName = _doc->fileName();
*line = _ast->identifierToken.startLine;
return true;
}
-const Value *ASTSignalReference::value(ReferenceContext *) const
-{
- return valueOwner()->undefinedValue();
-}
ImportInfo::ImportInfo()
: _type(InvalidImport)
virtual const Value *value(ReferenceContext *referenceContext) const;
};
-class QMLJS_EXPORT ASTSignalReference: public Reference
+class QMLJS_EXPORT ASTSignal: public FunctionValue
{
AST::UiPublicMember *_ast;
const Document *_doc;
QString _slotName;
public:
- ASTSignalReference(AST::UiPublicMember *ast, const Document *doc, ValueOwner *valueOwner);
- virtual ~ASTSignalReference();
+ ASTSignal(AST::UiPublicMember *ast, const Document *doc, ValueOwner *valueOwner);
+ virtual ~ASTSignal();
AST::UiPublicMember *ast() const { return _ast; }
QString slotName() const { return _slotName; }
- virtual bool getSourceLocation(QString *fileName, int *line, int *column) const;
+ // FunctionValue interface
+ virtual int argumentCount() const;
+ virtual const Value *argument(int index) const;
+ virtual QString argumentName(int index) const;
-private:
- virtual const Value *value(ReferenceContext *referenceContext) const;
+ // Value interface
+ virtual bool getSourceLocation(QString *fileName, int *line, int *column) const;
};
class QMLJS_EXPORT ASTObjectValue: public ObjectValue
AST::UiObjectInitializer *_initializer;
const Document *_doc;
QList<ASTPropertyReference *> _properties;
- QList<ASTSignalReference *> _signals;
+ QList<ASTSignal *> _signals;
ASTPropertyReference *_defaultPropertyRef;
public:
return _qmlVector3DObject;
}
-const Value *ValueOwner::defaultValueForBuiltinType(const QString &typeName) const
+const Value *ValueOwner::defaultValueForBuiltinType(const QString &name) const
{
- if (typeName == QLatin1String("string"))
- return stringValue();
- else if (typeName == QLatin1String("url"))
- return urlValue();
- else if (typeName == QLatin1String("bool"))
+ if (name == QLatin1String("int")) {
+ return intValue();
+ } else if (name == QLatin1String("bool")) {
return booleanValue();
- else if (typeName == QLatin1String("int"))
- return intValue();
- else if (typeName == QLatin1String("real"))
+ } else if (name == QLatin1String("double")
+ || name == QLatin1String("real")) {
return realValue();
- else if (typeName == QLatin1String("color"))
+ } else if (name == QLatin1String("string")) {
+ return stringValue();
+ } else if (name == QLatin1String("url")) {
+ return urlValue();
+ } else if (name == QLatin1String("color")) {
return colorValue();
- // ### more types...
-
+ } else if (name == QLatin1String("date")) {
+ return datePrototype();
+ }
+ // ### variant
return undefinedValue();
}