feat: add 'Include Open Files' chat action item (closes #796)

This commit is contained in:
Carl-Robert Linnupuu 2024-12-26 23:35:56 +00:00
parent 8d6ca73064
commit a596fa969c
7 changed files with 51 additions and 3 deletions

View file

@ -43,5 +43,7 @@ public final class Icons {
IconLoader.getIcon("/icons/vcs.svg", Icons.class);
public static final Icon QuestionMark =
IconLoader.getIcon("/icons/questionMark.svg", Icons.class);
public static final Icon ListFiles =
IconLoader.getIcon("/icons/listFiles.svg", Icons.class);
public static final Icon StatusBarCompletionInProgress = new AnimatedIcon.Default();
}

View file

@ -1,6 +1,7 @@
package ee.carlrobert.codegpt.ui.textarea
import com.intellij.openapi.components.Service
import com.intellij.openapi.diagnostic.thisLogger
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import ee.carlrobert.codegpt.CodeGPTKeys
@ -11,10 +12,24 @@ import java.io.File
@Service
class FileSearchService private constructor(val project: Project) {
companion object {
private val logger = thisLogger()
}
fun addFileToSession(file: VirtualFile) {
addFilesToSession(listOf(file))
}
fun addFilesToSession(files: List<VirtualFile>) {
val filesIncluded =
project.getUserData(CodeGPTKeys.SELECTED_FILES).orEmpty().toMutableList()
filesIncluded.add(ReferencedFile(File(file.path)))
files.forEach { file ->
try {
filesIncluded.add(ReferencedFile(File(file.path)))
} catch (e: Exception) {
logger.error("Failed to add file to session", e)
}
}
updateFilesInSession(filesIncluded)
}
@ -26,4 +41,4 @@ class FileSearchService private constructor(val project: Project) {
.syncPublisher(IncludeFilesInContextNotifier.FILES_INCLUDED_IN_CONTEXT_TOPIC)
.filesIncluded(files)
}
}
}

View file

@ -2,13 +2,16 @@ package ee.carlrobert.codegpt.ui.textarea.suggestion.item
import com.intellij.icons.AllIcons
import com.intellij.openapi.components.service
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.options.ShowSettingsUtil
import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.isFile
import ee.carlrobert.codegpt.CodeGPTBundle
import ee.carlrobert.codegpt.CodeGPTKeys
import ee.carlrobert.codegpt.EncodingManager
import ee.carlrobert.codegpt.Icons
import ee.carlrobert.codegpt.settings.GeneralSettings
import ee.carlrobert.codegpt.settings.documentation.DocumentationSettings
import ee.carlrobert.codegpt.settings.documentation.DocumentationsConfigurable
@ -21,6 +24,7 @@ import ee.carlrobert.codegpt.ui.textarea.FileSearchService
import ee.carlrobert.codegpt.ui.textarea.PromptTextField
import ee.carlrobert.codegpt.util.GitUtil
import git4idea.GitCommit
import javax.swing.Icon
class FileActionItem(val file: VirtualFile) : SuggestionActionItem {
override val displayName = file.name
@ -32,6 +36,18 @@ class FileActionItem(val file: VirtualFile) : SuggestionActionItem {
}
}
class IncludeOpenFilesActionItem : SuggestionActionItem {
override val displayName: String =
CodeGPTBundle.get("suggestionActionItem.includeOpenFiles.displayName")
override val icon: Icon = Icons.ListFiles
override fun execute(project: Project, textPane: PromptTextField) {
val openFiles = project.service<FileEditorManager>().openFiles.toList()
project.service<FileSearchService>().addFilesToSession(openFiles)
textPane.addInlayElement("files", "Open Files", this)
}
}
class FolderActionItem(val folder: VirtualFile) : SuggestionActionItem {
override val displayName = folder.name
override val icon = AllIcons.Nodes.Folder

View file

@ -39,7 +39,7 @@ class FileSuggestionGroupItem(private val project: Project) : SuggestionGroupIte
return FileUtil.searchProjectFiles(project, searchText).toFileSuggestions()
}
private fun Iterable<VirtualFile>.toFileSuggestions() = take(10).map { FileActionItem(it) }
private fun Iterable<VirtualFile>.toFileSuggestions() = take(10).map { FileActionItem(it) } + IncludeOpenFilesActionItem()
}
class FolderSuggestionGroupItem(private val project: Project) : SuggestionGroupItem {

View file

@ -0,0 +1,7 @@
<!-- Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -->
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="2.5" y="1.5" width="11" height="13" rx="1.5" stroke="#6C707E"/>
<rect x="5" y="5" width="6" height="1" rx="0.5" fill="#6C707E"/>
<rect x="5" y="7.5" width="6" height="1" rx="0.5" fill="#6C707E"/>
<rect x="5" y="10" width="6" height="1" rx="0.5" fill="#6C707E"/>
</svg>

After

Width:  |  Height:  |  Size: 501 B

View file

@ -0,0 +1,7 @@
<!-- Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -->
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="2.5" y="1.5" width="11" height="13" rx="1.5" stroke="#CED0D6"/>
<rect x="5" y="5" width="6" height="1" rx="0.5" fill="#CED0D6"/>
<rect x="5" y="7.5" width="6" height="1" rx="0.5" fill="#CED0D6"/>
<rect x="5" y="10" width="6" height="1" rx="0.5" fill="#CED0D6"/>
</svg>

After

Width:  |  Height:  |  Size: 501 B

View file

@ -300,3 +300,4 @@ suggestionActionItem.webSearch.displayName=Web
suggestionActionItem.viewDocumentations.displayName=View all docs
suggestionActionItem.createPersona.displayName=Create new persona
suggestionActionItem.createDocumentation.displayName=Create new documentation
suggestionActionItem.includeOpenFiles.displayName=Include Open Files