Merge branch 'master' of git://scm.dev.nokia.troll.no/qt/qtdeclarative
[profile/ivi/qtdeclarative.git] / src / declarative / qml / v4 / qdeclarativev4irbuilder_p.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the QtDeclarative module of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** No Commercial Usage
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
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file.  Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23 **
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27 **
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
30 **
31 **
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef QDECLARATIVEV4IRBUILDER_P_H
43 #define QDECLARATIVEV4IRBUILDER_P_H
44
45 #include <QtCore/qglobal.h>
46
47 #include "qdeclarativev4ir_p.h"
48
49 QT_BEGIN_HEADER
50
51 QT_BEGIN_NAMESPACE
52
53 class QDeclarativeV4IRBuilder : public QDeclarativeJS::AST::Visitor
54 {
55 public:
56     QDeclarativeV4IRBuilder(const QDeclarativeV4Compiler::Expression *, QDeclarativeEnginePrivate *);
57
58     QDeclarativeJS::IR::Function *operator()(QDeclarativeJS::IR::Module *, QDeclarativeJS::AST::Node *);
59
60 protected:
61     struct ExprResult {
62         enum Format {
63             ex, // expression
64             cx  // condition
65         };
66
67         QDeclarativeJS::IR::Expr *code;
68         QDeclarativeJS::IR::BasicBlock *iftrue;
69         QDeclarativeJS::IR::BasicBlock *iffalse;
70         Format hint; // requested format
71         Format format; // instruction format
72
73         ExprResult(QDeclarativeJS::IR::Expr *expr = 0)
74             : code(expr), iftrue(0), iffalse(0), hint(ex), format(ex) {}
75
76         ExprResult(QDeclarativeJS::IR::BasicBlock *iftrue, QDeclarativeJS::IR::BasicBlock *iffalse)
77             : code(0), iftrue(iftrue), iffalse(iffalse), hint(cx), format(ex) {}
78
79         inline QDeclarativeJS::IR::Type type() const { return code ? code->type : QDeclarativeJS::IR::InvalidType; }
80
81         inline QDeclarativeJS::IR::Expr *get() const { return code; }
82         inline operator QDeclarativeJS::IR::Expr *() const  { return get(); }
83         inline QDeclarativeJS::IR::Expr *operator->() const { return get(); }
84         inline bool isValid() const { return code ? code->type != QDeclarativeJS::IR::InvalidType : false; }
85         inline bool is(QDeclarativeJS::IR::Type t) const { return type() == t; }
86         inline bool isNot(QDeclarativeJS::IR::Type t) const { return type() != t; }
87
88         bool isPrimitive() const {
89             switch (type()) {
90             case QDeclarativeJS::IR::UndefinedType: // ### TODO
91             case QDeclarativeJS::IR::NullType: // ### TODO
92             case QDeclarativeJS::IR::UrlType: // ### TODO
93                 return false;
94
95             case QDeclarativeJS::IR::StringType:
96             case QDeclarativeJS::IR::BoolType:
97             case QDeclarativeJS::IR::IntType:
98             case QDeclarativeJS::IR::RealType:
99             case QDeclarativeJS::IR::RealNaNType:
100                 return true;
101
102             default:
103                 return false;
104             } // switch
105         }
106     };
107
108     inline void accept(QDeclarativeJS::AST::Node *ast) { QDeclarativeJS::AST::Node::accept(ast, this); }
109
110     ExprResult expression(QDeclarativeJS::AST::ExpressionNode *ast);
111     ExprResult statement(QDeclarativeJS::AST::Statement *ast);
112     void sourceElement(QDeclarativeJS::AST::SourceElement *ast);
113     void condition(QDeclarativeJS::AST::ExpressionNode *ast, QDeclarativeJS::IR::BasicBlock *iftrue, QDeclarativeJS::IR::BasicBlock *iffalse);
114     void binop(QDeclarativeJS::AST::BinaryExpression *ast, ExprResult left, ExprResult right);
115
116     void implicitCvt(ExprResult &expr, QDeclarativeJS::IR::Type type);
117
118     // QML
119     virtual bool visit(QDeclarativeJS::AST::UiProgram *ast);
120     virtual bool visit(QDeclarativeJS::AST::UiImportList *ast);
121     virtual bool visit(QDeclarativeJS::AST::UiImport *ast);
122     virtual bool visit(QDeclarativeJS::AST::UiPublicMember *ast);
123     virtual bool visit(QDeclarativeJS::AST::UiSourceElement *ast);
124     virtual bool visit(QDeclarativeJS::AST::UiObjectDefinition *ast);
125     virtual bool visit(QDeclarativeJS::AST::UiObjectInitializer *ast);
126     virtual bool visit(QDeclarativeJS::AST::UiObjectBinding *ast);
127     virtual bool visit(QDeclarativeJS::AST::UiScriptBinding *ast);
128     virtual bool visit(QDeclarativeJS::AST::UiArrayBinding *ast);
129     virtual bool visit(QDeclarativeJS::AST::UiObjectMemberList *ast);
130     virtual bool visit(QDeclarativeJS::AST::UiArrayMemberList *ast);
131     virtual bool visit(QDeclarativeJS::AST::UiQualifiedId *ast);
132     virtual bool visit(QDeclarativeJS::AST::UiSignature *ast);
133     virtual bool visit(QDeclarativeJS::AST::UiFormalList *ast);
134     virtual bool visit(QDeclarativeJS::AST::UiFormal *ast);
135
136     // JS
137     virtual bool visit(QDeclarativeJS::AST::Program *ast);
138     virtual bool visit(QDeclarativeJS::AST::SourceElements *ast);
139     virtual bool visit(QDeclarativeJS::AST::FunctionSourceElement *ast);
140     virtual bool visit(QDeclarativeJS::AST::StatementSourceElement *ast);
141
142     // object literals
143     virtual bool visit(QDeclarativeJS::AST::PropertyNameAndValueList *ast);
144     virtual bool visit(QDeclarativeJS::AST::IdentifierPropertyName *ast);
145     virtual bool visit(QDeclarativeJS::AST::StringLiteralPropertyName *ast);
146     virtual bool visit(QDeclarativeJS::AST::NumericLiteralPropertyName *ast);
147
148     // array literals
149     virtual bool visit(QDeclarativeJS::AST::ElementList *ast);
150     virtual bool visit(QDeclarativeJS::AST::Elision *ast);
151
152     // function calls
153     virtual bool visit(QDeclarativeJS::AST::ArgumentList *ast);
154
155     // expressions
156     virtual bool visit(QDeclarativeJS::AST::ObjectLiteral *ast);
157     virtual bool visit(QDeclarativeJS::AST::ArrayLiteral *ast);
158     virtual bool visit(QDeclarativeJS::AST::ThisExpression *ast);
159     virtual bool visit(QDeclarativeJS::AST::IdentifierExpression *ast);
160     virtual bool visit(QDeclarativeJS::AST::NullExpression *ast);
161     virtual bool visit(QDeclarativeJS::AST::TrueLiteral *ast);
162     virtual bool visit(QDeclarativeJS::AST::FalseLiteral *ast);
163     virtual bool visit(QDeclarativeJS::AST::StringLiteral *ast);
164     virtual bool visit(QDeclarativeJS::AST::NumericLiteral *ast);
165     virtual bool visit(QDeclarativeJS::AST::RegExpLiteral *ast);
166     virtual bool visit(QDeclarativeJS::AST::NestedExpression *ast);
167     virtual bool visit(QDeclarativeJS::AST::ArrayMemberExpression *ast);
168     virtual bool visit(QDeclarativeJS::AST::FieldMemberExpression *ast);
169     virtual bool visit(QDeclarativeJS::AST::NewMemberExpression *ast);
170     virtual bool visit(QDeclarativeJS::AST::NewExpression *ast);
171     virtual bool visit(QDeclarativeJS::AST::CallExpression *ast);
172     virtual bool visit(QDeclarativeJS::AST::PostIncrementExpression *ast);
173     virtual bool visit(QDeclarativeJS::AST::PostDecrementExpression *ast);
174     virtual bool visit(QDeclarativeJS::AST::DeleteExpression *ast);
175     virtual bool visit(QDeclarativeJS::AST::VoidExpression *ast);
176     virtual bool visit(QDeclarativeJS::AST::TypeOfExpression *ast);
177     virtual bool visit(QDeclarativeJS::AST::PreIncrementExpression *ast);
178     virtual bool visit(QDeclarativeJS::AST::PreDecrementExpression *ast);
179     virtual bool visit(QDeclarativeJS::AST::UnaryPlusExpression *ast);
180     virtual bool visit(QDeclarativeJS::AST::UnaryMinusExpression *ast);
181     virtual bool visit(QDeclarativeJS::AST::TildeExpression *ast);
182     virtual bool visit(QDeclarativeJS::AST::NotExpression *ast);
183     virtual bool visit(QDeclarativeJS::AST::BinaryExpression *ast);
184     virtual bool visit(QDeclarativeJS::AST::ConditionalExpression *ast);
185     virtual bool visit(QDeclarativeJS::AST::Expression *ast);
186
187     // statements
188     virtual bool visit(QDeclarativeJS::AST::Block *ast);
189     virtual bool visit(QDeclarativeJS::AST::StatementList *ast);
190     virtual bool visit(QDeclarativeJS::AST::VariableStatement *ast);
191     virtual bool visit(QDeclarativeJS::AST::VariableDeclarationList *ast);
192     virtual bool visit(QDeclarativeJS::AST::VariableDeclaration *ast);
193     virtual bool visit(QDeclarativeJS::AST::EmptyStatement *ast);
194     virtual bool visit(QDeclarativeJS::AST::ExpressionStatement *ast);
195     virtual bool visit(QDeclarativeJS::AST::IfStatement *ast);
196     virtual bool visit(QDeclarativeJS::AST::DoWhileStatement *ast);
197     virtual bool visit(QDeclarativeJS::AST::WhileStatement *ast);
198     virtual bool visit(QDeclarativeJS::AST::ForStatement *ast);
199     virtual bool visit(QDeclarativeJS::AST::LocalForStatement *ast);
200     virtual bool visit(QDeclarativeJS::AST::ForEachStatement *ast);
201     virtual bool visit(QDeclarativeJS::AST::LocalForEachStatement *ast);
202     virtual bool visit(QDeclarativeJS::AST::ContinueStatement *ast);
203     virtual bool visit(QDeclarativeJS::AST::BreakStatement *ast);
204     virtual bool visit(QDeclarativeJS::AST::ReturnStatement *ast);
205     virtual bool visit(QDeclarativeJS::AST::WithStatement *ast);
206     virtual bool visit(QDeclarativeJS::AST::SwitchStatement *ast);
207     virtual bool visit(QDeclarativeJS::AST::CaseBlock *ast);
208     virtual bool visit(QDeclarativeJS::AST::CaseClauses *ast);
209     virtual bool visit(QDeclarativeJS::AST::CaseClause *ast);
210     virtual bool visit(QDeclarativeJS::AST::DefaultClause *ast);
211     virtual bool visit(QDeclarativeJS::AST::LabelledStatement *ast);
212     virtual bool visit(QDeclarativeJS::AST::ThrowStatement *ast);
213     virtual bool visit(QDeclarativeJS::AST::TryStatement *ast);
214     virtual bool visit(QDeclarativeJS::AST::Catch *ast);
215     virtual bool visit(QDeclarativeJS::AST::Finally *ast);
216     virtual bool visit(QDeclarativeJS::AST::FunctionDeclaration *ast);
217     virtual bool visit(QDeclarativeJS::AST::FunctionExpression *ast);
218     virtual bool visit(QDeclarativeJS::AST::FormalParameterList *ast);
219     virtual bool visit(QDeclarativeJS::AST::FunctionBody *ast);
220     virtual bool visit(QDeclarativeJS::AST::DebuggerStatement *ast);
221
222 private:
223     bool buildName(QStringList &name, QDeclarativeJS::AST::Node *node, 
224                    QList<QDeclarativeJS::AST::ExpressionNode *> *nodes);
225     void discard();
226
227     const QDeclarativeV4Compiler::Expression *m_expression;
228     QDeclarativeEnginePrivate *m_engine;
229
230     QDeclarativeJS::IR::Module *_module;
231     QDeclarativeJS::IR::Function *_function;
232     QDeclarativeJS::IR::BasicBlock *_block;
233     bool _discard;
234
235     ExprResult _expr;
236 };
237
238 QT_END_NAMESPACE
239
240 QT_END_HEADER
241
242 #endif // QDECLARATIVEV4IRBUILDER_P_H