aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlls/qtextdocument.cpp
diff options
context:
space:
mode:
authorSemih Yavuz <semih.yavuz@qt.io>2023-05-23 15:02:50 +0200
committerSemih Yavuz <semih.yavuz@qt.io>2023-05-31 09:22:46 +0200
commit7a4175ff605d69dcafa4eb6aaf7aee3cf2620035 (patch)
tree8a7f7e7635e7af96eaf92885c54376930ec50eb2 /src/qmlls/qtextdocument.cpp
parentdc30e3859f4df146a675c367162720eae8d91982 (diff)
qmlls: Fix TextSynchronization
The offset from a given range was incorrectly calculated in findBlockByNumber because textblocks that are used to obtain that position were mistakenly ignoring the newline character. This were leading us to setting a different text than what we actually typed. Add an extra text block if the text ends with \n. Add a manual test but exclude it from tst_qmlformat as it is not a valid qml document. Fixes: QTBUG-113725 Change-Id: Ifb1b4121fd8af46df7627d986303ae67e170e50c Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qmlls/qtextdocument.cpp')
-rw-r--r--src/qmlls/qtextdocument.cpp24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/qmlls/qtextdocument.cpp b/src/qmlls/qtextdocument.cpp
index 826deddbb5..54e200274e 100644
--- a/src/qmlls/qtextdocument.cpp
+++ b/src/qmlls/qtextdocument.cpp
@@ -68,22 +68,30 @@ void TextDocument::setPlainText(const QString &text)
m_content = text;
m_blocks.clear();
- int blockStart = 0;
- int blockNumber = 0;
- while (blockStart < text.size()) {
+ const auto appendToBlocks = [this](int blockNumber, int start, int length) {
Block block;
- block.textBlock.setBlockNumber(blockNumber++);
- block.textBlock.setPosition(blockStart);
+ block.textBlock.setBlockNumber(blockNumber);
+ block.textBlock.setPosition(start);
block.textBlock.setDocument(this);
+ block.textBlock.setLength(length);
+ m_blocks.append(block);
+ };
+ int blockStart = 0;
+ int blockNumber = -1;
+ while (blockStart < text.size()) {
int blockEnd = text.indexOf(u'\n', blockStart) + 1;
if (blockEnd == 0)
blockEnd = text.size();
-
- block.textBlock.setLength(blockEnd - blockStart);
- m_blocks.append(block);
+ appendToBlocks(++blockNumber, blockStart, blockEnd - blockStart);
blockStart = blockEnd;
}
+ // Add an empty block if the text ends with \n. This is required for retrieving
+ // the actual line of the text editor if requested, for example, in findBlockByNumber.
+ // Consider a case with text aa\nbb\n\n. You are on 4th line of the text editor and even
+ // if it is an empty line, we introduce a text block for it to maybe use later.
+ if (text.endsWith(u'\n'))
+ appendToBlocks(++blockNumber, blockStart, 0);
}
bool TextDocument::isModified() const