diff options
author | Semih Yavuz <semih.yavuz@qt.io> | 2023-05-23 15:02:50 +0200 |
---|---|---|
committer | Semih Yavuz <semih.yavuz@qt.io> | 2023-05-31 09:22:46 +0200 |
commit | 7a4175ff605d69dcafa4eb6aaf7aee3cf2620035 (patch) | |
tree | 8a7f7e7635e7af96eaf92885c54376930ec50eb2 /src/qmlls/qtextdocument.cpp | |
parent | dc30e3859f4df146a675c367162720eae8d91982 (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.cpp | 24 |
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 |