diff --git a/src/main/java/ee/carlrobert/codegpt/filter/CodeGPTJvmExceptionFilter.java b/src/main/java/ee/carlrobert/codegpt/filter/CodeGPTJvmExceptionFilter.java new file mode 100644 index 000000000..04c18082d --- /dev/null +++ b/src/main/java/ee/carlrobert/codegpt/filter/CodeGPTJvmExceptionFilter.java @@ -0,0 +1,41 @@ +package ee.carlrobert.codegpt.filter; + +import com.intellij.execution.filters.Filter; +import com.intellij.execution.filters.JvmExceptionOccurrenceFilter; +import com.intellij.execution.impl.InlayProvider; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.EditorCustomElementRenderer; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiClass; +import java.util.List; +import org.jetbrains.annotations.NotNull; + +public class CodeGPTJvmExceptionFilter implements JvmExceptionOccurrenceFilter { + + @Override + public Filter.ResultItem applyFilter(@NotNull String exceptionClassName, + @NotNull List classes, int exceptionStartOffset) { + return new CreateExceptionBreakpointResult(exceptionStartOffset, + exceptionStartOffset + exceptionClassName.length(), classes + .get(0).getProject()); + } + + private static class CreateExceptionBreakpointResult extends Filter.ResultItem implements + InlayProvider { + + private final Project project; + + private final int startOffset; + + CreateExceptionBreakpointResult(int highlightStartOffset, int highlightEndOffset, + Project project) { + super(highlightStartOffset, highlightEndOffset, null); + this.project = project; + this.startOffset = highlightStartOffset; + } + + public EditorCustomElementRenderer createInlayRenderer(Editor editor) { + return new CodeGPTPresentation(editor, this.project, this.startOffset); + } + } +} diff --git a/src/main/java/ee/carlrobert/codegpt/filter/CodeGPTPresentation.java b/src/main/java/ee/carlrobert/codegpt/filter/CodeGPTPresentation.java new file mode 100644 index 000000000..2cd3f6602 --- /dev/null +++ b/src/main/java/ee/carlrobert/codegpt/filter/CodeGPTPresentation.java @@ -0,0 +1,69 @@ +package ee.carlrobert.codegpt.filter; + +import com.intellij.codeInsight.hints.presentation.InputHandler; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.EditorCustomElementRenderer; +import com.intellij.openapi.editor.Inlay; +import com.intellij.openapi.editor.impl.EditorImpl; +import com.intellij.openapi.editor.markup.TextAttributes; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import ee.carlrobert.codegpt.Icons; +import ee.carlrobert.codegpt.conversations.message.Message; +import ee.carlrobert.codegpt.toolwindow.chat.standard.StandardChatToolWindowContentManager; +import java.awt.Cursor; +import java.awt.Graphics; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.event.MouseEvent; +import javax.swing.Icon; +import javax.swing.SwingUtilities; +import org.jetbrains.annotations.NotNull; + +public class CodeGPTPresentation implements EditorCustomElementRenderer, InputHandler { + + private final Editor editor; + + private final Project project; + + private final int startOffset; + + + public CodeGPTPresentation(Editor editor, Project project, int starOffset) { + this.editor = editor; + this.project = project; + this.startOffset = starOffset; + } + + public void mouseClicked(@NotNull MouseEvent mouseEvent, @NotNull Point point) { + int line = this.editor.getDocument().getLineNumber(this.startOffset); + String errorInformation = this.editor.getDocument() + .getText(new TextRange(this.startOffset, this.editor.getDocument().getLineEndOffset(line))); + String prompt = "Provide recommendations for the error message: {{errorInformation}}"; + var message = new Message(prompt.replace("{{errorInformation}}", errorInformation)); + SwingUtilities.invokeLater( + () -> project.getService(StandardChatToolWindowContentManager.class).sendMessage(message)); + } + + public void mouseExited() { + ((EditorImpl) this.editor).setCustomCursor(this, + Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR)); + } + + public void mouseMoved(@NotNull MouseEvent mouseEvent, @NotNull Point point) { + ((EditorImpl) this.editor).setCustomCursor(this, + Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + } + + public int calcWidthInPixels(@NotNull Inlay inlay) { + return Icons.Default.getIconWidth(); + } + + public void paint(@NotNull Inlay inlay, @NotNull Graphics g, @NotNull Rectangle r, + @NotNull TextAttributes textAttributes) { + Icon consoleIcon = Icons.Default; + int curX = r.x + r.width / 2 - consoleIcon.getIconWidth() / 2; + int curY = r.y + r.height / 2 - consoleIcon.getIconHeight() / 2; + consoleIcon.paintIcon(inlay.getEditor().getComponent(), g, curX, curY); + } +} diff --git a/src/main/resources/META-INF/plugin-java.xml b/src/main/resources/META-INF/plugin-java.xml index 409509c01..c1e5401bf 100644 --- a/src/main/resources/META-INF/plugin-java.xml +++ b/src/main/resources/META-INF/plugin-java.xml @@ -3,4 +3,7 @@ - \ No newline at end of file + + + +