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