Skip to content

Commit 7a90966

Browse files
authored
* fix cross file context extraction bugs (#3724)
* duplicate code chunks will be extracted * bm25 query only use 9 lines of left context but not 10
1 parent ab2e919 commit 7a90966

File tree

1 file changed

+5
-3
lines changed

1 file changed

+5
-3
lines changed

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererFileContextProvider.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.model.FileContextI
3131
import software.aws.toolkits.jetbrains.services.codewhisperer.model.SupplementalContextInfo
3232
import java.io.DataInput
3333
import java.io.DataOutput
34+
import java.util.Collections
3435

3536
private val contentRootPathProvider = CopyContentRootPathProvider()
3637

@@ -147,20 +148,20 @@ class DefaultCodeWhispererFileContextProvider(private val project: Project) : Fi
147148

148149
override suspend fun extractCodeChunksFromFiles(psiFile: PsiFile, fileProducers: List<suspend (PsiFile) -> List<VirtualFile>>): List<Chunk> {
149150
val parseFilesStart = System.currentTimeMillis()
150-
val hasUsed = mutableSetOf<VirtualFile>()
151+
val hasUsed = Collections.synchronizedSet(mutableSetOf<VirtualFile>())
151152
val chunks = mutableListOf<Chunk>()
152153

153154
for (fileProducer in fileProducers) {
154155
yield()
155156
val files = fileProducer(psiFile)
156-
157157
files.forEach { file ->
158158
yield()
159159
if (hasUsed.contains(file)) {
160160
return@forEach
161161
}
162162
val relativePath = runReadAction { contentRootPathProvider.getPathToElement(project, file, null) ?: file.path }
163163
chunks.addAll(file.toCodeChunk(relativePath))
164+
hasUsed.add(file)
164165
if (chunks.size > CHUNK_SIZE) {
165166
LOG.debug { "finish fetching 60 chunks in ${System.currentTimeMillis() - parseFilesStart} ms" }
166167
return chunks.take(CHUNK_SIZE)
@@ -182,7 +183,8 @@ class DefaultCodeWhispererFileContextProvider(private val project: Project) : Fi
182183
suspend fun extractSupplementalFileContextForSrc(psiFile: PsiFile, targetContext: FileContextInfo): List<Chunk> {
183184
if (!targetContext.programmingLanguage.isSupplementalContextSupported()) return emptyList()
184185

185-
val query = targetContext.caretContext.leftFileContext.split("\n").takeLast(10).joinToString("\n")
186+
// takeLast(11) will extract 10 lines (exclusing current line) of left context as the query parameter
187+
val query = targetContext.caretContext.leftFileContext.split("\n").takeLast(11).joinToString("\n")
186188

187189
// step 1: prepare data
188190
val first60Chunks: List<Chunk> = try {

0 commit comments

Comments
 (0)