Skip to content

Commit

Permalink
feat: add simple suggestion
Browse files Browse the repository at this point in the history
  • Loading branch information
phodal committed Apr 23, 2023
1 parent c9c37cb commit 7fd8aaa
Show file tree
Hide file tree
Showing 10 changed files with 105 additions and 19 deletions.
13 changes: 0 additions & 13 deletions src/main/kotlin/cc/unitmesh/devti/actions/CodeReviewAction.kt

This file was deleted.

75 changes: 75 additions & 0 deletions src/main/kotlin/cc/unitmesh/devti/actions/CodeSuggestionAction.kt
@@ -0,0 +1,75 @@
package cc.unitmesh.devti.actions

import cc.unitmesh.devti.DevtiIcons
import cc.unitmesh.devti.connector.openai.OpenCodeCopilot
import cc.unitmesh.devti.runconfig.AutoCRUDState
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.progress.ProgressIndicator
import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.progress.Task
import com.intellij.openapi.ui.popup.JBPopupFactory
import com.intellij.openapi.util.NlsSafe
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiMethod
import com.intellij.ui.EditorTextField
import java.awt.BorderLayout
import java.awt.Dimension
import javax.swing.JPanel


class CodeSuggestionAction(methodName: @NlsSafe String, val method: PsiMethod) : AnAction({ "Code Suggestion for $methodName" }, DevtiIcons.AI_COPILOT) {
override fun actionPerformed(e: AnActionEvent) {
val project = e.project ?: return

val task = object : Task.Backgroundable(project, "Code completing", true) {
override fun run(indicator: ProgressIndicator) {
indicator.fraction = 0.2
indicator.text = "Preparing code complete prompt"

val apiExecutor = OpenCodeCopilot()

indicator.fraction = 0.5
indicator.text = "Call OpenAI API..."

val className = if (method.parent is PsiClass) {
(method.parent as PsiClass).name
} else {
method.containingFile?.name?.replace(".java", "")
}

val suggestion = apiExecutor.codeReviewFor(method.text, className!!).trimIndent()

indicator.fraction = 0.8
indicator.text = "Start replacing method"

val myTextField = EditorTextField(suggestion)

val panel = JPanel(BorderLayout(0, 20))
panel.add(myTextField, BorderLayout.CENTER)

val builder = JBPopupFactory.getInstance().createComponentPopupBuilder(panel, myTextField)


val popup = builder.createPopup()
popup.setMinimumSize(Dimension(400, 20))
ApplicationManager.getApplication().invokeLater() {
popup.showCenteredInCurrentWindow(project)
}

indicator.fraction = 1.0
}
}

ApplicationManager.getApplication().invokeLater {
ProgressManager.getInstance().run(task)
}
}

companion object {
private val log: Logger = logger<AutoCRUDState>()
}
}
1 change: 1 addition & 0 deletions src/main/kotlin/cc/unitmesh/devti/connector/CodeCopilot.kt
Expand Up @@ -4,4 +4,5 @@ interface CodeCopilot {
fun codeCompleteFor(text: String, className: String): String

fun autoComment(text: String): String
fun codeReviewFor(text: String, className: String): String
}
Expand Up @@ -15,4 +15,8 @@ class CustomConnector(val url: String, val key: String) : CodeCopilot {
return ""
}

override fun codeReviewFor(text: String, className: String): String {
return ""
}

}
Expand Up @@ -122,6 +122,15 @@ class OpenCodeCopilot : CodeCopilot, DevtiFlowAction {
}
}

override fun codeReviewFor(text: String, className: String): String {
val promptText = promptGenerator.codeReview(text, className)
logger.warn("codeReviewFor prompt text: $promptText")
return runBlocking {
val result = prompt(promptText)
return@runBlocking result
}
}

companion object {
private val logger: Logger = logger<OpenCodeCopilot>()
}
Expand Down
Expand Up @@ -48,4 +48,12 @@ class PromptGenerator() {
return promptTextString
.replace("{code}", methodCode)
}

fun codeReview(text: String, className: String): String {
val promptText: InputStream = this::class.java.classLoader.getResourceAsStream("prompts/openai/copilot/code_review.txt")!!
val promptTextString = promptText.bufferedReader().use { it.readText() }
return promptTextString
.replace("{code}", text)
.replace("{className}", className)
}
}
@@ -1,11 +1,8 @@
package cc.unitmesh.devti.language

import cc.unitmesh.devti.DevtiIcons
import cc.unitmesh.devti.actions.CodeReviewAction
import cc.unitmesh.devti.runconfig.AutoCRUDState
import cc.unitmesh.devti.actions.CodeSuggestionAction
import com.intellij.execution.lineMarker.RunLineMarkerContributor
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.diagnostic.logger
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiIdentifier
import com.intellij.psi.PsiMethod
Expand All @@ -17,7 +14,7 @@ class CodeReviewMarkerContributor : RunLineMarkerContributor() {
if (method !is PsiMethod) return null

val methodName = method.name
val runAction = CodeReviewAction(methodName, method)
val runAction = CodeSuggestionAction(methodName, method)

return Info(
DevtiIcons.AI_COPILOT,
Expand Down
Expand Up @@ -44,5 +44,6 @@ class DtCommandRunner : GenericProgramRunner<RunnerSettings>() {

companion object {
private val log: Logger = logger<AutoCRUDState>()
const val RUNNER_ID: String = "DtCommandRunner"
}
}
4 changes: 4 additions & 0 deletions src/main/resources/META-INF/plugin.xml
Expand Up @@ -35,6 +35,10 @@
implementation="cc.unitmesh.devti.runconfig.command.CompositeDevtiRunConfigurationProducer"/>
<configurationType implementation="cc.unitmesh.devti.runconfig.AutoCRUDConfigurationType"/>


<!-- Run Configurations -->
<programRunner implementation="cc.unitmesh.devti.runconfig.DtCommandRunner"/>

<toolWindow id="DevTi Flow" secondary="true" icon="AllIcons.Toolwindows.WebToolWindow" anchor="right"
factoryClass="cc.unitmesh.devti.gui.DevtiFlowToolWindowFactory"/>
</extensions>
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/prompts/openai/copilot/code_review.txt
@@ -1,4 +1,4 @@
请作为代码审查者,需对下列代码变更提供反馈
请作为代码审查者,对 class {className} 中的代码变更提供反馈

要求:

Expand Down

0 comments on commit 7fd8aaa

Please sign in to comment.