From 0cf48cb45d3816f231f5f7dd24225e77ef1603d7 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Mon, 1 Feb 2010 12:43:36 +0100 Subject: [PATCH] Introduced ASTFunctionValue. --- src/libs/qmljs/qmljsbind.cpp | 58 +++++++++++++++++-- src/libs/qmljs/qmljsinterpreter.cpp | 2 +- src/plugins/qmljseditor/qmlcodecompletion.cpp | 9 ++- 3 files changed, 60 insertions(+), 9 deletions(-) diff --git a/src/libs/qmljs/qmljsbind.cpp b/src/libs/qmljs/qmljsbind.cpp index c7b928d7d03..94889f637fd 100644 --- a/src/libs/qmljs/qmljsbind.cpp +++ b/src/libs/qmljs/qmljsbind.cpp @@ -37,6 +37,58 @@ using namespace QmlJS; using namespace QmlJS::AST; using namespace QmlJS::Interpreter; +namespace { + +class ASTFunctionValue: public FunctionValue +{ + FunctionDeclaration *_ast; + QList<NameId *> _argumentNames; + +public: + ASTFunctionValue(FunctionDeclaration *ast, Interpreter::Engine *engine) + : FunctionValue(engine), _ast(ast) + { + setPrototype(engine->functionPrototype()); + + for (FormalParameterList *it = ast->formals; it; it = it->next) + _argumentNames.append(it->name); + } + + FunctionDeclaration *ast() const { return _ast; } + + virtual const Value *returnValue() const + { + return engine()->undefinedValue(); + } + + virtual int argumentCount() const + { + return _argumentNames.size(); + } + + virtual const Value *argument(int) const + { + return engine()->undefinedValue(); + } + + virtual QString argumentName(int index) const + { + if (index < _argumentNames.size()) { + if (NameId *nameId = _argumentNames.at(index)) + return nameId->asString(); + } + + return FunctionValue::argumentName(index); + } + + virtual bool isVariadic() const + { + return true; + } +}; + +} // end of anonymous namespace + Bind::Bind(Document::Ptr doc, Interpreter::Engine *interp) : _doc(doc), _interp(interp), @@ -261,11 +313,7 @@ bool Bind::visit(FunctionDeclaration *ast) if (_currentObjectValue->property(ast->name->asString())) return false; - Function *function = _interp->newFunction(); - for (FormalParameterList *iter = ast->formals; iter; iter = iter->next) { - function->addArgument(_interp->undefinedValue()); // ### introduce unknownValue - // ### store argument names - } + ASTFunctionValue *function = new ASTFunctionValue(ast, _interp); _currentObjectValue->setProperty(ast->name->asString(), function); return false; // ### eventually want to visit function bodies } diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index f27405b2927..4b101bc5cb1 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -918,7 +918,7 @@ const Value *FunctionValue::argument(int) const QString FunctionValue::argumentName(int index) const { - return QString::fromLatin1("arg%1").arg(index); + return QString::fromLatin1("arg%1").arg(index + 1); } bool FunctionValue::isVariadic() const diff --git a/src/plugins/qmljseditor/qmlcodecompletion.cpp b/src/plugins/qmljseditor/qmlcodecompletion.cpp index ef67358972e..3c3f912aa55 100644 --- a/src/plugins/qmljseditor/qmlcodecompletion.cpp +++ b/src/plugins/qmljseditor/qmlcodecompletion.cpp @@ -424,10 +424,13 @@ void FunctionArgumentWidget::updateHintText() if (i != 0) prettyMethod += QLatin1String(", "); - prettyMethod += QLatin1String("arg"); + QString arg = m_signature.at(i); + if (arg.isEmpty()) { + arg = QLatin1String("arg"); + arg += QString::number(i + 1); + } - if (m_minimumArgumentCount != 1) - prettyMethod += QString::number(i + 1); + prettyMethod += arg; } prettyMethod += QLatin1Char(')'); -- GitLab