1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
16 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 ** In addition, as a special exception, Nokia gives you certain additional
26 ** rights. These rights are described in the Nokia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
32 **************************************************************************/
34 #include "qmljsevaluate.h"
35 #include "qmljsinterpreter.h"
36 #include "parser/qmljsparser_p.h"
37 #include "parser/qmljsast_p.h"
38 #include <QtCore/QDebug>
40 using namespace QmlJS;
41 using namespace QmlJS::Interpreter;
43 Evaluate::Evaluate(const Context *context)
44 : _engine(context->engine()),
46 _scope(_engine->globalObject()),
55 const Interpreter::Value *Evaluate::operator()(AST::Node *ast)
57 const Value *result = reference(ast);
59 if (const Reference *ref = value_cast<const Reference *>(result))
60 result = _context->lookupReference(ref);
63 result = _engine->undefinedValue();
68 const Interpreter::Value *Evaluate::reference(AST::Node *ast)
71 const Value *previousResult = switchResult(0);
73 // process the expression
76 // restore the previous result
77 return switchResult(previousResult);
80 Interpreter::Engine *Evaluate::switchEngine(Interpreter::Engine *engine)
82 Interpreter::Engine *previousEngine = _engine;
84 return previousEngine;
87 const Interpreter::Value *Evaluate::switchResult(const Interpreter::Value *result)
89 const Interpreter::Value *previousResult = _result;
91 return previousResult;
94 const Interpreter::ObjectValue *Evaluate::switchScope(const Interpreter::ObjectValue *scope)
96 const Interpreter::ObjectValue *previousScope = _scope;
101 void Evaluate::accept(AST::Node *node)
103 AST::Node::accept(node, this);
106 bool Evaluate::visit(AST::UiProgram *)
111 bool Evaluate::visit(AST::UiImportList *)
116 bool Evaluate::visit(AST::UiImport *)
121 bool Evaluate::visit(AST::UiPublicMember *)
126 bool Evaluate::visit(AST::UiSourceElement *)
131 bool Evaluate::visit(AST::UiObjectDefinition *)
136 bool Evaluate::visit(AST::UiObjectInitializer *)
141 bool Evaluate::visit(AST::UiObjectBinding *)
146 bool Evaluate::visit(AST::UiScriptBinding *)
151 bool Evaluate::visit(AST::UiArrayBinding *)
156 bool Evaluate::visit(AST::UiObjectMemberList *)
161 bool Evaluate::visit(AST::UiArrayMemberList *)
166 bool Evaluate::visit(AST::UiQualifiedId *ast)
171 const Value *value = _context->lookup(ast->name->asString());
176 const ObjectValue *base = value_cast<const ObjectValue *>(value);
178 for (AST::UiQualifiedId *it = ast->next; base && it; it = it->next) {
179 NameId *name = it->name;
183 const Value *value = base->property(name->asString(), _context);
187 base = value_cast<const ObjectValue *>(value);
194 bool Evaluate::visit(AST::UiSignature *)
199 bool Evaluate::visit(AST::UiFormalList *)
204 bool Evaluate::visit(AST::UiFormal *)
209 bool Evaluate::visit(AST::ThisExpression *)
214 bool Evaluate::visit(AST::IdentifierExpression *ast)
219 _result = _context->lookup(ast->name->asString());
223 bool Evaluate::visit(AST::NullExpression *)
225 _result = _engine->nullValue();
229 bool Evaluate::visit(AST::TrueLiteral *)
231 _result = _engine->booleanValue();
235 bool Evaluate::visit(AST::FalseLiteral *)
237 _result = _engine->booleanValue();
241 bool Evaluate::visit(AST::StringLiteral *)
243 _result = _engine->stringValue();
247 bool Evaluate::visit(AST::NumericLiteral *)
249 _result = _engine->numberValue();
253 bool Evaluate::visit(AST::RegExpLiteral *)
255 _result = _engine->regexpCtor()->construct();
259 bool Evaluate::visit(AST::ArrayLiteral *)
261 _result = _engine->arrayCtor()->construct();
265 bool Evaluate::visit(AST::ObjectLiteral *)
270 bool Evaluate::visit(AST::ElementList *)
275 bool Evaluate::visit(AST::Elision *)
280 bool Evaluate::visit(AST::PropertyNameAndValueList *)
285 bool Evaluate::visit(AST::NestedExpression *)
287 return true; // visit the child expression
290 bool Evaluate::visit(AST::IdentifierPropertyName *)
295 bool Evaluate::visit(AST::StringLiteralPropertyName *)
300 bool Evaluate::visit(AST::NumericLiteralPropertyName *)
305 bool Evaluate::visit(AST::ArrayMemberExpression *)
310 bool Evaluate::visit(AST::FieldMemberExpression *ast)
315 if (const Interpreter::Value *base = _engine->convertToObject(reference(ast->base))) {
316 if (const Interpreter::ObjectValue *obj = base->asObjectValue()) {
317 _result = obj->property(ast->name->asString(), _context);
324 bool Evaluate::visit(AST::NewMemberExpression *ast)
326 if (const FunctionValue *ctor = value_cast<const FunctionValue *>(reference(ast->base))) {
327 _result = ctor->construct();
332 bool Evaluate::visit(AST::NewExpression *ast)
334 if (const FunctionValue *ctor = value_cast<const FunctionValue *>(reference(ast->expression))) {
335 _result = ctor->construct();
340 bool Evaluate::visit(AST::CallExpression *ast)
342 if (const Interpreter::Value *base = reference(ast->base)) {
343 if (const Interpreter::FunctionValue *obj = base->asFunctionValue()) {
344 _result = obj->returnValue();
350 bool Evaluate::visit(AST::ArgumentList *)
355 bool Evaluate::visit(AST::PostIncrementExpression *)
360 bool Evaluate::visit(AST::PostDecrementExpression *)
365 bool Evaluate::visit(AST::DeleteExpression *)
370 bool Evaluate::visit(AST::VoidExpression *)
375 bool Evaluate::visit(AST::TypeOfExpression *)
380 bool Evaluate::visit(AST::PreIncrementExpression *)
385 bool Evaluate::visit(AST::PreDecrementExpression *)
390 bool Evaluate::visit(AST::UnaryPlusExpression *)
395 bool Evaluate::visit(AST::UnaryMinusExpression *)
400 bool Evaluate::visit(AST::TildeExpression *)
405 bool Evaluate::visit(AST::NotExpression *)
410 bool Evaluate::visit(AST::BinaryExpression *)
415 bool Evaluate::visit(AST::ConditionalExpression *)
420 bool Evaluate::visit(AST::Expression *)
425 bool Evaluate::visit(AST::Block *)
430 bool Evaluate::visit(AST::StatementList *)
435 bool Evaluate::visit(AST::VariableStatement *)
440 bool Evaluate::visit(AST::VariableDeclarationList *)
445 bool Evaluate::visit(AST::VariableDeclaration *)
450 bool Evaluate::visit(AST::EmptyStatement *)
455 bool Evaluate::visit(AST::ExpressionStatement *)
460 bool Evaluate::visit(AST::IfStatement *)
465 bool Evaluate::visit(AST::DoWhileStatement *)
470 bool Evaluate::visit(AST::WhileStatement *)
475 bool Evaluate::visit(AST::ForStatement *)
480 bool Evaluate::visit(AST::LocalForStatement *)
485 bool Evaluate::visit(AST::ForEachStatement *)
490 bool Evaluate::visit(AST::LocalForEachStatement *)
495 bool Evaluate::visit(AST::ContinueStatement *)
500 bool Evaluate::visit(AST::BreakStatement *)
505 bool Evaluate::visit(AST::ReturnStatement *)
510 bool Evaluate::visit(AST::WithStatement *)
515 bool Evaluate::visit(AST::SwitchStatement *)
520 bool Evaluate::visit(AST::CaseBlock *)
525 bool Evaluate::visit(AST::CaseClauses *)
530 bool Evaluate::visit(AST::CaseClause *)
535 bool Evaluate::visit(AST::DefaultClause *)
540 bool Evaluate::visit(AST::LabelledStatement *)
545 bool Evaluate::visit(AST::ThrowStatement *)
550 bool Evaluate::visit(AST::TryStatement *)
555 bool Evaluate::visit(AST::Catch *)
560 bool Evaluate::visit(AST::Finally *)
565 bool Evaluate::visit(AST::FunctionDeclaration *)
570 bool Evaluate::visit(AST::FunctionExpression *)
575 bool Evaluate::visit(AST::FormalParameterList *)
580 bool Evaluate::visit(AST::FunctionBody *)
585 bool Evaluate::visit(AST::Program *)
590 bool Evaluate::visit(AST::SourceElements *)
595 bool Evaluate::visit(AST::FunctionSourceElement *)
600 bool Evaluate::visit(AST::StatementSourceElement *)
605 bool Evaluate::visit(AST::DebuggerStatement *)