Skip to content

Commit cd56cd6

Browse files
committed
fix: Correctly pick whole file context
Currently the current line is duplicated in both "before" and "after" context. This is due to DocumentContextReader::readWholeFileAfter() picking the current line part of which has been already included into the "before" context.
1 parent 247256d commit cd56cd6

File tree

3 files changed

+32
-19
lines changed

3 files changed

+32
-19
lines changed

context/DocumentContextReader.cpp

+18-12
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,14 @@ QString DocumentContextReader::getContextBefore(
9191
effectiveStartLine = qMax(0, lineNumber - linesCount);
9292
}
9393

94-
return getContextBetween(effectiveStartLine, lineNumber, cursorPosition);
94+
return getContextBetween(effectiveStartLine, -1, lineNumber, cursorPosition);
9595
}
9696

9797
QString DocumentContextReader::getContextAfter(
9898
int lineNumber, int cursorPosition, int linesCount) const
9999
{
100100
int endLine = qMin(m_document->blockCount() - 1, lineNumber + linesCount);
101-
return getContextBetween(lineNumber + 1, endLine, cursorPosition);
101+
return getContextBetween(lineNumber + 1, cursorPosition, endLine, -1);
102102
}
103103

104104
QString DocumentContextReader::readWholeFileBefore(int lineNumber, int cursorPosition) const
@@ -110,14 +110,12 @@ QString DocumentContextReader::readWholeFileBefore(int lineNumber, int cursorPos
110110

111111
startLine = qMin(startLine, lineNumber);
112112

113-
QString result = getContextBetween(startLine, lineNumber, cursorPosition);
114-
115-
return result;
113+
return getContextBetween(startLine, -1, lineNumber, cursorPosition);
116114
}
117115

118116
QString DocumentContextReader::readWholeFileAfter(int lineNumber, int cursorPosition) const
119117
{
120-
return getContextBetween(lineNumber, m_document->blockCount() - 1, cursorPosition);
118+
return getContextBetween(lineNumber, cursorPosition, m_document->blockCount() - 1, -1);
121119
}
122120

123121
QString DocumentContextReader::getLanguageAndFileInfo() const
@@ -172,18 +170,26 @@ CopyrightInfo DocumentContextReader::findCopyright()
172170
return result;
173171
}
174172

175-
QString DocumentContextReader::getContextBetween(int startLine, int endLine, int cursorPosition) const
173+
QString DocumentContextReader::getContextBetween(
174+
int startLine, int startCursorPosition, int endLine, int endCursorPosition) const
176175
{
177176
QString context;
178177
for (int i = startLine; i <= endLine; ++i) {
179178
QTextBlock block = m_document->findBlockByNumber(i);
180179
if (!block.isValid()) {
181180
break;
182181
}
183-
if (i == endLine) {
184-
context += block.text().left(cursorPosition);
182+
auto text = block.text();
183+
if (i == startLine && startCursorPosition >= 0) {
184+
context += text.right(text.size() - startCursorPosition);
185+
} else if (i == endLine && endCursorPosition >= 0) {
186+
context += text.left(endCursorPosition);
185187
} else {
186-
context += block.text() + "\n";
188+
context += text;
189+
}
190+
191+
if (i < endLine) {
192+
context += "\n";
187193
}
188194
}
189195

@@ -222,7 +228,7 @@ QString DocumentContextReader::getContextBefore(int lineNumber, int cursorPositi
222228
} else {
223229
effectiveStartLine = qMax(0, lineNumber - beforeCursor);
224230
}
225-
return getContextBetween(effectiveStartLine, lineNumber, cursorPosition);
231+
return getContextBetween(effectiveStartLine, -1, lineNumber, cursorPosition);
226232
}
227233
}
228234

@@ -234,7 +240,7 @@ QString DocumentContextReader::getContextAfter(int lineNumber, int cursorPositio
234240
int endLine = qMin(
235241
m_document->blockCount() - 1,
236242
lineNumber + Settings::codeCompletionSettings().readStringsAfterCursor());
237-
return getContextBetween(lineNumber + 1, endLine, -1);
243+
return getContextBetween(lineNumber + 1, cursorPosition, endLine, -1);
238244
}
239245
}
240246

context/DocumentContextReader.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ class DocumentContextReader
4646
QString readWholeFileAfter(int lineNumber, int cursorPosition) const;
4747
QString getLanguageAndFileInfo() const;
4848
CopyrightInfo findCopyright();
49-
QString getContextBetween(int startLine, int endLine, int cursorPosition) const;
49+
QString getContextBetween(
50+
int startLine, int startCursorPosition, int endLine, int endCursorPosition) const;
5051

5152
CopyrightInfo copyrightInfo() const;
5253

test/DocumentContextReaderTest.cpp

+12-6
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ TEST_F(DocumentContextReaderTest, testGetContextAfterWithCopyright)
9393
EXPECT_EQ(reader.getContextAfter(0, -1, 2), "Line 1\nLine 2");
9494

9595
// Test getting context after with copyright skipped
96-
EXPECT_EQ(reader.getContextAfter(1, 0, 2), "Line 2\n");
96+
EXPECT_EQ(reader.getContextAfter(1, 0, 2), "Line 2\nLine 3");
9797
}
9898

9999
TEST_F(DocumentContextReaderTest, testReadWholeFile)
@@ -112,7 +112,9 @@ TEST_F(DocumentContextReaderTest, testReadWholeFileWithCopyright)
112112
EXPECT_EQ(reader.readWholeFileAfter(2, -1), "Line 2\nLine 3\nLine 4");
113113

114114
EXPECT_EQ(reader.readWholeFileBefore(2, 0), "Line 1\n");
115-
EXPECT_EQ(reader.readWholeFileAfter(2, 0), "Line 2\nLine 3\n");
115+
EXPECT_EQ(reader.readWholeFileAfter(2, 0), "Line 2\nLine 3\nLine 4");
116+
EXPECT_EQ(reader.readWholeFileBefore(2, 2), "Line 1\nLi");
117+
EXPECT_EQ(reader.readWholeFileAfter(2, 2), "ne 2\nLine 3\nLine 4");
116118
}
117119

118120
TEST_F(DocumentContextReaderTest, testReadWholeFileWithMultilineCopyright)
@@ -124,8 +126,10 @@ TEST_F(DocumentContextReaderTest, testReadWholeFileWithMultilineCopyright)
124126
EXPECT_EQ(reader.readWholeFileBefore(6, -1), "Line 1\nLine 2");
125127
EXPECT_EQ(reader.readWholeFileAfter(5, -1), "Line 1\nLine 2");
126128

127-
EXPECT_EQ(reader.readWholeFileBefore(6, 4), "Line 1\nLine");
128-
EXPECT_EQ(reader.readWholeFileAfter(5, 4), "Line 1\nLine");
129+
EXPECT_EQ(reader.readWholeFileBefore(6, 0), "Line 1\n");
130+
EXPECT_EQ(reader.readWholeFileAfter(6, 0), "Line 2");
131+
EXPECT_EQ(reader.readWholeFileBefore(6, 2), "Line 1\nLi");
132+
EXPECT_EQ(reader.readWholeFileAfter(6, 2), "ne 2");
129133
}
130134

131135
TEST_F(DocumentContextReaderTest, testFindCopyrightSingleLine)
@@ -173,8 +177,10 @@ TEST_F(DocumentContextReaderTest, testGetContextBetween)
173177
{
174178
auto reader = createTestReader("Line 1\nLine 2\nLine 3\nLine 4\nLine 5");
175179

176-
EXPECT_EQ(reader.getContextBetween(1, 3, -1), "Line 2\nLine 3\nLine 4");
177-
EXPECT_EQ(reader.getContextBetween(0, 2, 4), "Line 1\nLine 2\nLine");
180+
EXPECT_EQ(reader.getContextBetween(1, -1, 3, -1), "Line 2\nLine 3\nLine 4");
181+
EXPECT_EQ(reader.getContextBetween(1, 2, 3, -1), "ne 2\nLine 3\nLine 4");
182+
EXPECT_EQ(reader.getContextBetween(1, -1, 3, 2), "Line 2\nLine 3\nLi");
183+
EXPECT_EQ(reader.getContextBetween(1, 2, 3, 2), "ne 2\nLine 3\nLi");
178184
}
179185

180186
#include "DocumentContextReaderTest.moc"

0 commit comments

Comments
 (0)