1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the tools applications of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/contact-us.
16 **
17 ** 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 or version 3 as published by the Free
20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22 ** following information to ensure the GNU Lesser General Public License
23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 **
26 ** As a special exception, The Qt Company gives you certain additional
27 ** rights. These rights are described in The Qt Company LGPL Exception
28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 **
30 ** GNU General Public License Usage
31 ** Alternatively, this file may be used under the terms of the GNU
32 ** General Public License version 3.0 as published by the Free Software
33 ** Foundation and appearing in the file LICENSE.GPL included in the
34 ** packaging of this file.  Please review the following information to
35 ** ensure the GNU General Public License version 3.0 requirements will be
36 ** met: http://www.gnu.org/copyleft/gpl.html.
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 
42 #ifndef QMLVISITOR_H
43 #define QMLVISITOR_H
44 
45 #include <QString>
46 #include "declarativeparser/qdeclarativejsastvisitor_p.h"
47 #include "node.h"
48 #include "tree.h"
49 
50 QT_BEGIN_NAMESPACE
51 
52 class QmlMarkupVisitor : public QDeclarativeJS::AST::Visitor
53 {
54 public:
55     enum ExtraType{
56         Comment,
57         Pragma
58     };
59 
60     QmlMarkupVisitor(const QString &code,
61                      const QList<QDeclarativeJS::AST::SourceLocation> &pragmas,
62                      QDeclarativeJS::Engine *engine);
63     virtual ~QmlMarkupVisitor();
64 
65     QString markedUpCode();
66 
67     virtual bool visit(QDeclarativeJS::AST::UiImport *);
68     virtual void endVisit(QDeclarativeJS::AST::UiImport *);
69 
70     virtual bool visit(QDeclarativeJS::AST::UiPublicMember *);
71     virtual bool visit(QDeclarativeJS::AST::UiObjectDefinition *);
72 
73     virtual bool visit(QDeclarativeJS::AST::UiObjectInitializer *);
74     virtual void endVisit(QDeclarativeJS::AST::UiObjectInitializer *);
75 
76     virtual bool visit(QDeclarativeJS::AST::UiObjectBinding *);
77     virtual bool visit(QDeclarativeJS::AST::UiScriptBinding *);
78     virtual bool visit(QDeclarativeJS::AST::UiArrayBinding *);
79     virtual bool visit(QDeclarativeJS::AST::UiArrayMemberList *);
80     virtual bool visit(QDeclarativeJS::AST::UiQualifiedId *);
81 
82     virtual bool visit(QDeclarativeJS::AST::UiSignature *);
83     virtual void endVisit(QDeclarativeJS::AST::UiSignature *);
84 
85     virtual bool visit(QDeclarativeJS::AST::UiFormal *);
86     virtual bool visit(QDeclarativeJS::AST::ThisExpression *);
87     virtual bool visit(QDeclarativeJS::AST::IdentifierExpression *);
88     virtual bool visit(QDeclarativeJS::AST::NullExpression *);
89     virtual bool visit(QDeclarativeJS::AST::TrueLiteral *);
90     virtual bool visit(QDeclarativeJS::AST::FalseLiteral *);
91     virtual bool visit(QDeclarativeJS::AST::NumericLiteral *);
92     virtual bool visit(QDeclarativeJS::AST::StringLiteral *);
93     virtual bool visit(QDeclarativeJS::AST::RegExpLiteral *);
94     virtual bool visit(QDeclarativeJS::AST::ArrayLiteral *);
95 
96     virtual bool visit(QDeclarativeJS::AST::ObjectLiteral *);
97     virtual void endVisit(QDeclarativeJS::AST::ObjectLiteral *);
98 
99     virtual bool visit(QDeclarativeJS::AST::ElementList *);
100     virtual bool visit(QDeclarativeJS::AST::Elision *);
101     virtual bool visit(QDeclarativeJS::AST::PropertyNameAndValueList *);
102     virtual bool visit(QDeclarativeJS::AST::ArrayMemberExpression *);
103     virtual bool visit(QDeclarativeJS::AST::FieldMemberExpression *);
104     virtual bool visit(QDeclarativeJS::AST::NewMemberExpression *);
105     virtual bool visit(QDeclarativeJS::AST::NewExpression *);
106     virtual bool visit(QDeclarativeJS::AST::ArgumentList *);
107     virtual bool visit(QDeclarativeJS::AST::PostIncrementExpression *);
108     virtual bool visit(QDeclarativeJS::AST::PostDecrementExpression *);
109     virtual bool visit(QDeclarativeJS::AST::DeleteExpression *);
110     virtual bool visit(QDeclarativeJS::AST::VoidExpression *);
111     virtual bool visit(QDeclarativeJS::AST::TypeOfExpression *);
112     virtual bool visit(QDeclarativeJS::AST::PreIncrementExpression *);
113     virtual bool visit(QDeclarativeJS::AST::PreDecrementExpression *);
114     virtual bool visit(QDeclarativeJS::AST::UnaryPlusExpression *);
115     virtual bool visit(QDeclarativeJS::AST::UnaryMinusExpression *);
116     virtual bool visit(QDeclarativeJS::AST::TildeExpression *);
117     virtual bool visit(QDeclarativeJS::AST::NotExpression *);
118     virtual bool visit(QDeclarativeJS::AST::BinaryExpression *);
119     virtual bool visit(QDeclarativeJS::AST::ConditionalExpression *);
120     virtual bool visit(QDeclarativeJS::AST::Expression *);
121 
122     virtual bool visit(QDeclarativeJS::AST::Block *);
123     virtual void endVisit(QDeclarativeJS::AST::Block *);
124 
125     virtual bool visit(QDeclarativeJS::AST::VariableStatement *);
126     virtual bool visit(QDeclarativeJS::AST::VariableDeclarationList *);
127     virtual bool visit(QDeclarativeJS::AST::VariableDeclaration *);
128     virtual bool visit(QDeclarativeJS::AST::EmptyStatement *);
129     virtual bool visit(QDeclarativeJS::AST::ExpressionStatement *);
130     virtual bool visit(QDeclarativeJS::AST::IfStatement *);
131     virtual bool visit(QDeclarativeJS::AST::DoWhileStatement *);
132     virtual bool visit(QDeclarativeJS::AST::WhileStatement *);
133     virtual bool visit(QDeclarativeJS::AST::ForStatement *);
134     virtual bool visit(QDeclarativeJS::AST::LocalForStatement *);
135     virtual bool visit(QDeclarativeJS::AST::ForEachStatement *);
136     virtual bool visit(QDeclarativeJS::AST::LocalForEachStatement *);
137     virtual bool visit(QDeclarativeJS::AST::ContinueStatement *);
138     virtual bool visit(QDeclarativeJS::AST::BreakStatement *);
139     virtual bool visit(QDeclarativeJS::AST::ReturnStatement *);
140     virtual bool visit(QDeclarativeJS::AST::WithStatement *);
141 
142     virtual bool visit(QDeclarativeJS::AST::CaseBlock *);
143     virtual void endVisit(QDeclarativeJS::AST::CaseBlock *);
144 
145     virtual bool visit(QDeclarativeJS::AST::SwitchStatement *);
146     virtual bool visit(QDeclarativeJS::AST::CaseClause *);
147     virtual bool visit(QDeclarativeJS::AST::DefaultClause *);
148     virtual bool visit(QDeclarativeJS::AST::LabelledStatement *);
149     virtual bool visit(QDeclarativeJS::AST::ThrowStatement *);
150     virtual bool visit(QDeclarativeJS::AST::TryStatement *);
151     virtual bool visit(QDeclarativeJS::AST::Catch *);
152     virtual bool visit(QDeclarativeJS::AST::Finally *);
153     virtual bool visit(QDeclarativeJS::AST::FunctionDeclaration *);
154     virtual bool visit(QDeclarativeJS::AST::FunctionExpression *);
155     virtual bool visit(QDeclarativeJS::AST::FormalParameterList *);
156     virtual bool visit(QDeclarativeJS::AST::DebuggerStatement *);
157 
158 protected:
159     QString protect(const QString &string);
160 
161 private:
162     typedef QHash<QString, QString> StringHash;
163     void addExtra(quint32 start, quint32 finish);
164     void addMarkedUpToken(QDeclarativeJS::AST::SourceLocation &location,
165                           const QString &text,
166                           const StringHash &attributes = StringHash());
167     void addVerbatim(QDeclarativeJS::AST::SourceLocation first,
168                      QDeclarativeJS::AST::SourceLocation last = QDeclarativeJS::AST::SourceLocation());
169     QString sourceText(QDeclarativeJS::AST::SourceLocation &location);
170 
171     QDeclarativeJS::Engine *engine;
172     QList<ExtraType> extraTypes;
173     QList<QDeclarativeJS::AST::SourceLocation> extraLocations;
174     QString source;
175     QString output;
176     quint32 cursor;
177     int extraIndex;
178 };
179 
180 QT_END_NAMESPACE
181 
182 #endif
183