feat: support quick way of including git commit diffs in the prompt (closes #688)

This commit is contained in:
Carl-Robert Linnupuu 2024-09-11 12:31:38 +03:00
parent 757afeff9e
commit 94d0bcd0a0
11 changed files with 214 additions and 21 deletions

View file

@ -37,6 +37,7 @@ import ee.carlrobert.codegpt.ui.textarea.AppliedSuggestionActionInlay;
import ee.carlrobert.codegpt.ui.textarea.UserInputPanel;
import ee.carlrobert.codegpt.ui.textarea.suggestion.item.CreateDocumentationActionItem;
import ee.carlrobert.codegpt.ui.textarea.suggestion.item.DocumentationActionItem;
import ee.carlrobert.codegpt.ui.textarea.suggestion.item.GitCommitActionItem;
import ee.carlrobert.codegpt.ui.textarea.suggestion.item.PersonaActionItem;
import ee.carlrobert.codegpt.ui.textarea.suggestion.item.WebSearchActionItem;
import ee.carlrobert.codegpt.util.EditorUtil;
@ -47,6 +48,7 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.UUID;
import java.util.function.Function;
import javax.swing.JComponent;
import javax.swing.JPanel;
import kotlin.Unit;
@ -299,7 +301,8 @@ public class ChatToolWindowTabPanel implements Disposable {
if (action instanceof AppliedSuggestionActionInlay) {
processSuggestionActions(
message,
filterActions(appliedInlayActions, AppliedSuggestionActionInlay.class));
filterActions(appliedInlayActions, AppliedSuggestionActionInlay.class),
text);
} else if (action instanceof AppliedCodeActionInlay) {
processCodeActions(
message,
@ -325,10 +328,12 @@ public class ChatToolWindowTabPanel implements Disposable {
private void processSuggestionActions(
Message message,
List<AppliedSuggestionActionInlay> actions) {
List<AppliedSuggestionActionInlay> actions,
String text) {
message.setWebSearchIncluded(containsWebSearchActionInlay(actions));
processDocumentationAction(message, actions);
processPersonaAction(message, actions);
processGitCommitAction(message, actions, text);
}
private void processDocumentationAction(
@ -358,20 +363,24 @@ public class ChatToolWindowTabPanel implements Disposable {
}
}
private void processCodeActions(Message message, List<AppliedCodeActionInlay> actions,
String text, Editor editor) {
private <T extends AppliedActionInlay> void processActions(
Message message,
List<T> actions,
String text,
Function<T, String> codeExtractor,
Function<T, String> languageExtractor) {
var stringBuilder = new StringBuilder(text);
var resultStringBuilder = new StringBuilder();
int lastProcessedIndex = 0;
for (var actionInlay : actions) {
var inlayOffset = actionInlay.getInlay().getOffset();
var fileExtension = FileUtil.getFileExtension(editor.getVirtualFile().getName());
resultStringBuilder
.append(stringBuilder, lastProcessedIndex, Math.min(stringBuilder.length(), inlayOffset))
.append('\n')
.append(formatCodeBlock(fileExtension, actionInlay.getCode()))
.append(formatCodeBlock(languageExtractor.apply(actionInlay),
codeExtractor.apply(actionInlay)))
.append('\n');
lastProcessedIndex = inlayOffset;
@ -384,6 +393,39 @@ public class ChatToolWindowTabPanel implements Disposable {
message.setPrompt(result);
}
private void processGitCommitAction(
Message message,
List<AppliedSuggestionActionInlay> actions,
String text) {
var gitCommitInlays = actions.stream()
.filter(it -> it.getSuggestion() instanceof GitCommitActionItem)
.toList();
if (!gitCommitInlays.isEmpty()) {
processActions(
message,
gitCommitInlays,
text,
action -> ((GitCommitActionItem) action.getSuggestion()).getDiffString(),
action -> "shell"
);
}
}
private void processCodeActions(
Message message,
List<AppliedCodeActionInlay> actions,
String text,
Editor editor) {
processActions(
message,
actions,
text,
AppliedCodeActionInlay::getCode,
action -> FileUtil.getFileExtension(editor.getVirtualFile().getName())
);
}
private String formatCodeBlock(String fileExtension, String code) {
return String.format("```%s\n%s\n```", fileExtension, code);
}