From 7f58ff9b09ed83511fa5983deacf0504b7c2746e Mon Sep 17 00:00:00 2001 From: wang <1625116638@qq.com> Date: Tue, 24 Oct 2023 00:07:48 +0800 Subject: [PATCH] Add JvmExceptionOccurrenceFilter but it is marked unstable with @ApiStatus.Experimental --- build.gradle.kts | 2 +- .../filter/CodeGPTJvmExceptionFilter.java | 41 +++++++++++ .../codegpt/filter/CodeGPTPresentation.java | 69 +++++++++++++++++++ src/main/resources/META-INF/plugin-java.xml | 6 ++ src/main/resources/META-INF/plugin.xml | 1 + 5 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ee/carlrobert/codegpt/filter/CodeGPTJvmExceptionFilter.java create mode 100644 src/main/java/ee/carlrobert/codegpt/filter/CodeGPTPresentation.java create mode 100644 src/main/resources/META-INF/plugin-java.xml diff --git a/build.gradle.kts b/build.gradle.kts index 44e74a2b6..c06c83752 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -22,7 +22,7 @@ intellij { pluginName.set(properties("pluginName")) version.set(properties("platformVersion")) type.set(properties("platformType")) - plugins.set(listOf()) + plugins.set(listOf("java")) } changelog { 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..9743490c2 --- /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 java.awt.Cursor; +import java.awt.Graphics; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.event.MouseEvent; +import javax.swing.*; + +import ee.carlrobert.codegpt.conversations.message.Message; +import ee.carlrobert.codegpt.toolwindow.chat.standard.StandardChatToolWindowContentManager; +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.DefaultIcon.getIconWidth(); + } + + public void paint(@NotNull Inlay inlay, @NotNull Graphics g, @NotNull Rectangle r, + @NotNull TextAttributes textAttributes) { + Icon consoleIcon = Icons.DefaultIcon; + 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 new file mode 100644 index 000000000..475e52622 --- /dev/null +++ b/src/main/resources/META-INF/plugin-java.xml @@ -0,0 +1,6 @@ + + com.intellij.modules.lang + + + + diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index fddc2f3e0..84b56386b 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -3,6 +3,7 @@ CodeGPT Carl-Robert Linnupuu com.intellij.modules.platform + com.intellij.modules.java