Skip to content

Commit 80a36bb

Browse files
committed
feat(devti): add file context information to search results and improve class context formatting #359
- Add file context information (package, imports, class details) to search results - Improve class context formatting by handling underscore class names and adding annotations- Refactor FileContext to use buildString for formatting - Update LocalSearchInsCommand to include additional file info in search results
1 parent 4460fcd commit 80a36bb

File tree

6 files changed

+23
-7
lines changed

6 files changed

+23
-7
lines changed

core/src/main/kotlin/cc/unitmesh/devti/context/ClassContext.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ class ClassContext(
4848
"\n'" + annotations.joinToString(separator = ", ")
4949
}
5050

51+
if (className == "_") {
52+
return ""
53+
}
54+
5155
return """
5256
|'package: $filePath$annotations
5357
|class $className$superClasses {

core/src/main/kotlin/cc/unitmesh/devti/context/FileContext.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,10 @@ class FileContext(
3535
val filePath = getFieldString("file path", path)
3636

3737
return buildString {
38-
append("file name: $name\n")
38+
append("$filePath\n")
3939
if (filePackage.isNotEmpty()) append("$filePackage\n")
4040
if (fileImports.isNotEmpty()) append("$fileImports\n")
4141
if (classDetails.isNotEmpty()) append("$classDetails\n")
42-
append("$filePath\n")
4342
}
4443
}
4544
}

exts/devins-lang/src/main/kotlin/cc/unitmesh/devti/language/compiler/exec/LocalSearchInsCommand.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package cc.unitmesh.devti.language.compiler.exec
22

3+
import cc.unitmesh.devti.context.FileContextProvider
34
import cc.unitmesh.devti.devin.InsCommand
45
import cc.unitmesh.devti.devin.dataprovider.BuiltinCommand
56
import cc.unitmesh.devti.gui.chat.ui.relativePath
@@ -8,6 +9,7 @@ import com.intellij.openapi.application.runReadAction
89
import com.intellij.openapi.project.Project
910
import com.intellij.openapi.roots.ProjectFileIndex
1011
import com.intellij.openapi.vfs.VirtualFile
12+
import com.intellij.psi.PsiManager
1113

1214
/**
1315
* Todo: Spike different search API in Intellij
@@ -37,9 +39,11 @@ class LocalSearchInsCommand(val myProject: Project, private val scope: String, v
3739

3840
val textSearch = runReadAction { search(myProject, text, OVERLAP) }
3941
val results = textSearch.map { (file, lines) ->
42+
val fileInfo = runReadAction { collectAdditionalFileInfo(file) }
43+
4044
val filePath = file.relativePath(myProject)
4145
val linesWithContext = lines.joinToString("\n")
42-
"file: $filePath\n$linesWithContext"
46+
"file: $filePath\n$fileInfo\n$linesWithContext"
4347
}.joinToString("\n")
4448

4549
if (results.isEmpty()) {
@@ -49,6 +53,12 @@ class LocalSearchInsCommand(val myProject: Project, private val scope: String, v
4953
return results
5054
}
5155

56+
private fun collectAdditionalFileInfo(file: VirtualFile): String? {
57+
val psiFile = PsiManager.getInstance(myProject).findFile(file) ?: return null
58+
val from = FileContextProvider().from(psiFile) ?: return null
59+
return "```plantuml\n" + from.format() + "\n```"
60+
}
61+
5262
/**
5363
* Searches for occurrences of a specified keyword within the content of files in the project.
5464
* For each occurrence, it retrieves a specified number of lines before and after the matched line,
@@ -70,7 +80,6 @@ class LocalSearchInsCommand(val myProject: Project, private val scope: String, v
7080
}
7181

7282
if (ProjectFileIndex.getInstance(project).isUnderIgnored(file)) return@iterateContent true
73-
/// skip for .idea/
7483
if (file.path.contains(".idea")) return@iterateContent true
7584

7685
val content = file.contentsToByteArray().toString(Charsets.UTF_8).lines()

java/src/main/kotlin/cc/unitmesh/idea/context/JavaClassContextBuilder.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class JavaClassContextBuilder : ClassContextBuilder {
2121
val usages =
2222
if (gatherUsages) ClassContextBuilder.findUsages(psiElement as PsiNameIdentifierOwner) else emptyList()
2323

24-
val annotations: List<String> = psiElement.annotations.mapNotNull {
24+
val annotations: List<String> = runReadAction { psiElement.annotations }.mapNotNull {
2525
it.text
2626
}
2727

javascript/src/main/kotlin/cc/unitmesh/ide/javascript/context/JavaScriptFileContextBuilder.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cc.unitmesh.ide.javascript.context
33
import cc.unitmesh.devti.context.FileContext
44
import cc.unitmesh.devti.context.builder.FileContextBuilder
55
import com.intellij.lang.ecmascript6.psi.impl.ES6ImportPsiUtil
6+
import com.intellij.lang.javascript.psi.JSFile
67
import com.intellij.lang.javascript.psi.JSFunction
78
import com.intellij.lang.javascript.psi.ecmal4.JSClass
89
import com.intellij.psi.PsiElement
@@ -12,6 +13,7 @@ import com.intellij.psi.util.PsiTreeUtil
1213
class JavaScriptFileContextBuilder : FileContextBuilder {
1314
override fun getFileContext(psiFile: PsiFile): FileContext? {
1415
val file = psiFile.virtualFile ?: return null
16+
if (file !is JSFile) return null
1517
val importDeclarations = ES6ImportPsiUtil.getImportDeclarations((psiFile as PsiElement))
1618

1719
val classes =

kotlin/src/main/kotlin/cc/unitmesh/kotlin/context/KotlinFileContextBuilder.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import com.intellij.psi.PsiFile
66
import com.intellij.psi.util.PsiTreeUtil
77
import org.jetbrains.annotations.NotNull
88
import org.jetbrains.kotlin.psi.KtClassOrObject
9+
import org.jetbrains.kotlin.psi.KtFile
910
import org.jetbrains.kotlin.psi.KtImportList
1011
import org.jetbrains.kotlin.psi.KtNamedFunction
1112
import org.jetbrains.kotlin.psi.KtPackageDirective
1213

1314
class KotlinFileContextBuilder : FileContextBuilder {
14-
@NotNull
15-
override fun getFileContext(psiFile: PsiFile): FileContext {
15+
override fun getFileContext(psiFile: PsiFile): FileContext? {
16+
if (psiFile !is KtFile) return null
17+
1618
val name = psiFile.name
1719
val path = psiFile.virtualFile?.path ?: ""
1820

0 commit comments

Comments
 (0)