1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qqmldomoutwriter_p.h"
5#include "qqmldomlinewriter_p.h"
6#include "qqmldomitem_p.h"
7#include "qqmldomcomments_p.h"
8
9#include <QtCore/QLoggingCategory>
10
11QT_BEGIN_NAMESPACE
12namespace QQmlJS {
13namespace Dom {
14
15static inline OutWriter::RegionToCommentMap extractComments(const DomItem &it)
16{
17 OutWriter::RegionToCommentMap comments;
18 if (const RegionComments *cRegionsPtr = it.field(name: Fields::comments).as<RegionComments>()) {
19 comments = cRegionsPtr->regionComments();
20 }
21 return comments;
22}
23
24void OutWriter::itemStart(const DomItem &it)
25{
26 pendingComments.push(t: extractComments(it));
27 regionStart(region: MainRegion);
28}
29
30void OutWriter::itemEnd()
31{
32 Q_ASSERT(!pendingComments.isEmpty());
33 regionEnd(regino: MainRegion);
34 pendingComments.pop();
35}
36
37void OutWriter::regionStart(FileLocationRegion region)
38{
39 const auto &comments = pendingComments.top();
40 if (!skipComments && comments.contains(key: region)) {
41 comments[region].writePre(lw&: *this);
42 }
43}
44
45void OutWriter::regionEnd(FileLocationRegion region)
46{
47 auto &comments = pendingComments.top();
48 if (comments.contains(key: region)) {
49 if (!skipComments) {
50 comments[region].writePost(lw&: *this);
51 }
52 comments.remove(key: region);
53 }
54}
55
56/*!
57\internal
58Helper method for writeRegion(FileLocationRegion region) that allows to use
59\c{writeRegion(ColonTokenRegion);} instead of having to write out the more error-prone
60\c{writeRegion(ColonTokenRegion, ":");} for tokens and keywords.
61*/
62OutWriter &OutWriter::writeRegion(FileLocationRegion region)
63{
64 using namespace Qt::Literals::StringLiterals;
65 QString codeForRegion;
66 switch (region) {
67 case ComponentKeywordRegion:
68 codeForRegion = u"component"_s;
69 break;
70 case IdColonTokenRegion:
71 case ColonTokenRegion:
72 codeForRegion = u":"_s;
73 break;
74 case ImportTokenRegion:
75 codeForRegion = u"import"_s;
76 break;
77 case AsTokenRegion:
78 codeForRegion = u"as"_s;
79 break;
80 case OnTokenRegion:
81 codeForRegion = u"on"_s;
82 break;
83 case IdTokenRegion:
84 codeForRegion = u"id"_s;
85 break;
86 case LeftBraceRegion:
87 codeForRegion = u"{"_s;
88 break;
89 case RightBraceRegion:
90 codeForRegion = u"}"_s;
91 break;
92 case LeftBracketRegion:
93 codeForRegion = u"["_s;
94 break;
95 case RightBracketRegion:
96 codeForRegion = u"]"_s;
97 break;
98 case LeftParenthesisRegion:
99 codeForRegion = u"("_s;
100 break;
101 case RightParenthesisRegion:
102 codeForRegion = u")"_s;
103 break;
104 case EnumKeywordRegion:
105 codeForRegion = u"enum"_s;
106 break;
107 case DefaultKeywordRegion:
108 codeForRegion = u"default"_s;
109 break;
110 case RequiredKeywordRegion:
111 codeForRegion = u"required"_s;
112 break;
113 case ReadonlyKeywordRegion:
114 codeForRegion = u"readonly"_s;
115 break;
116 case PropertyKeywordRegion:
117 codeForRegion = u"property"_s;
118 break;
119 case FunctionKeywordRegion:
120 codeForRegion = u"function"_s;
121 break;
122 case SignalKeywordRegion:
123 codeForRegion = u"signal"_s;
124 break;
125 case ReturnKeywordRegion:
126 codeForRegion = u"return"_s;
127 break;
128 case EllipsisTokenRegion:
129 codeForRegion = u"..."_s;
130 break;
131 case EqualTokenRegion:
132 codeForRegion = u"="_s;
133 break;
134 case PragmaKeywordRegion:
135 codeForRegion = u"pragma"_s;
136 break;
137 case CommaTokenRegion:
138 codeForRegion = u","_s;
139 break;
140 case ForKeywordRegion:
141 codeForRegion = u"for"_s;
142 break;
143 case ElseKeywordRegion:
144 codeForRegion = u"else"_s;
145 break;
146 case DoKeywordRegion:
147 codeForRegion = u"do"_s;
148 break;
149 case WhileKeywordRegion:
150 codeForRegion = u"while"_s;
151 break;
152 case TryKeywordRegion:
153 codeForRegion = u"try"_s;
154 break;
155 case CatchKeywordRegion:
156 codeForRegion = u"catch"_s;
157 break;
158 case FinallyKeywordRegion:
159 codeForRegion = u"finally"_s;
160 break;
161 case CaseKeywordRegion:
162 codeForRegion = u"case"_s;
163 break;
164 case ThrowKeywordRegion:
165 codeForRegion = u"throw"_s;
166 break;
167 case ContinueKeywordRegion:
168 codeForRegion = u"continue"_s;
169 break;
170 case BreakKeywordRegion:
171 codeForRegion = u"break"_s;
172 break;
173 case QuestionMarkTokenRegion:
174 codeForRegion = u"?"_s;
175 break;
176 case SemicolonTokenRegion:
177 codeForRegion = u";"_s;
178 break;
179 case IfKeywordRegion:
180 codeForRegion = u"if"_s;
181 break;
182 case SwitchKeywordRegion:
183 codeForRegion = u"switch"_s;
184 break;
185 case YieldKeywordRegion:
186 codeForRegion = u"yield"_s;
187 break;
188 case NewKeywordRegion:
189 codeForRegion = u"new"_s;
190 break;
191 case ThisKeywordRegion:
192 codeForRegion = u"this"_s;
193 break;
194 case SuperKeywordRegion:
195 codeForRegion = u"super"_s;
196 break;
197 case StarTokenRegion:
198 codeForRegion = u"*"_s;
199 break;
200 case DollarLeftBraceTokenRegion:
201 codeForRegion = u"${"_s;
202 break;
203 case LeftBacktickTokenRegion:
204 case RightBacktickTokenRegion:
205 codeForRegion = u"`"_s;
206 break;
207 case FinalKeywordRegion:
208 codeForRegion = u"final"_s;
209 break;
210 // not keywords:
211 case ImportUriRegion:
212 case IdNameRegion:
213 case IdentifierRegion:
214 case PragmaValuesRegion:
215 case MainRegion:
216 case OnTargetRegion:
217 case TypeIdentifierRegion:
218 case TypeModifierRegion:
219 case FirstSemicolonTokenRegion:
220 case SecondSemicolonRegion:
221 case InOfTokenRegion:
222 case OperatorTokenRegion:
223 case VersionRegion:
224 case EnumValueRegion:
225 Q_ASSERT_X(false, "regionToString", "Using regionToString on a value or an identifier!");
226 return *this;
227 }
228
229 return writeRegion(region, toWrite: codeForRegion);
230}
231
232OutWriter &OutWriter::writeRegion(FileLocationRegion region, QStringView toWrite)
233{
234 regionStart(region);
235 lineWriter.write(v: toWrite);
236 regionEnd(region);
237 return *this;
238}
239
240} // namespace Dom
241} // namespace QQmlJS
242QT_END_NAMESPACE
243

source code of qtdeclarative/src/qmldom/qqmldomoutwriter.cpp