1 | // Copyright (C) 2021 The Qt Company Ltd. |
---|---|
2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 |
3 | |
4 | #ifndef QMLMARKUPVISITOR_H |
5 | #define QMLMARKUPVISITOR_H |
6 | |
7 | #include "node.h" |
8 | #include "tree.h" |
9 | |
10 | #include <QtCore/qstring.h> |
11 | |
12 | #include <private/qqmljsastvisitor_p.h> |
13 | #include <private/qqmljsengine_p.h> |
14 | |
15 | QT_BEGIN_NAMESPACE |
16 | |
17 | class QmlMarkupVisitor : public QQmlJS::AST::Visitor |
18 | { |
19 | public: |
20 | enum ExtraType { Comment, Pragma }; |
21 | |
22 | QmlMarkupVisitor(const QString &code, const QList<QQmlJS::SourceLocation> &pragmas, |
23 | QQmlJS::Engine *engine); |
24 | ~QmlMarkupVisitor() override = default; |
25 | |
26 | QString markedUpCode(); |
27 | [[nodiscard]] bool hasError() const; |
28 | |
29 | bool visit(QQmlJS::AST::UiImport *) override; |
30 | void endVisit(QQmlJS::AST::UiImport *) override; |
31 | |
32 | bool visit(QQmlJS::AST::UiPublicMember *) override; |
33 | bool visit(QQmlJS::AST::UiObjectDefinition *) override; |
34 | |
35 | bool visit(QQmlJS::AST::UiObjectInitializer *) override; |
36 | void endVisit(QQmlJS::AST::UiObjectInitializer *) override; |
37 | |
38 | bool visit(QQmlJS::AST::UiObjectBinding *) override; |
39 | bool visit(QQmlJS::AST::UiScriptBinding *) override; |
40 | bool visit(QQmlJS::AST::UiArrayBinding *) override; |
41 | bool visit(QQmlJS::AST::UiArrayMemberList *) override; |
42 | bool visit(QQmlJS::AST::UiQualifiedId *) override; |
43 | |
44 | bool visit(QQmlJS::AST::ThisExpression *) override; |
45 | bool visit(QQmlJS::AST::IdentifierExpression *) override; |
46 | bool visit(QQmlJS::AST::NullExpression *) override; |
47 | bool visit(QQmlJS::AST::TrueLiteral *) override; |
48 | bool visit(QQmlJS::AST::FalseLiteral *) override; |
49 | bool visit(QQmlJS::AST::NumericLiteral *) override; |
50 | bool visit(QQmlJS::AST::StringLiteral *) override; |
51 | bool visit(QQmlJS::AST::RegExpLiteral *) override; |
52 | bool visit(QQmlJS::AST::ArrayPattern *) override; |
53 | |
54 | bool visit(QQmlJS::AST::ObjectPattern *) override; |
55 | void endVisit(QQmlJS::AST::ObjectPattern *) override; |
56 | |
57 | bool visit(QQmlJS::AST::PatternElementList *) override; |
58 | bool visit(QQmlJS::AST::Elision *) override; |
59 | bool visit(QQmlJS::AST::PatternProperty *) override; |
60 | bool visit(QQmlJS::AST::ArrayMemberExpression *) override; |
61 | bool visit(QQmlJS::AST::FieldMemberExpression *) override; |
62 | bool visit(QQmlJS::AST::NewMemberExpression *) override; |
63 | bool visit(QQmlJS::AST::NewExpression *) override; |
64 | bool visit(QQmlJS::AST::ArgumentList *) override; |
65 | bool visit(QQmlJS::AST::PostIncrementExpression *) override; |
66 | bool visit(QQmlJS::AST::PostDecrementExpression *) override; |
67 | bool visit(QQmlJS::AST::DeleteExpression *) override; |
68 | bool visit(QQmlJS::AST::VoidExpression *) override; |
69 | bool visit(QQmlJS::AST::TypeOfExpression *) override; |
70 | bool visit(QQmlJS::AST::PreIncrementExpression *) override; |
71 | bool visit(QQmlJS::AST::PreDecrementExpression *) override; |
72 | bool visit(QQmlJS::AST::UnaryPlusExpression *) override; |
73 | bool visit(QQmlJS::AST::UnaryMinusExpression *) override; |
74 | bool visit(QQmlJS::AST::TildeExpression *) override; |
75 | bool visit(QQmlJS::AST::NotExpression *) override; |
76 | bool visit(QQmlJS::AST::BinaryExpression *) override; |
77 | bool visit(QQmlJS::AST::ConditionalExpression *) override; |
78 | bool visit(QQmlJS::AST::Expression *) override; |
79 | |
80 | bool visit(QQmlJS::AST::Block *) override; |
81 | void endVisit(QQmlJS::AST::Block *) override; |
82 | |
83 | bool visit(QQmlJS::AST::VariableStatement *) override; |
84 | bool visit(QQmlJS::AST::VariableDeclarationList *) override; |
85 | bool visit(QQmlJS::AST::EmptyStatement *) override; |
86 | bool visit(QQmlJS::AST::ExpressionStatement *) override; |
87 | bool visit(QQmlJS::AST::IfStatement *) override; |
88 | bool visit(QQmlJS::AST::DoWhileStatement *) override; |
89 | bool visit(QQmlJS::AST::WhileStatement *) override; |
90 | bool visit(QQmlJS::AST::ForStatement *) override; |
91 | bool visit(QQmlJS::AST::ForEachStatement *) override; |
92 | bool visit(QQmlJS::AST::ContinueStatement *) override; |
93 | bool visit(QQmlJS::AST::BreakStatement *) override; |
94 | bool visit(QQmlJS::AST::ReturnStatement *) override; |
95 | bool visit(QQmlJS::AST::WithStatement *) override; |
96 | |
97 | bool visit(QQmlJS::AST::CaseBlock *) override; |
98 | void endVisit(QQmlJS::AST::CaseBlock *) override; |
99 | |
100 | bool visit(QQmlJS::AST::SwitchStatement *) override; |
101 | bool visit(QQmlJS::AST::CaseClause *) override; |
102 | bool visit(QQmlJS::AST::DefaultClause *) override; |
103 | bool visit(QQmlJS::AST::LabelledStatement *) override; |
104 | bool visit(QQmlJS::AST::ThrowStatement *) override; |
105 | bool visit(QQmlJS::AST::TryStatement *) override; |
106 | bool visit(QQmlJS::AST::Catch *) override; |
107 | bool visit(QQmlJS::AST::Finally *) override; |
108 | bool visit(QQmlJS::AST::FunctionDeclaration *) override; |
109 | bool visit(QQmlJS::AST::FunctionExpression *) override; |
110 | bool visit(QQmlJS::AST::FormalParameterList *) override; |
111 | bool visit(QQmlJS::AST::DebuggerStatement *) override; |
112 | |
113 | protected: |
114 | QString protect(const QString &string); |
115 | |
116 | private: |
117 | typedef QHash<QString, QString> StringHash; |
118 | void addExtra(quint32 start, quint32 finish); |
119 | void addMarkedUpToken(QQmlJS::SourceLocation &location, const QString &text, |
120 | const StringHash &attributes = StringHash()); |
121 | void addVerbatim(QQmlJS::SourceLocation first, |
122 | QQmlJS::SourceLocation last = QQmlJS::SourceLocation()); |
123 | QString sourceText(QQmlJS::SourceLocation &location); |
124 | void throwRecursionDepthError() final; |
125 | |
126 | QQmlJS::Engine *m_engine { nullptr }; |
127 | QList<ExtraType> m_extraTypes {}; |
128 | QList<QQmlJS::SourceLocation> m_extraLocations {}; |
129 | QString m_source {}; |
130 | QString m_output {}; |
131 | quint32 m_cursor {}; |
132 | int m_extraIndex {}; |
133 | bool m_hasRecursionDepthError { false }; |
134 | }; |
135 | Q_DECLARE_TYPEINFO(QmlMarkupVisitor::ExtraType, Q_PRIMITIVE_TYPE); |
136 | |
137 | QT_END_NAMESPACE |
138 | |
139 | #endif |
140 |