From 6dcc675eb2ad6ed43ad51b054fbd2ec281a909f9 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Mon, 1 Feb 2010 17:31:28 +0100
Subject: [PATCH] Guess the type of a global variable by looking at its
 initializer.

---
 src/libs/qmljs/qmljsbind.cpp  | 16 +++++++++++++---
 src/libs/qmljs/qmljscheck.cpp | 10 ++++++++--
 2 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/src/libs/qmljs/qmljsbind.cpp b/src/libs/qmljs/qmljsbind.cpp
index 7935452be57..bdc07490633 100644
--- a/src/libs/qmljs/qmljsbind.cpp
+++ b/src/libs/qmljs/qmljsbind.cpp
@@ -30,6 +30,7 @@
 #include "parser/qmljsast_p.h"
 #include "qmljsbind.h"
 #include "qmljslink.h"
+#include "qmljscheck.h"
 #include "qmljsmetatypesystem.h"
 
 #include <QtCore/QDir>
@@ -126,7 +127,8 @@ class ProcessSourceElements: protected AST::Visitor
 
 public:
     ProcessSourceElements(Interpreter::Engine *interp)
-        : _interp(interp)
+        : _interp(interp),
+          typeOfExpression(interp)
     {
     }
 
@@ -149,11 +151,19 @@ protected:
 
     virtual bool visit(VariableDeclaration *ast)
     {
-        if (ast->name)
-            _interp->globalObject()->setProperty(ast->name->asString(), _interp->undefinedValue());
+        if (ast->name) {
+            const Value *value = _interp->undefinedValue();
+
+            if (ast->expression)
+                value = typeOfExpression(ast->expression, _interp->globalObject());
+
+            _interp->globalObject()->setProperty(ast->name->asString(), value);
+        }
 
         return false;
     }
+
+    Check typeOfExpression;
 };
 
 } // end of anonymous namespace
diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp
index 877959b967a..1dbd12a9076 100644
--- a/src/libs/qmljs/qmljscheck.cpp
+++ b/src/libs/qmljs/qmljscheck.cpp
@@ -286,13 +286,19 @@ bool Check::visit(AST::FieldMemberExpression *ast)
     return false;
 }
 
-bool Check::visit(AST::NewMemberExpression *)
+bool Check::visit(AST::NewMemberExpression *ast)
 {
+    if (const FunctionValue *ctor = value_cast<const FunctionValue *>(check(ast->base))) {
+        _result = ctor->construct();
+    }
     return false;
 }
 
-bool Check::visit(AST::NewExpression *)
+bool Check::visit(AST::NewExpression *ast)
 {
+    if (const FunctionValue *ctor = value_cast<const FunctionValue *>(check(ast->expression))) {
+        _result = ctor->construct();
+    }
     return false;
 }
 
-- 
GitLab