35 using namespace QQmlJS::Dom;
36 QList<QLspSpecification::TextEdit> result{};
39 QQmlLSUtils::lspUriToQmlUrl(request->m_parameters.textDocument.uri));
41 DomItem file = doc.snapshot.doc.fileObject(GoTo::MostLikely);
43 qWarning() << u"Could not find the file"_s << doc.snapshot.doc.toString();
47 if (
auto envPtr = file.environment().ownerAs<DomEnvironment>())
48 envPtr->clearReferenceCache();
50 auto qmlFile = file.ownerAs<QmlFile>();
51 auto code = qmlFile->code();
54 const auto selectedRange = request->m_parameters.range;
55 const auto selectedRangeStartLine = selectedRange.start.line;
56 const auto selectedRangeEndLine = selectedRange.end.line;
57 Q_ASSERT(selectedRangeStartLine >= 0);
58 Q_ASSERT(selectedRangeEndLine >= 0);
60 LineWriterOptions options;
61 options.attributesSequence = LineWriterOptions::AttributesSequence::Preserve;
63 QTextStream in(&code);
64 FormatTextStatus status = FormatTextStatus::initialStatus();
65 FormatPartialStatus partialStatus({}, options.formatOptions, status);
70 const auto line = in.readLine();
71 partialStatus = formatCodeLine(line, options.formatOptions, partialStatus.currentStatus);
72 if (++lineNumber >= selectedRangeStartLine)
77 QTextStream out(&resultText);
78 IndentingLineWriter lw([&out](QStringView writtenText) { out << writtenText.toUtf8(); },
79 QString(), options, partialStatus.currentStatus);
80 OutWriter ow(qmlFile, lw);
81 ow.indentNextlines =
true;
85 const auto removeSpaces = [](
const QString &line) {
87 QTextStream out(&result);
88 bool previousIsSpace =
false;
91 for (
int i = 0; i < line.length(); ++i) {
94 if (c ==
'\n'_L1 && newLineCount < 2) {
97 }
else if (c ==
'\r'_L1 && (i + 1) < line.length() && line.at(i + 1) ==
'\n'_L1
98 && newLineCount < 2) {
103 if (!previousIsSpace)
106 previousIsSpace =
true;
109 previousIsSpace =
false;
118 const auto startOffset = QQmlLSUtils::textOffsetFrom(code, selectedRangeStartLine, 0);
119 auto endOffset = QQmlLSUtils::textOffsetFrom(code, selectedRangeEndLine + 1, 0);
123 if (endOffset < code.size() && code[endOffset - 1] == u'\r' && code[endOffset] == u'\n')
126 const auto &toFormat = code.mid(startOffset, endOffset - startOffset);
127 ow.write(removeSpaces(toFormat));
131 const auto documentLineCount = QQmlLSUtils::textRowAndColumnFrom(code, code.length()).line;
132 code.replace(startOffset, toFormat.length(), resultText);
134 QLspSpecification::TextEdit add;
135 add.newText = code.toUtf8();
136 add.range = { { 0, 0 }, { documentLineCount + 1 } };
139 request->m_response.sendResponse(result);