Skip to content

Commit 77d6f04

Browse files
authored
codewhisperer: update open tabs logic to prioritize files with lower file distances (#3744)
1 parent 9fe925e commit 77d6f04

File tree

3 files changed

+98
-4
lines changed

3 files changed

+98
-4
lines changed

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,5 +91,30 @@ abstract class CodeWhispererFileCrawler : FileCrawler {
9191
acc
9292
}
9393
}
94+
95+
/**
96+
* For [LocalFileSystem](implementation of virtual file system), the path will be an absolute file path with file separator characters replaced
97+
* by forward slash "/"
98+
* @see [VirtualFile.getPath]
99+
*/
100+
fun getFileDistance(targetFile: VirtualFile, candidateFile: VirtualFile): Int {
101+
val targetFilePaths = targetFile.path.split("/").dropLast(1)
102+
val candidateFilePaths = candidateFile.path.split("/").dropLast(1)
103+
104+
var i = 0
105+
while (i < minOf(targetFilePaths.size, candidateFilePaths.size)) {
106+
val dir1 = targetFilePaths[i]
107+
val dir2 = candidateFilePaths[i]
108+
109+
if (dir1 != dir2) {
110+
break
111+
}
112+
113+
i++
114+
}
115+
116+
return targetFilePaths.subList(fromIndex = i, toIndex = targetFilePaths.size).size +
117+
candidateFilePaths.subList(fromIndex = i, toIndex = candidateFilePaths.size).size
118+
}
94119
}
95120
}

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,20 @@ object JavaCodeWhispererFileCrawler : CodeWhispererFileCrawler() {
2525

2626
override fun guessSourceFileName(tstFileName: String): String = tstFileName.substring(0, tstFileName.length - "Test.java".length) + ".java"
2727

28-
override fun listRelevantFilesInEditors(psiFile: PsiFile): List<VirtualFile> = FileEditorManager.getInstance(psiFile.project).openFiles.toList().filter {
29-
it.name != psiFile.virtualFile.name &&
30-
it.extension == psiFile.virtualFile.extension &&
31-
!TestSourcesFilter.isTestSources(it, psiFile.project)
28+
override fun listRelevantFilesInEditors(psiFile: PsiFile): List<VirtualFile> {
29+
val targetFile = psiFile.virtualFile
30+
31+
val openedFiles = FileEditorManager.getInstance(psiFile.project).openFiles.toList().filter {
32+
it.name != psiFile.virtualFile.name &&
33+
it.extension == psiFile.virtualFile.extension &&
34+
!TestSourcesFilter.isTestSources(it, psiFile.project)
35+
}
36+
37+
val fileToFileDistanceList = openedFiles.map {
38+
return@map it to CodeWhispererFileCrawler.getFileDistance(targetFile = targetFile, candidateFile = it)
39+
}
40+
41+
return fileToFileDistanceList.sortedBy { it.second }.map { it.first }
3242
}
3343

3444
override suspend fun listFilesImported(psiFile: PsiFile): List<VirtualFile> {

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererFileCrawlerTest.kt

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,65 @@ class JavaCodeWhispererFileCrawlerTest : CodeWhispererFileCrawlerTest(JavaCodeIn
4545
sut = JavaCodeWhispererFileCrawler
4646
}
4747

48+
@Test
49+
fun getFileDistance() {
50+
val targetFile = fixture.addFileToProject("service/microService/CodeWhispererFileContextProvider.java", aString())
51+
52+
val fileWithDistance0 = fixture.addFileToProject("service/microService/CodeWhispererFileCrawler.java", aString())
53+
val fileWithDistance1 = fixture.addFileToProject("service/CodewhispererRecommendationService.java", aString())
54+
val fileWithDistance3 = fixture.addFileToProject("util/CodeWhispererConstants.java", aString())
55+
val fileWithDistance4 = fixture.addFileToProject("ui/popup/CodeWhispererPopupManager.java", aString())
56+
val fileWithDistance5 = fixture.addFileToProject("ui/popup/components/CodeWhispererPopup.java", aString())
57+
val fileWithDistance6 = fixture.addFileToProject("ui/popup/components/actions/AcceptRecommendationAction.java", aString())
58+
59+
assertThat(CodeWhispererFileCrawler.getFileDistance(targetFile.virtualFile, fileWithDistance0.virtualFile))
60+
.isEqualTo(0)
61+
62+
assertThat(CodeWhispererFileCrawler.getFileDistance(targetFile.virtualFile, fileWithDistance1.virtualFile))
63+
.isEqualTo(1)
64+
65+
assertThat(CodeWhispererFileCrawler.getFileDistance(targetFile.virtualFile, fileWithDistance3.virtualFile))
66+
.isEqualTo(3)
67+
68+
assertThat(CodeWhispererFileCrawler.getFileDistance(targetFile.virtualFile, fileWithDistance4.virtualFile))
69+
.isEqualTo(4)
70+
71+
assertThat(CodeWhispererFileCrawler.getFileDistance(targetFile.virtualFile, fileWithDistance5.virtualFile))
72+
.isEqualTo(5)
73+
74+
assertThat(CodeWhispererFileCrawler.getFileDistance(targetFile.virtualFile, fileWithDistance6.virtualFile))
75+
.isEqualTo(6)
76+
}
77+
78+
@Test
79+
fun listRelevantFilesInEditor() {
80+
val recommendationServiceFile = fixture.addFileToProject("service/CodewhispererRecommendationService.java", aString())
81+
val fileContextProviderFile = fixture.addFileToProject("service/microService/CodeWhispererFileContextProvider.java", aString())
82+
val constantFile = fixture.addFileToProject("util/CodeWhispererConstants.java", aString())
83+
val popupManagerFile = fixture.addFileToProject("ui/popup/CodeWhispererPopupManager.java", aString())
84+
val popupFile = fixture.addFileToProject("ui/popup/components/CodeWhispererPopup.java", aString())
85+
val popupActionFile = fixture.addFileToProject("ui/popup/components/actions/AcceptRecommendationAction.java", aString())
86+
87+
val files = listOf(recommendationServiceFile, fileContextProviderFile, constantFile, popupManagerFile, popupFile, popupActionFile)
88+
89+
files.shuffled().forEach {
90+
runInEdtAndWait {
91+
fixture.openFileInEditor(it.virtualFile)
92+
}
93+
}
94+
95+
val actual = sut.listRelevantFilesInEditors(fileContextProviderFile)
96+
assertThat(actual).isEqualTo(
97+
listOf(
98+
recommendationServiceFile.virtualFile,
99+
constantFile.virtualFile,
100+
popupManagerFile.virtualFile,
101+
popupFile.virtualFile,
102+
popupActionFile.virtualFile
103+
)
104+
)
105+
}
106+
48107
@Test
49108
fun `findFilesUnderProjectRoot`() {
50109
val mainClass = fixture.addFileToProject(

0 commit comments

Comments
 (0)