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