Skip to content

Commit f9f2a86

Browse files
authored
fix: Correctly pick whole file context (#85)
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 f9f2a86

File tree

3 files changed

+87
-22
lines changed

3 files changed

+87
-22
lines changed

context/DocumentContextReader.cpp

+66-15
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,71 @@ 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;
178-
for (int i = startLine; i <= endLine; ++i) {
179-
QTextBlock block = m_document->findBlockByNumber(i);
177+
178+
if (startLine > endLine) {
179+
return context;
180+
}
181+
182+
if (startLine == endLine) {
183+
auto block = m_document->findBlockByNumber(startLine);
184+
if (!block.isValid()) {
185+
return context;
186+
}
187+
188+
auto text = block.text();
189+
190+
if (startCursorPosition < 0) {
191+
startCursorPosition = 0;
192+
}
193+
if (endCursorPosition < 0) {
194+
endCursorPosition = text.size();
195+
}
196+
197+
if (startCursorPosition >= endCursorPosition) {
198+
return context;
199+
}
200+
201+
return text.mid(startCursorPosition, endCursorPosition - startCursorPosition);
202+
}
203+
204+
// first line
205+
{
206+
auto block = m_document->findBlockByNumber(startLine);
207+
if (!block.isValid()) {
208+
return context;
209+
}
210+
auto text = block.text();
211+
if (startCursorPosition < 0) {
212+
context += text + "\n";
213+
} else {
214+
context += text.right(text.size() - startCursorPosition) + "\n";
215+
}
216+
}
217+
218+
// intermediate lines, if any
219+
for (int i = startLine + 1; i <= endLine - 1; ++i) {
220+
auto block = m_document->findBlockByNumber(i);
221+
if (!block.isValid()) {
222+
return context;
223+
}
224+
context += block.text() + "\n";
225+
}
226+
227+
// last line
228+
{
229+
auto block = m_document->findBlockByNumber(endLine);
180230
if (!block.isValid()) {
181-
break;
231+
return context;
182232
}
183-
if (i == endLine) {
184-
context += block.text().left(cursorPosition);
233+
auto text = block.text();
234+
if (endCursorPosition < 0) {
235+
context += text;
185236
} else {
186-
context += block.text() + "\n";
237+
context += text.left(endCursorPosition);
187238
}
188239
}
189240

@@ -222,7 +273,7 @@ QString DocumentContextReader::getContextBefore(int lineNumber, int cursorPositi
222273
} else {
223274
effectiveStartLine = qMax(0, lineNumber - beforeCursor);
224275
}
225-
return getContextBetween(effectiveStartLine, lineNumber, cursorPosition);
276+
return getContextBetween(effectiveStartLine, -1, lineNumber, cursorPosition);
226277
}
227278
}
228279

@@ -234,7 +285,7 @@ QString DocumentContextReader::getContextAfter(int lineNumber, int cursorPositio
234285
int endLine = qMin(
235286
m_document->blockCount() - 1,
236287
lineNumber + Settings::codeCompletionSettings().readStringsAfterCursor());
237-
return getContextBetween(lineNumber + 1, endLine, -1);
288+
return getContextBetween(lineNumber + 1, cursorPosition, endLine, -1);
238289
}
239290
}
240291

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

+19-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,17 @@ 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(2, -1, 0, -1), "");
181+
EXPECT_EQ(reader.getContextBetween(0, -1, 0, -1), "Line 1");
182+
EXPECT_EQ(reader.getContextBetween(1, -1, 1, -1), "Line 2");
183+
EXPECT_EQ(reader.getContextBetween(1, 3, 1, 1), "");
184+
EXPECT_EQ(reader.getContextBetween(1, 3, 1, 3), "");
185+
EXPECT_EQ(reader.getContextBetween(1, 3, 1, 4), "e");
186+
187+
EXPECT_EQ(reader.getContextBetween(1, -1, 3, -1), "Line 2\nLine 3\nLine 4");
188+
EXPECT_EQ(reader.getContextBetween(1, 2, 3, -1), "ne 2\nLine 3\nLine 4");
189+
EXPECT_EQ(reader.getContextBetween(1, -1, 3, 2), "Line 2\nLine 3\nLi");
190+
EXPECT_EQ(reader.getContextBetween(1, 2, 3, 2), "ne 2\nLine 3\nLi");
178191
}
179192

180193
#include "DocumentContextReaderTest.moc"

0 commit comments

Comments
 (0)