Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qqmljsstreamwriter.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
6
7#include <QtCore/QBuffer>
8#include <QtCore/QStringList>
9
11
12// TODO: All of this could be improved by using and re-using one buffer for all the writing.
13// We don't really need to allocate any temporary byte arrays.
14
16{
17 const qsizetype length = string.length();
20 buffer.append(' ');
21 buffer.append(string);
22 buffer.append(' ');
23 buffer.replace('\\', "\\\\").replace('"', "\\\"");
24 buffer[0] = '"';
25 buffer[buffer.length() - 1] = '"';
26 return buffer;
27}
28
30{
31 return string.visit([](auto data) {
33 return enquoteByteArray(view);
34 });
35 });
36}
37
39 : m_indentDepth(0)
40 , m_pendingLineLength(0)
41 , m_maybeOneline(false)
42 , m_stream(new QBuffer(array))
43{
44 m_stream->open(QIODevice::WriteOnly);
45}
46
50
54
56 QByteArrayView uri, int majorVersion, int minorVersion, QByteArrayView as)
57{
58 m_stream->write("import ");
59 m_stream->write(uri.data(), uri.length());
60 m_stream->write(" ");
61 m_stream->write(QByteArray::number(majorVersion));
62 m_stream->write(".");
63 m_stream->write(QByteArray::number(minorVersion));
64 if (!as.isEmpty()) {
65 m_stream->write(" as ");
66 m_stream->write(as.data(), as.length());
67 }
68 m_stream->write("\n");
69}
70
72{
73 flushPotentialLinesWithNewlines();
74 writeIndent();
75 m_stream->write(component.data(), component.length());
76 m_stream->write(" {");
77 ++m_indentDepth;
78 m_maybeOneline = true;
79}
80
82{
83 if (m_maybeOneline) {
84 --m_indentDepth;
85 for (int i = 0; i < m_pendingLines.size(); ++i) {
86 m_stream->write(" ");
87 m_stream->write(m_pendingLines.at(i).trimmed());
88 if (i != m_pendingLines.size() - 1)
89 m_stream->write(";");
90 }
91
92 if (!m_pendingLines.isEmpty())
93 m_stream->write(" }\n");
94 else
95 m_stream->write("}\n");
96
97 m_pendingLines.clear();
98 m_pendingLineLength = 0;
99 m_maybeOneline = false;
100 } else {
101 flushPotentialLinesWithNewlines();
102 --m_indentDepth;
103 writeIndent();
104 m_stream->write("}\n");
105 }
106}
107
109{
111 buffer.reserve(name.length() + 2 + rhs.length());
112 buffer.append(name);
113 buffer.append(": ");
114 buffer.append(rhs);
115 writePotentialLine(buffer);
116}
117
122
127
132
133template<typename String, typename ElementHandler>
134void QQmlJSStreamWriter::doWriteArrayBinding(
135 QByteArrayView name, const QList<String> &elements, ElementHandler &&handler)
136{
137 flushPotentialLinesWithNewlines();
138 writeIndent();
139
140 // try to use a single line
141 QByteArray singleLine(name.data(), name.length());
142 singleLine += ": [";
143 for (int i = 0; i < elements.size(); ++i) {
145 singleLine += handler(element);
146 });
147 if (i != elements.size() - 1)
148 singleLine += ", ";
149 }
150 singleLine += "]\n";
151 if (singleLine.size() + m_indentDepth * 4 < 80) {
152 m_stream->write(singleLine);
153 return;
154 }
155
156 // write multi-line
157 m_stream->write(name.data(), name.length());
158 m_stream->write(": [\n");
159 ++m_indentDepth;
160 for (int i = 0; i < elements.size(); ++i) {
161 writeIndent();
163 const auto handled = handler(element);
164 m_stream->write(handled.data(), handled.length());
165 });
166 if (i != elements.size() - 1) {
167 m_stream->write(",\n");
168 } else {
169 m_stream->write("\n");
170 }
171 }
172 --m_indentDepth;
173 writeIndent();
174 m_stream->write("]\n");
175}
176
178{
179 doWriteArrayBinding(name, elements, [](QByteArrayView view) { return view; });
180}
181
183 QByteArrayView name, const QList<QAnyStringView> &elements)
184{
185 doWriteArrayBinding(name, elements, enquoteByteArray);
186}
187
189{
190 flushPotentialLinesWithNewlines();
191 m_stream->write(data.data(), data.length());
192}
193
195 QByteArrayView name, const QList<QPair<QAnyStringView, int> > &keyValue)
196{
197 flushPotentialLinesWithNewlines();
198 writeIndent();
199 m_stream->write(name.data(), name.length());
200 m_stream->write(": {\n");
201 ++m_indentDepth;
202 for (int i = 0, end = keyValue.size(); i != end; ++i) {
203 writeIndent();
204 const auto &entry = keyValue[i];
205 m_stream->write(enquoteAnyString(entry.first));
206 m_stream->write(": ");
207 m_stream->write(QByteArray::number(entry.second));
208 if (i != end - 1)
209 m_stream->write(",\n");
210 else
211 m_stream->write("\n");
212 }
213 --m_indentDepth;
214 writeIndent();
215 m_stream->write("}\n");
216}
217
218void QQmlJSStreamWriter::writeIndent()
219{
220 for (int i = 0; i < m_indentDepth; ++i)
221 m_stream->write(" ");
222}
223
224void QQmlJSStreamWriter::writePotentialLine(const QByteArray &line)
225{
226 m_pendingLines.append(line);
227 m_pendingLineLength += line.size();
228 if (m_pendingLineLength >= 80) {
229 flushPotentialLinesWithNewlines();
230 }
231}
232
233void QQmlJSStreamWriter::flushPotentialLinesWithNewlines()
234{
235 if (m_maybeOneline)
236 m_stream->write("\n");
237 for (const QByteArray &line : std::as_const(m_pendingLines)) {
238 writeIndent();
239 m_stream->write(line);
240 m_stream->write("\n");
241 }
242 m_pendingLines.clear();
243 m_pendingLineLength = 0;
244 m_maybeOneline = false;
245}
246
\inmodule QtCore
\inmodule QtCore \reentrant
Definition qbuffer.h:16
\inmodule QtCore
constexpr qsizetype length() const noexcept
constexpr bool isEmpty() const noexcept
constexpr const_pointer data() const noexcept
\inmodule QtCore
Definition qbytearray.h:57
QByteArray trimmed() const &
Definition qbytearray.h:262
void reserve(qsizetype size)
Attempts to allocate memory for at least size bytes.
Definition qbytearray.h:634
static QByteArray number(int, int base=10)
Returns a byte-array representing the whole number n as text.
virtual bool open(QIODeviceBase::OpenMode mode)
Opens the device and sets its OpenMode to mode.
qint64 write(const char *data, qint64 len)
Writes at most maxSize bytes of data from data to the device.
Definition qlist.h:75
qsizetype size() const noexcept
Definition qlist.h:397
bool isEmpty() const noexcept
Definition qlist.h:401
const_reference at(qsizetype i) const noexcept
Definition qlist.h:446
void append(parameter_type t)
Definition qlist.h:458
void clear()
Definition qlist.h:434
void writeStringListBinding(QByteArrayView name, const QList< QAnyStringView > &elements)
void write(QByteArrayView data)
void writeEnumObjectLiteralBinding(QByteArrayView name, const QList< QPair< QAnyStringView, int > > &keyValue)
void writeLibraryImport(QByteArrayView uri, int majorVersion, int minorVersion, QByteArrayView as={})
void writeArrayBinding(QByteArrayView name, const QByteArrayList &elements)
QQmlJSStreamWriter(QByteArray *array)
void writeScriptBinding(QByteArrayView name, QByteArrayView rhs)
void writeStartObject(QByteArrayView component)
void writeBooleanBinding(QByteArrayView name, bool value)
void writeStringBinding(QByteArrayView name, QAnyStringView value)
void writeNumberBinding(QByteArrayView name, qint64 value)
qsizetype size() const noexcept
Returns the number of characters in this string.
Definition qstring.h:186
auto processAsUtf8(StringView string, Handler &&handler)
Combined button and popup list for selecting options.
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLuint GLuint end
GLenum GLuint GLenum GLsizei length
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint buffer
GLuint name
GLuint entry
GLenum array
static qreal component(const QPointF &point, unsigned int i)
static QT_BEGIN_NAMESPACE QByteArray enquoteByteArray(QByteArrayView string)
static QByteArray enquoteAnyString(QAnyStringView string)
static const QTextHtmlElement elements[Html_NumElements]
ptrdiff_t qsizetype
Definition qtypes.h:165
long long qint64
Definition qtypes.h:60
QQuickView * view
[0]