Skip to content

Commit 7f58ff9

Browse files
committed
Add JvmExceptionOccurrenceFilter but it is marked unstable with @ApiStatus.Experimental
1 parent 41b3956 commit 7f58ff9

File tree

5 files changed

+118
-1
lines changed

5 files changed

+118
-1
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ intellij {
2222
pluginName.set(properties("pluginName"))
2323
version.set(properties("platformVersion"))
2424
type.set(properties("platformType"))
25-
plugins.set(listOf())
25+
plugins.set(listOf("java"))
2626
}
2727

2828
changelog {
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package ee.carlrobert.codegpt.filter;
2+
3+
import com.intellij.execution.filters.Filter;
4+
import com.intellij.execution.filters.JvmExceptionOccurrenceFilter;
5+
import com.intellij.execution.impl.InlayProvider;
6+
import com.intellij.openapi.editor.Editor;
7+
import com.intellij.openapi.editor.EditorCustomElementRenderer;
8+
import com.intellij.openapi.project.Project;
9+
import com.intellij.psi.PsiClass;
10+
import java.util.List;
11+
import org.jetbrains.annotations.NotNull;
12+
13+
public class CodeGPTJvmExceptionFilter implements JvmExceptionOccurrenceFilter {
14+
15+
@Override
16+
public Filter.ResultItem applyFilter(@NotNull String exceptionClassName,
17+
@NotNull List<PsiClass> classes, int exceptionStartOffset) {
18+
return new CreateExceptionBreakpointResult(exceptionStartOffset,
19+
exceptionStartOffset + exceptionClassName.length(), classes
20+
.get(0).getProject());
21+
}
22+
23+
private static class CreateExceptionBreakpointResult extends Filter.ResultItem implements
24+
InlayProvider {
25+
26+
private final Project project;
27+
28+
private final int startOffset;
29+
30+
CreateExceptionBreakpointResult(int highlightStartOffset, int highlightEndOffset,
31+
Project project) {
32+
super(highlightStartOffset, highlightEndOffset, null);
33+
this.project = project;
34+
this.startOffset = highlightStartOffset;
35+
}
36+
37+
public EditorCustomElementRenderer createInlayRenderer(Editor editor) {
38+
return new CodeGPTPresentation(editor, this.project, this.startOffset);
39+
}
40+
}
41+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package ee.carlrobert.codegpt.filter;
2+
3+
import com.intellij.codeInsight.hints.presentation.InputHandler;
4+
import com.intellij.openapi.editor.Editor;
5+
import com.intellij.openapi.editor.EditorCustomElementRenderer;
6+
import com.intellij.openapi.editor.Inlay;
7+
import com.intellij.openapi.editor.impl.EditorImpl;
8+
import com.intellij.openapi.editor.markup.TextAttributes;
9+
import com.intellij.openapi.project.Project;
10+
import com.intellij.openapi.util.TextRange;
11+
import ee.carlrobert.codegpt.Icons;
12+
import java.awt.Cursor;
13+
import java.awt.Graphics;
14+
import java.awt.Point;
15+
import java.awt.Rectangle;
16+
import java.awt.event.MouseEvent;
17+
import javax.swing.*;
18+
19+
import ee.carlrobert.codegpt.conversations.message.Message;
20+
import ee.carlrobert.codegpt.toolwindow.chat.standard.StandardChatToolWindowContentManager;
21+
import org.jetbrains.annotations.NotNull;
22+
23+
public class CodeGPTPresentation implements EditorCustomElementRenderer, InputHandler {
24+
25+
private final Editor editor;
26+
27+
private final Project project;
28+
29+
private final int startOffset;
30+
31+
32+
public CodeGPTPresentation(Editor editor, Project project, int starOffset) {
33+
this.editor = editor;
34+
this.project = project;
35+
this.startOffset = starOffset;
36+
}
37+
38+
public void mouseClicked(@NotNull MouseEvent mouseEvent, @NotNull Point point) {
39+
int line = this.editor.getDocument().getLineNumber(this.startOffset);
40+
String errorInformation = this.editor.getDocument()
41+
.getText(new TextRange(this.startOffset, this.editor.getDocument().getLineEndOffset(line)));
42+
String prompt = "Provide recommendations for the error message: {{errorInformation}}";
43+
var message = new Message(prompt.replace("{{errorInformation}}", errorInformation));
44+
SwingUtilities.invokeLater(
45+
() -> project.getService(StandardChatToolWindowContentManager.class).sendMessage(message));
46+
}
47+
48+
public void mouseExited() {
49+
((EditorImpl) this.editor).setCustomCursor(this,
50+
Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
51+
}
52+
53+
public void mouseMoved(@NotNull MouseEvent mouseEvent, @NotNull Point point) {
54+
((EditorImpl) this.editor).setCustomCursor(this,
55+
Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
56+
}
57+
58+
public int calcWidthInPixels(@NotNull Inlay inlay) {
59+
return Icons.DefaultIcon.getIconWidth();
60+
}
61+
62+
public void paint(@NotNull Inlay inlay, @NotNull Graphics g, @NotNull Rectangle r,
63+
@NotNull TextAttributes textAttributes) {
64+
Icon consoleIcon = Icons.DefaultIcon;
65+
int curX = r.x + r.width / 2 - consoleIcon.getIconWidth() / 2;
66+
int curY = r.y + r.height / 2 - consoleIcon.getIconHeight() / 2;
67+
consoleIcon.paintIcon(inlay.getEditor().getComponent(), g, curX, curY);
68+
}
69+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<idea-plugin>
2+
<depends>com.intellij.modules.lang</depends>
3+
<extensions defaultExtensionNs="com.intellij">
4+
<jvm.exceptionFilter implementation="ee.carlrobert.codegpt.filter.CodeGPTJvmExceptionFilter"/>
5+
</extensions>
6+
</idea-plugin>

src/main/resources/META-INF/plugin.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<name>CodeGPT</name>
44
<vendor email="[email protected]" url="https://carlrobert.ee">Carl-Robert Linnupuu</vendor>
55
<depends>com.intellij.modules.platform</depends>
6+
<depends optional="true" config-file="plugin-java.xml">com.intellij.modules.java</depends>
67

78
<extensions defaultExtensionNs="com.intellij">
89
<postStartupActivity implementation="ee.carlrobert.codegpt.PluginStartupActivity"/>

0 commit comments

Comments
 (0)